summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/lang-rep.lua
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-01-29 16:15:09 +0100
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-01-29 16:15:09 +0100
commit452587cdeefbf6e3bf1eee91e4e976f1135b785f (patch)
treee52f05dfd327c3b31a1b0fb82545dbdec639d2e2 /tex/context/base/mkiv/lang-rep.lua
parent975f4f9f2d71d8021900955404f8b144ca6895f5 (diff)
downloadcontext-452587cdeefbf6e3bf1eee91e4e976f1135b785f.tar.gz
2016-01-28 22:37:00
Diffstat (limited to 'tex/context/base/mkiv/lang-rep.lua')
-rw-r--r--tex/context/base/mkiv/lang-rep.lua35
1 files changed, 26 insertions, 9 deletions
diff --git a/tex/context/base/mkiv/lang-rep.lua b/tex/context/base/mkiv/lang-rep.lua
index 0090d7cc3..ec82b7b19 100644
--- a/tex/context/base/mkiv/lang-rep.lua
+++ b/tex/context/base/mkiv/lang-rep.lua
@@ -17,16 +17,22 @@ if not modules then modules = { } end modules ['lang-rep'] = {
local type, tonumber = type, tonumber
local utfbyte, utfsplit = utf.byte, utf.split
-local P, C, U, Cc, Ct, lpegmatch = lpeg.P, lpeg.C, lpeg.patterns.utf8character, lpeg.Cc, lpeg.Ct, lpeg.match
+local P, C, U, Cc, Ct, Cs, lpegmatch = lpeg.P, lpeg.C, lpeg.patterns.utf8character, lpeg.Cc, lpeg.Ct, lpeg.Cs, lpeg.match
local find = string.find
+local zwnj = 0x200C
local grouped = P("{") * ( Ct((U/utfbyte-P("}"))^1) + Cc(false) ) * P("}")-- grouped
local splitter = Ct((
- Ct(Cc("discretionary") * grouped * grouped * grouped)
- + Ct(Cc("noligature") * grouped)
+ #P("{") * (
+ P("{}") / function() return zwnj end
+ + Ct(Cc("discretionary") * grouped * grouped * grouped)
+ + Ct(Cc("noligature") * grouped)
+ )
+ U/utfbyte
)^1)
+local stripper = P("{") * Cs((1-P(-2))^0) * P("}") * P(-1)
+
local trace_replacements = false trackers.register("languages.replacements", function(v) trace_replacements = v end)
local trace_detail = false trackers.register("languages.replacements.detail", function(v) trace_detail = v end)
@@ -93,6 +99,7 @@ lists[v_reset].attribute = unsetvalue -- so we discard 0
-- todo: glue kern attr
local function add(root,word,replacement)
+ local replacement = lpegmatch(stripper,replacement) or replacement
local list = utfsplit(word,true)
local size = #list
for i=1,size do
@@ -229,10 +236,16 @@ function replacements.handler(head)
elseif method == "noligature" then
-- not that efficient to copy but ok for testing
local list = codes[2]
- for i=1,#list do
+ if list then
+ for i=1,#list do
+ new = copy_node(last)
+ setchar(new,list[i])
+ setattr(new,a_noligature,1)
+ head, current = insert_after(head,current,new)
+ end
+ else
new = copy_node(last)
- setchar(new,list[i])
- setattr(new,a_noligature,1)
+ setchar(new,zwnj)
head, current = insert_after(head,current,new)
end
else
@@ -247,9 +260,13 @@ function replacements.handler(head)
end
flush_list(list)
elseif oldlength == newlength then -- #old == #new
- for i=1,newlength do
- setchar(current,newcodes[i])
- current = getnext(current)
+ if final.word == final.replacement then
+ -- nothing to do but skip
+ else
+ for i=1,newlength do
+ setchar(current,newcodes[i])
+ current = getnext(current)
+ end
end
elseif oldlength < newlength then -- #old < #new
for i=1,newlength-oldlength do