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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
if not modules then modules = { } end modules ['node-pro'] = {
version = 1.001,
comment = "companion to node-ini.tex",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
local utf = unicode.utf8
local format, concat = string.format, table.concat
local trace_callbacks = false trackers.register("nodes.callbacks", function(v) trace_callbacks = v end)
local glyph = node.id('glyph')
local free_node = node.free
local first_character = node.first_character
nodes.processors = nodes.processors or { }
-- vbox: grouptype: vbox vtop output split_off split_keep | box_type: exactly|aditional
-- hbox: grouptype: hbox adjusted_hbox(=hbox_in_vmode) | box_type: exactly|aditional
lists = lists or { }
chars = chars or { }
words = words or { } -- not used yet
local actions = tasks.actions("processors",2) -- head, where, boolean
local n = 0
local function reconstruct(head)
local t = { }
local h = head
while h do
local id = h.id
if id == glyph then
t[#t+1] = utf.char(h.char)
else
t[#t+1] = "[]"
end
h = h.next
end
return concat(t)
end
local function tracer(what,state,head,groupcode,before,after,show)
if not groupcode then
groupcode = "unknown"
elseif groupcode == "" then
groupcode = "mvl"
end
n = n + 1
if show then
texio.write_nl(format("%s %s: %s, group: %s, nodes: %s -> %s, string: %s",what,n,state,groupcode,before,after,reconstruct(head)))
else
texio.write_nl(format("%s %s: %s, group: %s, nodes: %s -> %s",what,n,state,groupcode,before,after))
end
end
nodes.processors.enabled = true -- thsi will become a proper state (like trackers)
function nodes.processors.pre_linebreak_filter(head,groupcode)
local first, found = first_character(head)
if found then
if trace_callbacks then
local before = nodes.count(head,true)
local head, done = actions(head,groupcode)
local after = nodes.count(head,true)
if done then
tracer("pre_linebreak","changed",head,groupcode,before,after,true)
else
tracer("pre_linebreak","unchanged",head,groupcode,before,after,true)
end
return (done and head) or true
else
local head, done = actions(head,groupcode)
return (done and head) or true
end
elseif trace_callbacks then
local n = nodes.count(head,false)
tracer("pre_linebreak","no chars",head,groupcode,n,n)
end
return true
end
function nodes.processors.hpack_filter(head,groupcode)
local first, found = first_character(head)
if found then
if trace_callbacks then
local before = nodes.count(head,true)
local head, done = actions(head,groupcode)
local after = nodes.count(head,true)
if done then
tracer("hpack","changed",head,groupcode,before,after,true)
else
tracer("hpack","unchanged",head,groupcode,before,after,true)
end
return (done and head) or true
else
local head, done = actions(head,groupcode)
return (done and head) or true
end
elseif trace_callbacks then
local n = nodes.count(head,false)
tracer("hpack","no chars",head,groupcode,n,n)
end
return true
end
callback.register('pre_linebreak_filter', nodes.processors.pre_linebreak_filter)
callback.register('hpack_filter' , nodes.processors.hpack_filter)
local actions = tasks.actions("finalizers",2) -- head, where, boolean
-- beware, these are packaged boxes so no first_character test
-- maybe some day a hash with valid groupcodes
--
-- beware, much can pass twice, for instance vadjust passes two times
function nodes.processors.post_linebreak_filter(head,groupcode)
--~ local first, found = first_character(head)
--~ if found then
if trace_callbacks then
local before = nodes.count(head,true)
local head, done = actions(head,groupcode)
local after = nodes.count(head,true)
if done then
tracer("finalizer","changed",head,groupcode,before,after,true)
else
tracer("finalizer","unchanged",head,groupcode,before,after,true)
end
return (done and head) or true
else
local head, done = actions(head,groupcode)
return (done and head) or true
end
--~ elseif trace_callbacks then
--~ local n = nodes.count(head,false)
--~ tracer("finalizer","no chars",head,groupcode,n,n)
--~ end
--~ return true
end
callback.register('post_linebreak_filter', nodes.processors.post_linebreak_filter)
statistics.register("h-node processing time", function()
if statistics.elapsedindeed(nodes) then
return format("%s seconds including kernel", statistics.elapsedtime(nodes))
end
end)
|