From b4260c7c04f7e82a9987b7bb758040853ebc464e Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Thu, 9 Jul 2020 15:15:53 +0200 Subject: 2020-07-09 14:50:00 --- tex/context/modules/mkiv/m-system-aliasing.mkiv | 120 ++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 tex/context/modules/mkiv/m-system-aliasing.mkiv (limited to 'tex/context/modules/mkiv/m-system-aliasing.mkiv') diff --git a/tex/context/modules/mkiv/m-system-aliasing.mkiv b/tex/context/modules/mkiv/m-system-aliasing.mkiv new file mode 100644 index 000000000..4661cc503 --- /dev/null +++ b/tex/context/modules/mkiv/m-system-aliasing.mkiv @@ -0,0 +1,120 @@ +%D \module +%D [ file=m-system-aliasing, +%D version=2020.07.08, +%D title=\CONTEXT\ Modules, +%D subtitle=Loading generic stuff, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] + +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[system-aliasing] + +\startluacode + local next = next + local find, topattern = string.find, string.topattern + + local aliases = { } + local replacer = false + local filenames = false + local wildcards = false + local enabled = false + + local report = logs.reporter("system", "aliasing") + + -- This is not yet perfect as we actually need to quit at a non token. + + interfaces.implement { + name = "registeralias", + public = true, + arguments = { "csname", "csname" }, + actions = function(old,new) + aliases[old] = new + replacer = false + end + } + + interfaces.implement { + name = "registeraliasfile", + public = true, + arguments = "string", + actions = function(name) + if find(name,"%*") then + name = topattern(name) + if wildcards then wildcards[name] = true else wildcards = { [name] = true } end + else + if filenames then filenames[name] = true else filenames = { [name] = true } end + end + if not enabled then + utilities.sequencers.appendaction( + resolvers.openers.helpers.textfileactions, + "system","resolvers.macros.processgeneric" + ) + utilities.sequencers.enableaction( + resolvers.openers.helpers.textfileactions, + "resolvers.macros.processgeneric" + ) + enabled = true + end + end + } + + local function found(name) + if filenames and filenames[name] then + return true + end + if wildcards then + for k, v in next, wildcards do + if find(name,k) then + return true + end + end + end + return false + end + + local Cs, lpegmatch = lpeg.Cs, lpeg.match + + local utfchartabletopattern = lpeg.utfchartabletopattern + local utf8character = lpeg.patterns.utf8character + local escapecharacter = lpeg.P("\\") + local terminal = lpeg.S([[`"'~@#$%^&_-+/*=(){}[]<>:;,.!?|\\]]) + + lpeg.P(-1) + local lpegmatch = lpeg.match + + function resolvers.macros.processgeneric(str,name) + if found(name) then + report("file %a",name) + if not replacer then + replacer = Cs( ( + escapecharacter + * (utfchartabletopattern(aliases) / aliases) + * terminal + + utf8character + )^0 ) + end + str = lpegmatch(replacer,str) or str + end + return str + end + +\stopluacode + +\registeralias \protected \normalprotected +\registeralias \unexpanded \normalunexpanded +\registeralias \expanded \normalexpanded + +%D \starttyping +%D \registeraliasfile{rubish.tex} +%D \registeraliasfile{generic/*.tex} +%D +%D % e.g. \def\foo{\unexpanded{test}} +%D +%D \input rubish.tex +%D \input generic/foo.tex +%D \stoptyping + +\stopmodule -- cgit v1.2.3