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
|
if not modules then modules = { } end modules ['node-acc'] = {
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"
}
-- see mkiv lua module for some experimental unused code
local nodes, node = nodes, node
local tasks = nodes.tasks
local nuts = nodes.nuts
local tonut = nodes.tonut
local tonode = nodes.tonode
local getid = nuts.getid
local getsubtype = nuts.getsubtype
local getattr = nuts.getattr
local getlist = nuts.getlist
local getchar = nuts.getchar
local getnext = nuts.getnext
local setattr = nuts.setattr
local setlink = nuts.setlink
local setchar = nuts.setchar
local setsubtype = nuts.setsubtype
local getwidth = nuts.getwidth
local setwidth = nuts.setwidth
local nextglyph = nuts.traversers.glyph
local nextnode = nuts.traversers.node
local copy_node = nuts.copy
local insert_after = nuts.insert_after
local nodecodes = nodes.nodecodes
local gluecodes = nodes.gluecodes
local glue_code = nodecodes.glue
local glyph_code = nodecodes.glyph
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
local userskip_code = gluecodes.user
local spaceskip_code = gluecodes.spaceskip
local xspaceskip_code = gluecodes.xspaceskip
local a_characters = attributes.private("characters")
local nofreplaced = 0
-- todo: nbsp etc
-- todo: collapse kerns (not needed, backend does this)
-- todo: maybe cache as we now create many nodes
-- todo: check for subtype related to spacing (13/14 but most seems to be user anyway)
local trace = false trackers.register("backend.spaces", function(v) trace = v end)
local slot = nil
local function injectspaces(head)
-- This can become two fast loops or we just move this to the backend where we can
-- also check for spaces (it actually is rather old code that relates to tagging
-- and so, which was implemented rather early in the mkiv saga).
local p, p_id
local n = head
while n do
local id = getid(n)
if id == glue_code then
if p and getid(p) == glyph_code then
local s = getsubtype(n)
if s == spaceskip_code or s == xspaceskip_code then
local g = copy_node(p)
local a = getattr(n,a_characters)
setchar(g,slot)
setlink(p,g,n)
setwidth(n,getwidth(n) - getwidth(g))
if a then
setattr(g,a_characters,a)
end
setattr(n,a_characters,0)
nofreplaced = nofreplaced + 1
end
end
elseif id == hlist_code or id == vlist_code then
injectspaces(getlist(n),slot)
end
p_id = id
p = n
n = getnext(n)
end
return head
end
nodes.handlers.accessibility = function(head)
if trace then
if not slot then
slot = fonts.helpers.privateslot("visualspace")
end
else
slot = 32
end
return injectspaces(head,slot)
end
statistics.register("inserted spaces in output",function()
if nofreplaced > 0 then
return nofreplaced
end
end)
|