Skip to content

Commit 7a3190c

Browse files
committed
improved handling of = in wiki context
1 parent ba95bef commit 7a3190c

3 files changed

Lines changed: 78 additions & 15 deletions

File tree

wiki/TemplateParser.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,10 @@ private String invocation_body(WikiScanner sh, WikiPage wp, Frame parent) {
182182
if (idx != -1) {//parameter present
183183
sh.setPointer(pointer0);//retract scanner at start of identifier
184184
sh.moveAfter(":");//move after : to get parameter
185-
StringBuilder param = new StringBuilder();
186-
template_body(sh, param, sh::getStringWithoutBracketsBar, wp, parent);
187-
parameter = param.toString();
185+
186+
String param = sh.getStringParameter(null);
187+
parameter = param == null ? "" : parseParameter(param, wp, parent);
188+
188189
while (sh.getCharInCharSet("|") != null) {//ignore any further parameter(s)
189190
sh.getStringParameter(null);
190191
}
@@ -203,10 +204,10 @@ private String invocation_body(WikiScanner sh, WikiPage wp, Frame parent) {
203204
if (idx != -1) {//first parameter present
204205
sh.setPointer(pointer0);//retract scanner at start of identifier
205206
sh.moveAfter(":");//move after : to get parameter
206-
StringBuilder param = new StringBuilder();
207-
template_body(sh, param, sh::getStringWithoutBracketsBar, wp, parent);
207+
208208
ArrayList<String> parameters = new ArrayList<>();
209-
parameters.add(param.toString().trim());//first parameter
209+
String param = sh.getStringParameter(null);
210+
parameters.add(param == null ? "" : param.trim());
210211

211212
Character ch;
212213
while ((ch = sh.getCharInCharSet("|")) != null) {//twin

wiki/parserfunctions/Switch.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import wiki.TemplateParser;
2929
import wiki.tools.WikiPage;
30+
import static wiki.tools.Utilities.findValidEqualSign;
3031
import info.bliki.extensions.scribunto.template.Frame;
3132

3233
//reference: https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:ParserFunctions
@@ -44,7 +45,8 @@ public String evaluate(WikiPage wp, ArrayList<String> parameters, Frame parent)
4445
boolean fallthrough = false;
4546
for (int i = 1; i < parameters.size(); i++) {
4647
String value = parameters.get(i);
47-
int idx = value.indexOf("=");
48+
int idx = findValidEqualSign(value);
49+
4850
String left = tp.parseParameter(idx != -1 ? value.substring(0, idx).trim() : value, wp, parent);
4951
if (idx != -1) {
5052
if ("#default".equals(left)) {

wiki/tools/Utilities.java

Lines changed: 68 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,77 @@ else if (lang_code.startsWith("de"))
4949
}
5050
}
5151

52-
public static int findValidEqualSign(String parameter) {//find position of = sign outside html tag
53-
if (parameter == null || parameter.isEmpty()) return -1;
54-
int idx = parameter.indexOf("=");
55-
if (idx == -1)
56-
return idx;
57-
int idx2 = parameter.indexOf("<");
58-
if ((idx2 == -1) || (idx < idx2))
59-
return idx;
52+
public static int findValidEqualSign(String str) {//find valid position of = sign
53+
if (str == null || str.isEmpty()) return -1;
54+
int len = str.length();
55+
int noc = 2; //number of open curls
56+
int i = 0;
57+
while (i < len) {
58+
char ch = str.charAt(i);
59+
switch (ch) {
60+
case '{':
61+
boolean found = false;
62+
while (++i < len && ((ch = str.charAt(i)) == '{')) {
63+
noc++; found = true;
64+
}
65+
if (found)
66+
noc++;
67+
continue;
68+
case '}':
69+
boolean found2 = false;
70+
while (noc > 0 && (++i < len) && ((ch = str.charAt(i)) == '}')) {
71+
noc--; found2 = true;
72+
}
73+
if (found2) {
74+
if (noc > 0)
75+
noc--;
76+
if (noc == 0)
77+
return -1;
78+
continue;
79+
}
80+
if (noc > 0) continue;
81+
break;
82+
case '<':
83+
if (str.startsWith("<nowiki>", i)) {
84+
int end = str.indexOf("</nowiki>", i + 8);
85+
if (end != -1) {
86+
i = end + 9;//go after tag "</nowiki>"
87+
continue;
88+
}
89+
} else if (str.startsWith("<code>", i)) {
90+
int end = str.indexOf("</code>", i + 6);
91+
if (end != -1) {
92+
i = end + 7;//go after tag "</code>"
93+
continue;
94+
}
95+
} else if (str.startsWith("<math>", i)) {
96+
int end = str.indexOf("</math>", i + 6);
97+
if (end != -1) {
98+
i = end + 7;//go after tag "</math>"
99+
continue;
100+
}
101+
}
102+
int end = str.indexOf(">", i);
103+
if (end != -1) {
104+
i = end + 1;// go after ">"
105+
continue;
106+
}
107+
break;
108+
case '|':
109+
if (noc < 3)
110+
return -1;
111+
break;
112+
case '=':
113+
if (noc < 3)
114+
return i;
115+
break;
116+
}
117+
i++;
118+
}
60119
return -1;
61120
}
62121

122+
63123
public static boolean checkInteger(String str) {//check that string str is an unsigned integer number
64124
for (char c : str.trim().toCharArray()) {
65125
if (!Character.isDigit(c)) {

0 commit comments

Comments
 (0)