diff options
Diffstat (limited to 'tex/context/base/mkiv/node-met.lua')
-rw-r--r-- | tex/context/base/mkiv/node-met.lua | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/node-met.lua b/tex/context/base/mkiv/node-met.lua index f472d31a9..db079c116 100644 --- a/tex/context/base/mkiv/node-met.lua +++ b/tex/context/base/mkiv/node-met.lua @@ -629,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 |