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;
+ }
+}