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
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 |