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