package tk.eclipse.plugin.htmleditor.editors; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IPredicateRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.IWordDetector; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WordRule; public class HTMLTagNameRule extends WordRule implements IPredicateRule { private IToken _woToken; public HTMLTagNameRule(IToken defaultToken, IToken woToken) { super(new HTMLTagWordDetector(), defaultToken); _woToken = woToken; } public IToken getSuccessToken() { return fDefaultToken; } @Override public IToken evaluate(ICharacterScanner scanner) { IToken token; int startColumn = scanner.getColumn(); if (startColumn >= 1) { boolean isTag = false; scanner.unread(); int ch = scanner.read(); if (ch == '/') { if (startColumn >= 2) { scanner.unread(); scanner.unread(); ch = scanner.read(); if (ch == '<') { isTag = true; } scanner.read(); } } else if (ch == '<') { isTag = true; } int possibleWoChar = scanner.read(); boolean possibleWoTag = possibleWoChar == 'w' || possibleWoChar == 'W'; scanner.unread(); if (isTag) { token = super.evaluate(scanner); if (possibleWoTag && token == fDefaultToken) { int endColumn = scanner.getColumn(); token = _woToken; } } else { token = Token.UNDEFINED; } } else { token = Token.UNDEFINED; } return token; } public IToken evaluate(ICharacterScanner scanner, boolean resume) { IToken token = evaluate(scanner); return token; } protected static class HTMLTagWordDetector implements IWordDetector { public boolean isWordPart(char c) { return Character.isLetterOrDigit(c) || c == ':' || c == '_'; } public boolean isWordStart(char c) { return Character.isLetter(c); } } }