/**
* 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.php.internal.parser;
import java.util.ArrayList;
import java.util.List;
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.MultiLineRule;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WordRule;
import com.aptana.editor.html.parsing.HTMLTokenScanner;
import com.aptana.editor.html.parsing.lexer.HTMLTokenType;
public class PHTMLTokenScanner extends HTMLTokenScanner
{
@SuppressWarnings("nls")
private static final String[] PHP_START = { "<?php", "<?=", "<?" };
@SuppressWarnings("nls")
private static final String[] PHP_END = new String[] { "?>" };
public PHTMLTokenScanner()
{
List<IRule> rules = new ArrayList<IRule>();
// adds rules for finding the PHP start and end sequences
WordRule wordRule = new WordRule(new PHPStartDetector(), Token.UNDEFINED);
IToken token = createToken(getTokenName(PHTMLTokens.PHP));
for (String word : PHP_START)
{
wordRule.addWord(word, token);
}
rules.add(wordRule);
wordRule = new WordRule(new PHPEndDetector(), Token.UNDEFINED);
token = createToken(getTokenName(PHTMLTokens.PHP_END));
for (String word : PHP_END)
{
wordRule.addWord(word, token);
}
rules.add(wordRule);
// Special heredoc and nowdoc rule
rules.add(new HeredocRule(createToken(getTokenName(PHTMLTokens.PHP_HEREDOC)), false));
rules.add(new HeredocRule(createToken(getTokenName(PHTMLTokens.PHP_HEREDOC)), true));
// Add rule for double quotes
rules.add(new MultiLineRule("\"", "\"", createToken(HTMLTokenType.DOUBLE_QUOTED_STRING.getScope()), '\\')); //$NON-NLS-1$ //$NON-NLS-2$
// Add a rule for single quotes
rules.add(new MultiLineRule("'", "'", createToken(HTMLTokenType.SINGLE_QUOTED_STRING.getScope()), '\\')); //$NON-NLS-1$ //$NON-NLS-2$
for (IRule rule : fRules)
{
rules.add(rule);
}
setRules(rules.toArray(new IRule[rules.size()]));
}
private static String getTokenName(short token) // $codepro.audit.disable
{
return PHTMLTokens.getTokenName(token);
}
private static final class PHPStartDetector implements IWordDetector
{
public boolean isWordPart(char c)
{
switch (c)
{
case '<':
case '?':
case '%':
case 'p':
case 'h':
case '=':
return true;
}
return false;
}
public boolean isWordStart(char c)
{
return c == '<';
}
}
private static final class PHPEndDetector implements IWordDetector
{
public boolean isWordPart(char c)
{
switch (c)
{
case '?':
case '%':
case '>':
return true;
}
return false;
}
public boolean isWordStart(char c)
{
return c == '?' || c == '%';
}
}
}