package tk.eclipse.plugin.htmleditor.editors; import org.eclipse.jface.text.rules.*; public class TagRule extends MultiLineRule { public TagRule(IToken token) { super("<", ">", token); } @Override protected boolean sequenceDetected(ICharacterScanner scanner,char[] sequence,boolean eofAllowed) { if (sequence[0] == '<') { int c = scanner.read(); if (c=='?' || c=='!' || c=='%') { scanner.unread(); return false; } } else if (sequence[0] == '>') { // read previous char scanner.unread(); scanner.unread(); int c = scanner.read(); // repair position scanner.read(); if(c=='%') { return false; } } return super.sequenceDetected(scanner, sequence, eofAllowed); } @Override protected boolean endSequenceDetected(ICharacterScanner scanner) { int c; boolean doubleQuoted = false; boolean singleQuoted = false; char[][] delimiters= scanner.getLegalLineDelimiters(); boolean previousWasEscapeCharacter = false; while ((c= scanner.read()) != ICharacterScanner.EOF) { if (c == fEscapeCharacter) { // Skip the escaped character. scanner.read(); } else if(c=='"'){ if(singleQuoted==false){ doubleQuoted = !doubleQuoted; } } else if(c=='\''){ if(doubleQuoted==false){ singleQuoted = !singleQuoted; } } else if (fEndSequence.length > 0 && c == fEndSequence[0]) { // Check if the specified end sequence has been found. if (doubleQuoted==false && singleQuoted==false && sequenceDetected(scanner, fEndSequence, true)) return true; } else if (fBreaksOnEOL) { // Check for end of line since it can be used to terminate the pattern. for (int i= 0; i < delimiters.length; i++) { if (c == delimiters[i][0] && sequenceDetected(scanner, delimiters[i], true)) { if (!fEscapeContinuesLine || !previousWasEscapeCharacter) return true; } } } previousWasEscapeCharacter = (c == fEscapeCharacter); } if (fBreaksOnEOF) return true; scanner.unread(); return false; } }