summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/regi-ini.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/regi-ini.lua')
-rw-r--r--Master/texmf-dist/tex/context/base/regi-ini.lua234
1 files changed, 184 insertions, 50 deletions
diff --git a/Master/texmf-dist/tex/context/base/regi-ini.lua b/Master/texmf-dist/tex/context/base/regi-ini.lua
index 83739760758..a440b65771a 100644
--- a/Master/texmf-dist/tex/context/base/regi-ini.lua
+++ b/Master/texmf-dist/tex/context/base/regi-ini.lua
@@ -6,83 +6,217 @@ if not modules then modules = { } end modules ['regi-ini'] = {
license = "see context related readme files"
}
-local utf = unicode.utf8
-local char, utfchar, gsub = string.char, utf.char, string.gsub
-local texsprint = tex.sprint
-
-local ctxcatcodes = tex.ctxcatcodes
-
--[[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.synonyms = regimes.synonyms or { }
-
-storage.register("regimes/synonyms", regimes.synonyms, "regimes.synonyms")
+local utfchar = utf.char
+local char, gsub, format = string.char, string.gsub, string.format
+local next = next
+local insert, remove = table.insert, table.remove
--- setmetatable(regimes.data,_empty_table_)
-
-regimes.currentregime = "utf"
+local sequencers = utilities.sequencers
+local textlineactions = resolvers.openers.helpers.textlineactions
+local setmetatableindex = table.setmetatableindex
--[[ldx--
<p>We will hook regime handling code into the input methods.</p>
--ldx]]--
-function regimes.number(n)
- if type(n) == "string" then return tonumber(n,16) else return n end
+local trace_translating = false trackers.register("regimes.translating", function(v) trace_translating = v end)
+
+local report_loading = logs.reporter("regimes","loading")
+local report_translating = logs.reporter("regimes","translating")
+
+regimes = regimes or { }
+local regimes = regimes
+
+local mapping = {
+ utf = false
+}
+
+local synonyms = { -- backward compatibility list
+
+ ["windows-1250"] = "cp1250",
+ ["windows-1251"] = "cp1251",
+ ["windows-1252"] = "cp1252",
+ ["windows-1253"] = "cp1253",
+ ["windows-1254"] = "cp1254",
+ ["windows-1255"] = "cp1255",
+ ["windows-1256"] = "cp1256",
+ ["windows-1257"] = "cp1257",
+ ["windows-1258"] = "cp1258",
+
+ ["il1"] = "8859-1",
+ ["il2"] = "8859-2",
+ ["il3"] = "8859-3",
+ ["il4"] = "8859-4",
+ ["il5"] = "8859-9",
+ ["il6"] = "8859-10",
+ ["il7"] = "8859-13",
+ ["il8"] = "8859-14",
+ ["il9"] = "8859-15",
+ ["il10"] = "8859-16",
+
+ ["iso-8859-1"] = "8859-1",
+ ["iso-8859-2"] = "8859-2",
+ ["iso-8859-3"] = "8859-3",
+ ["iso-8859-4"] = "8859-4",
+ ["iso-8859-9"] = "8859-9",
+ ["iso-8859-10"] = "8859-10",
+ ["iso-8859-13"] = "8859-13",
+ ["iso-8859-14"] = "8859-14",
+ ["iso-8859-15"] = "8859-15",
+ ["iso-8859-16"] = "8859-16",
+
+ ["latin1"] = "8859-1",
+ ["latin2"] = "8859-2",
+ ["latin3"] = "8859-3",
+ ["latin4"] = "8859-4",
+ ["latin5"] = "8859-9",
+ ["latin6"] = "8859-10",
+ ["latin7"] = "8859-13",
+ ["latin8"] = "8859-14",
+ ["latin9"] = "8859-15",
+ ["latin10"] = "8859-16",
+
+ ["utf-8"] = "utf",
+ ["utf8"] = "utf",
+ [""] = "utf",
+
+ ["windows"] = "cp1252",
+
+}
+
+local currentregime = "utf"
+
+local function loadregime(mapping,regime)
+ local name = resolvers.findfile(format("regi-%s.lua",regime)) or ""
+ local data = name ~= "" and dofile(name)
+ if data then
+ vector = { }
+ for eightbit, unicode in next, data do
+ vector[char(eightbit)] = utfchar(unicode)
+ end
+ report_loading("vector '%s' is loaded",regime)
+ else
+ vector = false
+ report_loading("vector '%s' is unknown",regime)
+ end
+ mapping[regime] = vector
+ return vector
end
-function regimes.setsynonym(synonym,target)
- regimes.synonyms[synonym] = target
+setmetatableindex(mapping, loadregime)
+
+local function translate(line,regime)
+ if line and #line > 0 then
+ local map = mapping[regime and synonyms[regime] or regime or currentregime]
+ if map then
+ line = gsub(line,".",map)
+ end
+ end
+ return line
+end
+
+local function disable()
+ currentregime = "utf"
+ sequencers.disableaction(textlineactions,"regimes.process")
end
-function regimes.truename(regime)
- texsprint(ctxcatcodes,(regime and regimes.synonyms[synonym] or regime) or regimes.currentregime)
+local function enable(regime)
+ regime = synonyms[regime] or regime
+ if mapping[regime] == false then
+ disable()
+ else
+ currentregime = regime
+ sequencers.enableaction(textlineactions,"regimes.process")
+ end
end
-function regimes.load(regime)
- regime = regimes.synonyms[regime] or regime
- if not regimes.data[regime] then
- environment.loadluafile("regi-"..regime, 1.001)
- if regimes.data[regime] then
- regimes.utf[regime] = { }
- for k,v in next, regimes.data[regime] do
- regimes.utf[regime][char(k)] = utfchar(v)
- end
+regimes.translate = translate
+regimes.enable = enable
+regimes.disable = disable
+
+-- The following function can be used when we want to make sure that
+-- utf gets passed unharmed. This is needed for modules.
+
+local level = 0
+
+function regimes.process(str)
+ if level == 0 then
+ str = translate(str,currentregime)
+ if trace_translating then
+ report_translating("utf: %s",str)
end
end
+ return str
+end
+
+function regimes.push()
+ level = level + 1
+ if trace_translating then
+ report_translating("pushing level: %s",level)
+ end
end
-function regimes.translate(line,regime)
- regime = regimes.synonyms[regime] or regime
- if regime and line then
- local rur = regimes.utf[regime]
- if rur then
- return (gsub(line,"(.)",rur)) -- () redundant
+function regimes.pop()
+ if level > 0 then
+ if trace_translating then
+ report_translating("popping level: %s",level)
end
+ level = level - 1
end
- return line
end
-function regimes.enable(regime)
- regime = regimes.synonyms[regime] or regime
- if regimes.data[regime] then
- regimes.currentregime = regime
- local translate = regimes.translate
- resolvers.install_text_filter('input',function(s)
- return translate(s,regime)
- end)
- else
- regimes.disable()
+sequencers.prependaction(textlineactions,"system","regimes.process")
+sequencers.disableaction(textlineactions,"regimes.process")
+
+-- interface:
+
+commands.enableregime = enable
+commands.disableregime = disable
+
+function commands.currentregime()
+ context(currentregime)
+end
+
+local stack = { }
+
+function commands.startregime(regime)
+ insert(stack,currentregime)
+ if trace_translating then
+ report_translating("start: '%s'",regime)
end
+ enable(regime)
end
-function regimes.disable()
- regimes.currentregime = "utf"
- resolvers.install_text_filter('input',nil)
+function commands.stopregime()
+ if #stack > 0 then
+ local regime = remove(stack)
+ if trace_translating then
+ report_translating("stop: '%s'",regime)
+ end
+ enable(regime)
+ end
end
+
+-- obsolete:
+--
+-- function regimes.setsynonym(synonym,target)
+-- synonyms[synonym] = target
+-- end
+--
+-- function regimes.truename(regime)
+-- return regime and synonyms[regime] or regime or currentregime
+-- end
+--
+-- function commands.trueregimename(regime)
+-- context(regimes.truename(regime))
+-- end
+--
+-- function regimes.load(regime)
+-- return mapping[synonyms[regime] or regime]
+-- end