Skip to content

Commit 571c281

Browse files
Pattern Stringification Customization (SkriptLang#8391)
* Implement StringificationProperties * Package cleanup
1 parent 27850e5 commit 571c281

12 files changed

Lines changed: 324 additions & 147 deletions

src/main/java/ch/njol/skript/patterns/ChoicePatternElement.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ch.njol.skript.patterns;
22

3+
import ch.njol.skript.patterns.SkriptPattern.StringificationProperties;
34
import org.jetbrains.annotations.Nullable;
45

56
import java.util.ArrayList;
@@ -20,11 +21,11 @@ public void add(PatternElement patternElement) {
2021
}
2122

2223
public PatternElement getLast() {
23-
return patternElements.get(patternElements.size() - 1);
24+
return patternElements.getLast();
2425
}
2526

2627
public void setLast(PatternElement patternElement) {
27-
patternElements.remove(patternElements.size() - 1);
28+
patternElements.removeLast();
2829
patternElements.add(patternElement);
2930
}
3031

@@ -40,8 +41,7 @@ void setNext(@Nullable PatternElement next) {
4041
}
4142

4243
@Override
43-
@Nullable
44-
public MatchResult match(String expr, MatchResult matchResult) {
44+
public @Nullable MatchResult match(String expr, MatchResult matchResult) {
4545
for (PatternElement patternElement : patternElements) {
4646
MatchResult matchResultCopy = matchResult.copy();
4747
MatchResult newMatchResult = patternElement.match(expr, matchResultCopy);
@@ -53,8 +53,13 @@ public MatchResult match(String expr, MatchResult matchResult) {
5353

5454
@Override
5555
public String toString() {
56+
return toString(StringificationProperties.DEFAULT);
57+
}
58+
59+
@Override
60+
public String toString(StringificationProperties properties) {
5661
return patternElements.stream()
57-
.map(PatternElement::toFullString)
62+
.map(element -> element.toFullString(properties))
5863
.collect(Collectors.joining("|"));
5964
}
6065

src/main/java/ch/njol/skript/patterns/GroupPatternElement.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ch.njol.skript.patterns;
22

3+
import ch.njol.skript.patterns.SkriptPattern.StringificationProperties;
34
import org.jetbrains.annotations.Nullable;
45

56
import java.util.Set;
@@ -26,13 +27,17 @@ void setNext(@Nullable PatternElement next) {
2627
}
2728

2829
@Override
29-
@Nullable
30-
public MatchResult match(String expr, MatchResult matchResult) {
30+
public @Nullable MatchResult match(String expr, MatchResult matchResult) {
3131
return patternElement.match(expr, matchResult);
3232
}
3333

3434
@Override
3535
public String toString() {
36+
return toString(StringificationProperties.DEFAULT);
37+
}
38+
39+
@Override
40+
public String toString(StringificationProperties properties) {
3641
return "(" + patternElement + ")";
3742
}
3843

src/main/java/ch/njol/skript/patterns/LiteralPatternElement.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ch.njol.skript.patterns;
22

3+
import ch.njol.skript.patterns.SkriptPattern.StringificationProperties;
34
import org.jetbrains.annotations.Nullable;
45

56
import java.util.HashSet;
@@ -23,25 +24,27 @@ public boolean isEmpty() {
2324
}
2425

2526
@Override
26-
@Nullable
27-
public MatchResult match(String expr, MatchResult matchResult) {
27+
public @Nullable MatchResult match(String expr, MatchResult matchResult) {
2828
char[] exprChars = expr.toCharArray();
2929

3030
int exprIndex = matchResult.exprOffset;
3131
for (char c : literal) {
3232
if (c == ' ') { // spaces have special handling to account for extraneous spaces within lines
3333
// ignore patterns leading or ending with spaces (or if we have multiple leading spaces)
34-
if (exprIndex == 0 || exprIndex == exprChars.length)
34+
if (exprIndex == 0 || exprIndex == exprChars.length) {
3535
continue;
36+
}
3637
if (exprChars[exprIndex] == ' ') { // pattern is ' fly' and we were given ' fly'
3738
exprIndex++;
3839
continue;
3940
}
40-
if (exprChars[exprIndex - 1] == ' ') // pattern is ' fly' but we were given something like ' fly' or 'fly'
41+
if (exprChars[exprIndex - 1] == ' ') { // pattern is ' fly' but we were given something like ' fly' or 'fly'
4142
continue;
43+
}
4244
return null;
43-
} else if (exprIndex == exprChars.length || Character.toLowerCase(c) != Character.toLowerCase(exprChars[exprIndex]))
45+
} else if (exprIndex == exprChars.length || Character.toLowerCase(c) != Character.toLowerCase(exprChars[exprIndex])) {
4446
return null;
47+
}
4548
exprIndex++;
4649
}
4750

@@ -51,6 +54,11 @@ public MatchResult match(String expr, MatchResult matchResult) {
5154

5255
@Override
5356
public String toString() {
57+
return toString(StringificationProperties.DEFAULT);
58+
}
59+
60+
@Override
61+
public String toString(StringificationProperties properties) {
5462
return new String(literal);
5563
}
5664

src/main/java/ch/njol/skript/patterns/OptionalPatternElement.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ch.njol.skript.patterns;
22

3+
import ch.njol.skript.patterns.SkriptPattern.StringificationProperties;
34
import org.jetbrains.annotations.Nullable;
45

56
import java.util.Set;
@@ -12,6 +13,10 @@ public class OptionalPatternElement extends PatternElement {
1213
private final PatternElement patternElement;
1314

1415
public OptionalPatternElement(PatternElement patternElement) {
16+
if (patternElement instanceof GroupPatternElement groupPatternElement && groupPatternElement.next == null) {
17+
// convert [(...)] to [...], for example [(a|b)] to [a|b]
18+
patternElement = groupPatternElement.getPatternElement();
19+
}
1520
this.patternElement = patternElement;
1621
}
1722

@@ -22,8 +27,7 @@ void setNext(@Nullable PatternElement next) {
2227
}
2328

2429
@Override
25-
@Nullable
26-
public MatchResult match(String expr, MatchResult matchResult) {
30+
public @Nullable MatchResult match(String expr, MatchResult matchResult) {
2731
MatchResult newMatchResult = patternElement.match(expr, matchResult.copy());
2832
if (newMatchResult != null)
2933
return newMatchResult;
@@ -36,7 +40,12 @@ public PatternElement getPatternElement() {
3640

3741
@Override
3842
public String toString() {
39-
return "[" + patternElement.toFullString() + "]";
43+
return toString(StringificationProperties.DEFAULT);
44+
}
45+
46+
@Override
47+
public String toString(StringificationProperties properties) {
48+
return "[" + patternElement.toFullString(properties) + "]";
4049
}
4150

4251
@Override

src/main/java/ch/njol/skript/patterns/ParseTagPatternElement.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package ch.njol.skript.patterns;
22

3+
import ch.njol.skript.patterns.SkriptPattern.StringificationProperties;
4+
import org.jetbrains.annotations.NotNull;
35
import org.jetbrains.annotations.Nullable;
46

57
import java.util.HashSet;
@@ -11,16 +13,15 @@
1113
*/
1214
public class ParseTagPatternElement extends PatternElement {
1315

14-
@Nullable
15-
private String tag;
16+
private @Nullable String tag;
1617
private final int mark;
1718

1819
public ParseTagPatternElement(int mark) {
1920
this.tag = null;
2021
this.mark = mark;
2122
}
2223

23-
public ParseTagPatternElement(String tag) {
24+
public ParseTagPatternElement(@NotNull String tag) {
2425
this.tag = tag;
2526
int mark = 0;
2627
try {
@@ -44,9 +45,8 @@ void setNext(@Nullable PatternElement next) {
4445
inner = ((OptionalPatternElement) next).getPatternElement();
4546
}
4647

47-
if (inner instanceof ChoicePatternElement) {
48+
if (inner instanceof ChoicePatternElement choicePatternElement) {
4849
// :(a|b) or :[a|b]
49-
ChoicePatternElement choicePatternElement = (ChoicePatternElement) inner;
5050
List<PatternElement> patternElements = choicePatternElement.getPatternElements();
5151
for (int i = 0; i < patternElements.size(); i++) {
5252
PatternElement patternElement = patternElements.get(i);
@@ -65,8 +65,7 @@ void setNext(@Nullable PatternElement next) {
6565
}
6666

6767
@Override
68-
@Nullable
69-
public MatchResult match(String expr, MatchResult matchResult) {
68+
public @Nullable MatchResult match(String expr, MatchResult matchResult) {
7069
if (tag != null && !tag.isEmpty())
7170
matchResult.tags.add(tag);
7271
matchResult.mark ^= mark;
@@ -75,13 +74,21 @@ public MatchResult match(String expr, MatchResult matchResult) {
7574

7675
@Override
7776
public String toString() {
78-
if (tag != null) {
79-
if (tag.isEmpty())
80-
return "";
81-
return tag + ":";
82-
} else {
83-
return mark + "¦";
77+
return toString(StringificationProperties.DEFAULT);
78+
}
79+
80+
@Override
81+
public String toString(StringificationProperties properties) {
82+
if (properties.excludeParseTags()) {
83+
return "";
84+
}
85+
if (tag == null) {
86+
return mark + ":";
87+
}
88+
if (tag.isEmpty()) {
89+
return "";
8490
}
91+
return tag + ":";
8592
}
8693

8794
/**

src/main/java/ch/njol/skript/patterns/PatternCompiler.java

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static PatternElement compile(String pattern, AtomicInteger expressionOffset) {
5252
for (int i = 0; i < pattern.length(); i++) {
5353
char c = pattern.charAt(i);
5454
if (c == '[') {
55-
if (literalBuilder.length() != 0) {
55+
if (!literalBuilder.isEmpty()) {
5656
first = appendElement(first, new LiteralPatternElement(literalBuilder.toString()));
5757
literalBuilder = new StringBuilder();
5858
}
@@ -64,7 +64,7 @@ static PatternElement compile(String pattern, AtomicInteger expressionOffset) {
6464

6565
i = end;
6666
} else if (c == '(') {
67-
if (literalBuilder.length() != 0) {
67+
if (!literalBuilder.isEmpty()) {
6868
first = appendElement(first, new LiteralPatternElement(literalBuilder.toString()));
6969
literalBuilder = new StringBuilder();
7070
}
@@ -76,7 +76,7 @@ static PatternElement compile(String pattern, AtomicInteger expressionOffset) {
7676

7777
i = end;
7878
} else if (c == '|') {
79-
if (literalBuilder.length() != 0) {
79+
if (!literalBuilder.isEmpty()) {
8080
first = appendElement(first, new LiteralPatternElement(literalBuilder.toString()));
8181
literalBuilder = new StringBuilder();
8282
}
@@ -110,7 +110,7 @@ static PatternElement compile(String pattern, AtomicInteger expressionOffset) {
110110

111111
first = appendElement(first, parseTagPatternElement);
112112
} else if (c == '%') {
113-
if (literalBuilder.length() != 0) {
113+
if (!literalBuilder.isEmpty()) {
114114
first = appendElement(first, new LiteralPatternElement(literalBuilder.toString()));
115115
literalBuilder = new StringBuilder();
116116
}
@@ -125,7 +125,7 @@ static PatternElement compile(String pattern, AtomicInteger expressionOffset) {
125125

126126
i = end;
127127
} else if (c == '<') {
128-
if (literalBuilder.length() != 0) {
128+
if (!literalBuilder.isEmpty()) {
129129
first = appendElement(first, new LiteralPatternElement(literalBuilder.toString()));
130130
literalBuilder = new StringBuilder();
131131
}
@@ -152,7 +152,7 @@ static PatternElement compile(String pattern, AtomicInteger expressionOffset) {
152152
}
153153
}
154154

155-
if (literalBuilder.length() != 0) {
155+
if (!literalBuilder.isEmpty()) {
156156
first = appendElement(first, new LiteralPatternElement(literalBuilder.toString()));
157157
}
158158

@@ -168,24 +168,30 @@ static PatternElement compile(String pattern, AtomicInteger expressionOffset) {
168168
* Returns the new first element of the list.
169169
*/
170170
private static PatternElement appendElement(@Nullable PatternElement first, PatternElement next) {
171-
if (first == null || (first instanceof LiteralPatternElement && first.next == null && ((LiteralPatternElement) first).isEmpty())) {
171+
// if "first" is null or not meaningful (empty), simply return "next"
172+
if (first == null || (first instanceof LiteralPatternElement literalPatternElement && first.next == null && literalPatternElement.isEmpty())) {
172173
return next;
173-
} else {
174-
if (first instanceof ChoicePatternElement) {
175-
ChoicePatternElement choicePatternElement = (ChoicePatternElement) first;
176-
PatternElement last = choicePatternElement.getLast();
177-
choicePatternElement.setLast(appendElement(last, next));
178-
return first;
179-
}
180-
181-
PatternElement last = first;
182-
while (last.next != null)
183-
last = last.next;
174+
}
184175

185-
last.setNext(next);
186-
last.originalNext = next;
176+
// if appending to a choice, we need to append to the last choice
177+
// ex: appending "hello" to "a|b", result should be "a|b hello" where the choices are "a" and "b hello"
178+
if (first instanceof ChoicePatternElement choicePatternElement) {
179+
PatternElement last = choicePatternElement.getLast();
180+
choicePatternElement.setLast(appendElement(last, next));
187181
return first;
188182
}
183+
184+
// get last element
185+
PatternElement last = first;
186+
while (last.next != null) {
187+
last = last.next;
188+
}
189+
190+
// append to this element
191+
last.setNext(next);
192+
last.originalNext = next;
193+
194+
return first;
189195
}
190196

191197
}

0 commit comments

Comments
 (0)