/** * 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.IWordDetector; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WordRule; /** * @author Max Stepanov */ public class RubyEvaluationElementRule implements IPredicateRule { private final WordRule wordRule; private final IToken successToken; public RubyEvaluationElementRule(IToken token) { successToken = token; wordRule = new WordRule(new RubyEvaluationElementWordDetector(), Token.UNDEFINED); wordRule.addWord("-", token); //$NON-NLS-1$ wordRule.addWord("~", token); //$NON-NLS-1$ wordRule.addWord("=", token); //$NON-NLS-1$ wordRule.addWord("&=", token); //$NON-NLS-1$ wordRule.addWord("&==", token); //$NON-NLS-1$ wordRule.addWord("!=", token); //$NON-NLS-1$ wordRule.addWord("!==", token); //$NON-NLS-1$ } /* * (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 index = 0; int c; while ((c = scanner.read()) != ICharacterScanner.EOF && isWhitespace(c)) { ++index; } if (c != ICharacterScanner.EOF) { scanner.unread(); } IToken token = wordRule.evaluate(scanner); if (token.isUndefined()) { for (int j = index; j > 0; --j) { scanner.unread(); } } return token; } return Token.UNDEFINED; } private static boolean isWhitespace(int c) { return (c == ' ') || (c == '\t'); } } /* package */class RubyEvaluationElementWordDetector implements IWordDetector { private static final char EQUAL = '='; private static final char TILDA = '~'; private static final char DASH = '-'; private static final char AMPERSAND = '&'; private static final char EXCLAMATION = '!'; /* * (non-Javadoc) * @see org.eclipse.jface.text.rules.IWordDetector#isWordStart(char) */ public boolean isWordStart(char c) { return AMPERSAND == c || EXCLAMATION == c || EQUAL == c || TILDA == c || DASH == c; } /* * (non-Javadoc) * @see org.eclipse.jface.text.rules.IWordDetector#isWordPart(char) */ public boolean isWordPart(char c) { return EQUAL == c; } }