summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/context/lua/mtx-chars.lua
blob: a05ab9f0860748a648ec331ca5cf8425f7e1d123 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
if not modules then modules = { } end modules ['mtx-chars'] = {
    version   = 1.001,
    comment   = "companion to mtxrun.lua",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

texmf.instance = instance -- we need to get rid of this / maybe current instance in global table

scripts       = scripts       or { }
scripts.chars = scripts.chars or { }

function scripts.chars.stixtomkiv(inname,outname)
    if inname == "" then
        logs.report("aquiring math data","invalid datafilename")
    end
    local f = io.open(inname)
    if not f then
        logs.report("aquiring math data","invalid datafile")
    else
        logs.report("aquiring math data","processing " .. inname)
        if not outname or outname == "" then
            outname = "char-mth.lua"
        end
        local classes = {
            N = "normal",
            A = "alphabetic",
            D = "diacritic",
            P = "punctuation",
            B = "binary",
            R = "relation",
            L = "large",
            O = "opening",
            C = "closing",
            F = "fence"
        }
        local format, concat = string.format, table.concat
        local valid, done = false, { }
        local g = io.open(outname,'w')
        g:write([[
-- filename : char-mth.lua
-- comment  : companion to char-mth.tex (in ConTeXt)
-- author   : Hans Hagen, PRAGMA-ADE, Hasselt NL
-- license  : see context related readme files
-- comment  : generated from data file downloaded from STIX website

if not versions   then versions   = { } end versions['char-mth'] = 1.001
if not characters then characters = { } end
        ]])
        g:write(format("\ncharacters.math = {\n"))
        for l in f:lines() do
            if not valid then
                valid = l:find("AMS/TeX name")
            end
            if valid then
                local unicode = l:sub(2,6)
                if unicode:sub(1,1) ~= " " and unicode ~= "" and not done[unicode] then
                    local mathclass, adobename, texname = l:sub(57,57) or "", l:sub(13,36) or "", l:sub(84,109) or ""
                    texname, adobename = texname:gsub("[\\ ]",""), adobename:gsub("[\\ ]","")
                    local t = { }
                    if mathclass ~= "" then t[#t+1] = format("mathclass='%s'", classes[mathclass] or "unknown") end
                    if adobename ~= "" then t[#t+1] = format("adobename='%s'", adobename                      ) end
                    if texname   ~= "" then t[#t+1] = format("texname='%s'"  , texname                        ) end
                    if #t > 0 then
                        g:write(format("\t[0x%s] = { %s },\n",unicode, concat(t,", ")))
                    end
                    done[unicode] = true
                end
            end
        end
        if not valid then
            g:write("\t-- The data file is corrupt, invalid or maybe the format has changed.\n")
            logs.report("aquiring math data","problems with data table")
        else
            logs.report("aquiring math data","table saved in " .. outname)
        end
        g:write("}\n")
        g:close()
        f:close()
    end
end

scripts.chars.banner_utf_1 = [[
% filename : enco-utf.tex
% comment  : generated by mtxrun --script chars --utf
% author   : Hans Hagen, PRAGMA-ADE, Hasselt NL
% copyright: PRAGMA ADE / ConTeXt Development Team
% license  : see context related readme files

\ifx\setcclcucx\undefined

  \def\setcclcucx #1 #2 #3 %
    {\global\catcode"#1=11
     \global\lccode "#1="#2
     \global\uccode "#1="#3 }

\fi
]]

scripts.chars.banner_utf_2 = [[

% lc/uc/catcode mappings

]]

scripts.chars.banner_utf_3 = [[

% named characters mapped onto utf (\\char is needed for accents)

]]

scripts.chars.banner_utf_4 = [[

\endinput
]]

function scripts.chars.makeencoutf()
    local chartable = input.find_file(instance,"char-def.lua") or ""
    if chartable ~= "" then
        dofile(chartable)
        if characters and characters.data then
            local f = io.open("enco-utf.tex", 'w')
            if f then
                local char, format = unicode.utf8.char, string.format
                f:write(scripts.chars.banner_utf_1)
                f:write(scripts.chars.banner_utf_2)
                local list = table.sortedkeys(characters.data)
                local length = 0
                for i=1,#list do
                    local code = list[i]
                    if code <= 0xFFFF then
                        local chr = characters.data[code]
                        local cc = chr.category
                        if cc == 'll' or cc == 'lu' or cc == 'lt' then
                            if not chr.lccode then chr.lccode = code end
                            if not chr.uccode then chr.uccode = code end
                            f:write(format("\\setcclcucx %04X %04X %04X %% %s\n",code,chr.lccode,chr.uccode,chr.description))
                        end
                        if #(chr.contextname or "") > length then
                            length = #chr.contextname
                        end
                    end
                end
                f:write(scripts.chars.banner_utf_3)
                for i=1,#list do
                    local code = list[i]
                    if code > 0x5B and code <= 0xFFFF then
                        local chr = characters.data[code]
                        if chr.contextname then
                            local ch = char(code)
--~                             if ch:find("[~#$%%^&{}\\]") then
                                f:write(format("\\def\\%s{\\char\"%04X } %% %s: %s\n", chr.contextname:rpadd(length," "), code, chr.description, ch))
--~                             else
--~                                 f:write(format("\\def\\%s{%s}           %% %s\n", chr.contextname:rpadd(length," "), ch,chr.description))
--~                             end
                        end
                    end
                end
                f:write(scripts.chars.banner_utf_4)
                f:close()
            end
        end
    end
end

banner = banner .. " | character tools "

messages.help = [[
--stix                convert stix table to math table
--utf                 generate enco-utf.tex (used by xetex)
]]

if environment.argument("stix") then
    local inname  = environment.files[1] or ""
    local outname = environment.files[2] or ""
    scripts.chars.stixtomkiv(inname,outname)
elseif environment.argument("utf") then
    scripts.chars.makeencoutf()
else
    input.help(banner,messages.help)
end