diff options
author | Taco Hoekwater <taco@elvenkind.com> | 2011-06-01 08:54:21 +0000 |
---|---|---|
committer | Taco Hoekwater <taco@elvenkind.com> | 2011-06-01 08:54:21 +0000 |
commit | d7ccb42582f85acf30568913610ccf4d602023fb (patch) | |
tree | 7292e3545a420676878e7451b68892d360c62cb6 /Master/texmf-dist/tex/context/base/typo-dig.lua | |
parent | 2d62a6fe9b80def59c392268022f1f9a2d6e358f (diff) |
commit context 2011.05.18
git-svn-id: svn://tug.org/texlive/trunk@22719 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/typo-dig.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/typo-dig.lua | 142 |
1 files changed, 92 insertions, 50 deletions
diff --git a/Master/texmf-dist/tex/context/base/typo-dig.lua b/Master/texmf-dist/tex/context/base/typo-dig.lua index c1b44e39f74..1e4a02fc6b9 100644 --- a/Master/texmf-dist/tex/context/base/typo-dig.lua +++ b/Master/texmf-dist/tex/context/base/typo-dig.lua @@ -6,48 +6,69 @@ if not modules then modules = { } end modules ['typo-dig'] = { license = "see context related readme files" } +-- we might consider doing this after the otf pass because now osf do not work +-- out well in node mode. + local next, type = next, type local format, insert = string.format, table.insert -local round = math.round +local round, div = math.round, math.div + +local trace_digits = false trackers.register("typesetters.digits", function(v) trace_digits = v end) + +local report_digits = logs.reporter("typesetting","digits") + +local nodes, node = nodes, node + +local has_attribute = node.has_attribute +local unset_attribute = node.unset_attribute +local set_attribute = node.set_attribute +local hpack_node = node.hpack +local traverse_id = node.traverse_id +local insert_before = node.insert_before +local insert_after = node.insert_after -local trace_digits = false trackers.register("nodes.digits", function(v) trace_digits = v end) +local texattribute = tex.attribute -local has_attribute = node.has_attribute -local unset_attribute = node.unset_attribute -local set_attribute = node.set_attribute -local hpack_node = node.hpack -local traverse_id = node.traverse_id -local insert_before = node.insert_before -local insert_after = node.insert_after +local nodecodes = nodes.nodecodes +local glyph_code = nodecodes.glyph -local glyph = node.id("glyph") -local kern = node.id("kern") +local nodepool = nodes.pool +local tasks = nodes.tasks -local new_glue = nodes.glue +local new_glue = nodepool.glue -local fontdata = fonts.identifiers -local chardata = fonts.characters -local quaddata = fonts.quads -local charbase = characters.data +local fonthashes = fonts.hashes +local fontdata = fonthashes.identifiers +local chardata = fonthashes.characters +local quaddata = fonthashes.quads -digits = digits or { } -digits.actions = { } -digits.attribute = attributes.private("digits") +local charbase = characters.data +local getdigitwidth = fonts.helpers.getdigitwidth -local actions = digits.actions +typesetters = typesetters or { } +local typesetters = typesetters + +typesetters.digits = typesetters.digits or { } +local digits = typesetters.digits + +digits.actions = { } +local actions = digits.actions + +local a_digits = attributes.private("digits") +digits.attribute = a_digits -- at some point we can manipulate the glyph node so then i need --- to rewrite this +-- to rewrite this then -function nodes.aligned(start,stop,width,how) - local prv, nxt, head = start.prev, stop.next, nil - start.prev, stop.next = nil, nil +function nodes.aligned(head,start,stop,width,how) if how == "flushright" or how == "middle" then - head, start = insert_before(start,start,new_glue(0,65536,65536)) + head, start = insert_before(head,start,new_glue(0,65536,65536)) end if how == "flushleft" or how == "middle" then - head, stop = insert_after(start,stop,new_glue(0,65536,65536)) + head, stop = insert_after(head,stop,new_glue(0,65536,65536)) end + local prv, nxt = start.prev, stop.next + start.prev, stop.next = nil, nil local packed = hpack_node(start,width,"exactly") -- no directional mess here, just lr if prv then prv.next, packed.prev = packed, prv @@ -55,38 +76,45 @@ function nodes.aligned(start,stop,width,how) if nxt then nxt.prev, packed.next = packed, nxt end - return packed, prv, nxt + if packed.prev then + return head, packed + else + return packed, packed + end end -actions[1] = function(start,attribute) +actions[1] = function(head,start,attribute,attr) + local font = start.font local char = start.char - if charbase[char].category == "nd" then - local font = start.font - local oldwidth, newwidth = start.width, fonts.get_digit_width(font) + local unic = chardata[font][char].tounicode + local what = unic and tonumber(unic,16) or char + if charbase[what].category == "nd" then + local oldwidth, newwidth = start.width, getdigitwidth(font) if newwidth ~= oldwidth then - local start = nodes.aligned(start,start,newwidth,"middle") -- return three node pointers - return start, true + if trace_digits then + report_digits("digit trigger %s, instance %s, char 0x%05X, unicode 0x%05X, delta %s", + attr%100,div(attr,100),char,what,newwidth-oldwidth) + end + head, start = nodes.aligned(head,start,start,newwidth,"middle") + return head, start, true end end - return start, false + return head, start, false end -function digits.process(namespace,attribute,head) +local function process(namespace,attribute,head) local done, current, ok = false, head, false while current do - if current.id == glyph then + if current.id == glyph_code then local attr = has_attribute(current,attribute) if attr and attr > 0 then unset_attribute(current,attribute) - local action = actions[attr] + local action = actions[attr%100] -- map back to low number if action then - if current == head then - head, ok = action(current,attribute) - current = head - else - current, ok = action(current,attribute) - end + head, current, ok = action(head,current,attribute,attr) done = done and ok + elseif trace_digits then + report_digits("unknown digit trigger %s",attr) end end end @@ -95,12 +123,26 @@ function digits.process(namespace,attribute,head) return head, done end -chars.handle_digits = nodes.install_attribute_handler { - name = "digits", - namespace = digits, - processor = digits.process, -} +local m, enabled = 0, false -- a trick to make neighbouring ranges work -function digits.enable() - tasks.enableaction("processors","chars.handle_digits") +function digits.set(n) + if not enabled then + tasks.enableaction("processors","typesetters.digits.handler") + if trace_digits then + report_digits("enabling digit handler") + end + enabled = true + end + if m == 100 then + m = 1 + else + m = m + 1 + end + texattribute[a_digits] = m * 100 + n end + +digits.handler = nodes.installattributehandler { + name = "digits", + namespace = digits, + processor = process, +} |