diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkiv/node-met.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkiv/node-met.lua | 246 |
1 files changed, 231 insertions, 15 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-met.lua b/Master/texmf-dist/tex/context/base/mkiv/node-met.lua index 574c71f60fd..db079c11628 100644 --- a/Master/texmf-dist/tex/context/base/mkiv/node-met.lua +++ b/Master/texmf-dist/tex/context/base/mkiv/node-met.lua @@ -322,19 +322,6 @@ function nodes.concat(list) -- consider tail instead of slide return head, tail end ---[[ -<p>At some point we ran into a problem that the glue specification -of the zeropoint dimension was overwritten when adapting a glue spec -node. This is a side effect of glue specs being shared. After a -couple of hours tracing and debugging Taco and I came to the -conclusion that it made no sense to complicate the spec allocator -and settled on a writable flag. This all is a side effect of the -fact that some glues use reserved memory slots (with the zeropoint -glue being a noticeable one). So, next we wrap this into a function -and hide it for the user. And yes, LuaTeX now gives a warning as -well.</p> -]]-- - function nodes.reference(n) return n and tonut(n) or "<none>" end @@ -601,8 +588,7 @@ local keys = { whatsit = whatsitkeys } local messyhack = table.tohash { -- temporary solution nodecodes.attributelist, nodecodes.attribute, - nodecodes.gluespec, - nodecodes.action, + nodecodes.action, -- hm } setmetatableindex(keys,function(t,k) @@ -643,3 +629,233 @@ end nodes.keys = keys -- [id][subtype] nodes.fields = nodefields -- (n) + +if not nodes.count then + + local type = type + + local direct = node.direct + local todirect = direct.tovaliddirect + local tonode = direct.tonode + + local count = direct.count + local length = direct.length + local slide = direct.slide + + function node.count(id,first,last) + return count(id,first and todirect(first), last and todirect(last) or nil) + end + + function node.length(first,last) + return length(first and todirect(first), last and todirect(last) or nil) + end + + function node.slide(n) + if n then + n = slide(todirect(n)) + if n then + return tonode(n) + end + end + return nil + end + + local hyphenating = direct.hyphenating + local ligaturing = direct.ligaturing + local kerning = direct.kerning + + -- kind of inconsistent + + function node.hyphenating(first,last) + if first then + local h, t = hyphenating(todirect(first), last and todirect(last) or nil) + return h and tonode(h) or nil, t and tonode(t) or nil, true + else + return nil, false + end + end + + function node.ligaturing(first,last) + if first then + local h, t = ligaturing(todirect(first), last and todirect(last) or nil) + return h and tonode(h) or nil, t and tonode(t) or nil, true + else + return nil, false + end + end + + function node.kerning(first,last) + if first then + local h, t = kerning(todirect(first), last and todirect(last) or nil) + return h and tonode(h) or nil, t and tonode(t) or nil, true + else + return nil, false + end + end + + local protect_glyph = direct.protect_glyph + local unprotect_glyph = direct.unprotect_glyph + local protect_glyphs = direct.protect_glyphs + local unprotect_glyphs = direct.unprotect_glyphs + + function node.protect_glyphs(first,last) + protect_glyphs(todirect(first), last and todirect(last) or nil) + end + + function node.unprotect_glyphs(first,last) + unprotect_glyphs(todirect(first), last and todirect(last) or nil) + end + + function node.protect_glyph(first) + protect_glyph(todirect(first)) + end + + function node.unprotect_glyph(first) + unprotect_glyph(todirect(first)) + end + + local flatten_discretionaries = direct.flatten_discretionaries + local check_discretionaries = direct.check_discretionaries + local check_discretionary = direct.check_discretionary + + function node.flatten_discretionaries(first) + local h, count = flatten_discretionaries(todirect(first)) + return tonode(h), count + end + + function node.check_discretionaries(n) + check_discretionaries(todirect(n)) + end + + function node.check_discretionary(n) + check_discretionary(todirect(n)) + end + + local hpack = direct.hpack + local vpack = direct.vpack + local list_to_hlist = direct.mlist_to_hlist + + function node.hpack(head,...) + local h, badness = hpack(head and todirect(head) or nil,...) + return tonode(h), badness + end + + function node.vpack(head,...) + local h, badness = vpack(head and todirect(head) or nil,...) + return tonode(h), badness + end + + function node.mlist_to_hlist(head,...) + return tonode(mlist_to_hlist(head and todirect(head) or nil,...)) + end + + local end_of_math = direct.end_of_math + local find_attribute = direct.find_attribute + local first_glyph = direct.first_glyph + + function node.end_of_math(n) + if n then + n = end_of_math(todirect(n)) + if n then + return tonode(n) + end + end + return nil + end + + function node.find_attribute(n,a) + if n then + local v, n = find_attribute(todirect(n),a) + if n then + return v, tonode(n) + end + end + return nil + end + + function node.first_glyph(first,last) + local n = first_glyph(todirect(first), last and todirect(last) or nil) + return n and tonode(n) or nil + end + + local dimensions = direct.dimensions + local rangedimensions = direct.rangedimensions + local effective_glue = direct.effective_glue + + function node.dimensions(a,b,c,d,e) + if type(a) == "userdata" then + a = todirect(a) + if type(b) == "userdata" then + b = todirect(b) + end + return dimensions(a,b) + else + d = todirect(d) + if type(e) == "userdata" then + e = todirect(e) + end + return dimensions(a,b,c,d,e) + end + return 0, 0, 0 + end + + function node.rangedimensions(parent,first,last) + return rangedimenensions(todirect(parent),todirect(first),last and todirect(last)) + end + + function node.effective_glue(list,parent) + return effective_glue(list and todirect(list) or nil,parent and todirect(parent) or nil) + end + + local uses_font = direct.uses_font + local has_glyph = direct.has_glyph + local protrusion_skippable = direct.protrusion_skippable + local prepend_prevdepth = direct.prepend_prevdepth + local make_extensible = direct.make_extensible + + function node.uses_font(n,f) + return uses_font(todirect(n),f) + end + + function node.has_glyph(n) + return has_glyph(todirect(n)) + end + + function node.protrusion_skippable(n) + return protrusion_skippable(todirect(n)) + end + + function node.prepend_prevdepth(n) + local n, d = prepend_prevdepth(todirect(n)) + return tonode(n), d + end + + function node.make_extensible(...) + local n = make_extensible(...) + return n and tonode(n) or nil + end + + local last_node = direct.last_node + + function node.last_node() + local n = last_node() + return n and tonode(n) or nil + end + + local is_zero_glue = direct.is_zero_glue + local getglue = direct.getglue + local setglue = direct.setglue + + function node.is_zero_glue(n) + return is_zero_glue(todirect(n)) + end + + function node.get_glue(n) + return get_glue(todirect(n)) + end + + function node.set_glue(n) + return set_glue(todirect(n)) + end + +end |