diff options
-rw-r--r-- | arabluatex.lua | 133 |
1 files changed, 92 insertions, 41 deletions
diff --git a/arabluatex.lua b/arabluatex.lua index d77aa51..b8ef9df 100644 --- a/arabluatex.lua +++ b/arabluatex.lua | |||
@@ -65,9 +65,17 @@ local function unprotectarb(str) | |||
65 | return str | 65 | return str |
66 | end | 66 | end |
67 | 67 | ||
68 | -- commands the arguments of which must not be processed by | 68 | -- the following is to be taken out of \arb{} |
69 | -- arabluatex. 'albrkcmds' is what is set by default. 'brkcmds' is | 69 | local outofarb = { |
70 | -- what may be set in the preamble as argument of \MkArbBreak{} | 70 | "LRfootnote", |
71 | "RLfootnote", | ||
72 | "edtext", | ||
73 | "pstart", | ||
74 | "pend" | ||
75 | } | ||
76 | -- commands the arguments of which must not be processed by arabluatex | ||
77 | -- inside \arb{}. 'albrkcmds' is what is set by default. 'brkcmds' | ||
78 | -- collects the commands set in the preamble with \MkArbBreak{} | ||
71 | local albrkcmds = { | 79 | local albrkcmds = { |
72 | "begin", | 80 | "begin", |
73 | "end", | 81 | "end", |
@@ -75,23 +83,31 @@ local albrkcmds = { | |||
75 | "LRmarginpar", | 83 | "LRmarginpar", |
76 | "Footnote", | 84 | "Footnote", |
77 | "Marginpar", | 85 | "Marginpar", |
78 | "edtext", | 86 | "arbmark", |
79 | "pstart", | 87 | "textcolor", |
80 | "pend", | 88 | "abjad" |
81 | "arbmark" | ||
82 | } | 89 | } |
83 | local brkcmds = {} | 90 | local brkcmds = {} |
84 | 91 | ||
85 | function mkarbbreak(str) | 92 | function mkarbbreak(str, opt) |
86 | str = str .."," | 93 | str = str .."," |
87 | str = string.gsub(str, "%s+", "") | 94 | str = string.gsub(str, "%s+", "") |
88 | local fieldstart = 1 | 95 | local fieldstart = 1 |
89 | repeat | 96 | if opt == "dflt" then |
90 | local nexti = string.find(str, "%,", fieldstart) | 97 | repeat |
91 | table.insert(brkcmds, string.sub(str, fieldstart, nexti-1)) | 98 | local nexti = string.find(str, "%,", fieldstart) |
92 | fieldstart = nexti +1 | 99 | table.insert(brkcmds, string.sub(str, fieldstart, nexti-1)) |
93 | until fieldstart > string.len(str) | 100 | fieldstart = nexti +1 |
94 | return brkcmds | 101 | until fieldstart > string.len(str) |
102 | return brkcmds | ||
103 | elseif opt == "out" then | ||
104 | repeat | ||
105 | local nexti = string.find(str, "%,", fieldstart) | ||
106 | table.insert(outofarb, string.sub(str, fieldstart, nexti-1)) | ||
107 | fieldstart = nexti +1 | ||
108 | until fieldstart > string.len(str) | ||
109 | return outofarb | ||
110 | end | ||
95 | end | 111 | end |
96 | 112 | ||
97 | local function breakcmd(str) | 113 | local function breakcmd(str) |
@@ -103,29 +119,37 @@ local function breakcmd(str) | |||
103 | end) | 119 | end) |
104 | str = string.gsub(str, "(\\item)(%s+)", "%1{}%2") | 120 | str = string.gsub(str, "(\\item)(%s+)", "%1{}%2") |
105 | -- \textcolor | 121 | -- \textcolor |
106 | str = string.gsub(str, "\\(textcolor%s?)(%b{})(%b{})", | 122 | -- str = string.gsub(str, "\\(textcolor%s?)(%b{})(%b{})", |
107 | function(tag, bodycolor, bodytext) | 123 | -- function(tag, bodycolor, bodytext) |
108 | bodycolor = string.sub(bodycolor, 2, -2) | 124 | -- bodycolor = string.sub(bodycolor, 2, -2) |
109 | bodytext = string.sub(bodytext, 2, -2) | 125 | -- bodytext = string.sub(bodytext, 2, -2) |
110 | return string.format("\\al@brk{\\%s{%s}{\\arb{%s}}}", tag, bodycolor, bodytext) | 126 | -- return string.format("\\al@brk{\\%s{%s}{\\arb{%s}}}", tag, bodycolor, bodytext) |
111 | end) | 127 | -- end) |
128 | str = string.gsub(str, "(.)(\\arbcolor%s?)(%b[])(%b{})(.)", | ||
129 | function (li, tag, opt, body, lii) | ||
130 | li = string.gsub(li, "%+", "") -- ^^^^200d | ||
131 | lii = string.gsub(lii, "%+", "") -- ^^^^200d | ||
132 | body = string.sub(body, 2, -2) | ||
133 | body = string.gsub(body, "%+", "") -- ^^^^200d | ||
134 | return string.format("%s%s%s{%s}%s", li, tag, opt, body, lii) | ||
135 | end) | ||
112 | -- Abjad | 136 | -- Abjad |
113 | str = string.gsub(str, "\\(abjad%s?)(%b{})", | 137 | -- str = string.gsub(str, "\\(abjad%s?)(%b{})", |
114 | function(tag, body) | 138 | -- function(tag, body) |
115 | body = string.sub(body, 2, -2) | 139 | -- body = string.sub(body, 2, -2) |
116 | return string.format("\\al@brk{\\%s{%s}}", tag, body) | 140 | -- return string.format("\\al@brk{\\%s{%s}}", tag, body) |
117 | end) | 141 | -- end) |
118 | -- LR/RL footnotes | 142 | ---[[ |
119 | str = string.gsub(str, "\\(RLfootnote%s?)(%b{})", | 143 | -- to be taken out of \arb{}, as LR/RL footnotes and the like: |
120 | function(tag, body) | 144 | for i = 1,#outofarb do |
121 | body = string.sub(body, 2, -2) | 145 | str = gsub(str, dblbkslash * lpeg.Cs(outofarb[i]) * cmdargs, "}%1%2%3\\arb{") |
122 | return string.format("}\\%s{%s}\\arb{", tag, body) | 146 | -- str = gsub(str, dblbkslash * lpeg.Cs(outofarb[i]) * spcenc^-1 * bcbraces, |
123 | end) | 147 | -- function(prefix, tag, body) |
124 | str = string.gsub(str, "\\(LRfootnote%s?)(%b{})", | 148 | -- body = string.sub(body, 2, -2) |
125 | function(tag, body) | 149 | -- return string.format("}%s%s{%s}\\arb{", prefix, tag, body) |
126 | body = string.sub(body, 2, -2) | 150 | -- end) |
127 | return string.format("}\\%s{%s}\\arb{", tag, body) | 151 | end |
128 | end) | 152 | --]] |
129 | -- commands set by default in albrkcmds | 153 | -- commands set by default in albrkcmds |
130 | for i = 1,#albrkcmds do | 154 | for i = 1,#albrkcmds do |
131 | str = gsub(str, dblbkslash * lpeg.Cs(albrkcmds[i]) * cmdargs, "\\al@brk{%1%2%3}") | 155 | str = gsub(str, dblbkslash * lpeg.Cs(albrkcmds[i]) * cmdargs, "\\al@brk{%1%2%3}") |
@@ -144,7 +168,7 @@ end | |||
144 | local function holdcmd(str) | 168 | local function holdcmd(str) |
145 | str = gsub(str, lpeg.Cs("\\arb") * bcbraces, function(tag, body) | 169 | str = gsub(str, lpeg.Cs("\\arb") * bcbraces, function(tag, body) |
146 | body = string.sub(body, 2, -2) | 170 | body = string.sub(body, 2, -2) |
147 | body = gsub(body, cmd * bsqbracketsii * spcenc^-1 * bcbraces, function(btag, bopt, bbody) | 171 | body = gsub(body, cmd * spcenc^-1 * bsqbracketsii * spcenc^-1 * bcbraces, function(btag, bopt, bbody) |
148 | bbody = string.sub(bbody, 2, -2) | 172 | bbody = string.sub(bbody, 2, -2) |
149 | if string.find(btag, "@") then | 173 | if string.find(btag, "@") then |
150 | return holdcmd(string.format("}%s%s{%s}\\arb{", btag, bopt, bbody)) | 174 | return holdcmd(string.format("}%s%s{%s}\\arb{", btag, bopt, bbody)) |
@@ -218,6 +242,32 @@ local function takeoutcapetc(str) | |||
218 | return str | 242 | return str |
219 | end | 243 | end |
220 | 244 | ||
245 | local function takeoutarb(str) | ||
246 | for i = 1,#outofarb do | ||
247 | str = gsub(str, dblbkslash * lpeg.Cs(outofarb[i]) * cmdargs, | ||
248 | function(prefix, tag, body) | ||
249 | -- body = string.sub(body, 2, -2) | ||
250 | body = gsub(body, lpeg.P("\\arb"), "\\@rb") | ||
251 | return string.format("%s%s%s", prefix, tag, body) | ||
252 | end) | ||
253 | end | ||
254 | -- for i = 1,#outofarb do | ||
255 | -- str = gsub(str, dblbkslash * lpeg.Cs(outofarb[i]) * spcenc^-1 * bcbraces, | ||
256 | -- function(prefix, tag, body) | ||
257 | -- body = string.sub(body, 2, -2) | ||
258 | -- body = gsub(body, lpeg.P("\\arb"), "\\@rb") | ||
259 | -- return string.format("%s%s{%s}", prefix, tag, body) | ||
260 | -- end) | ||
261 | -- end | ||
262 | str = string.gsub(str, "(\\arb%s?)(%b{})", function(tag, body) | ||
263 | body = string.sub(body, 2, -2) | ||
264 | return string.format("%s", body) | ||
265 | end) | ||
266 | str = string.gsub(str, "\\@rb", "\\arb") | ||
267 | str = "\\arb{"..str.."}" | ||
268 | return str | ||
269 | end | ||
270 | |||
221 | local function voc(str, rules) | 271 | local function voc(str, rules) |
222 | str = string.gsub(str, "\\arb(%b{})", function(inside) | 272 | str = string.gsub(str, "\\arb(%b{})", function(inside) |
223 | inside = string.sub(inside, 2, -2) | 273 | inside = string.sub(inside, 2, -2) |
@@ -599,7 +649,7 @@ return str | |||
599 | end | 649 | end |
600 | 650 | ||
601 | function processvoc(str, rules, scheme) | 651 | function processvoc(str, rules, scheme) |
602 | str = "\\arb{".. str.."}" | 652 | str = takeoutarb(str) |
603 | str = processarbnull(str, scheme) | 653 | str = processarbnull(str, scheme) |
604 | str = takeoutcapetc(str) | 654 | str = takeoutcapetc(str) |
605 | str = protectarb(str) | 655 | str = protectarb(str) |
@@ -618,7 +668,7 @@ return str | |||
618 | end | 668 | end |
619 | 669 | ||
620 | function processfullvoc(str, rules, scheme) | 670 | function processfullvoc(str, rules, scheme) |
621 | str = "\\arb{".. str.."}" | 671 | str = takeoutarb(str) |
622 | str = processarbnull(str, scheme) | 672 | str = processarbnull(str, scheme) |
623 | str = takeoutcapetc(str) | 673 | str = takeoutcapetc(str) |
624 | str = protectarb(str) | 674 | str = protectarb(str) |
@@ -639,7 +689,7 @@ return str | |||
639 | end | 689 | end |
640 | 690 | ||
641 | function processnovoc(str, rules, scheme) | 691 | function processnovoc(str, rules, scheme) |
642 | str = "\\arb{".. str.."}" | 692 | str = takeoutarb(str) |
643 | str = processarbnull(str, scheme) | 693 | str = processarbnull(str, scheme) |
644 | str = takeoutcapetc(str) | 694 | str = takeoutcapetc(str) |
645 | str = protectarb(str) | 695 | str = protectarb(str) |
@@ -658,7 +708,7 @@ return str | |||
658 | end | 708 | end |
659 | 709 | ||
660 | function processtrans(str, mode, rules, scheme) | 710 | function processtrans(str, mode, rules, scheme) |
661 | str = "\\arb{".. str.."}" | 711 | str = takeoutarb(str) |
662 | str = processdiscretionary(str) | 712 | str = processdiscretionary(str) |
663 | str = processarbnull(str, scheme) | 713 | str = processarbnull(str, scheme) |
664 | str = takeoutabjad(str) | 714 | str = takeoutabjad(str) |
@@ -682,6 +732,7 @@ end | |||
682 | function newarbmark(abbr, rtlmk, ltrmk) | 732 | function newarbmark(abbr, rtlmk, ltrmk) |
683 | rtlmk = "\\arabicfont "..rtlmk | 733 | rtlmk = "\\arabicfont "..rtlmk |
684 | table.insert(arbmarks, {a = abbr, b = rtlmk, c = ltrmk}) | 734 | table.insert(arbmarks, {a = abbr, b = rtlmk, c = ltrmk}) |
735 | table.sort(arbmarks, function(a ,b) return(#a.a > #b.a) end) | ||
685 | return true | 736 | return true |
686 | end | 737 | end |
687 | 738 | ||