summaryrefslogtreecommitdiff
path: root/tex/context/third/transliterator/trans_tables_sr.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/third/transliterator/trans_tables_sr.lua')
-rw-r--r--tex/context/third/transliterator/trans_tables_sr.lua33
1 files changed, 27 insertions, 6 deletions
diff --git a/tex/context/third/transliterator/trans_tables_sr.lua b/tex/context/third/transliterator/trans_tables_sr.lua
index 2b1bdee..4f549c5 100644
--- a/tex/context/third/transliterator/trans_tables_sr.lua
+++ b/tex/context/third/transliterator/trans_tables_sr.lua
@@ -3,7 +3,9 @@
-- Serbian --
--===========================================================================--
-local translit = thirddata.translit
+local translit = thirddata.translit
+local pcache = translit.parser_cache
+local lpegmatch = lpeg.match
-- Special thanks to Mojca Miklavec and Arthur Reutenauer for their
@@ -189,7 +191,7 @@ end
local t = translit
-local function sr (mode, text)
+local function sr (mode)
local P, R, Cs = lpeg.P, lpeg.R, lpeg.Cs
local utfchar = translit.utfchar
local modestr = "p_" .. mode:match("to..$")
@@ -200,7 +202,7 @@ local function sr (mode, text)
trl_sr = t[mode.."_upper"] + t[mode.."_lower"]
-- transliteration from latin script requires macro handling …
- local _p_macro = P[[\]] * R("az", "AZ")^1
+ local _p_macro = P[[\]] * R("az", "AZ")^1 -- assuming standard catcodes
local _p_sr = translit.addrules (trl_sr, _p_sr) / trl_sr
if translit.hinting then
_p_sr = t.serbian_exceptions[modestr .. "_hint"] + _p_sr
@@ -213,8 +215,27 @@ local function sr (mode, text)
p_sr = Cs((_p_macro + _p_sr + utfchar)^0)
end
- return p_sr:match(text)
+ return p_sr
end
-translit.methods ["sr_tolt"] = function (text) return sr( "sr_tolt", text ) end
-translit.methods ["sr_tocy"] = function (text) return sr( "sr_tocy", text ) end
+translit.methods["sr_tolt"] = function (text)
+ local pname = "sr_tolt" .. tostring(translit.hinting) .. tostring(translit.sr_except)
+ local p = pcache[pname]
+ if not p then
+ p = sr("sr_tolt")
+ pcache[pname] = p
+ end
+ return lpegmatch(p, text)
+end
+
+translit.methods["sr_tocy"] = function (text)
+ local pname = "sr_tocy" .. tostring(translit.hinting) .. tostring(translit.sr_except)
+ local p = pcache[pname]
+ if not p then
+ p = sr("sr_tocy")
+ pcache[pname] = p
+ end
+ return lpegmatch(p, text)
+end
+
+-- vim:ft=lua:sw=4:ts=4