1if not modules then modules = { } end modules ['attr-neg'] = {
2 version = 1.001,
3 comment = "companion to attr-neg.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
9
10
11
12local format = string.format
13
14local attributes, nodes, utilities, logs, backends = attributes, nodes, utilities, logs, backends
15local commands, context, interfaces = commands, context, interfaces
16local tex = tex
17
18local states = attributes.states
19local enableaction = nodes.tasks.enableaction
20local nodeinjections = backends.nodeinjections
21local texsetattribute = tex.setattribute
22local variables = interfaces.variables
23local allocate = utilities.storage.allocate
24local setmetatableindex = table.setmetatableindex
25
26
27
28attributes.negatives = attributes.negatives or { }
29local negatives = attributes.negatives
30
31local a_negative = attributes.private("negative")
32
33local v_none = interfaces.variables.none
34
35negatives.data = allocate()
36negatives.attribute = a_negative
37
38negatives.registered = allocate {
39 [variables.positive] = 1,
40 [variables.negative] = 2,
41}
42
43local data = negatives.data
44local registered = negatives.registered
45
46local function extender(negatives,key)
47 if key == "none" then
48 local d = data[1]
49 negatives.none = d
50 return d
51 end
52end
53
54local function reviver(data,n)
55 if n == 1 then
56 local d = nodeinjections.positive()
57 data[1] = d
58 return d
59 elseif n == 2 then
60 local d = nodeinjections.negative()
61 data[2] = d
62 return d
63 end
64end
65
66setmetatableindex(negatives, extender)
67setmetatableindex(negatives.data, reviver)
68
69negatives.handler = nodes.installattributehandler {
70 name = "negative",
71 namespace = negatives,
72 initializer = states.initialize,
73 finalizer = states.finalize,
74 processor = states.process,
75}
76
77local function register(stamp)
78 return registered[stamp] or registered.positive
79end
80
81local function enable()
82 enableaction("shipouts","attributes.negatives.handler")
83end
84
85negatives.register = register
86negatives.enable = enable
87
88
89
90local enabled = false
91
92function negatives.set(stamp)
93 if not enabled then
94 enable()
95 enabled = true
96 end
97 texsetattribute(a_negative,register(stamp))
98end
99
100interfaces.implement {
101 name = "setnegative",
102 actions = negatives.set,
103 arguments = "string",
104}
105 |