1if not modules then modules = { } end modules ['typo-cln'] = {
2 version = 1.001,
3 comment = "companion to typo-cln.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 tonumber = tonumber
16local utfbyte = utf.byte
17
18local trace_cleaners = false trackers.register("typesetters.cleaners", function(v) trace_cleaners = v end)
19local trace_autocase = false trackers.register("typesetters.cleaners.autocase",function(v) trace_autocase = v end)
20
21local report_cleaners = logs.reporter("nodes","cleaners")
22local report_autocase = logs.reporter("nodes","autocase")
23
24typesetters.cleaners = typesetters.cleaners or { }
25local cleaners = typesetters.cleaners
26
27local nodecodes = nodes.nodecodes
28
29local enableaction = nodes.tasks.enableaction
30
31local texsetattribute = tex.setattribute
32
33local nuts = nodes.nuts
34local getattr = nuts.getattr
35local setattr = nuts.setattr
36local setchar = nuts.setchar
37local nextglyph = nuts.traversers.glyph
38
39local uccodes = characters.uccodes
40
41local glyph_code <const> = nodecodes.glyph
42
43local a_cleaner <const> = attributes.private("cleaner")
44local unsetvalue <const> = attributes.unsetvalue
45
46local v_reset <const> = interfaces.variables.reset
47
48
49local resetter = {
50 [utfbyte(".")] = true
51}
52
53
54
55
56
57
58function cleaners.handler(head)
59 local inline = false
60 for n, char, font in nextglyph, head do
61 if resetter[char] then
62 inline = false
63 elseif not inline then
64 local a = getattr(n,a_cleaner)
65 if a == 1 then
66 local upper = uccodes[char]
67 if type(upper) == "table" then
68
69 else
70 setchar(n,upper)
71 if trace_autocase then
72 report_autocase("")
73 end
74 end
75 end
76 inline = true
77 end
78 end
79 return head
80end
81
82
83
84local enabled = false
85
86function cleaners.set(n)
87 if n == v_reset or not tonumber(n) or n == 0 then
88 texsetattribute(a_cleaner,unsetvalue)
89 else
90 if not enabled then
91 enableaction("processors","typesetters.cleaners.handler")
92 if trace_cleaners then
93 report_cleaners("enabling cleaners")
94 end
95 enabled = true
96 end
97 texsetattribute(a_cleaner,tonumber(n))
98 end
99end
100
101
102
103interfaces.implement {
104 name = "setcharactercleaning",
105 actions = cleaners.set,
106 arguments = "string"
107}
108 |