1if not modules then modules = { } end modules [ ' typo-ovl ' ] = {
2 version = 1 . 001 ,
3 comment = " companion to typo-ovl.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
12
13
14
15local next , type = next , type
16
17local context = context
18
19local nuts = nodes . nuts
20local tonut = nodes . tonut
21local tonode = nodes . tonode
22
23local nodecodes = nodes . nodecodes
24local glyph_code = nodecodes . glyph
25local disc_code = nodecodes . disc
26
27local getnext = nuts . getnext
28local getid = nuts . getid
29local getdisc = nuts . getdisc
30local getattr = nuts . getattr
31local setattr = nuts . setattr
32local getattrlist = nuts . getattrlist
33local setattrlist = nuts . setattrlist
34local getfield = nuts . getfield
35local setfont = nuts . setfont
36
37local nextnode = nuts . traversers . node
38
39local unsetvalue = attributes . unsetvalue
40local prvattribute = attributes . private
41
42local texgetbox = tex . getbox
43local currentfont = font . current
44
45local a_overloads = attributes . private ( " overloads " )
46local n_overloads = 0
47local t_overloads = { }
48
49local overloaded = { }
50
51local function markasoverload ( a )
52 local n = prvattribute ( a )
53 if n then
54 overloaded [ n ] = a
55 end
56end
57
58attributes . markasoverload = markasoverload
59
60markasoverload ( " color " )
61markasoverload ( " colormodel " )
62markasoverload ( " transparency " )
63markasoverload ( " case " )
64markasoverload ( " negative " )
65markasoverload ( " effect " )
66markasoverload ( " ruled " )
67markasoverload ( " shifted " )
68markasoverload ( " kernchars " )
69markasoverload ( " kern " )
70markasoverload ( " noligature " )
71markasoverload ( " viewerlayer " )
72
73local function tooverloads ( n )
74 local current = tonut ( n )
75 local a = getattrlist ( current )
76 local s = { }
77 while a do
78 local n = getfield ( a , " number " )
79 local o = overloaded [ n ]
80 if o then
81 local v = getfield ( a , " value " )
82 if v ~ = unsetvalue then
83 s [ n ] = v
84
85 end
86 end
87 a = getnext ( a )
88 end
89 return s
90end
91
92attributes . tooverloads = tooverloads
93
94function attributes . applyoverloads ( specification , start , stop )
95 local start = tonut ( start )
96 local processor = specification . processor
97 local overloads = specification . processor or getattr ( start , a_overloads )
98 if overloads and overloads ~ = unsetvalue then
99 overloads = t_overloads [ overloads ]
100 if not overloads then
101 return
102 end
103 else
104 return
105 end
106
107 local last = stop and tonut ( stop )
108 local oldlist = nil
109 local newlist = nil
110 local newfont = overloads . font
111
112 local function apply ( current )
113 local a = getattrlist ( current )
114 if a = = oldlist then
115 setattrlist ( current , newlist )
116 else
117 oldlist = getattrlist ( current )
118 for k , v in next , overloads do
119 if type ( v ) = = " number " then
120 setattr ( current , k , v )
121 else
122
123 end
124 end
125 newlist = current
126 end
127 if newfont then
128 setfont ( current , newfont )
129 end
130 end
131
132 for current , id in nextnode , start do
133 if id = = glyph_code then
134 apply ( current )
135 elseif id = = disc_code then
136 apply ( current )
137 if pre then
138 while pre do
139 if getid ( pre ) = = glyph_code then
140 apply ( )
141 end
142 pre = getnext ( pre )
143 end
144 end
145 if post then
146 while post do
147 if getid ( post ) = = glyph_code then
148 apply ( )
149 end
150 post = getnext ( post )
151 end
152 end
153 if replace then
154 while replace do
155 if getid ( replace ) = = glyph_code then
156 apply ( )
157 end
158 replace = getnext ( replace )
159 end
160 end
161 end
162 if current = = last then
163 break
164 end
165 end
166end
167
168
169
170interfaces . implement {
171 name = " overloadsattribute " ,
172 arguments = { " string " , " integer " , " integer " } ,
173 actions = function ( name , font , box )
174 local samplebox = texgetbox ( box )
175 local sample = samplebox and samplebox . list
176 local overloads = sample and tooverloads ( sample )
177 if overloads then
178 overloads . font = font > 0 and font or false
179 n_overloads = n_overloads + 1
180 t_overloads [ n_overloads ] = overloads
181 t_overloads [ name ] = overloads
182 context ( n_overloads )
183 else
184 context ( unsetvalue )
185 end
186 end
187}
188 |