summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/typo-rep.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkxl/typo-rep.lmt')
-rw-r--r--tex/context/base/mkxl/typo-rep.lmt135
1 files changed, 135 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/typo-rep.lmt b/tex/context/base/mkxl/typo-rep.lmt
new file mode 100644
index 000000000..683b483ef
--- /dev/null
+++ b/tex/context/base/mkxl/typo-rep.lmt
@@ -0,0 +1,135 @@
+if not modules then modules = { } end modules ['typo-rep'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This was rather boring to program (more of the same) but I could
+-- endure it by listening to a couple cd's by The Scene and The Lau
+-- on the squeezebox on my desk.
+
+local next, type, tonumber = next, type, tonumber
+
+local trace_stripping = false trackers.register("nodes.stripping", function(v) trace_stripping = v end)
+ trackers.register("fonts.stripping", function(v) trace_stripping = v end)
+
+local report_stripping = logs.reporter("fonts","stripping")
+
+local nodes = nodes
+local enableaction = nodes.tasks.enableaction
+
+local nuts = nodes.nuts
+
+local getnext = nuts.getnext
+local getchar = nuts.getchar
+local isglyph = nuts.isglyph
+
+local getattr = nuts.getattr
+
+local remove_node = nuts.remove
+local replace_node = nuts.replace
+local copy_node = nuts.copy
+
+local nodecodes = nodes.nodecodes
+
+local chardata = characters.data
+local collected = false
+
+local a_stripping = attributes.private("stripping")
+
+local texsetattribute = tex.setattribute
+local unsetvalue = attributes.unsetvalue
+
+local v_reset = interfaces.variables.reset
+
+-- todo: other namespace -> typesetters
+
+nodes.stripping = nodes.stripping or { } local stripping = nodes.stripping
+stripping.glyphs = stripping.glyphs or { } local glyphs = stripping.glyphs
+
+local function initialize()
+ for k, v in next, chardata do
+ if v.category == "cf" and not v.visible and not glyphs[k] then
+ glyphs[k] = true
+ end
+ end
+ initialize = nil
+end
+
+local function process(what,head,current,char)
+ if what == true then
+ if trace_stripping then
+ report_stripping("deleting %C from text",char)
+ end
+ head, current = remove_node(head,current,true)
+ elseif type(what) == "function" then
+ head, current = what(head,current)
+ current = getnext(current)
+ if trace_stripping then
+ report_stripping("processing %C in text",char)
+ end
+ elseif what then -- assume node
+ head, current = replace_node(head,current,copy_node(what))
+ current = getnext(current)
+ if trace_stripping then
+ report_stripping("replacing %C in text",char)
+ end
+ end
+ return head, current
+end
+
+function nodes.handlers.stripping(head) -- use loop
+ local current = head
+ while current do
+ local char, id = isglyph(current)
+ if char then
+ -- it's more efficient to keep track of what needs to be kept
+ local todo = getattr(current,a_stripping)
+ if todo == 1 then
+ local what = glyphs[char]
+ if what then
+ head, current = process(what,head,current,char)
+ else -- handling of spacing etc has to be done elsewhere
+ current = getnext(current)
+ end
+ else
+ current = getnext(current)
+ end
+ else
+ current = getnext(current)
+ end
+ end
+ return head
+end
+
+local enabled = false
+
+function stripping.set(n) -- number or 'reset'
+ if n == v_reset then
+ n = unsetvalue
+ else
+ n = tonumber(n)
+ if n then
+ if not enabled then
+ if initialize then initialize() end
+ enableaction("processors","nodes.handlers.stripping")
+ enabled = true
+ end
+ else
+ n = unsetvalue
+ end
+ end
+ texsetattribute(a_stripping,n)
+end
+
+-- interface
+
+interfaces.implement {
+ name = "setcharacterstripping",
+ public = true,
+ protected = true,
+ actions = stripping.set,
+ arguments = "optional"
+}