package com.liferay.ide.velocity.ui.editor.xml; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.PatternRule; import org.eclipse.jface.text.rules.Token; import com.liferay.ide.velocity.editor.EditorsUtil; /** * DOCUMENT ME! * * @version $Revision: 7 $ * @author <a href="mailto:akmal.sarhan@gmail.com">Akmal Sarhan </a> */ public class IgnoreCasePatternRule extends PatternRule { protected char[] fStartUpper; protected char[] fEndUpper; protected boolean fSkipString; public IgnoreCasePatternRule(String startSequence, String endSequence, IToken token, char escapeCharacter, boolean breaksOnEOL, boolean skipString) { super(startSequence.toLowerCase(), endSequence.toLowerCase(), token, escapeCharacter, breaksOnEOL); fStartUpper = startSequence.toUpperCase().toCharArray(); fEndUpper = endSequence.toUpperCase().toCharArray(); fSkipString = skipString; } protected IToken doEvaluate(ICharacterScanner scanner, boolean resume) { if (resume) { if (endSequenceDetected(scanner)) { return super.fToken; } } else { int c = scanner.read(); if (((c == super.fStartSequence[0]) || (c == fStartUpper[0])) && sequenceDetected(scanner, super.fStartSequence, fStartUpper, false) && endSequenceDetected(scanner)) { return super.fToken; } } scanner.unread(); return Token.UNDEFINED; } /** * DOCUMENT ME! * * @param scanner * DOCUMENT ME! * * @return DOCUMENT ME! */ public IToken evaluate(ICharacterScanner scanner) { return evaluate(scanner, false); } protected boolean endSequenceDetected(ICharacterScanner scanner) { char[][] delimiters = scanner.getLegalLineDelimiters(); int c; while ((c = scanner.read()) != -1) { if (c == super.fEscapeCharacter) { scanner.read(); } else if (fSkipString && ((c == 34) || (c == 39))) { EditorsUtil.skipString(c, scanner); } else if ((super.fEndSequence.length > 0) && ((c == super.fEndSequence[0]) || (c == fEndUpper[0]))) { if (sequenceDetected(scanner, super.fEndSequence, fEndUpper, true)) { return true; } } else if (super.fBreaksOnEOL) { for (int i = 0; i < delimiters.length; i++) { if ((c == delimiters[i][0]) && sequenceDetected(scanner, delimiters[i], false)) { return true; } } } } scanner.unread(); return true; } protected boolean sequenceDetected(ICharacterScanner scanner, char[] lower, char[] upper, boolean eofAllowed) { for (int i = 1; i < lower.length; i++) { int c = scanner.read(); if ((c == -1) && eofAllowed) { return true; } if ((c != lower[i]) && (c != upper[i])) { scanner.unread(); for (int j = i - 1; j > 0; j--) { scanner.unread(); } return false; } } return true; } /** * DOCUMENT ME! * * @param scanner * DOCUMENT ME! * @param resume * DOCUMENT ME! * * @return DOCUMENT ME! */ public IToken evaluate(ICharacterScanner scanner, boolean resume) { if (super.fColumn == -1) { return doEvaluate(scanner, resume); } int c = scanner.read(); scanner.unread(); if ((c == super.fStartSequence[0]) || (c == fStartUpper[0])) { return (super.fColumn != scanner.getColumn()) ? Token.UNDEFINED : doEvaluate(scanner, resume); } else { return Token.UNDEFINED; } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public IToken getSuccessToken() { return super.fToken; } }