/**
* 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.EndOfLineRule;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.Token;
/**
* @author Max Stepanov
*/
public class HAMLSingleLineRule extends EndOfLineRule
{
private boolean fNoStartSequence;
public HAMLSingleLineRule(String startSequence, IToken token)
{
super(startSequence, token);
}
public HAMLSingleLineRule(IToken token)
{
super(" ", token); //$NON-NLS-1$
fNoStartSequence = true;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.text.rules.PatternRule#doEvaluate(org.eclipse.jface.text.rules.ICharacterScanner, boolean)
*/
@Override
protected IToken doEvaluate(ICharacterScanner scanner, boolean resume)
{
if (!resume)
{
if (fNoStartSequence)
{
if (scanner.read() != ICharacterScanner.EOF)
{
if (endSequenceDetected(scanner))
{
return fToken;
}
scanner.unread();
}
return Token.UNDEFINED;
}
int index = 0;
int c;
if (scanner.getColumn() != 0)
{
return Token.UNDEFINED;
}
while ((c = scanner.read()) != ICharacterScanner.EOF && isWhitespace(c))
{
++index;
}
if (c != ICharacterScanner.EOF)
{
scanner.unread();
}
IToken token = super.doEvaluate(scanner, resume);
if (token.isUndefined())
{
for (int j = index; j > 0; --j)
{
scanner.unread();
}
}
return token;
}
return super.doEvaluate(scanner, resume);
}
private static boolean isWhitespace(int c)
{
return (c == ' ') || (c == '\t');
}
}