attr-alt.lmt /size: 3057 b    last modification: 2021-10-28 13:50
1if not modules then modules = { } end modules ['attr-eff'] = {
2    version   = 1.001,
3    comment   = "companion to attr-eff.mkiv",
4    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5    copyright = "PRAGMA ADE / ConTeXt Development Team",
6    license   = "see context related readme files"
7}
8
9local attributes, nodes, backends, utilities = attributes, nodes, backends, utilities
10local tex = tex
11
12local states            = attributes.states
13local enableaction      = nodes.tasks.enableaction
14local nodeinjections    = backends.nodeinjections
15local texsetattribute   = tex.setattribute
16local allocate          = utilities.storage.allocate
17local setmetatableindex = table.setmetatableindex
18
19local interfaces        = interfaces
20local implement         = interfaces.implement
21
22attributes.alternates   = attributes.alternates or { }
23local alternates        = attributes.alternates
24
25local a_alternate       = attributes.private('alternate')
26
27alternates.data         = allocate()
28alternates.values       = alternates.values     or { }
29alternates.registered   = alternates.registered or { }
30alternates.attribute    = a_alternate
31
32local data              = alternates.data
33local registered        = alternates.registered
34local values            = alternates.values
35
36storage.register("attributes/alternates/registered", registered, "attributes.alternates.registered")
37storage.register("attributes/alternates/values",     values,     "attributes.alternates.values")
38
39local function extender(alternates,key)
40    if key == "none" then
41        local d = nodeinjections.stopalternate()
42        alternates.none = d
43        return d
44    end
45end
46
47local function reviver(data,n)
48    local d = values[n] and nodeinjections.startalternate(values[n]) or nodeinjections.stopalternate()
49    data[n] = d
50    return d
51end
52
53setmetatableindex(alternates,      extender)
54setmetatableindex(alternates.data, reviver)
55
56alternates.handler = nodes.installattributehandler {
57    name        = "alternate",
58    namespace   = alternates,
59    initializer = states.initialize,
60    finalizer   = states.finalize,
61    processor   = states.simple,
62}
63
64local function register(specification)
65    local text = specification.text or "unknown"
66    local n = registered[text]
67    if not n then
68        n = #values + 1
69        values[n] = text
70        registered[text] = n
71    end
72    return n
73end
74
75local enabled = false
76
77local function enable()
78    if not enabled then
79        enableaction("shipouts","attributes.alternates.handler")
80        enabled = true
81    end
82end
83
84alternates.register = register
85alternates.enable   = enable
86
87-- interface
88
89implement {
90    name      = "setalternate",
91    actions   = function(specification)
92        if not enabled then
93            enable()
94        end
95        texsetattribute(a_alternate,register(specification))
96    end,
97    arguments = {
98        {
99            { "text", "string" },
100        }
101    }
102}
103
104implement {
105    name      = "resetalternate",
106    actions   = function()
107        if enabled then
108            texsetattribute(a_alternate)
109        end
110    end
111}
112