diff --git a/library/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php b/library/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php new file mode 100644 --- /dev/null +++ b/library/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php @@ -0,0 +1,133 @@ +smarty = $smarty; + parent::__construct(); + // get required plugins + $this->lexer_class = $lexer_class; + $this->parser_class = $parser_class; + } + + /** + * method to compile a Smarty template + * + * @param mixed $_content template source + * + * @return bool true if compiling succeeded, false if it failed + */ + protected function doCompile($_content, $isTemplateSource = false) { + /* 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(str_replace(array("\r\n", "\r"), "\n", $_content), $this); + $this->parser = new $this->parser_class($this->lex, $this); + if ($isTemplateSource) { + $this->parser->insertPhpCode("properties['nocache_hash'] = '{$this->nocache_hash}';\n?>\n"); + } + if ($this->inheritance_child) { + // start state on child templates + $this->lex->yypushstate(Smarty_Internal_Templatelexer::CHILDBODY); + } + if (function_exists('mb_internal_encoding') && ((int)ini_get('mbstring.func_overload')) & 2) { + $mbEncoding = mb_internal_encoding(); + mb_internal_encoding('ASCII'); + } else { + $mbEncoding = null; + } + + if ($this->smarty->_parserdebug) { + $this->parser->PrintTrace(); + $this->lex->PrintTrace(); + } + // get tokens from lexer and parse them + while ($this->lex->yylex() && !$this->abort_and_recompile) { + if ($this->smarty->_parserdebug) { + echo "
Line {$this->lex->line} Parsing  {$this->parser->yyTokenName[$this->lex->token]} Token " .
+                    htmlentities($this->lex->value) . "
"; + } + $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); + if ($mbEncoding) { + mb_internal_encoding($mbEncoding); + } + // 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 {$this->smarty->left_delimiter}" . $openTag . "{$this->smarty->right_delimiter} tag"); + } + // return compiled code + // return str_replace(array("? >\nparser->retvalue); + return $this->parser->retvalue; + } +}