<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
require_once('ParserDriver/Tokenizer/Regex.php');
require_once(
'CSS/Parser.php');
class 
CSS_Lexer extends ParserDriver_Tokenizer_Regex
{
    
/*     __construct {{{ */
    /**
     * Constructor
     *
     * @param string CSS Code
     */
    
public function __construct($input null)
    {
        
parent::__construct();
        if (!
is_null($input)) $this->setInput($input);

        
//$this->addRegex('@\\{@', 
        
$this->addRegex('@[ \\t\\r\\n\\f]*\\{@'
                        
CSS_Parser::LBRACE);
        
$this->addRegex('@;@'
                        
CSS_Parser::SEMICOLON);
        
$this->addRegex('@\.@'
                        
CSS_Parser::DOT);
        
$this->addRegex('@:@'
                        
CSS_Parser::COLON);
        
$this->addRegex('@=@'
                        
CSS_Parser::EQUAL);
        
$this->addRegex('@\\*@'
                        
CSS_Parser::STAR);
        
$this->addRegex('@/@'
                        
CSS_Parser::SLASH);
        
$this->addRegex('@\\[@'
                        
CSS_Parser::LBRACKET);
        
$this->addRegex('@\\]@'
                        
CSS_Parser::RBRACKET);
        
$this->addRegex('@-@'
                        
CSS_Parser::MINUS);
        
$this->addRegex('@;?[ \\t\\r\\n\\f]*\\}@'
                        
CSS_Parser::RBRACE);
        
$this->addRegex('@\\)@'
                        
CSS_Parser::RPAREN);
        
$this->addRegex('@>@'
                        
CSS_Parser::GREATER);
        
$this->addRegex('@,@'
                        
CSS_Parser::COMMA);
        
$this->addRegex('@\\+@'
                        
CSS_Parser::PLUS);

        
$this->addRegex('@([ \\t\\r\\n\\f])+@'
                        
CSS_Parser::SS);

        
$this->addRegex('@/\\*[^*]*\\*+([^/*][^*]*\\*+)*/@'
                        
CSS_Parser::COMMENT);

        
$this->addRegex('@<!--@'
                        
CSS_Parser::CDO);
        
$this->addRegex('@-->@'
                        
CSS_Parser::CDC);
        
$this->addRegex('@~=@'
                        
CSS_Parser::INCLUDES);
        
$this->addRegex('@\\|=@'
                        
CSS_Parser::DASHMATCH);

        
$this->addRegex('@(\\"([^\\n\\r\\f\\\\"]|\\\\(\\n|\\r\\n|\\r|\\f)|((\\\\([0-9a-fA-F]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-fA-F]))*\\")|(\\\'([^\\n\\r\\f\\\\\']|\\\\(\\n|\\r\\n|\\r|\\f)|((\\\\([0-9a-fA-F]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-fA-F]))*\\\')@'
                        
CSS_Parser::STRING);

        
$this->addRegex('@(-?([_a-z]|([\\200-\\377])|((\\\\([0-9a-f]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-f]))([_a-z0-9-]|([\\200-\\377])|((\\\\([0-9a-f]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-f]))*)\\(@'
                        
CSS_Parser::CSSFUNCTION); // Out of order, relative to the spec, in order for the global regexp to match. Does not affect lexing, as far as tests show
        
$this->addRegex('@url\\(([ \\t\\r\\n\\f]+)?((\\"([^\\n\\r\\f\\\\"]|\\\\(\\n|\\r\\n|\\r|\\f)|((\\\\([0-9a-fA-F]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-fA-F]))*\\")|(\\\'([^\\n\\r\\f\\\\\']|\\\\(\\n|\\r\\n|\\r|\\f)|((\\\\([0-9a-fA-F]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-fA-F]))*\\\'))([ \\t\\r\\n\\f]+)?\\)|url\\(([ \\t\\r\\n\\f]+)?(([!#$%&*-~]|([\\200-\\377])|((\\\\([0-9a-fA-F]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-fA-F]))*)([ \\t\\r\\n\\f]+)?\\)@'
                        
CSS_Parser::URI); // Out of order, relative to the spec, in order for the global regexp to match. Does not affect lexing, as far as tests show
        
$this->addRegex('@-?([_a-zA-Z]|([\\200-\\377])|((\\\\([0-9a-fA-F]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-fA-F]))([_a-zA-Z0-9-]|([\\200-\\377])|((\\\\([0-9a-fA-F]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-fA-F]))*@'
                        
CSS_Parser::IDENT);

        
$this->addRegex('@#[a-fA-F0-9]{6}@'CSS_Parser::HASH);
        
$this->addRegex('@#([_a-zA-Z0-9-]|[\\200-\\377]|\\\\[0-9a-fA-F]{1,6}(\\r\\n|[ \\t\\r\\n\\f])?|\\\\[^\\r\\n\\f0-9a-fA-F])+@',
                        
CSS_Parser::HASH);

        
$this->addRegex('@\@import@',
                        
CSS_Parser::IMPORT_SYM);
        
$this->addRegex('@\@page@',
                        
CSS_Parser::PAGE_SYM);
        
$this->addRegex('@\@media@',
                        
CSS_Parser::MEDIA_SYM);
        
$this->addRegex('@\@charset@',
                        
CSS_Parser::CHARSET_SYM);

        
$this->addRegex('@!(([ \\t\\r\\n\\f])|(/\\*[^*]*\\*+([^/*][^*]*\\*+)*/))*important@'
                        
CSS_Parser::IMPORTANT_SYM);

        
$this->addRegex('@([0-9]+|[0-9]*\\.[0-9]+)em@'
                        
CSS_Parser::EMS);
        
$this->addRegex('@([0-9]+|[0-9]*\\.[0-9]+)ex@'
                        
CSS_Parser::EXS);
        
$this->addRegex('@([0-9]+|[0-9]*\\.[0-9]+)(px|cm|mm|in|pt|pc)@'
                        
CSS_Parser::LENGTH);
        
$this->addRegex('@([0-9]+|[0-9]*\\.[0-9]+)(deg|rad|grad)@'
                        
CSS_Parser::ANGLE);
        
$this->addRegex('@([0-9]+|[0-9]*\\.[0-9]+)(ms|s)@'
                        
CSS_Parser::TIME);
        
$this->addRegex('@([0-9]+|[0-9]*\\.[0-9]+)(hz|khz)@'
                        
CSS_Parser::FREQ);
        
$this->addRegex('@([0-9]+|[0-9]*\\.[0-9]+)-?([_a-z]|([\\200-\\377])|((\\\\([0-9a-f]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-f]))([_a-z0-9-]|([\\200-\\377])|((\\\\([0-9a-f]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-f]))*@'
                        
CSS_Parser::DIMENSION);
        
$this->addRegex('@([0-9]+|[0-9]*\\.[0-9]+)%@'
                        
CSS_Parser::PERCENTAGE);
        
$this->addRegex('@([0-9]*\\.[0-9]+)@'
                        
CSS_Parser::NUMBER);
        
$this->addRegex('@([0-9]+)@'
                        
CSS_Parser::NUMBER);


//        $this->addRegex('@(\\"([^\\n\\r\\f\\\\"]|\\\\(\\n|\\r\\n|\\r|\\f)|((\\\\([0-9a-f]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-f]))*)|(\\\'([^\\n\\r\\f\\\\\']|\\\\(\\n|\\r\\n|\\r|\\f)|((\\\\([0-9a-f]){1,6}(\\r\\n|[ \\t\\r\\n\\f])?)|\\\\[^\\r\\n\\f0-9a-f]))*)@', 
//                        CSS_Parser::INVALID);
    
}
    
/* }}} */
}
?>