summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/node-nut.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/node-nut.lua')
-rw-r--r--tex/context/base/mkiv/node-nut.lua484
1 files changed, 295 insertions, 189 deletions
diff --git a/tex/context/base/mkiv/node-nut.lua b/tex/context/base/mkiv/node-nut.lua
index 1465a6680..7e5c3438b 100644
--- a/tex/context/base/mkiv/node-nut.lua
+++ b/tex/context/base/mkiv/node-nut.lua
@@ -93,8 +93,6 @@ local direct = node.direct
local fastcopy = table.fastcopy
-local texget = tex.get
-
local nodecodes = nodes.nodecodes
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
@@ -119,16 +117,113 @@ nodes.tonut = tonut
-- getters
-nuts.getfield = direct.getfield
-nuts.getnext = direct.getnext
-nuts.getprev = direct.getprev
-nuts.getid = direct.getid
-nuts.getattr = direct.get_attribute or direct.has_attribute or direct.getfield
-nuts.getchar = direct.getchar
-nuts.getfont = direct.getfont
-nuts.getsubtype = direct.getsubtype
-nuts.getlist = direct.getlist -- only hlist and vlist !
-nuts.getleader = direct.getleader
+if not direct.getwhd then
+ local getfield = direct.getfield
+ function direct.getwhd(n)
+ return getfield(n,"width"), getfield(n,"height"), getfield(n,"depth")
+ end
+end
+
+if not direct.setwhd then
+ local setfield = direct.setfield
+ function direct.setwhd(n,w,h,d)
+ setfield(n,"width",w or 0)
+ setfield(n,"height",h or 0)
+ setfield(n,"depth",d or 0)
+ end
+end
+
+if not direct.getcomponents then
+
+ local getfield = direct.getfield
+ local setfield = direct.setfield
+ local setsubtype = direct.setsubtype
+
+ local attributelist_code = nodecodes.attributelist
+
+ function direct.getcomponents(n) return getfield(n,"components") end
+ function direct.setcomponents(n,c) setfield(n,"components",c) end
+ function direct.getkern(n) return getfield(n,"kern") end
+ function direct.getwidth(n) return getfield(n,"width") end
+ function direct.setwidth(n,w) return setfield(n,"width",w) end
+ function direct.getheight(n) return getfield(n,"height") end
+ function direct.setheight(n,h) return setfield(n,"height",h) end
+ function direct.getdepth(n) return getfield(n,"depth") end
+ function direct.setdepth(n,d) return setfield(n,"depth",d) end
+ function direct.getshift(n) return getfield(n,"shift") end
+ function direct.setshift(n,s) return setfield(n,"shift",s) end
+ function direct.getpenalty(n) return getfield(n,"penalty") end
+ function direct.setpenalty(n,p) setfield(n,"penalty",p) end
+ function direct.getdir(n) return getfield(n,"dir") end
+ function direct.setdir(n,p) setfield(n,"dir",p) end
+ function direct.getlanguage(n) return getfield(n,"lang") end
+ function direct.setlanguage(n,l) return setfield(n,"lang",l) end
+ function direct.getattributelist(n) getfield(n,"attr") end
+
+ function direct.getnucleus(n) return getfield(n,"nucleus") end
+ function direct.setnucleus(n,p) return setfield(n,"nucleus",p) end
+ function direct.getsup(n) return getfield(n,"sup") end
+ function direct.setsup(n,p) return setfield(n,"sup",p) end
+ function direct.getsub(n) return getfield(n,"sub") end
+ function direct.setsub(n,p) return setfield(n,"sub",p) end
+
+ function direct.setattributelist(n,a)
+ if a and type(a) ~= attributelist_code then
+ a = getfield(a,"attr")
+ end
+ setfield(n,"attr",a)
+ end
+
+ function direct.setkern(n,k,s)
+ setfield(n,"kern",k)
+ if s then
+ setsubtype(n,s)
+ end
+ end
+
+ function direct.setfont(n,f,c)
+ setfield(n,"font",f)
+ if c then
+ setfield(n,"char",f)
+ end
+ end
+
+ function direct.getoffsets(n)
+ return getfield(n,"xoffset"), getfield(n,"yoffset")
+ end
+
+ function direct.setoffsets(n,x,y)
+ if x then
+ setfield(n,"xoffset",x)
+ end
+ if y then
+ setfield(n,"yoffset",y)
+ end
+ end
+
+end
+
+if LUATEXVERSION < 1.005 then
+ local getfield = direct.getfield
+ function direct.getnucleus(n) return getfield(n,"nucleus") end
+ function direct.getsub (n) return getfield(n,"sub") end
+ function direct.getsup (n) return getfield(n,"sup") end
+end
+
+-- if LUATEXVERSION < 1.004 then
+-- local gc = direct.getcomponents
+-- getcomponents = function(n) local c = gc(n) return c ~= 0 and c or nil end
+-- end
+
+-- local hash = table.setmetatableindex("number")
+-- local ga = direct.get_attribute
+-- function direct.get_attribute(n,a)
+-- hash[a] = hash[a] + 1
+-- return ga(n,a)
+-- end
+-- function nuts.reportattr()
+-- inspect(hash)
+-- end
-- local function track(name)
-- local n = 0
@@ -146,59 +241,58 @@ nuts.getleader = direct.getleader
-- setters
-nuts.setfield = direct.setfield
-nuts.setattr = direct.set_attribute or setfield
-
-nuts.getbox = direct.getbox
-nuts.setbox = direct.setbox
-nuts.getskip = direct.getskip or function(s) return tonut(texget(s)) end
-
-- helpers
-nuts.tostring = direct.tostring
-nuts.copy = direct.copy
-nuts.copy_list = direct.copy_list
-nuts.delete = direct.delete
-nuts.dimensions = direct.dimensions
-nuts.end_of_math = direct.end_of_math
-nuts.flush_list = direct.flush_list
-nuts.flush_node = direct.flush_node
-nuts.free = direct.free
-nuts.insert_after = direct.insert_after
-nuts.insert_before = direct.insert_before
-nuts.hpack = direct.hpack
-nuts.new = direct.new
-nuts.tail = direct.tail
-nuts.traverse = direct.traverse
-nuts.traverse_id = direct.traverse_id
-nuts.traverse_char = direct.traverse_char
-nuts.slide = direct.slide
-nuts.writable_spec = direct.writable_spec
-nuts.vpack = direct.vpack
-nuts.is_node = direct.is_node
-nuts.is_direct = direct.is_direct
-nuts.is_nut = direct.is_direct
-nuts.first_glyph = direct.first_glyph
-nuts.has_glyph = direct.has_glyph or direct.first_glyph
-
-nuts.current_attr = direct.current_attr
-nuts.do_ligature_n = direct.do_ligature_n
-nuts.has_field = direct.has_field
-nuts.last_node = direct.last_node
-nuts.usedlist = direct.usedlist
-nuts.protrusion_skippable = direct.protrusion_skippable
-nuts.write = direct.write
-
-nuts.has_attribute = direct.has_attribute
-nuts.set_attribute = direct.set_attribute
-nuts.unset_attribute = direct.unset_attribute
-
-nuts.protect_glyphs = direct.protect_glyphs
-nuts.protect_glyph = direct.protect_glyph
-nuts.unprotect_glyphs = direct.unprotect_glyphs
-nuts.ligaturing = direct.ligaturing
-nuts.kerning = direct.kerning
-nuts.effective_glue = direct.effective_glue
+nuts.tostring = direct.tostring
+nuts.copy = direct.copy
+nuts.copy_node = direct.copy
+nuts.copy_list = direct.copy_list
+nuts.delete = direct.delete
+nuts.dimensions = direct.dimensions
+nuts.rangedimensions = direct.rangedimensions
+nuts.end_of_math = direct.end_of_math
+nuts.flush = direct.flush_node
+nuts.flush_node = direct.flush_node
+nuts.flush_list = direct.flush_list
+nuts.free = direct.free
+nuts.insert_after = direct.insert_after
+nuts.insert_before = direct.insert_before
+nuts.hpack = direct.hpack
+nuts.new = direct.new
+nuts.tail = direct.tail
+nuts.traverse = direct.traverse
+nuts.traverse_id = direct.traverse_id
+nuts.traverse_char = direct.traverse_char
+nuts.slide = direct.slide
+nuts.writable_spec = direct.writable_spec
+nuts.vpack = direct.vpack
+nuts.is_node = direct.is_node
+nuts.is_direct = direct.is_direct
+nuts.is_nut = direct.is_direct
+nuts.first_glyph = direct.first_glyph
+nuts.has_glyph = direct.has_glyph or direct.first_glyph
+nuts.count = direct.count
+nuts.length = direct.length
+nuts.find_attribute = direct.find_attribute
+nuts.unset_attribute = direct.unset_attribute
+
+nuts.current_attr = direct.current_attr
+nuts.has_field = direct.has_field
+nuts.last_node = direct.last_node
+nuts.usedlist = direct.usedlist
+nuts.protrusion_skippable = direct.protrusion_skippable
+nuts.check_discretionaries = direct.check_discretionaries
+nuts.write = direct.write
+
+nuts.has_attribute = direct.has_attribute
+nuts.set_attribute = direct.set_attribute
+nuts.unset_attribute = direct.unset_attribute
+
+nuts.protect_glyphs = direct.protect_glyphs
+nuts.protect_glyph = direct.protect_glyph
+nuts.unprotect_glyphs = direct.unprotect_glyphs
+nuts.ligaturing = direct.ligaturing
+nuts.kerning = direct.kerning
if not direct.mlist_to_hlist then -- needed
@@ -210,84 +304,115 @@ if not direct.mlist_to_hlist then -- needed
end
-local is_zero_glue = direct.is_zero_glue
-local setglue = direct.setglue
-local getglue = direct.getglue
-
-if not is_zero_glue then
- is_zero_glue = function(n)
- return not n or (
- getfield(n,"width") == 0 and
- getfield(n,"stretch") == 0 and
- getfield(n,"shrink") == 0
- )
- end
- setglue = function(n,width,stretch,shrink,stretch_order,shrink_order)
- setfield(n,"width", width or 0)
- setfield(n,"stretch", stretch or 0)
- setfield(n,"shrink", shrink or 0)
- setfield(n,"stretch_order",stretch_order or 0)
- setfield(n,"shrink_order", shrink_order or 0)
- end
- getglue = function(n)
- return
- getfield(n,"width"), getfield(n,"stretch"), getfield(n,"shrink"),
- getfield(n,"stretch_order"), getfield(n,"shrink_order")
- end
-end
-
-nuts.is_zero_glue = is_zero_glue
-nuts.setglue = setglue
-nuts.getglue = getglue
-
-
--- if not direct.getpre then
---
--- local getfield = nuts.getfield
---
--- function direct.getpre (n) local h, _, _, t = getdisc(n,true) return h, t end
--- function direct.getpost (n) local _, h, _, _, t = getdisc(n,true) return h, t end
--- function direct.getreplace(n) local _, _, h, _, _, t = getdisc(n,true) return h, t end
---
--- end
-
-----.getpre = direct.getpre
-----.getpost = direct.getpost
-----.getreplace = direct.getreplace
-
-nuts.getdisc = direct.getdisc
-nuts.setdisc = direct.setdisc
-nuts.setchar = direct.setchar
-nuts.setnext = direct.setnext
-nuts.setprev = direct.setprev
-nuts.setboth = direct.setboth
-nuts.getboth = direct.getboth
-nuts.setlink = direct.setlink
-nuts.setlist = direct.setlist
-nuts.setleader = direct.setleader
-nuts.setsubtype = direct.setsubtype
-
-nuts.is_char = direct.is_char
-nuts.ischar = direct.is_char
-nuts.is_glyph = direct.is_glyph
-nuts.isglyph = direct.is_glyph
-
-local d_remove_node = direct.remove
-local d_free_node = direct.free
-local d_getfield = direct.getfield
-local d_setfield = direct.setfield
-local d_getnext = direct.getnext
-local d_getprev = direct.getprev
-local d_getid = direct.getid
-local d_getlist = direct.getlist
-local d_find_tail = direct.tail
-local d_insert_after = direct.insert_after
-local d_insert_before = direct.insert_before
-local d_slide = direct.slide
------ d_copy_node = direct.copy
-local d_traverse = direct.traverse
-local d_setlink = direct.setlink
-local d_setboth = direct.setboth
+nuts.getfield = direct.getfield
+nuts.setfield = direct.setfield
+
+nuts.getnext = direct.getnext
+nuts.setnext = direct.setnext
+
+nuts.getid = direct.getid
+
+nuts.getprev = direct.getprev
+nuts.setprev = direct.setprev
+
+nuts.getattr = direct.get_attribute
+nuts.setattr = direct.set_attribute
+nuts.takeattr = direct.unset_attribute -- ?
+
+nuts.is_zero_glue = direct.is_zero_glue
+nuts.effective_glue = direct.effective_glue
+
+nuts.getglue = direct.getglue
+nuts.setglue = direct.setglue
+
+nuts.getdisc = direct.getdisc
+nuts.setdisc = direct.setdisc
+nuts.getdiscretionary = direct.getdisc
+nuts.setdiscretionary = direct.setdisc
+
+nuts.getwhd = direct.getwhd
+nuts.setwhd = direct.setwhd
+nuts.getwidth = direct.getwidth
+nuts.setwidth = direct.setwidth
+nuts.getheight = direct.getheight
+nuts.setheight = direct.setheight
+nuts.getdepth = direct.getdepth
+nuts.setdepth = direct.setdepth
+nuts.getshift = direct.getshift
+nuts.setshift = direct.setshift
+
+nuts.getnucleus = direct.getnucleus
+nuts.setnucleus = direct.setnucleus
+nuts.getsup = direct.getsup
+nuts.setsup = direct.setsup
+nuts.getsub = direct.getsub
+nuts.setsub = direct.setsub
+
+nuts.getchar = direct.getchar
+nuts.setchar = direct.setchar
+nuts.getfont = direct.getfont
+nuts.setfont = direct.setfont
+
+nuts.getboth = direct.getboth
+nuts.setboth = direct.setboth
+nuts.setlink = direct.setlink
+nuts.setsplit = direct.setsplit
+
+nuts.getlist = direct.getlist -- only hlist and vlist !
+nuts.setlist = direct.setlist
+nuts.getleader = direct.getleader
+nuts.setleader = direct.setleader
+nuts.getcomponents = direct.getcomponents
+nuts.setcomponents = direct.setcomponents
+
+nuts.getsubtype = direct.getsubtype
+nuts.setsubtype = direct.setsubtype
+
+nuts.getlang = direct.getlang
+nuts.setlang = direct.setlang
+nuts.getlanguage = direct.getlang
+nuts.setlanguage = direct.setlang
+
+nuts.getattrlist = direct.getattributelist
+nuts.setattrlist = direct.setattributelist
+nuts.getattributelist = direct.getattributelist
+nuts.setattributelist = direct.setattributelist
+
+nuts.getoffsets = direct.getoffsets
+nuts.setoffsets = direct.setoffsets
+
+nuts.getkern = direct.getkern
+nuts.setkern = direct.setkern
+
+nuts.getdir = direct.getdir
+nuts.setdir = direct.setdir
+
+nuts.getpenalty = direct.getpenalty
+nuts.setpenalty = direct.setpenalty
+
+nuts.getbox = direct.getbox
+nuts.setbox = direct.setbox
+
+nuts.is_char = direct.is_char
+nuts.ischar = direct.is_char
+nuts.is_glyph = direct.is_glyph
+nuts.isglyph = direct.is_glyph
+
+local d_remove_node = direct.remove
+local d_flush_node = direct.flush_node
+local d_getnext = direct.getnext
+local d_getprev = direct.getprev
+local d_getid = direct.getid
+local d_getlist = direct.getlist
+local d_find_tail = direct.tail
+local d_insert_after = direct.insert_after
+local d_insert_before = direct.insert_before
+local d_slide = direct.slide
+----- d_copy_node = direct.copy
+local d_traverse = direct.traverse
+local d_setlink = direct.setlink
+local d_setboth = direct.setboth
+local d_getboth = direct.getboth
local function remove(head,current,free_too)
local t = current
@@ -295,7 +420,7 @@ local function remove(head,current,free_too)
if not t then
-- forget about it
elseif free_too then
- d_free_node(t)
+ d_flush_node(t)
t = nil
else
d_setboth(t) -- (t,nil,nil)
@@ -303,6 +428,11 @@ local function remove(head,current,free_too)
return head, current, t
end
+-- alias
+
+nuts.getsurround = nuts.getkern
+nuts.setsurround = nuts.setkern
+
-- bad: we can have prev's being glue_spec
nuts.remove = remove
@@ -316,32 +446,35 @@ function nuts.replace(head,current,new) -- no head returned if false
head, current, new = false, head, current
end
local prev, next = d_getboth(current)
- if next then
- d_setlink(new,next)
- end
- if prev then
- d_setlink(new,prev)
+-- if next then
+-- d_setlink(new,next)
+-- end
+-- if prev then
+-- d_setlink(prev,new)
+-- end
+ if prev or next then
+ d_setlink(prev,new,next)
end
if head then
if head == current then
head = new
end
- d_free_node(current)
+ d_flush_node(current)
return head, new
else
- d_free_node(current)
+ d_flush_node(current)
return new
end
end
-local function count(stack,flat)
+local function countall(stack,flat)
local n = 0
while stack do
local id = d_getid(stack)
if not flat and id == hlist_code or id == vlist_code then
local list = d_getlist(stack)
if list then
- n = n + 1 + count(list) -- self counts too
+ n = n + 1 + countall(list) -- self counts too
else
n = n + 1
end
@@ -353,7 +486,11 @@ local function count(stack,flat)
return n
end
-nuts.count = count
+nuts.countall = countall
+
+function nodes.countall(stack,flat)
+ return countall(tonut(stack),flat)
+end
function nuts.append(head,current,...)
for i=1,select("#",...) do
@@ -369,7 +506,7 @@ function nuts.prepend(head,current,...)
return head, current
end
-function nuts.linked(...)
+function nuts.linked(...) -- slides !
local head, last
for i=1,select("#",...) do
local next = select(i,...)
@@ -719,41 +856,10 @@ function nuts.copy_properties(source,target,what)
return newprops -- for checking
end
--- a bit special
-
-local getwidth = { }
-local setwidth = { }
-local getdimensions = { }
-local setdimensions = { }
-
-nodes.whatsitters = {
- getters = { width = getwidth, dimensions = getdimensions },
- setters = { width = setwidth, dimensions = setdimensions },
-}
-
--- obsolete
+-- here:
--- local function get_width(n,dir)
--- n = tonut(n)
--- return getfield(n,"width")
--- end
---
--- local function get_dimensions(n,dir)
--- n = tonut(n)
--- return getfield(n,"width"), getfield(n,"height"), getfield(n,"depth")
--- end
---
--- local whatcodes = nodes.whatcodes
--- local pdfrefximage_code = whatcodes.pdfrefximage
--- local pdfrefxform_code = whatcodes.pdfrefxform
---
--- if pdfrefxform_code then
--- getwidth [pdfrefxform_code ] = get_width
--- getdimensions[pdfrefxform_code ] = get_dimensions
--- end
---
--- if pdfrefximage_code then
--- getwidth [pdfrefximage_code] = get_width
--- getdimensions[pdfrefximage_code] = get_dimensions
--- end
+nodes.set_synctex_line = node.set_synctex_line
+nodes.set_synctex_tag = node.set_synctex_tag
+nuts.get_synctex_fields = direct.get_synctex_fields
+nuts.set_synctex_fields = direct.set_synctex_fields