@@ -29,39 +29,33 @@ public GenericTokenParser(String openToken, String closeToken, TokenHandler hand
29
29
30
30
public String parse (String text ) {
31
31
StringBuilder builder = new StringBuilder ();
32
- if (text != null ) {
33
- String after = text ;
34
- int start = after . indexOf ( openToken ) ;
35
- int end = after .indexOf (closeToken );
32
+ if (text != null && text . length () > 0 ) {
33
+ char [] src = text . toCharArray () ;
34
+ int offset = 0 ;
35
+ int start = text .indexOf (openToken , offset );
36
36
while (start > -1 ) {
37
- if (end > start ) {
38
- String before = after . substring ( 0 , start );
39
- String content = after . substring ( start + openToken . length (), end );
40
- String substitution ;
41
-
42
- // check if variable has to be skipped
43
- if (start > 0 && text . charAt ( start - 1 ) == '\\' ) {
44
- before = before . substring ( 0 , before .length () - 1 );
45
- substitution = new StringBuilder ( openToken ). append ( content ). append ( closeToken ). toString () ;
37
+ if (start > 0 && src [ start - 1 ] == '\\' ) {
38
+ // the variable is escaped. remove the backslash.
39
+ builder . append ( src , offset , start - 1 ). append ( openToken );
40
+ offset = start + openToken . length () ;
41
+ } else {
42
+ int end = text . indexOf ( closeToken , start );
43
+ if (end == - 1 ) {
44
+ builder . append ( src , offset , src .length - offset );
45
+ offset = src . length ;
46
46
} else {
47
- substitution = handler .handleToken (content );
47
+ builder .append (src , offset , start - offset );
48
+ offset = start + openToken .length ();
49
+ String content = new String (src , offset , end - offset );
50
+ builder .append (handler .handleToken (content ));
51
+ offset = end + closeToken .length ();
48
52
}
49
-
50
- builder .append (before );
51
- builder .append (substitution );
52
- after = after .substring (end + closeToken .length ());
53
- } else if (end > -1 ) {
54
- String before = after .substring (0 , end );
55
- builder .append (before );
56
- builder .append (closeToken );
57
- after = after .substring (end + closeToken .length ());
58
- } else {
59
- break ;
60
53
}
61
- start = after .indexOf (openToken );
62
- end = after .indexOf (closeToken );
54
+ start = text .indexOf (openToken , offset );
55
+ }
56
+ if (offset < src .length ) {
57
+ builder .append (src , offset , src .length - offset );
63
58
}
64
- builder .append (after );
65
59
}
66
60
return builder .toString ();
67
61
}
0 commit comments