summaryrefslogtreecommitdiff
path: root/tex/context/base/typo-dig.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/typo-dig.lua')
-rw-r--r--tex/context/base/typo-dig.lua324
1 files changed, 162 insertions, 162 deletions
diff --git a/tex/context/base/typo-dig.lua b/tex/context/base/typo-dig.lua
index 9cf8417b8..62d17fa3b 100644
--- a/tex/context/base/typo-dig.lua
+++ b/tex/context/base/typo-dig.lua
@@ -1,162 +1,162 @@
-if not modules then modules = { } end modules ['typo-dig'] = {
- version = 1.001,
- comment = "companion to typo-dig.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- 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, 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 hpack_node = node.hpack
-local traverse_id = node.traverse_id
-local insert_node_before = node.insert_before
-local insert_node_after = node.insert_after
-
-local texattribute = tex.attribute
-local unsetvalue = attributes.unsetvalue
-
-local nodecodes = nodes.nodecodes
-local glyph_code = nodecodes.glyph
-
-local nodepool = nodes.pool
-local tasks = nodes.tasks
-
-local new_glue = nodepool.glue
-
-local fonthashes = fonts.hashes
-local fontdata = fonthashes.identifiers
-local chardata = fonthashes.characters
-local quaddata = fonthashes.quads
-
-local v_reset = interfaces.variables.reset
-
-local charbase = characters.data
-local getdigitwidth = fonts.helpers.getdigitwidth
-
-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 then
-
-function nodes.aligned(head,start,stop,width,how)
- if how == "flushright" or how == "middle" then
- head, start = insert_node_before(head,start,new_glue(0,65536,65536))
- end
- if how == "flushleft" or how == "middle" then
- head, stop = insert_node_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
- end
- if nxt then
- nxt.prev, packed.next = packed, nxt
- end
- if packed.prev then
- return head, packed
- else
- return packed, packed
- end
-end
-
-actions[1] = function(head,start,attribute,attr)
- local font = start.font
- local char = start.char
- 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
- if trace_digits then
- report_digits("digit trigger %a, instance %a, char %C, unicode %U, 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 head, start, false
-end
-
-local function process(namespace,attribute,head)
- local done, current, ok = false, head, false
- while current do
- if current.id == glyph_code then
- local attr = current[attribute]
- if attr and attr > 0 then
- current[attribute] = unsetvalue
- local action = actions[attr%100] -- map back to low number
- if action then
- head, current, ok = action(head,current,attribute,attr)
- done = done and ok
- elseif trace_digits then
- report_digits("unknown digit trigger %a",attr)
- end
- end
- end
- current = current and current.next
- end
- return head, done
-end
-
-local m, enabled = 0, false -- a trick to make neighbouring ranges work
-
-function digits.set(n) -- number or 'reset'
- if n == v_reset then
- n = unsetvalue
- else
- n = tonumber(n)
- if n then
- 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
- n = m * 100 + n
- else
- n = unsetvalue
- end
- end
- texattribute[a_digits] = n
-end
-
-digits.handler = nodes.installattributehandler { -- we could avoid this wrapper
- name = "digits",
- namespace = digits,
- processor = process,
-}
-
--- interface
-
-commands.setdigitsmanipulation = digits.set
+if not modules then modules = { } end modules ['typo-dig'] = {
+ version = 1.001,
+ comment = "companion to typo-dig.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ 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, 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 hpack_node = node.hpack
+local traverse_id = node.traverse_id
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+
+local texattribute = tex.attribute
+local unsetvalue = attributes.unsetvalue
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+
+local nodepool = nodes.pool
+local tasks = nodes.tasks
+
+local new_glue = nodepool.glue
+
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+local chardata = fonthashes.characters
+local quaddata = fonthashes.quads
+
+local v_reset = interfaces.variables.reset
+
+local charbase = characters.data
+local getdigitwidth = fonts.helpers.getdigitwidth
+
+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 then
+
+function nodes.aligned(head,start,stop,width,how)
+ if how == "flushright" or how == "middle" then
+ head, start = insert_node_before(head,start,new_glue(0,65536,65536))
+ end
+ if how == "flushleft" or how == "middle" then
+ head, stop = insert_node_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
+ end
+ if nxt then
+ nxt.prev, packed.next = packed, nxt
+ end
+ if packed.prev then
+ return head, packed
+ else
+ return packed, packed
+ end
+end
+
+actions[1] = function(head,start,attribute,attr)
+ local font = start.font
+ local char = start.char
+ 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
+ if trace_digits then
+ report_digits("digit trigger %a, instance %a, char %C, unicode %U, 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 head, start, false
+end
+
+local function process(namespace,attribute,head)
+ local done, current, ok = false, head, false
+ while current do
+ if current.id == glyph_code then
+ local attr = current[attribute]
+ if attr and attr > 0 then
+ current[attribute] = unsetvalue
+ local action = actions[attr%100] -- map back to low number
+ if action then
+ head, current, ok = action(head,current,attribute,attr)
+ done = done and ok
+ elseif trace_digits then
+ report_digits("unknown digit trigger %a",attr)
+ end
+ end
+ end
+ current = current and current.next
+ end
+ return head, done
+end
+
+local m, enabled = 0, false -- a trick to make neighbouring ranges work
+
+function digits.set(n) -- number or 'reset'
+ if n == v_reset then
+ n = unsetvalue
+ else
+ n = tonumber(n)
+ if n then
+ 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
+ n = m * 100 + n
+ else
+ n = unsetvalue
+ end
+ end
+ texattribute[a_digits] = n
+end
+
+digits.handler = nodes.installattributehandler { -- we could avoid this wrapper
+ name = "digits",
+ namespace = digits,
+ processor = process,
+}
+
+-- interface
+
+commands.setdigitsmanipulation = digits.set