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
18local formatters = string . formatters
19
20local interfaces = interfaces
21local implement = interfaces . implement
22
23local variables = interfaces . variables
24local v_normal = variables . normal
25
26attributes . effects = attributes . effects or { }
27local effects = attributes . effects
28
29local a_effect = attributes . private ( ' effect ' )
30
31effects . data = allocate ( )
32effects . values = effects . values or { }
33effects . registered = effects . registered or { }
34effects . attribute = a_effect
35
36local data = effects . data
37local registered = effects . registered
38local values = effects . values
39
40local f_stamp = formatters [ " %s:%s:%s " ]
41
42storage . register ( " attributes/effects/registered " , registered , " attributes.effects.registered " )
43storage . register ( " attributes/effects/values " , values , " attributes.effects.values " )
44
45
46
47local function effect ( ... ) effect = nodeinjections . effect return effect ( ... ) end
48
49local function extender ( effects , key )
50 if key = = " none " then
51 local d = effect ( 0 , 0 , 0 )
52 effects . none = d
53 return d
54 end
55end
56
57local function reviver ( data , n )
58 local e = values [ n ]
59 local d = effect ( e [ 1 ] , e [ 2 ] , e [ 3 ] )
60 data [ n ] = d
61 return d
62end
63
64setmetatableindex ( effects , extender )
65setmetatableindex ( effects . data , reviver )
66
67effects . handler = nodes . installattributehandler {
68 name = " effect " ,
69 namespace = effects ,
70 initializer = states . initialize ,
71 finalizer = states . finalize ,
72 processor = states . process ,
73}
74
75local function register ( specification )
76 local alternative , stretch , rulethickness
77 if specification then
78 alternative = specification . alternative or v_normal
79 stretch = specification . stretch or 0
80 rulethickness = specification . rulethickness or 0
81 else
82 alternative = v_normal
83 stretch = 0
84 rulethickness = 0
85 end
86 local stamp = f_stamp ( alternative , stretch , rulethickness )
87 local n = registered [ stamp ]
88 if not n then
89 n = # values + 1
90 values [ n ] = { alternative , stretch , rulethickness }
91 registered [ stamp ] = n
92 end
93 return n
94end
95
96local enabled = false
97
98local function enable ( )
99 if not enabled then
100 enableaction ( " shipouts " , " attributes.effects.handler " )
101 enabled = true
102 end
103end
104
105effects . register = register
106effects . enable = enable
107
108
109
110implement {
111 name = " seteffect " ,
112 actions = function ( specification )
113 if not enabled then
114 enable ( )
115 end
116 texsetattribute ( a_effect , register ( specification ) )
117 end ,
118 arguments = {
119 {
120 { " alternative " , " string " } ,
121 { " stretch " , " integer " } ,
122 { " rulethickness " , " dimen " }
123 }
124 }
125}
126
127implement {
128 name = " reseteffect " ,
129 actions = function ( )
130 if enabled then
131 texsetattribute ( a_effect , register ( ) )
132 end
133 end
134}
135 |