summaryrefslogtreecommitdiff
path: root/otfl-font-ota.lua
diff options
context:
space:
mode:
Diffstat (limited to 'otfl-font-ota.lua')
-rw-r--r--otfl-font-ota.lua47
1 files changed, 31 insertions, 16 deletions
diff --git a/otfl-font-ota.lua b/otfl-font-ota.lua
index c6a5b29..72e7414 100644
--- a/otfl-font-ota.lua
+++ b/otfl-font-ota.lua
@@ -32,10 +32,14 @@ local glyph = node.id('glyph')
local glue = node.id('glue')
local penalty = node.id('penalty')
-local set_attribute = node.set_attribute
-local has_attribute = node.has_attribute
-local traverse_id = node.traverse_id
-local remove_node = nodes.remove
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+local traverse_id = node.traverse_id
+local delete_node = nodes.delete
+local replace_node = nodes.replace
+local insert_node_after = node.insert_after
+local insert_node_before = node.insert_before
+local traverse_node_list = node.traverse
local fontdata = fonts.ids
local state = attributes.private('state')
@@ -46,12 +50,6 @@ local fcr = (fonts.color and fonts.color.reset) or function() end
local a_to_script = otf.a_to_script
local a_to_language = otf.a_to_language
-local remove_node = node.remove
-local delete_node = nodes.delete
-local insert_node_after = node.insert_after
-local insert_node_before = node.insert_before
-local traverse_node_list = node.traverse
-
-- in the future we will use language/script attributes instead of the
-- font related value, but then we also need dynamic features which is
-- somewhat slower; and .. we need a chain of them
@@ -239,17 +237,23 @@ end
function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special version with no trace
local tfmdata = fontdata[font]
---~ local marks = tfmdata.shared.otfdata.luatex.marks
local marks = tfmdata.marks
local first, last, current, done = nil, nil, head, false
- local removejoiners = otf.remove_joiners
- local joiners = { }
+ local joiners, nonjoiners
+ local removejoiners = tfmdata.remove_joiners -- or otf.remove_joiners
+ if removejoiners then
+ joiners, nonjoiners = { }, { }
+ end
while current do
if current.id == glyph and current.subtype<256 and current.font == font and not has_attribute(current,state) then
done = true
local char = current.char
- if removejoiners and char == zwj or char == zwnj then
- joiners[#joiners+1] = current
+ if removejoiners then
+ if char == zwj then
+ joiners[#joiners+1] = current
+ elseif char == zwnj then
+ nonjoiners[#nonjoiners+1] = current
+ end
end
if marks[char] then
set_attribute(current,state,5) -- mark
@@ -298,8 +302,19 @@ function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special ve
first, last = finish(first,last)
if removejoiners then
for i=1,#joiners do
- head = delete_node(head,joiners[i]) -- was remove so no free
+ head = delete_node(head,joiners[i])
+ end
+ for i=1,#nonjoiners do
+ head = replace_node(head,nonjoiners[i],nodes.glue(0)) -- or maybe a kern
end
end
return head, done
end
+
+table.insert(fonts.manipulators,"joiners")
+
+function fonts.initializers.node.otf.joiners(tfmdata,value)
+ if value == "strip" then
+ tfmdata.remove_joiners = true
+ end
+end