19
19
package ch .njol .skript .expressions ;
20
20
21
21
import java .util .regex .Pattern ;
22
+ import java .util .regex .PatternSyntaxException ;
22
23
23
24
import ch .njol .skript .SkriptConfig ;
25
+ import ch .njol .skript .lang .Literal ;
24
26
import org .bukkit .event .Event ;
25
27
import org .jetbrains .annotations .Nullable ;
26
28
36
38
import ch .njol .util .Kleenean ;
37
39
import ch .njol .util .StringUtils ;
38
40
39
- /**
40
- * @author Peter Güttinger
41
- */
42
41
@ Name ("Join & Split" )
43
42
@ Description ("Joins several texts with a common delimiter (e.g. \" , \" ), or splits a text into multiple texts at a given delimiter." )
44
43
@ Examples ({
45
- "message \" Online players: %join all players with \" \" | \" \" %\" # %all players% would use the default \" x, y, and z\" " ,
46
- "set {_s::*} to the string argument split at \" ,\" "
44
+ "message \" Online players: %join all players' names with \" \" | \" \" %\" # %all players% would use the default \" x, y, and z\" " ,
45
+ "set {_s::*} to the string argument split at \" ,\" "
47
46
})
48
47
@ Since ("2.1, 2.5.2 (regex support), 2.7 (case sensitivity)" )
49
48
public class ExprJoinSplit extends SimpleExpression <String > {
@@ -61,33 +60,47 @@ public class ExprJoinSplit extends SimpleExpression<String> {
61
60
private boolean regex ;
62
61
private boolean caseSensitivity ;
63
62
64
- @ SuppressWarnings ("null" )
65
63
private Expression <String > strings ;
66
- @ Nullable
67
- private Expression <String > delimiter ;
64
+ private @ Nullable Expression <String > delimiter ;
65
+
66
+ private @ Nullable Pattern pattern ;
68
67
69
68
@ Override
70
- @ SuppressWarnings ({"unchecked" , "null" })
71
69
public boolean init (Expression <?>[] exprs , int matchedPattern , Kleenean isDelayed , ParseResult parseResult ) {
72
70
join = matchedPattern == 0 ;
73
71
regex = matchedPattern >= 3 ;
74
72
caseSensitivity = SkriptConfig .caseSensitive .value () || parseResult .hasTag ("case" );
73
+ //noinspection unchecked
75
74
strings = (Expression <String >) exprs [0 ];
75
+ //noinspection unchecked
76
76
delimiter = (Expression <String >) exprs [1 ];
77
+ if (!join && delimiter instanceof Literal ) {
78
+ String stringPattern = ((Literal <String >) delimiter ).getSingle ();
79
+ try {
80
+ this .pattern = compilePattern (stringPattern );
81
+ } catch (PatternSyntaxException e ) {
82
+ Skript .error ("'" + stringPattern + "' is not a valid regular expression" );
83
+ return false ;
84
+ }
85
+ }
77
86
return true ;
78
87
}
79
88
80
89
@ Override
81
- @ Nullable
82
- protected String [] get (Event event ) {
90
+ protected String @ Nullable [] get (Event event ) {
83
91
String [] strings = this .strings .getArray (event );
84
92
String delimiter = this .delimiter != null ? this .delimiter .getSingle (event ) : "" ;
85
93
if (strings .length == 0 || delimiter == null )
86
94
return new String [0 ];
87
- if (join ) {
95
+ if (join )
88
96
return new String [] {StringUtils .join (strings , delimiter )};
89
- } else {
90
- return strings [0 ].split (regex ? delimiter : (caseSensitivity ? "" : "(?i)" ) + Pattern .quote (delimiter ), -1 );
97
+ try {
98
+ Pattern pattern = this .pattern ;
99
+ if (pattern == null )
100
+ pattern = compilePattern (delimiter );
101
+ return pattern .split (strings [0 ], -1 );
102
+ } catch (PatternSyntaxException e ) {
103
+ return new String [0 ];
91
104
}
92
105
}
93
106
@@ -103,10 +116,28 @@ public Class<? extends String> getReturnType() {
103
116
104
117
@ Override
105
118
public String toString (@ Nullable Event event , boolean debug ) {
106
- if (join )
107
- return "join " + strings .toString (event , debug ) + (delimiter != null ? " with " + delimiter .toString (event , debug ) : "" );
108
- return (regex ? "regex " : "" ) + "split " + strings .toString (event , debug ) + (delimiter != null ? " at " + delimiter .toString (event , debug ) : "" )
109
- + (regex ? "" : "(case sensitive: " + caseSensitivity + ")" );
119
+ StringBuilder builder = new StringBuilder ();
120
+ if (join ) {
121
+ builder .append ("join " ).append (strings .toString (event , debug ));
122
+ if (delimiter != null )
123
+ builder .append (" with " ).append (delimiter .toString (event , debug ));
124
+ return builder .toString ();
125
+ }
126
+
127
+ assert delimiter != null ;
128
+ if (regex )
129
+ builder .append ("regex " );
130
+ builder .append ("split " )
131
+ .append (strings .toString (event , debug ))
132
+ .append (" at " )
133
+ .append (delimiter .toString (event , debug ));
134
+ if (!regex )
135
+ builder .append (" (case sensitive: " ).append (caseSensitivity ).append (")" );
136
+ return builder .toString ();
137
+ }
138
+
139
+ private Pattern compilePattern (String delimiter ) {
140
+ return Pattern .compile (regex ? delimiter : (caseSensitivity ? "" : "(?i)" ) + Pattern .quote (delimiter ));
110
141
}
111
142
112
143
}
0 commit comments