summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/node-acc.lmt
blob: 328074428d06a04f744da51e12b32f88c4cfc0dd (plain)
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
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 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)