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
13local tonumber = tonumber
14local utfbyte = utf.byte
15
16local trace_cleaners = false trackers.register("typesetters.cleaners", function(v) trace_cleaners = v end)
17local trace_autocase = false trackers.register("typesetters.cleaners.autocase",function(v) trace_autocase = v end)
18
19local report_cleaners = logs.reporter("nodes","cleaners")
20local report_autocase = logs.reporter("nodes","autocase")
21
22typesetters.cleaners = typesetters.cleaners or { }
23local cleaners = typesetters.cleaners
24
25local variables = interfaces.variables
26
27local nodecodes = nodes.nodecodes
28
29local enableaction = nodes.tasks.enableaction
30
31local texsetattribute = tex.setattribute
32
33local nuts = nodes.nuts
34
35local getattr = nuts.getattr
36local setattr = nuts.setattr
37
38local setchar = nuts.setchar
39
40local nextglyph = nuts.traversers.glyph
41
42local unsetvalue = attributes.unsetvalue
43
44local glyph_code = nodecodes.glyph
45local uccodes = characters.uccodes
46
47local a_cleaner = attributes.private("cleaner")
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 == variables.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 |