| 475 | } |
| 476 | |
| 477 | Token mTEXT() { |
| 478 | boolean modifiedText = false; |
| 479 | StringBuilder buf = new StringBuilder(); |
| 480 | while ( c!= EOF && c!= delimiterStartChar ) { |
| 481 | if ( c=='\r' || c=='\n' ) break; |
| 482 | if ( c=='}' && subtemplateDepth>0) break; |
| 483 | if ( c=='\\' ) { |
| 484 | if ( input.LA(2)=='\\' ) { // convert \\ to \ |
| 485 | consume(); |
| 486 | consume(); |
| 487 | buf.append('\\'); |
| 488 | modifiedText = true; |
| 489 | continue; |
| 490 | } |
| 491 | |
| 492 | if ( input.LA(2)==delimiterStartChar || input.LA(2)=='}' ) { |
| 493 | modifiedText = true; |
| 494 | consume(); // toss out \ char |
| 495 | buf.append(c); |
| 496 | consume(); |
| 497 | } |
| 498 | else { |
| 499 | buf.append(c); |
| 500 | consume(); |
| 501 | } |
| 502 | continue; |
| 503 | } |
| 504 | buf.append(c); |
| 505 | consume(); |
| 506 | } |
| 507 | |
| 508 | if ( modifiedText ) return newToken(TEXT, buf.toString()); |
| 509 | else return newToken(TEXT); |
| 510 | } |
| 511 | |
| 512 | /** <pre> |
| 513 | * ID : ('a'..'z'|'A'..'Z'|'_'|'/') |