From bc16279db68fd63aa1830167e0a635f6526cc1ed Mon Sep 17 00:00:00 2001
From: Robert Alessi <alessi@robertalessi.net>
Date: Sat, 2 Jun 2018 16:55:55 +0200
Subject: use LPeg patterns in holdcmd() as well and get rid of
 (un)protectarb()

---
 arabluatex.lua | 53 +++++++++++++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 24 deletions(-)

diff --git a/arabluatex.lua b/arabluatex.lua
index 8ba42fd..053fb50 100644
--- a/arabluatex.lua
+++ b/arabluatex.lua
@@ -35,21 +35,21 @@ local function gsub(s, patt, repl)
 end
 
 local function protectarb(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, "\\par", "\\p@r{}")
-   str = string.gsub(str, "\\@@par", "\\p@r{}")
+--   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{}")
 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")
+--   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")
 return str
 end
 
@@ -57,6 +57,11 @@ 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",
@@ -90,7 +95,7 @@ local bcbraces = lpeg.Cs{ "{" * ((1 - lpeg.S"{}") + lpeg.V(1))^0 * "}" }
 local spce = lpeg.Cs(" ")
 local bsqbracketsii = lpeg.Cs(bsqbrackets^-2)
 local bcbracesii = lpeg.Cs(bcbraces^-2)
-local cmdargs = lpeg.Cs(spce * bsqbracketsii * bcbracesii)
+local cmdargs = lpeg.Cs(spce * bsqbracketsii * bcbracesii * bsqbrackets^-1)
 
 local function breakcmd(str)
    -- process \item[], then \item[]
@@ -133,11 +138,11 @@ local function holdcmd(str)
 	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)
@@ -589,7 +594,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
@@ -600,7 +605,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
 
@@ -608,7 +613,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
@@ -621,7 +626,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
 
@@ -629,7 +634,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
@@ -640,7 +645,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
 
@@ -649,7 +654,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
@@ -662,7 +667,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