summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/mkxl/node-pro.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkxl/node-pro.lmt')
-rw-r--r--Master/texmf-dist/tex/context/base/mkxl/node-pro.lmt219
1 files changed, 219 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkxl/node-pro.lmt b/Master/texmf-dist/tex/context/base/mkxl/node-pro.lmt
new file mode 100644
index 00000000000..e736f2b76b6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkxl/node-pro.lmt
@@ -0,0 +1,219 @@
+if not modules then modules = { } end modules ['node-pro'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local trace_callbacks = false trackers .register("nodes.callbacks", function(v) trace_callbacks = v end)
+local force_processors = false directives.register("nodes.processors.force", function(v) force_processors = v end)
+
+local report_nodes = logs.reporter("nodes","processors")
+
+local nodes = nodes
+local tasks = nodes.tasks
+local nuts = nodes.nuts
+local tonut = nodes.tonut
+
+nodes.processors = nodes.processors or { }
+local processors = nodes.processors
+
+-- 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
+
+local actions = tasks.actions("processors")
+
+do
+
+ local isglyph = nuts.isglyph
+ local getnext = nuts.getnext
+
+ local utfchar = utf.char
+ local concat = table.concat
+
+ local n = 0
+
+ local function reconstruct(head) -- we probably have a better one
+ local t, n, h = { }, 0, head
+ while h do
+ n = n + 1
+ local char, id = isglyph(h)
+ if char then -- todo: disc etc
+ t[n] = utfchar(char)
+ else
+ t[n] = "[]"
+ end
+ h = getnext(h)
+ end
+ return concat(t)
+ end
+
+ function processors.tracer(what,head,groupcode,before,after,show)
+ if not groupcode then
+ groupcode = "unknown"
+ elseif groupcode == "" then
+ groupcode = "mvl"
+ end
+ n = n + 1
+ if show then
+ report_nodes("%s: location %a, group %a, # before %a, # after %s, stream: %s",what,n,groupcode,before,after,reconstruct(head))
+ else
+ report_nodes("%s: location %a, group %a, # before %a, # after %s",what,n,groupcode,before,after)
+ end
+ end
+
+end
+
+processors.enabled = true -- this will become a proper state (like trackers)
+
+do
+
+ -- local has_glyph = nodes.has_glyph
+ local count_nodes = nodes.countall
+
+ local texget = tex.get
+
+ local tracer = processors.tracer
+
+ -- We've set \hlistcallbackmode=1 so glyph checking happens at the other end!
+
+ local function pre_linebreak_filter(head,groupcode)
+ -- local found = force_processors or has_glyph(head)
+ -- if found then
+ if trace_callbacks then
+ local before = count_nodes(head,true)
+ head = actions(head,groupcode)
+ local after = count_nodes(head,true)
+ tracer("pre_linebreak",head,groupcode,before,after,true)
+ else
+ head = actions(head,groupcode)
+ end
+ -- elseif trace_callbacks then
+ -- local n = count_nodes(head,false)
+ -- tracer("pre_linebreak",head,groupcode,n,n)
+ -- end
+ return head
+ end
+
+ local function hpack_filter(head,groupcode,size,packtype,direction,attributes)
+ -- local found = force_processors or has_glyph(head)
+ -- if found then
+ --
+ -- yes or no or maybe an option
+ --
+ if not direction then
+ direction = texget("textdir")
+ end
+ --
+ if trace_callbacks then
+ local before = count_nodes(head,true)
+ head = actions(head,groupcode,size,packtype,direction,attributes)
+ local after = count_nodes(head,true)
+ tracer("hpack",head,groupcode,before,after,true)
+ else
+ head = actions(head,groupcode,size,packtype,direction,attributes)
+ end
+ -- elseif trace_callbacks then
+ -- local n = count_nodes(head,false)
+ -- tracer("hpack",head,groupcode,n,n)
+ -- end
+ return head
+ end
+
+ processors.pre_linebreak_filter = pre_linebreak_filter
+ processors.hpack_filter = hpack_filter
+
+ do
+
+ local hpack = nodes.hpack
+
+ function nodes.fullhpack(head,...)
+ return hpack((hpack_filter(head)),...)
+ end
+
+ end
+
+ do
+
+ local hpack = nuts.hpack
+
+ function nuts.fullhpack(head,...)
+ return hpack(tonut(hpack_filter(tonode(head))),...)
+ end
+
+ end
+
+ callbacks.register('pre_linebreak_filter', pre_linebreak_filter, "horizontal manipulations (before par break)")
+ callbacks.register('hpack_filter' , hpack_filter, "horizontal manipulations (before hbox creation)")
+
+end
+
+do
+ -- Beware, these are packaged boxes so no first_glyph test needed. Maybe some day I'll add a hash
+ -- with valid groupcodes. Watch out, much can pass twice, for instance vadjust passes two times,
+
+ local actions = tasks.actions("finalizers") -- head, where
+ local count_nodes = nodes.countall
+
+ local tracer = processors.tracer
+
+ local function post_linebreak_filter(head,groupcode)
+ if trace_callbacks then
+ local before = count_nodes(head,true)
+ head = actions(head,groupcode)
+ local after = count_nodes(head,true)
+ tracer("post_linebreak",head,groupcode,before,after,true)
+ else
+ head = actions(head,groupcode)
+ end
+ return head
+ end
+
+ processors.post_linebreak_filter = post_linebreak_filter
+
+ callbacks.register("post_linebreak_filter", post_linebreak_filter,"horizontal manipulations (after par break)")
+
+end
+
+do
+
+ ----- texnest = tex.nest
+ local getnest = tex.getnest
+
+ local getlist = nuts.getlist
+ local setlist = nuts.setlist
+ local getsubtype = nuts.getsubtype
+
+ local linelist_code = nodes.listcodes.line
+
+ local actions = tasks.actions("contributers")
+
+ function processors.contribute_filter(groupcode)
+ if groupcode == "box" then -- "pre_box"
+ local whatever = getnest()
+ if whatever then
+ local line = whatever.tail
+ if line then
+ line = tonut(line)
+ if getsubtype(line) == linelist_code then
+ local head = getlist(line)
+ if head then
+ local result = actions(head,groupcode,line)
+ if result and result ~= head then
+ setlist(line,result)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+
+ callbacks.register("contribute_filter", processors.contribute_filter,"things done with lines")
+
+end
+
+statistics.register("h-node processing time", function()
+ return statistics.elapsedseconds(nodes,"including kernel") -- hm, ok here?
+end)