From 9bf202e8f1ff9a1047db825c54ca5226164eecfa Mon Sep 17 00:00:00 2001 From: Robert Alessi Date: Sun, 3 Jun 2018 22:13:51 +0200 Subject: LPegs patterns: removed most of the rules from (un)protectarb(), moved \par into takeoutcapetc(). [todo] more work is now needed for footnotes to work in some extreme cases --- arabluatex.lua | 66 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 26 deletions(-) (limited to 'arabluatex.lua') diff --git a/arabluatex.lua b/arabluatex.lua index 053fb50..6a08a33 100644 --- a/arabluatex.lua +++ b/arabluatex.lua @@ -35,21 +35,12 @@ local function gsub(s, patt, repl) end local function protectarb(str) --- str = string.gsub(str, "(\\arb%s?)(%[.-%])(%b{})", "\\@arb%2%3") --- str = string.gsub(str, "(\\begin%s?)(%b{})(%b[])", "\\@@begin{%2%3}") --- str = string.gsub(str, "(\\begin%s?)(%b{})", "\\@begin%2") --- str = string.gsub(str, "(\\end%s?)(%b{})", "\\@end%2") --- str = string.gsub(str, "\\par", "\\p@r{}") --- str = string.gsub(str, "\\@@par", "\\p@r{}") + str = string.gsub(str, "(\\arb%s?)(%[.-%])(%b{})", "\\@arb%2%3") return str end local function unprotectarb(str) --- str = string.gsub(str, "(\\@arb)(%[.-%])(%b{})", "\\arb%2%3") --- str = string.gsub(str, "(\\@@begin){(%b{})(%b[])}", "\\begin%2%3") --- str = string.gsub(str, "(\\@begin)(%b{})", "\\begin%2") --- str = string.gsub(str, "(\\@end)(%b{})", "\\end%2") --- str = string.gsub(str, "\\p@r{}", "\\par") + str = string.gsub(str, "(\\@arb)(%[.-%])(%b{})", "\\arb%2%3") return str end @@ -57,11 +48,8 @@ end -- arabluatex. 'albrkcmds' is what is set by default. 'brkcmds' is -- what may be set in the preamble as argument of \MkArbBreak{} local albrkcmds = { - "arb", "begin", "end", - "par", - "@@par", "RL", "LR", "RLfootnote", @@ -89,12 +77,16 @@ function mkarbbreak(str) end -- some basic patterns: +local ascii = lpeg.R("az", "AZ", "@@") local dblbkslash = lpeg.Cs("\\") local bsqbrackets = lpeg.Cs{ "[" * ((1 - lpeg.S"[]") + lpeg.V(1))^0 * "]" } local bcbraces = lpeg.Cs{ "{" * ((1 - lpeg.S"{}") + lpeg.V(1))^0 * "}" } local spce = lpeg.Cs(" ") +local spcenc = lpeg.P(" ") +local cmdstar = lpeg.Cs(spce * lpeg.P("*")) local bsqbracketsii = lpeg.Cs(bsqbrackets^-2) local bcbracesii = lpeg.Cs(bcbraces^-2) +local cmd = lpeg.Cs(dblbkslash * ascii^1 * cmdstar^-1) local cmdargs = lpeg.Cs(spce * bsqbracketsii * bcbracesii * bsqbrackets^-1) local function breakcmd(str) @@ -133,22 +125,43 @@ local function breakcmd(str) return str end +---[[ +local function holdcmd(str) + str = gsub(str, lpeg.Cs("\\arb") * bcbraces, function(tag, body) + body = string.sub(body, 2, -2) + body = gsub(body, cmd * bsqbracketsii * spcenc^-1 * bcbraces, function(btag, bopt, bbody) + bbody = string.sub(bbody, 2, -2) + if string.find(btag, "@") then + return holdcmd(string.format("}%s%s{%s}\\arb{", btag, bopt, bbody)) + else + return holdcmd(string.format("}%s%s{\\arb{%s}}\\arb{", btag, bopt, bbody)) + end + end) + return string.format("%s{%s}", tag, body) + end) + str = string.gsub(str, "\\arb{}", "") + return str +end +--]] + +--[[ local function holdcmd(str) str = string.gsub(str, "\\(arb)(%b{})", function(tag, body) body = string.sub(body, 2, -2) body = string.gsub(body, "\\(.-)(%b{})", function(btag, bbody) bbody = string.sub(bbody, 2, -2) --- if string.find(btag, "@") then --- return holdcmd(string.format("}\\%s{%s}\\arb{", btag, bbody)) --- else + if string.find(btag, "@") then + return holdcmd(string.format("}\\%s{%s}\\arb{", btag, bbody)) + else return holdcmd(string.format("}\\%s{\\arb{%s}}\\arb{", btag, bbody)) --- end + end end) return string.format("\\%s{%s}", tag, body) end) str = string.gsub(str, "\\arb{}", "") return str end +--]] local function arbnum(str) str = string.gsub(str, "([0-9%,%-%/]+)", function(num) @@ -207,6 +220,7 @@ local function takeoutcapetc(str) end) str = string.gsub(str, "\\linebreak", "") str = string.gsub(str, "\\%-", "") + str = string.gsub(str, "\\(@-)par", "\\%1par{}") return str end @@ -594,7 +608,7 @@ function processvoc(str, rules, scheme) str = "\\arb{".. str.."}" str = processarbnull(str, scheme) str = takeoutcapetc(str) --- str = protectarb(str) + str = protectarb(str) str = breakcmd(str) str = holdcmd(str) if scheme == "buckwalter" then @@ -605,7 +619,7 @@ function processvoc(str, rules, scheme) elseif rules == "dflt" or rules == "idgham" then str = voc(str, rules) else end --- str = unprotectarb(str) + str = unprotectarb(str) return str end @@ -613,7 +627,7 @@ function processfullvoc(str, rules, scheme) str = "\\arb{".. str.."}" str = processarbnull(str, scheme) str = takeoutcapetc(str) --- str = protectarb(str) + str = protectarb(str) str = breakcmd(str) str = holdcmd(str) if scheme == "buckwalter" then @@ -626,7 +640,7 @@ function processfullvoc(str, rules, scheme) elseif rules == "dflt" or rules == "idgham" then str = fullvoc(str, rules) else end --- str = unprotectarb(str) + str = unprotectarb(str) return str end @@ -634,7 +648,7 @@ function processnovoc(str, rules, scheme) str = "\\arb{".. str.."}" str = processarbnull(str, scheme) str = takeoutcapetc(str) --- str = protectarb(str) + str = protectarb(str) str = breakcmd(str) str = holdcmd(str) if scheme == "buckwalter" then @@ -645,7 +659,7 @@ function processnovoc(str, rules, scheme) elseif rules == "dflt" or rules == "idgham" then str = novoc(str) else end --- str = unprotectarb(str) + str = unprotectarb(str) return str end @@ -654,7 +668,7 @@ function processtrans(str, mode, rules, scheme) str = processdiscretionary(str) str = processarbnull(str, scheme) str = takeoutabjad(str) --- str = protectarb(str) + str = protectarb(str) str = breakcmd(str) str = holdcmd(str) if scheme == "buckwalter" then @@ -667,7 +681,7 @@ function processtrans(str, mode, rules, scheme) elseif mode == "arabica" then str = transarabica(str) end --- str = unprotectarb(str) + str = unprotectarb(str) return str end -- cgit v1.2.3