summaryrefslogtreecommitdiff
path: root/tex/context/third/transliterator/transliterator.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/third/transliterator/transliterator.lua')
-rw-r--r--tex/context/third/transliterator/transliterator.lua19
1 files changed, 16 insertions, 3 deletions
diff --git a/tex/context/third/transliterator/transliterator.lua b/tex/context/third/transliterator/transliterator.lua
index d794c05..f1d34ae 100644
--- a/tex/context/third/transliterator/transliterator.lua
+++ b/tex/context/third/transliterator/transliterator.lua
@@ -84,11 +84,24 @@ end
-- Generate a rule pattern from hash table.
do
local P, R, V = lpeg.P, lpeg.R, lpeg.V
+ local len = unicode.utf8.len
+ -- multi-char rules first
function translit.addrules (dict, rules)
- for i, _ in pairs(dict) do
- if rules == nil then rules = P(i)
- else rules = rules + P(i)
+ local by_length, occurring_lengths = { }, { }
+ for chr, _ in next, dict do
+ local l = len(chr)
+ if not by_length[l] then
+ by_length[l] = { }
+ occurring_lengths[#occurring_lengths+1] = l
+ end
+ by_length[l][#by_length[l]+1] = chr
+ end
+ table.sort(occurring_lengths)
+ for i=#occurring_lengths, 1, -1 do
+ local l = occurring_lengths[i]
+ for _, chr in next, by_length[l] do
+ rules = rules and rules + P(chr) or P(chr)
end
end
return rules