if not modules then modules = { } end modules ['node-acc'] = { 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" } -- see mkiv lua module for some experimental unused code local nodes, node = nodes, node local tasks = nodes.tasks local nuts = nodes.nuts local tonut = nodes.tonut local tonode = nodes.tonode local getid = nuts.getid local getsubtype = nuts.getsubtype local getattr = nuts.getattr local getlist = nuts.getlist local getchar = nuts.getchar local getnext = nuts.getnext local setattr = nuts.setattr local setlink = nuts.setlink local setchar = nuts.setchar local getwidth = nuts.getwidth local setwidth = nuts.setwidth local nextglyph = nuts.traversers.glyph local copy_node = nuts.copy local nodecodes = nodes.nodecodes local gluecodes = nodes.gluecodes local glue_code = nodecodes.glue local glyph_code = nodecodes.glyph local hlist_code = nodecodes.hlist local vlist_code = nodecodes.vlist local spaceskip_code = gluecodes.spaceskip local xspaceskip_code = gluecodes.xspaceskip local a_characters = attributes.private("characters") local nofreplaced = 0 local trace = false trackers.register("backend.contenttostring", function(v) trace = v end) local slot = nil -- todo : use getnextglyph local function injectspaces(head) -- This can become two fast loops or we just move this to the backend where we can -- also check for spaces (it actually is rather old code that relates to tagging -- and so, which was implemented rather early in the mkiv saga). It can also become -- a helper. local p, p_id local n = head while n do local id = getid(n) if id == glue_code then if p and getid(p) == glyph_code then local s = getsubtype(n) if s == spaceskip_code or s == xspaceskip_code then local g = copy_node(p) local a = getattr(n,a_characters) setchar(g,slot) setlink(p,g,n) setwidth(n,getwidth(n) - getwidth(g)) -- use criterium if a then setattr(g,a_characters,a) end setattr(n,a_characters,0) -- really? better change s into normal nofreplaced = nofreplaced + 1 end end elseif id == hlist_code or id == vlist_code then injectspaces(getlist(n),slot) end p_id = id p = n n = getnext(n) end return head end nodes.handlers.accessibility = function(head) if trace then if not slot then slot = fonts.helpers.privateslot("visualspace") end else slot = 32 end return injectspaces(head,slot) end statistics.register("inserted spaces in output",function() if nofreplaced > 0 then return nofreplaced end end)