diff options
Diffstat (limited to 'tex/context/base/mkxl/typo-rep.lmt')
-rw-r--r-- | tex/context/base/mkxl/typo-rep.lmt | 135 |
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" +} |