summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/regi-ini.lua
blob: a12fd24a24f9ecf60321ec15f26f695e5ee9e2cc (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
if not modules then modules = { } end modules ['regi-ini'] = {
    version   = 1.001,
    comment   = "companion to regi-ini.tex",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

--[[ldx--
<p>Regimes take care of converting the input characters into
<l n='utf'/> sequences. The conversion tables are loaded at
runtime.</p>
--ldx]]--

regimes         = regimes         or { }
regimes.data    = regimes.data    or { }
regimes.utf     = regimes.utf     or { }
regimes.context = regimes.context or { }

-- setmetatable(regimes.data,_empty_table_)

regimes.currentregime = ""

--[[ldx--
<p>We will hook regime handling code into the input methods.</p>
--ldx]]--

input         = input         or { }
input.filters = input.filters or { }

function regimes.number(n)
    if type(n) == "string" then return tonumber(n,16) else return n end
end

function regimes.define(c) -- is this used at all?
    local r, u, s = c.regime, c.unicodeslot, c.slot
    regimes.data[r] = regimes.data[r] or { }
    if s then
        if u then
            regimes.data[r][regimes.number(s)] = regimes.number(u)
        else
            regimes.data[r][regimes.number(s)] = 0
        end
    else
        input.report(string.format("regi-ini: invalid regime code %s/%s", r, s))
    end
end

function regimes.load(regime)
    environment.loadlucfile("regi-"..regime, 1.001)
    if regimes.data[regime] then
        regimes.utf[regime] = { }
        for k,v in pairs(regimes.data[regime]) do
            regimes.utf[regime][string.char(k)] = unicode.utf8.char(v)
        end
    end
end

function regimes.translate(line,regime)
    if regime and line then
        local rur = regimes.utf[regime]
        if rur then
            return line:gsub("(.)", rur) -- () redundant
        end
    end
    return line
end

function regimes.enable(regime)
    if regimes.data[regime] then
        regimes.currentregime = regime
        local translate = regimes.translate
        input.filters.dynamic_translator = function(s)
            return translate(s,regime)
        end
    else
        regimes.disable()
    end
end

function regimes.disable()
    regimes.currentregime            = ""
    input.filters.dynamic_translator = nil
end

function input.filters.frozen_translator(regime)
    return function(s)
        return regimes.translate(s,regime)
    end
end

--[[ldx--
<p>The following code is rather <l n='context'/> specific.</p>
--ldx]]--

function regimes.context.show(regime)
    local flush, tc = tex.sprint, tex.ctxcatcodes
    local r = regimes.data[regime]
    if r then
        flush(tc, "\\starttabulate[|rT|T|rT|lT|lT|lT|]")
        for k, v in ipairs(r) do
            flush(tc, string.format("\\NC %s\\NC\\getvalue{%s}\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR", k,
                characters.contextname(v), characters.hexindex(v), characters.contextname(v),
                characters.category(v), characters.description(v)))
        end
        flush(tc, "\\stoptabulate")
    else
        flush(tc, "unknown regime " .. regime)
    end
end