From ce59f6705d9b2bd6df0d3eeadbaf43b25fa58b4f Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Wed, 19 Oct 2011 00:01:18 +0200 Subject: parser caching (-> *great* speedup); generalized the yer-hack --- .../third/transliterator/trans_tables_sr.lua | 33 ++++++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'tex/context/third/transliterator/trans_tables_sr.lua') 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 -- cgit v1.2.3