package tk.eclipse.plugin.htmleditor.editors; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.MultiLineRule; /** * @author Naoki Takezoe */ public class DocTypeRule extends MultiLineRule { public DocTypeRule(IToken token){ super("<!DOCTYPE", ">", token); } @Override protected boolean endSequenceDetected(ICharacterScanner scanner) { int c; boolean quoted = 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=='['){ quoted = true; } else if(c==']'){ quoted = false; } else if (fEndSequence.length > 0 && c == fEndSequence[0]) { // Check if the specified end sequence has been found. if (quoted==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; } }