| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | <?php/** * Smarty Internal Plugin Smarty Template Compiler Base * * This file contains the basic classes and methodes for compiling Smarty templates with lexer/parser * * @package Smarty * @subpackage Compiler * @author Uwe Tews *//** * @ignore */include ("smarty_internal_parsetree.php");/** * Class SmartyTemplateCompiler * * @package Smarty * @subpackage Compiler */class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCompilerBase {    /**     * Lexer class name     *     * @var string     */    public $lexer_class;    /**     * Parser class name     *     * @var string     */    public $parser_class;    /**     * Lexer object     *     * @var object     */    public $lex;    /**     * Parser object     *     * @var object     */    public $parser;    /**     * Smarty object     *     * @var object     */    public $smarty;    /**     * array of vars which can be compiled in local scope     *     * @var array     */    public $local_var = array();    /**     * Initialize compiler     *     * @param string $lexer_class  class name     * @param string $parser_class class name     * @param Smarty $smarty       global instance     */    public function __construct($lexer_class, $parser_class, $smarty)    {        $this->smarty = $smarty;        parent::__construct();        // get required plugins        $this->lexer_class = $lexer_class;        $this->parser_class = $parser_class;    }    /**     * Methode to compile a Smarty template     *     * @param  mixed $_content template source     * @return bool true if compiling succeeded, false if it failed     */    protected function doCompile($_content)    {        /* here is where the compiling takes place. Smarty          tags in the templates are replaces with PHP code,          then written to compiled files. */        // init the lexer/parser to compile the template        $this->lex = new $this->lexer_class($_content, $this);        $this->parser = new $this->parser_class($this->lex, $this);        if ($this->smarty->_parserdebug)            $this->parser->PrintTrace();        // get tokens from lexer and parse them        while ($this->lex->yylex() && !$this->abort_and_recompile) {            if ($this->smarty->_parserdebug) {                echo "<pre>Line {$this->lex->line} Parsing  {$this->parser->yyTokenName[$this->lex->token]} Token " .                    htmlentities($this->lex->value) . "</pre>";            }            $this->parser->doParse($this->lex->token, $this->lex->value);        }        if ($this->abort_and_recompile) {            // exit here on abort            return false;        }        // finish parsing process        $this->parser->doParse(0, 0);        // check for unclosed tags        if (count($this->_tag_stack) > 0) {            // get stacked info            list($openTag, $_data) = array_pop($this->_tag_stack);            $this->trigger_template_error("unclosed {" . $openTag . "} tag");        }        // return compiled code        // return str_replace(array("? >\n<?php","? ><?php"), array('',''), $this->parser->retvalue);        return $this->parser->retvalue;    }}?>
 |