From 4598ab9c7ed597b70726baaab9e30645562b5931 Mon Sep 17 00:00:00 2001 From: Robert Alessi Date: Sat, 9 Jun 2018 08:09:17 +0200 Subject: huge commit: improved LPeg patterns, (un)protectarb() now operates on \arb[]{}, LR{}/LR{} and any command found in (al)brkcmds tables, which withholds the execution of the 'breaking' mechanism until holdcmd() function operates. improved holdcmd() with LPeg patterns: commands with up to two optional arguments are now processed. moved back \par into albrkcmds. --- arabluatex.lua | 87 +++++++++++++++++++++++++++------------------------------- 1 file changed, 41 insertions(+), 46 deletions(-) (limited to 'arabluatex.lua') diff --git a/arabluatex.lua b/arabluatex.lua index 6a08a33..d77aa51 100644 --- a/arabluatex.lua +++ b/arabluatex.lua @@ -34,14 +34,35 @@ local function gsub(s, patt, repl) return lpeg.match(patt, s) 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 protectarb(str) str = string.gsub(str, "(\\arb%s?)(%[.-%])(%b{})", "\\@arb%2%3") -return str + str = string.gsub(str, "(\\LR%s?)(%b{})", "\\@LR%2") + str = string.gsub(str, "(\\RL%s?)(%b{})", "\\@RL%2") + return str end local function unprotectarb(str) str = string.gsub(str, "(\\@arb)(%[.-%])(%b{})", "\\arb%2%3") -return str + str = string.gsub(str, "(\\@LR)(%b{})", "\\LR%2") + str = string.gsub(str, "(\\@RL)(%b{})", "\\RL%2") + str = gsub(str, lpeg.Cs("\\al@brk") * bcbraces, function(tag, body) + body = string.sub(body, 2, -2) + return string.format("%s", body) + end) + return str end -- commands the arguments of which must not be processed by @@ -50,10 +71,7 @@ end local albrkcmds = { "begin", "end", - "RL", - "LR", - "RLfootnote", - "LRfootnote", + "par", "LRmarginpar", "Footnote", "Marginpar", @@ -76,25 +94,12 @@ function mkarbbreak(str) return brkcmds 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) -- process \item[], then \item[] str = string.gsub(str, "\\(item.?)(%b[])", function(tag, body) body = string.sub(body, 2, -2) - return string.format("}\\item[\\arb{%s}] \\arb{", body) + return string.format("\\al@brk{\\item[\\arb{%s}] }", body) end) str = string.gsub(str, "(\\item)(%s+)", "%1{}%2") -- \textcolor @@ -102,30 +107,40 @@ local function breakcmd(str) function(tag, bodycolor, bodytext) bodycolor = string.sub(bodycolor, 2, -2) bodytext = string.sub(bodytext, 2, -2) - return string.format("}\\%s{%s}{\\arb{%s}}\\arb{", tag, bodycolor, bodytext) + return string.format("\\al@brk{\\%s{%s}{\\arb{%s}}}", tag, bodycolor, bodytext) end) -- Abjad str = string.gsub(str, "\\(abjad%s?)(%b{})", + function(tag, body) + body = string.sub(body, 2, -2) + return string.format("\\al@brk{\\%s{%s}}", tag, body) + end) + -- LR/RL footnotes + str = string.gsub(str, "\\(RLfootnote%s?)(%b{})", + function(tag, body) + body = string.sub(body, 2, -2) + return string.format("}\\%s{%s}\\arb{", tag, body) + end) + str = string.gsub(str, "\\(LRfootnote%s?)(%b{})", function(tag, body) body = string.sub(body, 2, -2) - return string.format("}\\aemph{\\%s{%s}}\\arb{", tag, body) + return string.format("}\\%s{%s}\\arb{", tag, body) end) -- commands set by default in albrkcmds for i = 1,#albrkcmds do - str = gsub(str, dblbkslash * lpeg.Cs(albrkcmds[i]) * cmdargs, "}%1%2%3\\arb{") + str = gsub(str, dblbkslash * lpeg.Cs(albrkcmds[i]) * cmdargs, "\\al@brk{%1%2%3}") end -- user commands if next(brkcmds) == nil then -- nothing to do else for i = 1,#brkcmds do - str = gsub(str, dblbkslash * lpeg.Cs(brkcmds[i]) * cmdargs, "}%1%2%3\\arb{") + str = gsub(str, dblbkslash * lpeg.Cs(brkcmds[i]) * cmdargs, "\\al@brk{%1%2%3}") end end return str end ----[[ local function holdcmd(str) str = gsub(str, lpeg.Cs("\\arb") * bcbraces, function(tag, body) body = string.sub(body, 2, -2) @@ -142,26 +157,6 @@ local function holdcmd(str) 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 - return holdcmd(string.format("}\\%s{\\arb{%s}}\\arb{", btag, bbody)) - 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) @@ -220,7 +215,6 @@ local function takeoutcapetc(str) end) str = string.gsub(str, "\\linebreak", "") str = string.gsub(str, "\\%-", "") - str = string.gsub(str, "\\(@-)par", "\\%1par{}") return str end @@ -686,6 +680,7 @@ return str end function newarbmark(abbr, rtlmk, ltrmk) + rtlmk = "\\arabicfont "..rtlmk table.insert(arbmarks, {a = abbr, b = rtlmk, c = ltrmk}) return true end -- cgit v1.2.3