diff --git a/minim/minim-etex.tex b/minim/minim-etex.tex index bdf71def16e5166420ff4a5ada5e9d9eefddc490..f53b74119f08dc22c215481ee8ddec1fa509c9a1 100644 --- a/minim/minim-etex.tex +++ b/minim/minim-etex.tex @@ -7,74 +7,16 @@ % The following has been removed: % - Module loading % - Version checks +% - Language handling % % The following has been retained: -% - Language handling (somewhat simplified) % - Tracing and logging extensions % - The \eTeX symbol % - Register allocation \catcode `\@=\catcode `\A -% Define the language-handling commands - -\def \uselanguage #1% - {\ifcsname lang@#1\endcsname - \language=\csname lang@#1\endcsname - \lefthyphenmin=\csname lhm@#1\endcsname - \righthyphenmin=\csname rhm@#1\endcsname - \ifcsname lu@texhyphen@loaded@\the\language\endcsname \else - \global\expandafter\def\csname - lu@texhyphen@loaded@\the\language\endcsname{}% - \directlua{ - if not status.ini_version then - require("luatex-hyphen") - luatexhyphen.loadlanguage("\luatexluaescapestring{#1}", - \the\language) - end}% - \fi - \ifdefined\uselanguage@hook \uselanguage@hook{#1}\fi - \else - \begingroup\errorcontextlines=0\relax - \errhelp {You are trying to use a language which has not previously - been defined; remember that any language you want to use - will need to have been specified at the time the format - was created.% - }% - \errmessage {Language #1 undefined.}\endgroup - \fi} - -\def \addlanguage #1#2#3#4#5{% language patterns exceptions lhm rhm - \expandafter\newlanguage \csname lang@#1\endcsname - \expandafter\chardef \csname lhm@#1\endcsname=#4 - \expandafter\chardef \csname rhm@#1\endcsname=#5 - \csname if\directlua{% do we want to skip this language now? - require("luatex-hyphen") - if (luatexhyphen.lookupname("\luatexluaescapestring{#1}") == nil) - or (\number\csname lang@#1\endcsname == 0) then - tex.sprint("false") % no, load it (execute 'else' part) - else - tex.sprint("true") % yes, skip - end}\endcsname - \else - \uselanguage {#1}% - \input #2 - \if *#3*\else \input #3 \fi - \edef \fmtversion {\fmtversion/#1}% - \fi - \ifdefined\addlanguage@hook \addlanguage@hook{#1}\fi} - -% Decrement \count 19, because \newlanguage will increment it again - -\advance \count 19 by -1 - -% We are about to try to process a user/site-specific file "language.def", -% which establishes a Babel-like language selection environment. - -\input language.def - -% All that was just to set up natural language handling... -% The "real" work of "etex.src", however, is to augment the non-primitives +% The "real" work of "etex.src", is to augment the non-primitives % of Plain.TeX to incorporate e-TeX specific features, and to add new % non-primitives to simplify access to new e-TeX specific primitives. diff --git a/minim/minim-languages.lua b/minim/minim-languages.lua new file mode 100644 index 0000000000000000000000000000000000000000..bf9b73607c11c0096fbd7ecf3d96b8027f9d0494 --- /dev/null +++ b/minim/minim-languages.lua @@ -0,0 +1,73 @@ +local M = {} +local alloc = require("minim-alloc") +alloc.remember("minim-languages") +local cb = require("minim-callbacks") + +local languages = require("language.dat.lua") + +for name, language in pairs(languages) do + local special = language.special + if special then + if special == "language0" then + -- Knuth's English (hyphen.tex) is already loaded + language.id = 0 + elseif string.find(language.special, "^disabled:") then + -- disabled language + languages[name] = nil + lang = nil + end + end + -- synonyms just point to the same table + -- or are nil'ed for disabled languages + for _, synonym in ipairs(lang.synonyms or {}) do + languages[synonym] = lang + end +end + +M.languages = languages + +function M.use_language (name) + local language = languages[name] + if language then + if not language.id then + language.id = M.load_language(language) + end + tex.language = language.id + tex.lefthyphenmin = language.lefthyphenmin + tex.righthyphenmin = language.righthyphenmin + else + alloc.err("Unsupported language \"%s\"", name) + end +end + +function M.load_language (language) + local l = lang.new() + + for _, item in ipairs{"patterns", "hyphenation"} do + local filelist = language[item] + if filelist ~= nil and filelist ~= "" then + for _, file in ipairs(string.explode(filelist, ",")) do + local file = kpse.find_file(file) or alloc.err("file not found: %s", file) + local fh = io.open(file, "r") or alloc.err("file not readable: %s", file) + local data = fh:read("*a") or alloc.err("file not readable: %s", f) + fh:close() + lang[item](l, data) + end + end + end + + return lang.id(l) +end + +alloc.luadef("newlanguage", function() + token.set_char(token.scan_csname(), lang.new()) +end) + +cb.new_callback("uselanguage", "simple") +alloc.luadef("minim:uselanguage", function() + local name = token.scan_string() + M.use_language(name) + cb.call_callback("uselanguage", name) +end) + +return M diff --git a/minim/minim-languages.tex b/minim/minim-languages.tex new file mode 100644 index 0000000000000000000000000000000000000000..84369c267ea723f3b745a16bee4a62e3e2737612 --- /dev/null +++ b/minim/minim-languages.tex @@ -0,0 +1,19 @@ +\ifdefined \minimlanguagesloaded + \message{(skipped)} + \expandafter\endinput\fi +\chardef\minimlanguagesloaded=\catcode`\: +\catcode`\:=11 + +% Define the language-handling commands +\directlua{ require('minim-languages') } +% defined from Lua: +% \minim:uselanguage + +\def \uselanguage #1{% + \minim:uselanguage{#1}% + \ifcsname uselanguage@hook\endcsname + \lastnamedcs{#1} + \fi} + +\catcode`\:=\minimloaded +\endinput diff --git a/minim/minim.tex b/minim/minim.tex index 6003e52a85e21fbfa097793d2a967fbb820a6808..421a9ac52d37c46264a232e28f1646aea8233d2c 100644 --- a/minim/minim.tex +++ b/minim/minim.tex @@ -1,5 +1,6 @@ \input minim-alloc +\input minim-languages \input minim-mp \input minim-math \input minim-pdf diff --git a/pdf/minim-pdf.lua b/pdf/minim-pdf.lua index 3ad3f39a3bd21d5d6a28900d771ebe13eefd8398..6ef205dea016657b4042def76bb9658870b947c5 100644 --- a/pdf/minim-pdf.lua +++ b/pdf/minim-pdf.lua @@ -519,13 +519,12 @@ alloc.luadef('setdocumentlanguage', function() M.set_document_language(M.get_language_code(token.scan_string())) end, 'protected') --- \uselanguage patch; provide default document language +-- \uselanguage hook; provide default document language -- and associate names with numbers -alloc.luadef('minim:apply:language:code', function() - local name = token.scan_string() +cb.register('uselanguage', function(name) local nr = language_codes[name] or alloc.err('No language code known for ā€˜%s’', name) and 1 if not structure[1].lang then M.set_document_language(language_codes[nr]) end - tex.sprint(nr) + tex.attribute['tagging:current:language'] = nr end) local function write_language() diff --git a/pdf/minim-pdf.tex b/pdf/minim-pdf.tex index 75451d88444b25248687b443282bcd8f6b3e7bfb..3c4b15888f828a7c04207e3160aad40edb9209bb 100644 --- a/pdf/minim-pdf.tex +++ b/pdf/minim-pdf.tex @@ -267,20 +267,6 @@ % provided by the lua module: % \setdocumentlanguage {name or code} % \setlanguagecode {name} {code} -% \minim:apply:language:code{name} → index - -% patch in language codes to \uselanguage -\ifcsname uselanguage@hook\endcsname - \expandafter\let - \expandafter\minim:uselanguagehook - \lastnamedcs \fi -\expandafter\edef\csname uselanguage@hook\endcsname#1{% - % tagging support - \noexpand\tagging:current:language - \noexpand\minim:apply:language:code{#1}% - % previous definitions - \ifdefined\minim:uselanguagehook - \noexpand\minim:uselanguagehook{#1}\fi} % \newnamedlanguage {name} {lhm} {rhm} \def\newnamedlanguage#1#2#3{%