1if not modules then modules = { } end modules [ ' typo-rep ' ] = {
2 version = 1 . 001 ,
3 comment = " companion to node-ini.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
13local next , type , tonumber = next , type , tonumber
14
15local trace_stripping = false trackers . register ( " nodes.stripping " , function ( v ) trace_stripping = v end )
16 trackers . register ( " fonts.stripping " , function ( v ) trace_stripping = v end )
17
18local report_stripping = logs . reporter ( " fonts " , " stripping " )
19
20local nodes = nodes
21local enableaction = nodes . tasks . enableaction
22
23local nuts = nodes . nuts
24
25local getnext = nuts . getnext
26local getchar = nuts . getchar
27local isglyph = nuts . isglyph
28
29local getattr = nuts . getattr
30
31local remove_node = nuts . remove
32local replace_node = nuts . replace
33local copy_node = nuts . copy
34
35local nodecodes = nodes . nodecodes
36
37local chardata = characters . data
38local collected = false
39
40local a_stripping = attributes . private ( " stripping " )
41local texsetattribute = tex . setattribute
42local unsetvalue = attributes . unsetvalue
43
44local v_reset = interfaces . variables . reset
45
46
47
48nodes . stripping = nodes . stripping or { } local stripping = nodes . stripping
49stripping . glyphs = stripping . glyphs or { } local glyphs = stripping . glyphs
50
51local function initialize ( )
52 for k , v in next , chardata do
53 if v . category = = " cf " and not v . visible and not glyphs [ k ] then
54 glyphs [ k ] = true
55 end
56 end
57 initialize = nil
58end
59
60local function process ( what , head , current , char )
61 if what = = true then
62 if trace_stripping then
63 report_stripping ( " deleting %C from text " , char )
64 end
65 head , current = remove_node ( head , current , true )
66 elseif type ( what ) = = " function " then
67 head , current = what ( head , current )
68 current = getnext ( current )
69 if trace_stripping then
70 report_stripping ( " processing %C in text " , char )
71 end
72 elseif what then
73 head , current = replace_node ( head , current , copy_node ( what ) )
74 current = getnext ( current )
75 if trace_stripping then
76 report_stripping ( " replacing %C in text " , char )
77 end
78 end
79 return head , current
80end
81
82function nodes . handlers . stripping ( head )
83 local current = head
84 while current do
85 local char , id = isglyph ( current )
86 if char then
87
88 local todo = getattr ( current , a_stripping )
89 if todo = = 1 then
90 local what = glyphs [ char ]
91 if what then
92 head , current = process ( what , head , current , char )
93 else
94 current = getnext ( current )
95 end
96 else
97 current = getnext ( current )
98 end
99 else
100 current = getnext ( current )
101 end
102 end
103 return head
104end
105
106local enabled = false
107
108function stripping . set ( n )
109 if n = = v_reset then
110 n = unsetvalue
111 else
112 n = tonumber ( n )
113 if n then
114 if not enabled then
115 if initialize then initialize ( ) end
116 enableaction ( " processors " , " nodes.handlers.stripping " )
117 enabled = true
118 end
119 else
120 n = unsetvalue
121 end
122 end
123 texsetattribute ( a_stripping , n )
124end
125
126
127
128interfaces . implement {
129 name = " setcharacterstripping " ,
130 actions = stripping . set ,
131 arguments = " string "
132}
133 |