/** * Method to compile Smarty config source. * * @param Smarty_Internal_Template $template * * @return bool true if compiling succeeded, false if it failed */ public function compileTemplate(Smarty_Internal_Template $template) { $this->template = $template; $this->template->compiled->file_dependency[$this->template->source->uid] = array($this->template->source->filepath, $this->template->source->getTimeStamp(), $this->template->source->type); if ($this->smarty->debugging) { $this->smarty->_debug->start_compile($this->template); } // init the lexer/parser to compile the config file $lex = new $this->lexer_class(str_replace(array("\r\n", "\r"), "\n", $template->source->getContent()) . "\n", $this); $parser = new $this->parser_class($lex, $this); 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) { $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); if ($mbEncoding) { mb_internal_encoding($mbEncoding); } if ($this->smarty->debugging) { $this->smarty->_debug->end_compile($this->template); } // template header code $template_header = "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . "\n"; $template_header .= " compiled from \"" . $this->template->source->filepath . "\" */ ?>\n"; $code = '<?php Smarty_Internal_Method_ConfigLoad::_loadConfigVars($_smarty_tpl, ' . var_export($this->config_data, true) . '); ?>'; return $template_header . Smarty_Internal_Extension_CodeFrame::create($this->template, $code); }
/** * Method to compile a Smarty template * * @param Smarty_Internal_Template $template template object to compile * @param bool $nocache true is shall be compiled in nocache mode * @param null|Smarty_Internal_TemplateCompilerBase $parent_compiler * * @return bool true if compiling succeeded, false if it failed */ public function compileTemplate(Smarty_Internal_Template $template, $nocache = null, $parent_compiler = null) { // save template object in compiler class $this->template = $template; if (isset($this->template->smarty->security_policy)) { $this->php_handling = $this->template->smarty->security_policy->php_handling; } else { $this->php_handling = $this->template->smarty->php_handling; } $this->parent_compiler = $parent_compiler ? $parent_compiler : $this; $nocache = isset($nocache) ? $nocache : false; if (empty($template->properties['nocache_hash'])) { $template->properties['nocache_hash'] = $this->nocache_hash; } else { $this->nocache_hash = $template->properties['nocache_hash']; } $save_source = $this->template->source; // template header code $template_header = ''; if (!$this->suppressHeader) { $template_header .= "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . "\n"; $template_header .= " compiled from \"" . $this->template->source->filepath . "\" */ ?>\n"; } if (empty($this->template->source->components)) { $this->sources = array($template->source); } else { // we have array of inheritance templates by extends: resource $this->sources = array_reverse($template->source->components); } $loop = 0; // the $this->sources array can get additional elements while compiling by the {extends} tag while ($this->template->source = array_shift($this->sources)) { $this->smarty->_current_file = $this->template->source->filepath; if ($this->smarty->debugging) { Smarty_Internal_Debug::start_compile($this->template); } $no_sources = count($this->sources); $this->parent_compiler->template->properties['file_dependency'][$this->template->source->uid] = array($this->template->source->filepath, $this->template->source->getTimeStamp(), $this->template->source->type); $loop++; if ($no_sources) { $this->inheritance_child = true; } else { $this->inheritance_child = false; } // flag for nochache sections $this->nocache = $nocache; $this->tag_nocache = false; // reset has nocache code flag $this->template->has_nocache_code = false; $this->has_variable_string = false; $this->prefix_code = array(); $_compiled_code = ''; // get template source $_content = $this->template->source->getContent(); if ($_content != '') { // run pre filter if required if ((isset($this->smarty->autoload_filters['pre']) || isset($this->smarty->registered_filters['pre'])) && !$this->suppressFilter) { $_content = Smarty_Internal_Filter_Handler::runFilter('pre', $_content, $template); } // call compiler $_compiled_code = $this->doCompile($_content, true); } if ($this->smarty->debugging) { Smarty_Internal_Debug::end_compile($this->template); } } // restore source $this->template->source = $save_source; unset($save_source); $this->smarty->_current_file = $this->template->source->filepath; // free memory unset($this->parser->root_buffer, $this->parser->current_buffer, $this->parser, $this->lex); // return compiled code to template object $merged_code = ''; if (!empty($this->mergedSubTemplatesCode)) { foreach ($this->mergedSubTemplatesCode as $code) { $merged_code .= $code; } } // run post filter if required on compiled template code if ((isset($this->smarty->autoload_filters['post']) || isset($this->smarty->registered_filters['post'])) && !$this->suppressFilter && $_compiled_code != '') { $_compiled_code = Smarty_Internal_Filter_Handler::runFilter('post', $_compiled_code, $template); } if ($this->suppressTemplatePropertyHeader) { $_compiled_code .= $merged_code; } else { $_compiled_code = $template_header . Smarty_Internal_Extension_CodeFrame::create($template, $_compiled_code) . $merged_code; } if (!empty($this->templateFunctionCode)) { // run post filter if required on compiled template code if ((isset($this->smarty->autoload_filters['post']) || isset($this->smarty->registered_filters['post'])) && !$this->suppressFilter) { $_compiled_code .= Smarty_Internal_Filter_Handler::runFilter('post', $this->templateFunctionCode, $template); } else { $_compiled_code .= $this->templateFunctionCode; } } $this->parent_compiler = null; $this->template = null; return $_compiled_code; }
/** * Method to compile Smarty config source. * * @param Smarty_Internal_Template $template * * @return bool true if compiling succeeded, false if it failed */ public function compileTemplate(Smarty_Internal_Template $template) { $this->template = $template; // on empty config just return if ($template->source->content == '') { return true; } if ($this->smarty->debugging) { Smarty_Internal_Debug::start_compile($this->template); } // init the lexer/parser to compile the config file $lex = new $this->lexer_class(str_replace(array("\r\n", "\r"), "\n", $template->source->content) . "\n", $this); $parser = new $this->parser_class($lex, $this); 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) { $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); if ($mbEncoding) { mb_internal_encoding($mbEncoding); } if ($this->smarty->debugging) { Smarty_Internal_Debug::end_compile($this->template); } $code = 'Smarty_Internal_Extension_Config::loadConfigVars($_smarty_tpl, ' . var_export($this->config_data, true) . ');' . "\n"; return Smarty_Internal_Extension_CodeFrame::create($this->template, array(), $code); }
/** * Writes the content to cache resource * * @param Smarty_Internal_Template $_template * @param string $content * * @return bool */ public function writeCachedContent(Smarty_Internal_Template $_template, $content) { if ($_template->source->recompiled || !($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED)) { // don't write cache file return false; } $_template->properties['cache_lifetime'] = $_template->cache_lifetime; $_template->properties['unifunc'] = 'content_' . str_replace(['.', ','], '_', uniqid('', true)); $content = Smarty_Internal_Extension_CodeFrame::create($_template, $content, true); if (!empty($_template->properties['tpl_function'])) { foreach ($_template->properties['tpl_function'] as $funcParam) { if (is_file($funcParam['compiled_filepath'])) { // read compiled file $code = file_get_contents($funcParam['compiled_filepath']); // grab template function if (preg_match("/\\/\\* {$funcParam['call_name']} \\*\\/([\\S\\s]*?)\\/\\*\\/ {$funcParam['call_name']} \\*\\//", $code, $match)) { unset($code); $content .= "<?php " . $match[0] . "?>\n"; } } } } return $this->write($_template, $content); }
/** * Writes the content to cache resource * * @param Smarty_Internal_Template $_template * @param string $content * * @return bool */ public function writeCachedContent(Smarty_Internal_Template $_template, $content) { if ($_template->source->recompiled || !($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED)) { // don't write cache file return false; } $_template->properties['cache_lifetime'] = $_template->cache_lifetime; $_template->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true)); $content = Smarty_Internal_Extension_CodeFrame::create($_template, $content, true); return $this->write($_template, $content); }
/** * Method to compile a Smarty template * * @param Smarty_Internal_Template $template template object to compile * @param bool $nocache true is shall be compiled in nocache mode * @param null|Smarty_Internal_TemplateCompilerBase $parent_compiler * * @return bool true if compiling succeeded, false if it failed * @throws \Exception */ public function compileTemplate(Smarty_Internal_Template $template, $nocache = null, Smarty_Internal_TemplateCompilerBase $parent_compiler = null) { // get code frame of compiled template $_compiled_code = "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . "\n compiled from \"" . $template->source->filepath . "\" */ ?>\n" . Smarty_Internal_Extension_CodeFrame::create($template, $this->compileTemplateSource($template, $nocache, $parent_compiler), $this->postFilter($this->blockOrFunctionCode) . join('', $this->mergedSubTemplatesCode)); return $_compiled_code; }
/** * Method to compile a Smarty template * * @param Smarty_Internal_Template $template template object to compile * @param bool $nocache true is shall be compiled in nocache mode * * @param Smarty_Internal_TemplateCompilerBase $parent_compiler * * @return bool true if compiling succeeded, false if it failed * @throws \SmartyException */ public function compileTemplate(Smarty_Internal_Template $template, $nocache = null, Smarty_Internal_TemplateCompilerBase $parent_compiler = null) { $this->parent_compiler = $parent_compiler ? $parent_compiler : $this; $nocache = isset($nocache) ? $nocache : false; // flag for nochache sections $this->nocache = $nocache; $this->tag_nocache = false; // save template object in compiler class $this->template = $template; // template header code $template_header = ''; if (!$this->suppressHeader) { $template_header .= "/* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . "\n"; $template_header .= " compiled from \"" . $this->template->source->filepath . "\" */\n"; } if ($isExtendsResource = !empty($this->template->source->components)) { // we have array of inheritance templates by extends: resource $this->sources = array_reverse($template->source->components); } // the $this->sources array can get additional elements while compiling by the {extends} tag if (!$isExtendsResource) { $this->inheritance_child = $this->template->source->isChild; $this->smarty->_current_file = $this->template->source->filepath; if ($this->smarty->debugging) { Smarty_Internal_Debug::start_compile($this->template); } if (!($this->template->source->recompiled || $this->template->source->type == 'string' || $this->template->source->type == 'extends')) { $this->parent_compiler->resourceInfo[$this->template->source->uid] = $this->template->source->getResourceInfo($this->template); } } do { // flag for aborting current and start recompile $this->abort_and_recompile = false; if ($isExtendsResource) { $_content = ''; } else { // get template source $_content = $this->template->source->content; } if ($_content != '') { // run prefilter if required if ((isset($this->smarty->autoload_filters['pre']) || isset($this->smarty->registered_filters['pre'])) && !$this->suppressFilter) { $_content = Smarty_Internal_Filter_Handler::runFilter('pre', $_content, $template); } } // call compiler $_compiled_code = $this->doCompile($_content); } while ($this->abort_and_recompile); if ($this->smarty->debugging) { Smarty_Internal_Debug::end_compile($this->template); } // free memory unset($this->parser->root_buffer, $this->parser->current_buffer, $this->parser, $this->lex); self::$_tag_objects = array(); // return compiled code to template object // run postfilter if required on compiled template code if ((isset($this->smarty->autoload_filters['post']) || isset($this->smarty->registered_filters['post'])) && !$this->suppressFilter && $_compiled_code != '') { $_compiled_code = Smarty_Internal_Filter_Handler::runFilter('post', $_compiled_code, $template); } // unset content because template inheritance could have replace source with parent code unset($template->source->content); $this->parent_compiler = null; $this->template = null; if ($this->suppressTemplatePropertyHeader) { return $_compiled_code; } else { $properties = array('resourceInfo' => $this->resourceInfo, 'isInheritanceChild' => $this->inheritance_child); if (isset($this->templateProperties['tpl_function'])) { $properties['templateFunctions'] = $this->templateProperties['tpl_function']; } if (isset($this->templateProperties['block_function'])) { $properties['blockFunctions'] = $this->templateProperties['block_function']; } foreach ($this->plugins as $tmp) { foreach ($tmp as $plugin) { $properties['plugins'][$plugin['file']] = $plugin['function']; } } foreach ($this->nocachePlugins as $tmp) { foreach ($tmp as $plugin) { $properties['nocachePlugins'][$plugin['file']] = $plugin['function']; } } return Smarty_Internal_Extension_CodeFrame::create($template, $properties, $_compiled_code, $template_header); } }
/** * Method to compile a Smarty template * * @param Smarty_Internal_Template $template template object to compile * @param bool $nocache true is shall be compiled in nocache mode * @param null|Smarty_Internal_TemplateCompilerBase $parent_compiler * * @return bool true if compiling succeeded, false if it failed * @throws \Exception */ public function compileTemplate(Smarty_Internal_Template $template, $nocache = null, $parent_compiler = null) { if (property_exists($template->smarty, 'plugin_search_order')) { $this->plugin_search_order = $template->smarty->plugin_search_order; } // save template object in compiler class $this->template = $template; $this->savedSource = $this->template->source; try { if (isset($this->template->smarty->security_policy)) { $this->php_handling = $this->template->smarty->security_policy->php_handling; } else { $this->php_handling = $this->template->smarty->php_handling; } $this->parent_compiler = $parent_compiler ? $parent_compiler : $this; $nocache = isset($nocache) ? $nocache : false; if (empty($template->compiled->nocache_hash)) { $template->compiled->nocache_hash = $this->nocache_hash; } else { $this->nocache_hash = $template->compiled->nocache_hash; } // template header code $template_header = ''; if (!$this->suppressHeader) { $template_header .= "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . "\n"; $template_header .= " compiled from \"" . $this->template->source->filepath . "\" */ ?>\n"; } $_compiled_code = ''; $this->smarty->_current_file = $this->template->source->filepath; if ($this->smarty->debugging) { $this->smarty->_debug->start_compile($this->template); } $this->parent_compiler->template->compiled->file_dependency[$this->template->source->uid] = array($this->template->source->filepath, $this->template->source->getTimeStamp(), $this->template->source->type); // compile for child template? $this->inheritance_child = $this->template->isChild; // flag for nochache sections $this->nocache = $nocache; $this->tag_nocache = false; // reset has nocache code flag $this->template->compiled->has_nocache_code = false; $this->has_variable_string = false; $this->prefix_code = array(); // get template source if (!empty($this->template->source->components)) { // we have array of inheritance templates by extends: resource $this->sources = array_reverse($template->source->components); $_content = ''; } else { // get template source $_content = $this->template->source->getContent(); } if ($_content != '') { // run pre filter if required if ($_content != '' && ((isset($this->smarty->autoload_filters['pre']) || isset($this->smarty->registered_filters['pre'])) && !$this->suppressFilter)) { $_content = Smarty_Internal_Filter_Handler::runFilter('pre', $_content, $template); } } // call compiler $_compiled_code = $this->doCompile($_content, true); if ($this->smarty->debugging) { $this->smarty->_debug->end_compile($this->template); } // free memory $this->parser = null; // restore source $this->template->source = $this->savedSource; $this->savedSource = null; $this->smarty->_current_file = $this->template->source->filepath; // return compiled code to template object $merged_code = ''; if (!empty($this->mergedSubTemplatesCode)) { foreach ($this->mergedSubTemplatesCode as $code) { $merged_code .= $code; } } // run post filter if required on compiled template code if ((isset($this->smarty->autoload_filters['post']) || isset($this->smarty->registered_filters['post'])) && !$this->suppressFilter && $_compiled_code != '') { $_compiled_code = Smarty_Internal_Filter_Handler::runFilter('post', $_compiled_code, $template); } if ($this->suppressTemplatePropertyHeader) { $_compiled_code .= $merged_code; } else { $_compiled_code = $template_header . Smarty_Internal_Extension_CodeFrame::create($template, $_compiled_code) . $merged_code; } if (!empty($this->templateFunctionCode)) { // run post filter if required on compiled template code if ((isset($this->smarty->autoload_filters['post']) || isset($this->smarty->registered_filters['post'])) && !$this->suppressFilter) { $_compiled_code .= Smarty_Internal_Filter_Handler::runFilter('post', $this->templateFunctionCode, $template); } else { $_compiled_code .= $this->templateFunctionCode; } } } catch (Exception $e) { $this->_tag_stack = array(); $this->_tag_objects = array(); // restore source $this->template->source = $this->savedSource; $this->savedSource = null; $this->smarty->_current_file = $this->template->source->filepath; // free memory $this->parent_compiler = null; $this->template = null; $this->parser = null; throw $e; } $this->parent_compiler = null; $this->template = null; return $_compiled_code; }
/** * Writes the content to cache resource * * @param Smarty_Internal_Template $_template * @param \Smarty_Internal_Context $context * @param string $content * * @return bool */ public function writeCachedContent(Smarty_Internal_Template $_template, Smarty_Internal_Context $context = null, $content = '') { if ($_template->source->recompiled || !($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED)) { // don't write cache file return false; } $properties = array('isCache' => true, 'cacheLifetime' => $_template->cache_lifetime); if ($context) { $properties['resourceInfo'] = $context->resourceInfo; if ($context->hasNocacheCode) { $properties['hasNocacheCode'] = true; } foreach ($context->templateFunctions as $name => $data) { unset($data['obj']); $properties['templateFunctions'][$name] = $data; } if (!empty($context->nocachePlugins)) { $properties['plugins'] = $context->nocachePlugins; } $content = !empty($content) ? $content : $context->getContent(); } return $this->write($_template, Smarty_Internal_Extension_CodeFrame::create($_template, $properties, $content, '', true)); }