node-dir.lmt /size: 3202 b    last modification: 2023-12-21 09:44
1if not modules then modules = { } end modules ['node-dir'] = {
2    version   = 1.001,
3    comment   = "companion to node-ini.mkiv",
4    author    = "Hans Hagen",
5    copyright = "PRAGMA ADE / ConTeXt Development Team",
6    license   = "see context related readme files"
7}
8
9local nodes             = nodes
10local nuts              = nodes.nuts
11
12local nodecodes         = nodes.nodecodes
13local hlist_code        = nodecodes.hlist
14local vlist_code        = nodecodes.vlist
15local normaldir_code    = nodes.dircodes.normal
16local line_code         = nodes.listcodes.line
17
18local lefttoright_code  = tex.directioncodes.lefttoright
19
20local getnext           = nuts.getnext
21local getlist           = nuts.getlist
22local getwhd            = nuts.getwhd
23local getwidth          = nuts.getwidth
24local getdirection      = nuts.getdirection
25
26local setlist           = nuts.setlist
27
28local nextdir           = nuts.traversers.dir
29local nextlist          = nuts.traversers.list
30
31local rangedimensions   = nuts.rangedimensions
32local insertbefore      = nuts.insertbefore
33local insertafter       = nuts.insertafter
34
35local new_rule          = nuts.pool.rule
36local new_kern          = nuts.pool.kern
37
38local setcolor          = nodes.tracers.colors.set
39local settransparency   = nodes.tracers.transparencies.set
40
41local function dirdimensions(parent,begindir) -- can be a helper
42    local level = 1
43    for current, subtype in nextdir, getnext(begindir) do
44        if subtype == normaldir_code then -- todo
45            level = level + 1
46        else
47            level = level - 1
48        end
49        if level == 0 then -- does the type matter
50            return (rangedimensions(parent,begindir,current)), current
51        end
52    end
53    return (rangedimensions(parent,begindir)), begindir
54--  return getwidth(parent), begindir
55end
56
57nuts.dirdimensions = dirdimensions
58
59local function colorit(list,current,dir,w,h,d)
60    local rule  = new_rule(w,h,d)
61    local kern  = new_kern(-w)
62    local color = dir == lefttoright_code and "trace:s" or "trace:o"
63    setcolor(rule,color)
64    settransparency(rule,color)
65    list, current = insertbefore(list,current,kern)
66    list, current = insertbefore(list,current,rule)
67    return list, current
68end
69
70
71local function tracedirections(head)
72    for parent, id, subtype, list in nextlist, head do
73        if list then
74            if subtype == line_code then
75                local w, h, d = getwhd(parent)
76                list = colorit(list,list,getdirection(parent),w,h,d)
77                for current in nextdir, list do
78                    local dir, cancel = getdirection(current)
79                    if not cancel then
80                        local width = dirdimensions(parent,current)
81                        list = colorit(list,current,dir,width,h,d)
82                    end
83                end
84            end
85            tracedirections(list)
86        end
87    end
88    return head
89end
90
91nodes.tracers.directions = tracedirections
92
93-- so, not attribute driven, only shipout, so more a document wide tracer, maybe
94-- per page (so keep enabled and delayed disabled
95
96trackers.register("nodes.directions", function(v)
97    nodes.tasks.setaction("shipouts","nodes.tracers.directions",v)
98end)
99