diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/font-nod.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/font-nod.lua | 118 |
1 files changed, 73 insertions, 45 deletions
diff --git a/Master/texmf-dist/tex/context/base/font-nod.lua b/Master/texmf-dist/tex/context/base/font-nod.lua index f99130279d1..8251dc58842 100644 --- a/Master/texmf-dist/tex/context/base/font-nod.lua +++ b/Master/texmf-dist/tex/context/base/font-nod.lua @@ -41,11 +41,6 @@ tracers.characters = char_tracers local step_tracers = tracers.steppers or { } tracers.steppers = step_tracers -local copy_node_list = node.copy_list -local hpack_node_list = node.hpack -local free_node_list = node.flush_list -local traverse_nodes = node.traverse - local nodecodes = nodes.nodecodes local whatcodes = nodes.whatcodes @@ -57,12 +52,32 @@ local glue_code = nodecodes.glue local kern_code = nodecodes.kern local rule_code = nodecodes.rule local whatsit_code = nodecodes.whatsit -local spec_code = nodecodes.glue_spec local localpar_code = whatcodes.localpar local dir_code = whatcodes.dir -local nodepool = nodes.pool +local nuts = nodes.nuts +local tonut = nuts.tonut +local tonode = nuts.tonode + +local getfield = nuts.getfield +local setfield = nuts.setfield +local getnext = nuts.getnext +local getprev = nuts.getprev +local getid = nuts.getid +local getfont = nuts.getfont +local getsubtype = nuts.getsubtype +local getchar = nuts.getchar +local getlist = nuts.getlist +local setbox = nuts.setbox + +local copy_node_list = nuts.copy_list +local hpack_node_list = nuts.hpack +local free_node_list = nuts.flush_list +local traverse_nodes = nuts.traverse +local protect_glyphs = nuts.protect_glyphs + +local nodepool = nuts.pool local new_glyph = nodepool.glyph local formatters = string.formatters @@ -77,16 +92,17 @@ local fontproperties = hashes.properties local fontparameters = hashes.parameters function char_tracers.collect(head,list,tag,n) + head = tonut(head) n = n or 0 local ok, fn = false, nil while head do - local id = head.id + local id = getid(head) if id == glyph_code then - local f = head.font + local f = getfont(head) if f ~= fn then ok, fn = false, f end - local c = head.char + local c = getchar(head) local i = fontidentifiers[f].indices[c] or 0 if not ok then ok = true @@ -101,7 +117,7 @@ function char_tracers.collect(head,list,tag,n) else ok = false end - head = head.next + head = getnext(head) end end @@ -160,12 +176,12 @@ function char_tracers.indices(t,decimal) end function char_tracers.start() - local npc = handlers.characters + local npc = handlers.characters -- should accept nuts too local list = { } function handlers.characters(head) local n = #list char_tracers.collect(head,list,'before',n) - local h, d = npc(head) + local h, d = npc(tonode(head)) -- for the moment tonode char_tracers.collect(head,list,'after',n) if #list > n then list[#list+1] = { } @@ -232,7 +248,8 @@ end function step_tracers.glyphs(n,i) local c = collection[i] if c then - tex.box[n] = hpack_node_list(copy_node_list(c)) + local b = hpack_node_list(copy_node_list(c)) -- multiple arguments + setbox(n,b) end end @@ -240,8 +257,8 @@ function step_tracers.features() -- we cannot use first_glyph here as it only finds characters with subtype < 256 local f = collection[1] while f do - if f.id == glyph_code then - local tfmdata, t = fontidentifiers[f.font], { } + if getid(f) == glyph_code then + local tfmdata, t = fontidentifiers[getfont(f)], { } for feature, value in table.sortedhash(tfmdata.shared.features) do if feature == "number" or feature == "features" then -- private @@ -262,22 +279,24 @@ function step_tracers.features() end return end - f = f.next + f = getnext(f) end end function tracers.fontchar(font,char) local n = new_glyph() - n.font, n.char, n.subtype = font, char, 256 - context(n) + setfield(n,"font",font) + setfield(n,"char",char) + setfield(n,"subtype",256) + context(tonode(n)) end function step_tracers.font(command) local c = collection[1] while c do - local id = c.id + local id = getid(c) if id == glyph_code then - local font = c.font + local font = getfont(c) local name = file.basename(fontproperties[font].filename or "unknown") local size = fontparameters[font].size or 0 if command then @@ -287,7 +306,7 @@ function step_tracers.font(command) end return else - c = c.next + c = getnext(c) end end end @@ -295,22 +314,22 @@ end function step_tracers.codes(i,command) local c = collection[i] while c do - local id = c.id + local id = getid(c) if id == glyph_code then if command then - local f, c = c.font,c.char + local f, c = getfont(c), getchar(c) local d = fontdescriptions[f] local d = d and d[c] context[command](f,c,d and d.class or "") else - context("[%s:U+%04X]",c.font,c.char) + context("[%s:U+%04X]",getfont(c),getchar(c)) end - elseif id == whatsit_code and (c.subtype == localpar_code or c.subtype == dir_code) then - context("[%s]",c.dir) + elseif id == whatsit_code and (getsubtype(c) == localpar_code or getsubtype(c) == dir_code) then + context("[%s]",getfield(c,"dir")) else context("[%s]",nodecodes[id]) end - c = c.next + c = getnext(c) end end @@ -336,9 +355,10 @@ end function step_tracers.check(head) if collecting then step_tracers.reset() - local n = copy_node_list(head) + local n = copy_node_list(tonut(head)) injections.handler(n,nil,"trace",true) - handlers.protectglyphs(n) -- can be option + -- handlers.protectglyphs(n) -- can be option + protect_glyphs(n) collection[1] = n end end @@ -347,9 +367,10 @@ function step_tracers.register(head) if collecting then local nc = #collection+1 if messages[nc] then - local n = copy_node_list(head) + local n = copy_node_list(tonut(head)) injections.handler(n,nil,"trace",true) - handlers.protectglyphs(n) -- can be option + -- handlers.protectglyphs(n) -- can be option + protect_glyphs(n) collection[nc] = n end end @@ -372,21 +393,28 @@ local threshold = 65536 local function toutf(list,result,nofresult,stopcriterium) if list then - for n in traverse_nodes(list) do - local id = n.id + for n in traverse_nodes(tonut(list)) do + local id = getid(n) if id == glyph_code then - local components = n.components + local components = getfield(n,"components") if components then result, nofresult = toutf(components,result,nofresult) else - local c = n.char - local fc = fontcharacters[n.font] + local c = getchar(n) + local fc = fontcharacters[getfont(n)] if fc then - local u = fc[c].tounicode - if u then - for s in gmatch(u,"....") do + local fcc = fc[c] + if fcc then + -- == fromunicode + local u = fcc.tounicode + if u then + for s in gmatch(u,"....") do + nofresult = nofresult + 1 + result[nofresult] = utfchar(tonumber(s,16)) + end + else nofresult = nofresult + 1 - result[nofresult] = utfchar(tonumber(s,16)) + result[nofresult] = utfchar(c) end else nofresult = nofresult + 1 @@ -394,23 +422,23 @@ local function toutf(list,result,nofresult,stopcriterium) end else nofresult = nofresult + 1 - result[nofresult] = utfchar(c) + result[nofresult] = f_unicode(c) end end elseif id == disc_code then - result, nofresult = toutf(n.replace,result,nofresult) -- needed? + result, nofresult = toutf(getfield(n,"replace"),result,nofresult) -- needed? elseif id == hlist_code or id == vlist_code then -- if nofresult > 0 and result[nofresult] ~= " " then -- nofresult = nofresult + 1 -- result[nofresult] = " " -- end - result, nofresult = toutf(n.list,result,nofresult) + result, nofresult = toutf(getlist(n),result,nofresult) elseif id == glue_code then if nofresult > 0 and result[nofresult] ~= " " then nofresult = nofresult + 1 result[nofresult] = " " end - elseif id == kern_code and n.kern > threshold then + elseif id == kern_code and getfield(n,"kern") > threshold then if nofresult > 0 and result[nofresult] ~= " " then nofresult = nofresult + 1 result[nofresult] = " " |