protected function tokenize($selector)
{
// split tokens by space except if space is in an attribute selector
$tokens = array();
$combinators = array(' ', '>', '+');
$quoted = false;
$token = array('combinator' => ' ', 'name' => '');
for ($i = 0, $max = strlen($selector); $i < $max; $i++) {
if (in_array($selector[$i], $combinators) && !$quoted) {
// remove all whitespaces around the combinator
$combinator = $selector[$i];
while (in_array($selector[$i + 1], $combinators)) {
if (' ' != $selector[++$i]) {
$combinator = $selector[$i];
}
}
$tokens[] = $token;
$token = array('combinator' => $combinator, 'name' => '');
} elseif ('"' == $selector[$i]) {
$token['name'] .= $selector[$i];
$quoted = $quoted ? false : true;
} else {
$token['name'] .= $selector[$i];
}
}
if ($token['name']) {
$tokens[] = $token;
}
return $tokens;
}