/** * Aptana Studio * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions). * Please see the license.html included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.aptana.editor.haml.internal.text.rules; 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.Token; import com.aptana.editor.common.TextUtils; /** * @author Max Stepanov */ public class HAMLEscapeRule implements IPredicateRule { private static final char ESCAPE = '\\'; private final IToken successToken; public HAMLEscapeRule(IToken token) { this.successToken = token; } /* * (non-Javadoc) * @see org.eclipse.jface.text.rules.IPredicateRule#getSuccessToken() */ public IToken getSuccessToken() { return successToken; } /* * (non-Javadoc) * @see org.eclipse.jface.text.rules.IRule#evaluate(org.eclipse.jface.text.rules.ICharacterScanner) */ public IToken evaluate(ICharacterScanner scanner) { return evaluate(scanner, false); } /* * (non-Javadoc) * @see org.eclipse.jface.text.rules.IPredicateRule#evaluate(org.eclipse.jface.text.rules.ICharacterScanner, * boolean) */ public IToken evaluate(ICharacterScanner scanner, boolean resume) { if (!resume) { int c = scanner.read(); if (c != ICharacterScanner.EOF) { if (ESCAPE == c) { c = scanner.read(); if (c != ICharacterScanner.EOF && !isNewLine(scanner, c)) { return successToken; } scanner.unread(); } scanner.unread(); } } return Token.UNDEFINED; } private static boolean isNewLine(ICharacterScanner characterScanner, int c) { char[][] newLineSequences = TextUtils.rsort(characterScanner.getLegalLineDelimiters()); for (char[] sequence : newLineSequences) { if (c == sequence[0]) { return true; } } return false; } }