Skip to content

Instantly share code, notes, and snippets.

@julesfern
Created August 12, 2010 11:32
Show Gist options
  • Save julesfern/520806 to your computer and use it in GitHub Desktop.
Save julesfern/520806 to your computer and use it in GitHub Desktop.
public function parseElementSelector(selector:String):ElementSelector
{
var elementSelector:ElementSelector = new ElementSelector();
var str:String = StringUtil.trim(selector);
var parserPreviousState:uint = 0;
var parserCurrentState:uint = ElementSelectorParser.ELEMENT_NAME;
var token:String = "";
var tokenBuilt:Boolean = false;
for(var i:uint = 0; i <= str.length; i++) // Loop deliberately overruns
{
var char:String;
if(i < str.length) {
char = str.charAt(i);
}
else
{
char = "END";
}
// Send parser into state for this token
if(char == "#")
{
tokenBuilt = true;
parserPreviousState = parserCurrentState;
parserCurrentState = ElementSelectorParser.ELEMENT_ID;
}
else if(char == ".")
{
tokenBuilt = true;
parserPreviousState = parserCurrentState;
parserCurrentState = ElementSelectorParser.ELEMENT_CLASSNAME;
}
else if(char == ":")
{
tokenBuilt = true;
parserPreviousState = parserCurrentState;
parserCurrentState = ElementSelectorParser.ELEMENT_PSEUDOCLASS;
}
else if(char == "END")
{
tokenBuilt = true;
parserPreviousState = parserCurrentState;
}
else if(char != " ")
{
// Keep building the token
token += char;
}
if(tokenBuilt && token.length > 0)
{
switch(parserPreviousState)
{
case ElementSelectorParser.ELEMENT_NAME:
// End the element name state
Logger.debug("Parsing element selector '"+str+"', built element name '"+token+"'", this);
elementSelector.elementName = token;
break;
case ElementSelectorParser.ELEMENT_ID:
Logger.debug("Parsing element selector '"+str+"', built element ID '"+token+"'", this);
elementSelector.elementID = token;
break;
case ElementSelectorParser.ELEMENT_CLASSNAME:
Logger.debug("Parsing element selector '"+str+"', built class name '"+token+"'", this);
elementSelector.addElementClassName(token);
break;
case ElementSelectorParser.ELEMENT_PSEUDOCLASS:
Logger.debug("Parsing element selector '"+str+"', built pseudoclass '"+token+"'", this);
elementSelector.addElementPseudoClass(token);
break;
default:
break;
}
// Reset the token
token = "";
tokenBuilt = false;
}
}
return elementSelector;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment