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