@@ -31,26 +31,42 @@ public GenericTokenParser(String openToken, String closeToken, TokenHandler hand
31
31
}
32
32
33
33
public String parse (String text ) {
34
- StringBuilder builder = new StringBuilder ();
34
+ final StringBuilder builder = new StringBuilder ();
35
+ final StringBuilder expression = new StringBuilder ();
35
36
if (text != null && text .length () > 0 ) {
36
37
char [] src = text .toCharArray ();
37
38
int offset = 0 ;
39
+ // search open token
38
40
int start = text .indexOf (openToken , offset );
39
41
while (start > -1 ) {
40
42
if (start > 0 && src [start - 1 ] == '\\' ) {
41
- // the variable is escaped. remove the backslash.
43
+ // this open token is escaped. remove the backslash and continue .
42
44
builder .append (src , offset , start - offset - 1 ).append (openToken );
43
45
offset = start + openToken .length ();
44
46
} else {
45
- int end = text .indexOf (closeToken , start );
47
+ // found open token. let's search close token.
48
+ expression .setLength (0 );
49
+ builder .append (src , offset , start - offset );
50
+ offset = start + openToken .length ();
51
+ int end = text .indexOf (closeToken , offset );
52
+ while (end > -1 ) {
53
+ if (end > offset && src [end - 1 ] == '\\' ) {
54
+ // this close token is escaped. remove the backslash and continue.
55
+ expression .append (src , offset , end - offset - 1 ).append (closeToken );
56
+ offset = end + closeToken .length ();
57
+ end = text .indexOf (closeToken , offset );
58
+ } else {
59
+ expression .append (src , offset , end - offset );
60
+ offset = end + closeToken .length ();
61
+ break ;
62
+ }
63
+ }
46
64
if (end == -1 ) {
47
- builder .append (src , offset , src .length - offset );
65
+ // close token was not found.
66
+ builder .append (src , start , src .length - start );
48
67
offset = src .length ;
49
68
} else {
50
- builder .append (src , offset , start - offset );
51
- offset = start + openToken .length ();
52
- String content = new String (src , offset , end - offset );
53
- builder .append (handler .handleToken (content ));
69
+ builder .append (handler .handleToken (expression .toString ()));
54
70
offset = end + closeToken .length ();
55
71
}
56
72
}
@@ -62,5 +78,4 @@ public String parse(String text) {
62
78
}
63
79
return builder .toString ();
64
80
}
65
-
66
81
}
0 commit comments