1 55 56 package freemarker.eclipse.editors; 57 58 import org.eclipse.jface.text.rules.ICharacterScanner; 59 60 69 public class FreemarkerTools { 70 71 74 private static final char[] COMMENT_START = "<#--".toCharArray(); 75 76 79 private static final char[] COMMENT_END = "-->".toCharArray(); 80 81 84 private static final char[] XML_COMMENT_START = "<!--".toCharArray(); 85 86 89 private static final char[] XML_COMMENT_END = "-->".toCharArray(); 90 91 103 public static boolean readCommentStart(ICharacterScanner scanner) { 104 return readSequence(scanner, COMMENT_START); 105 } 106 107 112 public static void readCommentEnd(ICharacterScanner scanner) { 113 int c; 114 115 do { 116 c = scanner.read(); 117 if (c == '-') { 118 scanner.unread(); 119 if (readSequence(scanner, COMMENT_END)) { 120 break; 121 } else { 122 c = scanner.read(); 123 } 124 } 125 } while (c != ICharacterScanner.EOF); 126 } 127 128 140 public static boolean readDirectiveStart(ICharacterScanner scanner) { 141 int c; 142 143 c = scanner.read(); 144 if (c != '<') { 145 scanner.unread(); 146 return false; 147 } 148 c = scanner.read(); 149 if (c != '#' && c != '@' && c != '/') { 150 scanner.unread(); 151 scanner.unread(); 152 return false; 153 } 154 if (c == '/') { 155 c = scanner.read(); 156 if (c != '#' && c != '@') { 157 scanner.unread(); 158 scanner.unread(); 159 scanner.unread(); 160 return false; 161 } 162 } 163 return true; 164 } 165 166 174 public static void readDirectiveEnd(ICharacterScanner scanner) { 175 int parens = 0; 176 int c; 177 178 do { 179 c = scanner.read(); 180 if (c == '<') { 181 scanner.unread(); 182 if (readCommentStart(scanner)) { 183 readCommentEnd(scanner); 184 } else { 185 c = scanner.read(); 186 } 187 } else if (c == '"') { 188 readQuoteEnd(scanner); 189 } else if (c == '(') { 190 parens++; 191 } else if (c == ')') { 192 parens--; 193 } 194 } while (c != ICharacterScanner.EOF 195 && (c != '>' || parens > 0)); 196 } 197 198 210 public static boolean readInterpolationStart(ICharacterScanner scanner) { 211 int c; 212 213 c = scanner.read(); 214 if (c != '$' && c != '#') { 215 scanner.unread(); 216 return false; 217 } 218 c = scanner.read(); 219 if (c != '{') { 220 scanner.unread(); 221 scanner.unread(); 222 return false; 223 } 224 return true; 225 } 226 227 234 public static void readInterpolationEnd(ICharacterScanner scanner) { 235 int c; 236 237 do { 238 c = scanner.read(); 239 if (c == '"') { 240 readQuoteEnd(scanner); 241 } else if (c == '{') { 242 readHashEnd(scanner); 243 } 244 } while (c != ICharacterScanner.EOF && c != '}'); 245 } 246 247 259 public static boolean readHashStart(ICharacterScanner scanner) { 260 if (scanner.read() != '{') { 261 scanner.unread(); 262 return false; 263 } else { 264 return true; 265 } 266 } 267 268 273 public static void readHashEnd(ICharacterScanner scanner) { 274 int c; 275 276 do { 277 c = scanner.read(); 278 if (c == '"') { 279 readQuoteEnd(scanner); 280 } else if (c == '{') { 281 readHashEnd(scanner); 282 } 283 284 } while (c != ICharacterScanner.EOF && c != '}'); 285 } 286 287 299 public static boolean readQuoteStart(ICharacterScanner scanner) { 300 if (scanner.read() != '"') { 301 scanner.unread(); 302 return false; 303 } else { 304 return true; 305 } 306 } 307 308 315 public static void readQuoteEnd(ICharacterScanner scanner) { 316 int c; 317 318 do { 319 c = scanner.read(); 320 if (c == '\\') { 321 scanner.read(); 322 } 323 } while (c != ICharacterScanner.EOF && c != '"'); 324 } 325 326 338 public static boolean readXmlCommentStart(ICharacterScanner scanner) { 339 return readSequence(scanner, XML_COMMENT_START); 340 } 341 342 349 public static void readXmlCommentEnd(ICharacterScanner scanner) { 350 int c; 351 352 do { 353 c = scanner.read(); 354 if (c == '$' || c == '#') { 355 scanner.unread(); 356 if (readInterpolationStart(scanner)) { 357 readInterpolationEnd(scanner); 358 } else { 359 c = scanner.read(); 360 } 361 } else if (c == '<') { 362 scanner.unread(); 363 if (readCommentStart(scanner)) { 364 readCommentEnd(scanner); 365 } else if (readDirectiveStart(scanner)) { 366 readDirectiveEnd(scanner); 367 } else { 368 c = scanner.read(); 369 } 370 } else if (c == '-') { 371 scanner.unread(); 372 if (readSequence(scanner, XML_COMMENT_END)) { 373 break; 374 } else { 375 c = scanner.read(); 376 } 377 } 378 } while (c != ICharacterScanner.EOF); 379 } 380 381 393 public static boolean readXmlTagStart(ICharacterScanner scanner) { 394 if (scanner.read() != '<') { 395 scanner.unread(); 396 return false; 397 } else { 398 return true; 399 } 400 } 401 402 409 public static void readXmlTagEnd(ICharacterScanner scanner) { 410 int c; 411 412 do { 413 c = scanner.read(); 414 if (c == '$' || c == '#') { 415 scanner.unread(); 416 if (readInterpolationStart(scanner)) { 417 readInterpolationEnd(scanner); 418 } else { 419 c = scanner.read(); 420 } 421 } else if (c == '<') { 422 scanner.unread(); 423 if (readCommentStart(scanner)) { 424 readCommentEnd(scanner); 425 } else if (readDirectiveStart(scanner)) { 426 readDirectiveEnd(scanner); 427 } else { 428 c = scanner.read(); 429 } 430 } 431 } while (c != ICharacterScanner.EOF && c != '>'); 432 } 433 434 446 private static boolean readSequence(ICharacterScanner scanner, 447 char[] chars) { 448 449 int pos = 0; 450 int c; 451 452 do { 453 c = scanner.read(); 454 if (chars[pos] != c) { 455 while (pos-- >= 0) { 456 scanner.unread(); 457 } 458 return false; 459 } 460 pos++; 461 } while (pos < chars.length); 462 463 return true; 464 } 465 } 466 | Popular Tags |