diff options
author | Hans Hagen <pragma@wxs.nl> | 2023-05-27 12:37:50 +0200 |
---|---|---|
committer | Context Git Mirror Bot <phg@phi-gamma.net> | 2023-05-27 12:37:50 +0200 |
commit | 32381f97e98465953bfde24b4436093e70fbe70f (patch) | |
tree | 1f585cf7af509e76c64aca108cecd23acd6fb437 /tex/context/base/mkxl/lang-rep.lmt | |
parent | bb8ae12f4f94189fd1540b201e2aea78f485de97 (diff) | |
download | context-32381f97e98465953bfde24b4436093e70fbe70f.tar.gz |
2023-05-27 12:16:00
Diffstat (limited to 'tex/context/base/mkxl/lang-rep.lmt')
-rw-r--r-- | tex/context/base/mkxl/lang-rep.lmt | 91 |
1 files changed, 62 insertions, 29 deletions
diff --git a/tex/context/base/mkxl/lang-rep.lmt b/tex/context/base/mkxl/lang-rep.lmt index fcaff523a..1f1c1e417 100644 --- a/tex/context/base/mkxl/lang-rep.lmt +++ b/tex/context/base/mkxl/lang-rep.lmt @@ -111,28 +111,48 @@ lists[v_reset].attribute = unsetvalue -- so we discard 0 -- todo: glue kern attr local function add(root,word,replacement) - local processor, replacement = splitprocessor(replacement,true) -- no check - replacement = lpegmatch(stripper,replacement) or replacement - local list = utfsplit(word) -- ,true) - local size = #list - for i=1,size do - local l = utfbyte(list[i]) - if not root[l] then - root[l] = { } + if type(replacement) == "function" then + local list = utfsplit(word) -- ,true) + local size = #list + for i=1,size do + local l = utfbyte(list[i]) + if not root[l] then + root[l] = { } + end + if i == size then + root[l].final = { + word = word, + replacer = replacement, + processor = processor, + oldlength = size, + } + end + root = root[l] end - if i == size then - local special = find(replacement,"{",1,true) - local newlist = lpegmatch(splitter,replacement) - root[l].final = { - word = word, - replacement = replacement, - processor = processor, - oldlength = size, - newcodes = newlist, - special = special, - } + else + local processor, replacement = splitprocessor(replacement,true) -- no check + replacement = lpegmatch(stripper,replacement) or replacement + local list = utfsplit(word) -- ,true) + local size = #list + for i=1,size do + local l = utfbyte(list[i]) + if not root[l] then + root[l] = { } + end + if i == size then + local special = find(replacement,"{",1,true) + local newlist = lpegmatch(splitter,replacement) + root[l].final = { + word = word, + replacement = replacement, + processor = processor, + oldlength = size, + newcodes = newlist, + special = special, + } + end + root = root[l] end - root = root[l] end end @@ -192,16 +212,29 @@ local ispunctuation = characters.is_punctuation -- for punctuation was added. local function replace(head,first,last,final,hasspace,overload) - local current = first - local prefirst = getprev(first) or head - local postlast = getnext(last) - local oldlength = final.oldlength - local newcodes = final.newcodes + local current = first + local prefirst = getprev(first) or head + local postlast = getnext(last) + local oldlength = final.oldlength + local newcodes = final.newcodes + local word = final.word + local replacement = final.replacement + local replacer = final.replacer + local special = final.special + if type(replacer) == "function" then + replacement = replacer(word) + if type(replacement) == "string" then + special = find(replacement,"{",1,true) + newcodes = lpegmatch(splitter,replacement) + else + return + end + end local newlength = newcodes and #newcodes or 0 if trace_replacements then - report_replacement("replacing word %a by %a",final.word,final.replacement) + report_replacement("replacing word %a by %a",word,replacement) end - if hasspace or final.special then + if hasspace or special then -- It's easier to delete and insert so we do just that. On the todo list is -- turn injected spaces into glue but easier might be to let the char break -- handler do that ... @@ -271,13 +304,13 @@ local function replace(head,first,last,final,hasspace,overload) elseif newlength == 0 then -- we overload elseif oldlength == newlength then - if final.word ~= final.replacement then + if word ~= replacement then for i=1,newlength do setchar(current,newcodes[i]) current = getnext(current) end end - current = getnext(final) + -- current = getnext(final) -- some left over? no next! elseif oldlength < newlength then for i=1,newlength-oldlength do local n = copy_node(current) |