1if not modules then modules = { } end modules ['math-txt'] = {
2 version = 1.001,
3 comment = "companion to math-ini.mkxl",
4 author = "Hans Hagen & Mikael Sundqvist",
5 copyright = "PRAGMA ADE / ConTeXt Development Team",
6 license = "see context related readme files",
7}
8
9local setmetatableindex = table.setmetatableindex
10local upper = string.upper
11local utfchar = utf.char
12local settings_to_hash = utilities.parsers.settings_to_hash
13
14local mathematics = mathematics
15
16local a_mathdomain <const> = attributes.private("mathdomain")
17local integer_value = tokens.values.integer
18
19local report = logs.reporter("mathematics","domains")
20
21
22
23
24local domainlabels = { }
25mathematics.domainlabels = domainlabels
26local domainnames = mathematics.domainnames or { [1] = "default", default = 1 }
27mathematics.domainnames = domainnames
28
29local nofdomains = 1
30local defaultlabels = false
31local defaultdomain = domainnames.default
32
33setmetatableindex(domainnames,function(t,name)
34 nofdomains = nofdomains + 1
35 domainnames[name] = nofdomains
36 domainnames[nofdomains] = name
37 report("registering %a with id %s",name,nofdomains)
38 return nofdomains
39end)
40
41local function loadone(name)
42 local f = resolvers.findfile("math-txt-imp-" .. name .. ".lmt") or ""
43 local t = f ~= "" and table.load(f) or { }
44 report("labels for %a %s",name,f ~= "" and "loaded" or "not found")
45 return t
46end
47
48setmetatableindex(domainlabels,function(t,name)
49 if not defaultlabels then
50 defaultlabels = loadone("default")
51 t.default = defaultlabels
52 end
53 if name == "default" then
54 return defaultlabels
55 else
56 local v = loadone(name)
57 setmetatableindex(v,defaultlabels)
58 t[name] = v
59 return v
60 end
61end)
62
63interfaces.implement {
64 name = "domainattribute",
65 arguments = "string",
66 usage = "value",
67 actions = function(name)
68 return integer_value, domainnames[name]
69 end
70}
71
72function mathematics.getdomainname(id)
73 return id and domainnames[id] or "default"
74end
75
76local uppercased = setmetatableindex(function(t,k)
77 local v = upper(k)
78 t[k] = v
79 return v
80end)
81
82function mathematics.getverboselabel(name,language,domain)
83 local verboselabels = domainlabels[domain] or defaultlabels
84 local l = verboselabels[name]
85 if l then
86 if language == "debug" then
87 return l.en and uppercased[name] or name
88 else
89 return (language and l[language]) or l.en or name
90 end
91 else
92
93 return name
94 end
95end
96
97function mathematics.getoptionallabel(name,language,domain)
98 local verboselabels = domainlabels[domain] or defaultlabels
99 local l = verboselabels[name]
100 if l then
101 return (language and l[language]) or l.en
102 end
103end
104
105
106
107
108local function set(verboselabels,language,name,meaning)
109 local v = verboselabels[name]
110 if not v then
111 v = { }
112 verboselabels[name] = v
113 end
114 v[language or "en"] = meaning
115end
116
117function mathematics.registerverboselabel(domain,language,name,meaning)
118 local verboselabels = domainlabels[domain] or defaultlabels
119 local first, last, _, gaps = characters.getrange(name)
120 if first then
121 for i=first,last do
122 set(verboselabels,language,utfchar(i),meaning)
123 end
124 if gaps then
125 for k, v in next, gaps do
126 set(verboselabels,language,utfchar(v),meaning)
127 end
128 end
129 else
130 set(verboselabels,language,name,meaning)
131 end
132end
133
134interfaces.implement {
135 name = "registerverbosemathlabel",
136 protected = true,
137 arguments = "4 strings",
138 actions = mathematics.registerverboselabel,
139}
140 |