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" } local nodes, node = nodes, node local nodecodes = nodes.nodecodes local tasks = nodes.tasks local traverse_nodes = node.traverse local traverse_id = node.traverse_id local copy_node = node.copy local free_nodelist = node.flush_list local glue_code = nodecodes.glue local kern_code = nodecodes.kern local glyph_code = nodecodes.glyph local hlist_code = nodecodes.hlist local vlist_code = nodecodes.vlist local a_characters = attributes.private("characters") local threshold = 65536 -- todo: nbsp etc -- todo: collapse kerns local function injectspaces(head) local p local n = head while n do local id = n.id if id == glue_code then -- todo: check for subtype related to spacing (13/14 but most seems to be 0) -- if n.spec.width > 0 then -- threshold if p and p.id == glyph_code then local g = copy_node(p) local c = g.components if c then -- it happens that we copied a ligature free_nodelist(c) g.components = nil g.subtype = 256 end local a = n[a_characters] local s = copy_node(n.spec) g.char, n.spec = 32, s p.next, g.prev = g, p g.next, n.prev = n, g s.width = s.width - g.width if a then g[a_characters] = a end s[a_characters] = 0 n[a_characters] = 0 end -- end elseif id == hlist_code or id == vlist_code then injectspaces(n.list,attribute) -- elseif id == kern_code then -- the backend already collapses -- local first = n -- while true do -- local nn = n.next -- if nn and nn.id == kern_code then -- -- maybe we should delete kerns but who cares at this stage -- first.kern = first.kern + nn.kern -- nn.kern = 0 -- n = nn -- else -- break -- end -- end end p = n n = n.next end return head, true end nodes.handlers.accessibility = injectspaces -- todo: -- local a_hyphenated = attributes.private('hyphenated') -- -- local hyphenated, codes = { }, { } -- -- local function compact(n) -- local t = { } -- for n in traverse_id(glyph_code,n) do -- t[#t+1] = utfchar(n.char) -- check for unicode -- end -- return concat(t,"") -- end -- -- local function injectspans(head) -- for n in traverse_nodes(head) do -- local id = n.id -- if id == disc then -- local r, p = n.replace, n.pre -- if r and p then -- local str = compact(r) -- local hsh = hyphenated[str] -- if not hsh then -- hsh = #codes + 1 -- hyphenated[str] = hsh -- codes[hsh] = str -- end -- n[a_hyphenated] = hsh -- end -- elseif id == hlist_code or id == vlist_code then -- injectspans(n.list) -- end -- end -- return head, true -- end -- -- nodes.injectspans = injectspans -- -- tasks.appendaction("processors", "words", "nodes.injectspans") -- -- local function injectspans(head) -- for n in traverse_nodes(head) do -- local id = n.id -- if id == disc then -- local a = n[a_hyphenated] -- if a then -- local str = codes[a] -- local b = new_pdfliteral(format("/Span << /ActualText %s >> BDC", lpdf.tosixteen(str))) -- local e = new_pdfliteral("EMC") -- node.insert_before(head,n,b) -- node.insert_after(head,n,e) -- end -- elseif id == hlist_code or id == vlist_code then -- injectspans(n.list) -- end -- end -- end