package com.liferay.ide.velocity.scanner;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.RuleBasedScanner;
import org.eclipse.jface.text.rules.Token;
import com.liferay.ide.velocity.editor.EditorsUtil;
import com.liferay.ide.velocity.vaulttec.ui.IColorConstants;
import com.liferay.ide.velocity.vaulttec.ui.VelocityColorProvider;
/**
* DOCUMENT ME!
*
* @version $Revision: 7 $
* @author <a href="mailto:akmal.sarhan@gmail.com">Akmal Sarhan </a>
*/
public class HTMLScriptScanner extends RuleBasedScanner
{
// private static final int START = 0;
// private static final int ATTRIBUTE = 1;
// private static final int CONTENT = 2;
// private static final int ENDTAG = 3;
// private static final int END = 4;
private int fState;
private HTMLElementDetector fWordDetector;
private String fElement;
private IToken fDefaultToken;
private IToken fScriptToken;
private IToken fElementToken;
private IToken fEndElementToken;
private IToken fStringToken;
public HTMLScriptScanner(VelocityColorProvider manager)
{
fDefaultToken = manager.getToken(IColorConstants.SCRIPT);
fScriptToken = manager.getToken(IColorConstants.SCRIPT);
fElementToken = manager.getToken(IColorConstants.HTML_TAG);
fEndElementToken = manager.getToken(IColorConstants.HTML_ENDTAG);
fStringToken = manager.getToken(IColorConstants.HTML_String);
setDefaultReturnToken(fDefaultToken);
fWordDetector = new HTMLElementDetector();
setRules(null);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public IToken nextToken()
{
super.fTokenOffset = super.fOffset;
super.fColumn = -1;
if (super.fRules != null)
{
for (int i = 0; i < super.fRules.length; i++)
{
IToken token = super.fRules[i].evaluate(this);
if (!token.isUndefined()) { return token; }
}
}
for (int c = EditorsUtil.skipWhitespace(this); c != -1; c = read())
{
if (fState == 0)
{
if (c == 60)
{
return fDefaultToken;
} else
{
unread();
fElement = EditorsUtil.getWord(fWordDetector, this);
fState = 1;
return fElementToken;
}
}
if (fState == 1)
{
if (c == 62)
{
fState = 2;
return fDefaultToken;
}
if ((c == 34) || (c == 39))
{
if (super.fOffset > (super.fTokenOffset + 1))
{
unread();
return fDefaultToken;
} else
{
EditorsUtil.skipString(c, this);
return fStringToken;
}
}
} else if (fState == 2)
{
if (c == 60)
{
int start = super.fOffset;
if (read() == 47)
{
String name = EditorsUtil.getWord(fWordDetector, this);
if (name.equalsIgnoreCase(fElement))
{
if (start > (super.fTokenOffset + 1))
{
while (super.fOffset >= start)
{
unread();
}
return fScriptToken;
}
fState = 3;
while (super.fOffset > (start + 1))
{
unread();
}
return fDefaultToken;
}
}
while (super.fOffset > start)
{
unread();
}
}
} else if (fState == 3)
{
EditorsUtil.getWord(fWordDetector, this);
fState = 4;
return fEndElementToken;
}
}
unread();
if (super.fOffset > super.fTokenOffset)
{
return fDefaultToken;
} else
{
return Token.EOF;
}
}
/**
* DOCUMENT ME!
*
* @param document
* DOCUMENT ME!
* @param offset
* DOCUMENT ME!
* @param length
* DOCUMENT ME!
*/
public void setRange(IDocument document, int offset, int length)
{
super.setRange(document, offset, length);
fState = 0;
}
class HTMLElementDetector implements IWordDetector
{
HTMLElementDetector()
{
}
public boolean isWordStart(char c)
{
return XMLChar.isNameStart(c);
}
public boolean isWordPart(char c)
{
return XMLChar.isName(c);
}
}
}