math-txt.lmt /size: 4008 b    last modification: 2025-02-21 11:03
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-- We don't need to store anything because we preset default and registering
22-- other domains happens at runtime.
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) -- todo: change order
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     -- print("missing label",language or "en", name)
93        return name
94    end
95end
96
97function mathematics.getoptionallabel(name,language,domain) -- todo: change order
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-- characters.blocks
106-- characters.getrange
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