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