summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/mult-ini.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mult-ini.lua')
-rw-r--r--Master/texmf-dist/tex/context/base/mult-ini.lua240
1 files changed, 199 insertions, 41 deletions
diff --git a/Master/texmf-dist/tex/context/base/mult-ini.lua b/Master/texmf-dist/tex/context/base/mult-ini.lua
index 92a7bc62965..4156e813d38 100644
--- a/Master/texmf-dist/tex/context/base/mult-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mult-ini.lua
@@ -10,79 +10,232 @@ local format, gmatch, gsub = string.format, string.gmatch, string.gsub
local lpegmatch = lpeg.match
local serialize = table.serialize
-interfaces = interfaces or { }
-interfaces.messages = interfaces.messages or { }
-interfaces.constants = interfaces.constants or { }
-interfaces.variables = interfaces.variables or { }
+local allocate = utilities.storage.allocate
+local mark = utilities.storage.mark
+local texsprint = tex.sprint
+local setmetatableindex = table.setmetatableindex
-storage.register("interfaces/messages", interfaces.messages, "interfaces.messages" )
-storage.register("interfaces/constants", interfaces.constants, "interfaces.constants")
-storage.register("interfaces/variables", interfaces.variables, "interfaces.variables")
+local report_interface = logs.reporter("interface","initialization")
-local messages, constants, variables = interfaces.messages, interfaces.constants, interfaces.variables
+interfaces = interfaces or { }
+interfaces.constants = mark(interfaces.constants or { })
+interfaces.variables = mark(interfaces.variables or { })
+interfaces.elements = mark(interfaces.elements or { })
+interfaces.formats = mark(interfaces.formats or { })
+interfaces.translations = mark(interfaces.translations or { })
+
+storage.register("interfaces/constants", interfaces.constants, "interfaces.constants")
+storage.register("interfaces/variables", interfaces.variables, "interfaces.variables")
+storage.register("interfaces/elements", interfaces.elements, "interfaces.elements")
+storage.register("interfaces/formats", interfaces.formats, "interfaces.formats")
+storage.register("interfaces/translations", interfaces.translations, "interfaces.translations")
+
+interfaces.interfaces = {
+ "cs", "de", "en", "fr", "it", "nl", "ro", "pe",
+}
+
+storage.shared.currentinterface = storage.shared.currentinterface or "en"
+storage.shared.currentresponse = storage.shared.currentresponse or "en"
+
+local currentinterface = storage.shared.currentinterface
+local currentresponse = storage.shared.currentresponse
+
+local complete = allocate()
+interfaces.complete = complete
+
+local function resolve(t,k) -- one access needed to get loaded
+ report_interface("loading interface definitions from 'mult-def.lua'")
+ complete = dofile(resolvers.findfile("mult-def.lua"))
+ report_interface("loading interface messages from 'mult-mes.lua'")
+ complete.messages = dofile(resolvers.findfile("mult-mes.lua"))
+ interfaces.complete = complete
+ return rawget(complete,k)
+end
+
+setmetatableindex(complete, resolve)
+
+local constants = interfaces.constants
+local variables = interfaces.variables
+local elements = interfaces.elements
+local formats = interfaces.formats
+local translations = interfaces.translations
+local reporters = { } -- just an optimization
+
+local function valueiskey(t,k) -- will be helper
+ t[k] = k
+ return k
+end
+
+setmetatableindex(variables, valueiskey)
+setmetatableindex(constants, valueiskey)
+setmetatableindex(elements, valueiskey)
+setmetatableindex(formats, valueiskey)
+setmetatableindex(translations, valueiskey)
+
+local function resolve(t,k)
+ local v = logs.reporter(k)
+ t[k] = v
+ return v
+end
+
+setmetatableindex(reporters, resolve)
+
+for category, _ in next, translations do
+ -- We pre-create reporters for already defined messages
+ -- because otherwise listing is incomplete and we want
+ -- to use that for checking so delaying makes not much
+ -- sense there.
+ local r = reporters[category]
+end
+
+-- adding messages
+
+local function add(target,tag,values)
+ local t = target[tag]
+ if not f then
+ target[tag] = values
+ else
+ for k, v in next, values do
+ if f[k] then
+ -- error
+ else
+ f[k] = v
+ end
+ end
+ end
+end
+
+function interfaces.settranslation(tag,values)
+ add(translations,tag,values)
+end
+
+function interfaces.setformat(tag,values)
+ add(formats,tag,values)
+end
+
+-- the old method:
+
+local function fulltag(category,tag)
+ tag = gsub(tag,"%-%-","%%s")
+ return format("%s:%s",category,tag)
+end
function interfaces.setmessages(category,str)
- local m = messages[category] or { }
- for k, v in gmatch(str,"(%S+) *: *(.-) *[\n\r]") do
- m[k] = gsub(v,"%-%-","%%s")
+ for tag, message in gmatch(str,"(%S+) *: *(.-) *[\n\r]") do
+ if tag == "title" then
+ translations[tag] = translations[tag] or tag
+ else
+ formats[fulltag(category,tag)] = gsub(message,"%-%-","%%s")
+ end
end
- messages[category] = m
end
function interfaces.setmessage(category,tag,message)
- local m = messages[category]
- if not m then
- m = { }
- messages[category] = m
- end
- m[tag] = gsub(message,"%-%-","%%s")
+ formats[fulltag(category,tag)] = gsub(message,"%-%-","%%s")
end
function interfaces.getmessage(category,tag,default)
- local m = messages[category]
- return (m and m[tag]) or default or "unknown message"
+ return formats[fulltag(category,tag)] or default or "unknown message"
end
function interfaces.doifelsemessage(category,tag)
- local m = messages[category]
- return commands.testcase(m and m[tag])
+ return commands.testcase(formats[fulltag(category,tag)])
end
-local messagesplitter = lpeg.splitat(",")
+local splitter = lpeg.splitat(",")
-function interfaces.makemessage(category,tag,arguments)
- local m = messages[category]
- m = (m and (m[tag] or m[tostring(tag)])) or format("unknown message, category '%s', tag '%s'",category,tag)
- if not m then
- return m .. " " .. tag
- elseif not arguments then
- return m
+function interfaces.showmessage(category,tag,arguments)
+ local r = reporters[category]
+ local f = formats[fulltag(category,tag)]
+ if type(arguments) == "string" and #arguments > 0 then
+ r(f,lpegmatch(splitter,arguments))
+ elseif arguments then
+ r(f,arguments)
else
- return format(m,lpegmatch(messagesplitter,arguments))
+ r(f)
end
end
-function interfaces.showmessage(category,tag,arguments)
- local m = messages[category]
- commands.writestatus((m and m.title) or "unknown title",interfaces.makemessage(category,tag,arguments))
-end
+-- till here
function interfaces.setvariable(variable,given)
---~ variables[given] = variable
- variables[variable] = given
+ variables[given] = variable
end
function interfaces.setconstant(constant,given)
constants[given] = constant
end
--- it's nicer to have numbers as reference than a hash
+function interfaces.setelement(element,given)
+ elements[given] = element
+end
+
+-- the real thing:
+
+logs.setmessenger(context.verbatim.ctxreport)
+
+-- status
+
+function commands.writestatus(category,message)
+ local r = reporters[category]
+ r(message)
+end
+
+-- initialization
+
+function interfaces.setuserinterface(interface,response)
+ storage.shared.currentinterface, currentinterface = interface, interface
+ storage.shared.currentresponse, currentresponse = response, response
+ if environment.initex then
+ local nofconstants = 0
+ for given, constant in next, complete.constants do
+ constant = constant[interface] or constant.en or given
+ constants[constant] = given -- breedte -> width
+ texsprint("\\do@sicon{",given,"}{",constant,"}")
+ nofconstants = nofconstants + 1
+ end
+ local nofvariables = 0
+ for given, variable in next, complete.variables do
+ variable = variable[interface] or variable.en or given
+ variables[given] = variable -- ja -> yes
+ texsprint("\\do@sivar{",given,"}{",variable,"}")
+ nofvariables = nofvariables + 1
+ end
+ local nofelements = 0
+ for given, element in next, complete.elements do
+ element = element[interface] or element.en or given
+ elements[element] = given
+ texsprint("\\do@siele{",given,"}{",element,"}")
+ nofelements = nofelements + 1
+ end
+ local nofcommands = 0
+ for given, command in next, complete.commands do
+ command = command[interface] or command.en or given
+ if command ~= given then
+ texsprint("\\do@sicom{",given,"}{",command,"}")
+ end
+ nofcommands = nofcommands + 1
+ end
+ local nofformats = 0
+ for given, format in next, complete.messages.formats do
+ formats[given] = format[interface] or format.en or given
+ nofformats = nofformats + 1
+ end
+ local noftranslations = 0
+ for given, translation in next, complete.messages.translations do
+ translations[given] = translation[interface] or translation.en or given
+ noftranslations = noftranslations + 1
+ end
+ report_interface("definitions: %s constants, %s variables, %s elements, %s commands, % formats, %s translations",
+ nofconstants,nofvariables,nofelements,nofcommands,nofformats,noftranslations)
+ end
+end
interfaces.cachedsetups = interfaces.cachedsetups or { }
interfaces.hashedsetups = interfaces.hashedsetups or { }
-storage.register("interfaces.cachedsetups", interfaces.cachedsetups, "interfaces.cachedsetups")
-storage.register("interfaces.hashedsetups", interfaces.hashedsetups, "interfaces.hashedsetups")
+storage.register("interfaces/cachedsetups", interfaces.cachedsetups, "interfaces.cachedsetups")
+storage.register("interfaces/hashedsetups", interfaces.hashedsetups, "interfaces.hashedsetups")
local cachedsetups = interfaces.cachedsetups
local hashedsetups = interfaces.hashedsetups
@@ -101,5 +254,10 @@ function interfaces.cachesetup(t)
end
function interfaces.is_command(str)
- return (str and str ~= "" and token.csname_name(token.create(str)) ~= "") or false
+ return (str and str ~= "" and token.csname_name(token.create(str)) ~= "") or false -- there will be a proper function for this
+end
+
+function interfaces.interfacedcommand(name)
+ local command = complete.commands[name]
+ return command and command[currentinterface] or name
end