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)
42 local level = 1
43 for current, subtype in nextdir, getnext(begindir) do
44 if subtype == normaldir_code then
45 level = level + 1
46 else
47 level = level - 1
48 end
49 if level == 0 then
50 return (rangedimensions(parent,begindir,current)), current
51 end
52 end
53 return (rangedimensions(parent,begindir)), begindir
54
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
94
95
96trackers.register("nodes.directions", function(v)
97 nodes.tasks.setaction("shipouts","nodes.tracers.directions",v)
98end)
99 |