diff options
Diffstat (limited to 'tex/context/base/mkxl/typo-ada.lmt')
-rw-r--r-- | tex/context/base/mkxl/typo-ada.lmt | 118 |
1 files changed, 89 insertions, 29 deletions
diff --git a/tex/context/base/mkxl/typo-ada.lmt b/tex/context/base/mkxl/typo-ada.lmt index 813c3ada2..17e18f01e 100644 --- a/tex/context/base/mkxl/typo-ada.lmt +++ b/tex/context/base/mkxl/typo-ada.lmt @@ -7,25 +7,33 @@ if not modules then modules = { } end modules ['typo-adj'] = { license = "see context related readme files" } -local setdimen = tex.setdimen -local setcount = tex.setcount -local setmacro = tokens.setters.macro -local expandmacro = token.expandmacro +local setdimen = tex.setdimen +local setcount = tex.setcount +local setmacro = tokens.setters.macro +local expandmacro = token.expandmacro -local nuts = nodes.nuts -local getwhd = nuts.getwhd -local getattr = nuts.getattr -local getwidth = nuts.getwidth -local setlist = nuts.setlist -local setlink = nuts.setlink -local setstate = nuts.setstate +local nuts = nodes.nuts +local getid = nuts.getid +local getlist = nuts.getlist +local getwhd = nuts.getwhd +local getattr = nuts.getattr +local getwidth = nuts.getwidth +local setlist = nuts.setlist +local setlink = nuts.setlink +local setstate = nuts.setstate +local setattr = nuts.setattr -local takebox = nuts.takebox +local hlist_code = nodes.nodecodes.hlist +local vlist_code = nodes.nodecodes.vlist -local new_kern = nuts.pool.kern +local getbox = nuts.getbox +local takebox = nuts.takebox -local traverselist = node.direct.traverselist -local traverseleader = node.direct.traverseleader +local new_kern = nuts.pool.kern + +local flattenleaders = nuts.flattenleaders +local traverselist = nuts.traverselist +local traverseleader = nuts.traverseleader local a_adaptive = attributes.private("adaptive") @@ -42,7 +50,8 @@ local enableaction = nodes.tasks.enableaction function adaptive.set(settings) if not enabled then - enableaction("vboxbuilders","nodes.adaptive.handle") + enableaction("vboxbuilders","nodes.adaptive.handlehorizontal") + enableaction("vboxhandlers","nodes.adaptive.handlevertical") enabled = true end texsetattribute(a_adaptive,registervalue(a_adaptive,settings)) @@ -58,30 +67,63 @@ end local methods = { -- overlay - [1] = function(settings,hlist,list) + [1] = function(settings,parent,list) local setups = settings.setups if setups and setups ~= "" then - local w, h, d = getwhd(hlist) + local w, h, d = getwhd(parent) setadaptive(w,h,d,settings.rulethickness,settings.color) expandmacro("setup",true,setups) local l = takebox("b_adaptive_box") if l then - setlist(hlist, setlink(l,new_kern(-getwidth(l)),list)) + setlist(parent, setlink(l,new_kern(-getwidth(l)),list)) end end end } -function adaptive.handle(n) +-- The hlist leaders get done before we enter vpacking, so that is where the +-- first call kicks in. Then we do a vpack (so one can indeed also adapt the +-- ht/dp). After packing we know the glue and do the vlist leaders. + +local function handlehorizontal(n) + if hasvalues(a_adaptive) then + for _, t, _, l in traverselist(n) do + if t == hlist_code then + for m, _, _, ll in traverseleader(l) do + local a = getattr(m,a_adaptive) + if a then + local settings = getvalue(a_adaptive,a) + if settings then + setstate(m,0) + local action = methods[settings.method or 1] + if action then + action(settings,m,ll) + end + end + end + end + end + end + end + return n +end + +local function handlevertical(n) if hasvalues(a_adaptive) then - for _, _, _, l in traverselist(n) do - for m, _, _, ll in traverseleader(l) do - local settings = getvalue(a_adaptive,getattr(m,a_adaptive)) - if settings then - setstate(m,0) - local action = methods[settings.method or 1] - if action then - action(settings,m,ll) + -- not a list just a node + for nn, t, _, l in traverselist(n) do + if t == vlist_code then + for m, _, _, ll in traverseleader(l) do + local a = getattr(m,a_adaptive) + if a then + local settings = getvalue(a_adaptive,a) + if settings then + setstate(m,0) + local action = methods[settings.method or 1] + if action then + action(settings,m,ll) + end + end end end end @@ -90,6 +132,9 @@ function adaptive.handle(n) return n end +adaptive.handlehorizontal = handlehorizontal +adaptive.handlevertical = handlevertical + interfaces.implement { name = "setadaptive", actions = adaptive.set, @@ -104,4 +149,19 @@ interfaces.implement { } } -nodes.tasks.prependaction("vboxbuilders", "normalizers", "nodes.adaptive.handle", nil, "nut", "disabled") +interfaces.implement { + name = "adaptivecheckbox", + arguments = "integer", + public = true, + protected = true, + actions = function(n) + local b = getbox(n) + if b and flattenleaders(b) > 0 then + if getid(b) == hlist_code then + handlehorizontal(b) + else + handlevertical(b) + end + end + end, +} |