/**
* 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;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.rules.BufferedRuleBasedScanner;
import org.eclipse.jface.text.rules.IRule;
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.WhitespaceRule;
import org.eclipse.jface.text.rules.WordRule;
import com.aptana.core.util.StringUtil;
import com.aptana.editor.common.text.rules.SingleCharacterRule;
import com.aptana.editor.common.text.rules.WhitespaceDetector;
import com.aptana.editor.haml.IHAMLConstants;
public class HAMLElementScanner extends BufferedRuleBasedScanner
{
private IToken fLastToken;
public HAMLElementScanner()
{
List<IRule> rules = new ArrayList<IRule>();
// Add generic whitespace rule.
rules.add(new WhitespaceRule(new WhitespaceDetector()));
rules.add(new SingleCharacterRule('%', createToken(IHAMLConstants.PUNCTUATION_DEFINITION_TAG_HAML)));
// tags
rules.add(new WordRule(new TagDetector(), createToken(IHAMLConstants.ENTITY_NAME_TAG_HAML)));
// ids
rules.add(new WordRule(new IDDetector(), createToken(IHAMLConstants.ENTITY_NAME_TAG_ID_HAML)));
// classes
rules.add(new WordRule(new ClassDetector(), createToken(IHAMLConstants.ENTITY_NAME_TAG_CLASS_HAML)));
setRules(rules.toArray(new IRule[rules.size()]));
}
private IToken createToken(String string)
{
return new Token(string);
}
@Override
public IToken nextToken()
{
IToken token = super.nextToken();
// If preceding is %, then entity name tag stays, otherwise it's just default token
if (token != null && IHAMLConstants.ENTITY_NAME_TAG_HAML.equals(token.getData()))
{
if (fLastToken == null || !IHAMLConstants.PUNCTUATION_DEFINITION_TAG_HAML.equals(fLastToken.getData()))
{
token = createToken(StringUtil.EMPTY);
}
}
fLastToken = token;
return token;
}
@Override
public void setRange(IDocument document, int offset, int length)
{
super.setRange(document, offset, length);
fLastToken = null;
}
private static final class TagDetector implements IWordDetector
{
public boolean isWordStart(char c)
{
return Character.isLetterOrDigit(c);
}
public boolean isWordPart(char c)
{
return Character.isLetterOrDigit(c) || c == '_' || c == '-';
}
}
private static final class IDDetector implements IWordDetector
{
public boolean isWordStart(char c)
{
return c == '#';
}
public boolean isWordPart(char c)
{
return Character.isLetterOrDigit(c) || c == '_' || c == '-';
}
}
private static final class ClassDetector implements IWordDetector
{
public boolean isWordStart(char c)
{
return c == '.';
}
public boolean isWordPart(char c)
{
return Character.isLetterOrDigit(c) || c == '_' || c == '-';
}
}
}