diff options
Diffstat (limited to 'otfl-node-dum.lua')
-rw-r--r-- | otfl-node-dum.lua | 108 |
1 files changed, 107 insertions, 1 deletions
diff --git a/otfl-node-dum.lua b/otfl-node-dum.lua index f39a087..fbc8264 100644 --- a/otfl-node-dum.lua +++ b/otfl-node-dum.lua @@ -6,7 +6,19 @@ if not modules then modules = { } end modules ['node-dum'] = { license = "see context related readme files" } -nodes = nodes or { } +nodes = nodes or { } +fonts = fonts or { } +attributes = attributes or { } + +local traverse_id = node.traverse_id +local free_node = node.free +local remove_node = node.remove + +local glyph = node.id('glyph') + +-- fonts + +local fontdata = fonts.ids or { } function nodes.simple_font_handler(head) -- lang.hyphenate(head) @@ -17,3 +29,97 @@ function nodes.simple_font_handler(head) head = node.kerning(head) return head end + +if tex.attribute[0] ~= 0 then + + texio.write_nl("log","!") + texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be") + texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special") + texio.write_nl("log","! purposed so setting them at the TeX end might break the font handler.") + texio.write_nl("log","!") + + tex.attribute[0] = 0 -- else no features + +end + +nodes.protect_glyphs = node.protect_glyphs +nodes.unprotect_glyphs = node.unprotect_glyphs + +function nodes.process_characters(head) + local usedfonts, done, prevfont = { }, false, nil + for n in traverse_id(glyph,head) do + if font ~= prevfont then + prevfont = font + local used = usedfonts[font] + if not used then + local tfmdata = fontdata[font] + if tfmdata then + local shared = tfmdata.shared -- we need to check shared, only when same features + if shared then + local processors = shared.processes + if processors and #processors > 0 then + usedfonts[font] = processors + done = true + end + end + end + end + end + end + if done then + for font, processors in next, usedfonts do + for i=1,#processors do + local h, d = processors[i](head,font,0) + head, done = h or head, done or d + end + end + end + return head, true +end + +-- helper + +function nodes.kern(k) + local n = new_node("kern",1) + n.kern = k + return n +end + +function nodes.remove(head, current, free_too) + local t = current + head, current = remove_node(head,current) + if t then + if free_too then + free_node(t) + t = nil + else + t.next, t.prev = nil, nil + end + end + return head, current, t +end + +function nodes.delete(head,current) + return nodes.remove(head,current,true) +end + +nodes.before = node.insert_before +nodes.after = node.insert_after + +-- attributes + +attributes.unsetvalue = -0x7FFFFFFF + +local numbers, last = { }, 127 + +function attributes.private(name) + local number = numbers[name] + if not number then + if last < 255 then + last = last + 1 + end + number = last + numbers[name] = number + end + return number +end |