| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 | <?php/** * Smarty Internal Plugin Config File Compiler * * This is the config file compiler class. It calls the lexer and parser to * perform the compiling. * * @package Smarty * @subpackage Config * @author Uwe Tews *//** * Main config file compiler class * * @package Smarty * @subpackage Config */class Smarty_Internal_Config_File_Compiler {    /**     * Lexer object     *     * @var object     */    public $lex;    /**     * Parser object     *     * @var object     */    public $parser;    /**     * Smarty object     *     * @var Smarty object     */    public $smarty;    /**     * Smarty object     *     * @var Smarty_Internal_Config object     */    public $config;    /**     * Compiled config data sections and variables     *     * @var array     */    public $config_data = array();    /**     * Initialize compiler     *     * @param Smarty $smarty base instance     */    public function __construct($smarty)    {        $this->smarty = $smarty;        $this->config_data['sections'] = array();        $this->config_data['vars'] = array();    }    /**     * Method to compile a Smarty template.     *     * @param  Smarty_Internal_Config $config config object     * @return bool true if compiling succeeded, false if it failed     */    public function compileSource(Smarty_Internal_Config $config)    {        /* here is where the compiling takes place. Smarty          tags in the templates are replaces with PHP code,          then written to compiled files. */        $this->config = $config;        // get config file source        $_content = $config->source->content . "\n";        // on empty template just return        if ($_content == '') {            return true;        }        // init the lexer/parser to compile the config file        $lex = new Smarty_Internal_Configfilelexer($_content, $this->smarty);        $parser = new Smarty_Internal_Configfileparser($lex, $this);        if ($this->smarty->_parserdebug) $parser->PrintTrace();        // get tokens from lexer and parse them        while ($lex->yylex()) {            if ($this->smarty->_parserdebug) echo "<br>Parsing  {$parser->yyTokenName[$lex->token]} Token {$lex->value} Line {$lex->line} \n";            $parser->doParse($lex->token, $lex->value);        }        // finish parsing process        $parser->doParse(0, 0);        $config->compiled_config = '<?php $_config_vars = ' . var_export($this->config_data, true) . '; ?>';    }    /**     * display compiler error messages without dying     *     * If parameter $args is empty it is a parser detected syntax error.     * In this case the parser is called to obtain information about exspected tokens.     *     * If parameter $args contains a string this is used as error message     *     * @param string $args individual error message or null     */    public function trigger_config_file_error($args = null)    {        $this->lex = Smarty_Internal_Configfilelexer::instance();        $this->parser = Smarty_Internal_Configfileparser::instance();        // get template source line which has error        $line = $this->lex->line;        if (isset($args)) {            // $line--;        }        $match = preg_split("/\n/", $this->lex->data);        $error_text = "Syntax error in config file '{$this->config->source->filepath}' on line {$line} '{$match[$line-1]}' ";        if (isset($args)) {            // individual error message            $error_text .= $args;        } else {            // exspected token from parser            foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {                $exp_token = $this->parser->yyTokenName[$token];                if (isset($this->lex->smarty_token_names[$exp_token])) {                    // token type from lexer                    $expect[] = '"' . $this->lex->smarty_token_names[$exp_token] . '"';                } else {                    // otherwise internal token name                    $expect[] = $this->parser->yyTokenName[$token];                }            }            // output parser error message            $error_text .= ' - Unexpected "' . $this->lex->value . '", expected one of: ' . implode(' , ', $expect);        }        throw new SmartyCompilerException($error_text);    }}?>
 |