From 833f88731fd600ab96db58600765e2d8c6274597 Mon Sep 17 00:00:00 2001 From: Ortwin Pinke Date: Mon, 4 Nov 2019 17:25:53 +0100 Subject: [PATCH] add smarty lib --- ..._compile_private_object_block_function.php | 42 + ...ternal_compile_private_object_function.php | 86 ++ .../smarty_internal_compile_private_php.php | 216 ++++ ...ernal_compile_private_print_expression.php | 162 +++ ...ernal_compile_private_registered_block.php | 72 ++ ...al_compile_private_registered_function.php | 86 ++ ...ernal_compile_private_special_variable.php | 126 +++ .../smarty_internal_compile_rdelim.php | 40 + .../smarty_internal_compile_section.php | 469 +++++++++ .../smarty_internal_compile_setfilter.php | 70 ++ ...ty_internal_compile_shared_inheritance.php | 46 + .../smarty_internal_compile_while.php | 100 ++ .../smarty_internal_compilebase.php | 196 ++++ .../smarty_internal_config_file_compiler.php | 201 ++++ .../smarty_internal_configfilelexer.php | 733 +++++++++++++ .../smarty_internal_configfileparser.php | 989 ++++++++++++++++++ libs/sysplugins/smarty_internal_data.php | 285 +++++ libs/sysplugins/smarty_internal_debug.php | 426 ++++++++ .../smarty_internal_extension_handler.php | 171 +++ ...rty_internal_method_addautoloadfilters.php | 52 + ...ty_internal_method_adddefaultmodifiers.php | 42 + .../smarty_internal_method_append.php | 74 ++ .../smarty_internal_method_appendbyref.php | 50 + .../smarty_internal_method_assignbyref.php | 36 + .../smarty_internal_method_assignglobal.php | 43 + .../smarty_internal_method_clearallassign.php | 37 + .../smarty_internal_method_clearallcache.php | 40 + .../smarty_internal_method_clearassign.php | 44 + .../smarty_internal_method_clearcache.php | 44 + ..._internal_method_clearcompiledtemplate.php | 126 +++ .../smarty_internal_method_clearconfig.php | 41 + ...marty_internal_method_compileallconfig.php | 33 + ...ty_internal_method_compilealltemplates.php | 119 +++ .../smarty_internal_method_configload.php | 183 ++++ .../smarty_internal_method_createdata.php | 44 + ...rty_internal_method_getautoloadfilters.php | 37 + ...arty_internal_method_getconfigvariable.php | 34 + .../smarty_internal_method_getconfigvars.php | 58 + ...marty_internal_method_getdebugtemplate.php | 35 + ...ty_internal_method_getdefaultmodifiers.php | 35 + .../smarty_internal_method_getglobal.php | 47 + ...ty_internal_method_getregisteredobject.php | 44 + ...arty_internal_method_getstreamvariable.php | 51 + .../smarty_internal_method_gettags.php | 62 ++ ...smarty_internal_method_gettemplatevars.php | 116 ++ .../smarty_internal_method_loadfilter.php | 77 ++ .../smarty_internal_method_loadplugin.php | 111 ++ .../smarty_internal_method_mustcompile.php | 51 + ..._internal_method_registercacheresource.php | 40 + .../smarty_internal_method_registerclass.php | 46 + ...al_method_registerdefaultconfighandler.php | 42 + ...al_method_registerdefaultpluginhandler.php | 43 + ..._method_registerdefaulttemplatehandler.php | 82 ++ .../smarty_internal_method_registerfilter.php | 88 ++ .../smarty_internal_method_registerobject.php | 72 ++ .../smarty_internal_method_registerplugin.php | 51 + ...marty_internal_method_registerresource.php | 44 + ...rty_internal_method_setautoloadfilters.php | 70 ++ ...marty_internal_method_setdebugtemplate.php | 41 + ...ty_internal_method_setdefaultmodifiers.php | 38 + .../smarty_internal_method_unloadfilter.php | 42 + 61 files changed, 6981 insertions(+) create mode 100644 libs/sysplugins/smarty_internal_compile_private_object_block_function.php create mode 100644 libs/sysplugins/smarty_internal_compile_private_object_function.php create mode 100644 libs/sysplugins/smarty_internal_compile_private_php.php create mode 100644 libs/sysplugins/smarty_internal_compile_private_print_expression.php create mode 100644 libs/sysplugins/smarty_internal_compile_private_registered_block.php create mode 100644 libs/sysplugins/smarty_internal_compile_private_registered_function.php create mode 100644 libs/sysplugins/smarty_internal_compile_private_special_variable.php create mode 100644 libs/sysplugins/smarty_internal_compile_rdelim.php create mode 100644 libs/sysplugins/smarty_internal_compile_section.php create mode 100644 libs/sysplugins/smarty_internal_compile_setfilter.php create mode 100644 libs/sysplugins/smarty_internal_compile_shared_inheritance.php create mode 100644 libs/sysplugins/smarty_internal_compile_while.php create mode 100644 libs/sysplugins/smarty_internal_compilebase.php create mode 100644 libs/sysplugins/smarty_internal_config_file_compiler.php create mode 100644 libs/sysplugins/smarty_internal_configfilelexer.php create mode 100644 libs/sysplugins/smarty_internal_configfileparser.php create mode 100644 libs/sysplugins/smarty_internal_data.php create mode 100644 libs/sysplugins/smarty_internal_debug.php create mode 100644 libs/sysplugins/smarty_internal_extension_handler.php create mode 100644 libs/sysplugins/smarty_internal_method_addautoloadfilters.php create mode 100644 libs/sysplugins/smarty_internal_method_adddefaultmodifiers.php create mode 100644 libs/sysplugins/smarty_internal_method_append.php create mode 100644 libs/sysplugins/smarty_internal_method_appendbyref.php create mode 100644 libs/sysplugins/smarty_internal_method_assignbyref.php create mode 100644 libs/sysplugins/smarty_internal_method_assignglobal.php create mode 100644 libs/sysplugins/smarty_internal_method_clearallassign.php create mode 100644 libs/sysplugins/smarty_internal_method_clearallcache.php create mode 100644 libs/sysplugins/smarty_internal_method_clearassign.php create mode 100644 libs/sysplugins/smarty_internal_method_clearcache.php create mode 100644 libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php create mode 100644 libs/sysplugins/smarty_internal_method_clearconfig.php create mode 100644 libs/sysplugins/smarty_internal_method_compileallconfig.php create mode 100644 libs/sysplugins/smarty_internal_method_compilealltemplates.php create mode 100644 libs/sysplugins/smarty_internal_method_configload.php create mode 100644 libs/sysplugins/smarty_internal_method_createdata.php create mode 100644 libs/sysplugins/smarty_internal_method_getautoloadfilters.php create mode 100644 libs/sysplugins/smarty_internal_method_getconfigvariable.php create mode 100644 libs/sysplugins/smarty_internal_method_getconfigvars.php create mode 100644 libs/sysplugins/smarty_internal_method_getdebugtemplate.php create mode 100644 libs/sysplugins/smarty_internal_method_getdefaultmodifiers.php create mode 100644 libs/sysplugins/smarty_internal_method_getglobal.php create mode 100644 libs/sysplugins/smarty_internal_method_getregisteredobject.php create mode 100644 libs/sysplugins/smarty_internal_method_getstreamvariable.php create mode 100644 libs/sysplugins/smarty_internal_method_gettags.php create mode 100644 libs/sysplugins/smarty_internal_method_gettemplatevars.php create mode 100644 libs/sysplugins/smarty_internal_method_loadfilter.php create mode 100644 libs/sysplugins/smarty_internal_method_loadplugin.php create mode 100644 libs/sysplugins/smarty_internal_method_mustcompile.php create mode 100644 libs/sysplugins/smarty_internal_method_registercacheresource.php create mode 100644 libs/sysplugins/smarty_internal_method_registerclass.php create mode 100644 libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php create mode 100644 libs/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php create mode 100644 libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php create mode 100644 libs/sysplugins/smarty_internal_method_registerfilter.php create mode 100644 libs/sysplugins/smarty_internal_method_registerobject.php create mode 100644 libs/sysplugins/smarty_internal_method_registerplugin.php create mode 100644 libs/sysplugins/smarty_internal_method_registerresource.php create mode 100644 libs/sysplugins/smarty_internal_method_setautoloadfilters.php create mode 100644 libs/sysplugins/smarty_internal_method_setdebugtemplate.php create mode 100644 libs/sysplugins/smarty_internal_method_setdefaultmodifiers.php create mode 100644 libs/sysplugins/smarty_internal_method_unloadfilter.php diff --git a/libs/sysplugins/smarty_internal_compile_private_object_block_function.php b/libs/sysplugins/smarty_internal_compile_private_object_block_function.php new file mode 100644 index 0000000..5c7fb62 --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_private_object_block_function.php @@ -0,0 +1,42 @@ + $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + $callback = array("\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]", "->{$method}"); + return array($callback, $_paramsArray, "array(\$_block_plugin{$this->nesting}, '{$method}')"); + } +} diff --git a/libs/sysplugins/smarty_internal_compile_private_object_function.php b/libs/sysplugins/smarty_internal_compile_private_object_function.php new file mode 100644 index 0000000..7f78a42 --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_private_object_function.php @@ -0,0 +1,86 @@ +getAttributes($compiler, $args); + //Does tag create output + $compiler->has_output = isset($_attr[ 'assign' ]) ? false : true; + + unset($_attr[ 'nocache' ]); + $_assign = null; + if (isset($_attr[ 'assign' ])) { + $_assign = $_attr[ 'assign' ]; + unset($_attr[ 'assign' ]); + } + // method or property ? + if (is_callable(array($compiler->smarty->registered_objects[ $tag ][ 0 ], $method))) { + // convert attributes into parameter array string + if ($compiler->smarty->registered_objects[ $tag ][ 2 ]) { + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + $_params = 'array(' . implode(",", $_paramsArray) . ')'; + $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params},\$_smarty_tpl)"; + } else { + $_params = implode(",", $_attr); + $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params})"; + } + } else { + // object property + $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}"; + } + if (!empty($parameter[ 'modifierlist' ])) { + $output = $compiler->compileTag('private_modifier', array(), + array('modifierlist' => $parameter[ 'modifierlist' ], 'value' => $output)); + } + //Does tag create output + $compiler->has_output = isset($_attr[ 'assign' ]) ? false : true; + + if (empty($_assign)) { + return "\n"; + } else { + return "assign({$_assign},{$output});?>\n"; + } + } +} diff --git a/libs/sysplugins/smarty_internal_compile_private_php.php b/libs/sysplugins/smarty_internal_compile_private_php.php new file mode 100644 index 0000000..8bff849 --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_private_php.php @@ -0,0 +1,216 @@ +getAttributes($compiler, $args); + $compiler->has_code = false; + if ($_attr[ 'type' ] == 'xml') { + $compiler->tag_nocache = true; + $output = addcslashes($_attr[ 'code' ], "'\\"); + $compiler->parser->current_buffer->append_subtree($compiler->parser, + new Smarty_Internal_ParseTree_Tag($compiler->parser, + $compiler->processNocacheCode("", + true))); + return ''; + } + if ($_attr[ 'type' ] != 'tag') { + if ($compiler->php_handling == Smarty::PHP_REMOVE) { + return ''; + } elseif ($compiler->php_handling == Smarty::PHP_QUOTE) { + $output = + preg_replace_callback('#(<\?(?:php|=)?)|(<%)|()|(\?>)|(%>)|(<\/script>)#i', + array($this, 'quote'), $_attr[ 'code' ]); + $compiler->parser->current_buffer->append_subtree($compiler->parser, + new Smarty_Internal_ParseTree_Text($output)); + return ''; + } elseif ($compiler->php_handling == Smarty::PHP_PASSTHRU || $_attr[ 'type' ] == 'unmatched') { + $compiler->tag_nocache = true; + $output = addcslashes($_attr[ 'code' ], "'\\"); + $compiler->parser->current_buffer->append_subtree($compiler->parser, + new Smarty_Internal_ParseTree_Tag($compiler->parser, + $compiler->processNocacheCode("", + true))); + return ''; + } elseif ($compiler->php_handling == Smarty::PHP_ALLOW) { + if (!($compiler->smarty instanceof SmartyBC)) { + $compiler->trigger_template_error('$smarty->php_handling PHP_ALLOW not allowed. Use SmartyBC to enable it', + null, true); + } + $compiler->has_code = true; + return $_attr[ 'code' ]; + } else { + $compiler->trigger_template_error('Illegal $smarty->php_handling value', null, true); + } + } else { + $compiler->has_code = true; + if (!($compiler->smarty instanceof SmartyBC)) { + $compiler->trigger_template_error('{php}{/php} tags not allowed. Use SmartyBC to enable them', null, + true); + } + $ldel = preg_quote($compiler->smarty->left_delimiter, '#'); + $rdel = preg_quote($compiler->smarty->right_delimiter, '#'); + preg_match("#^({$ldel}php\\s*)((.)*?)({$rdel})#", $_attr[ 'code' ], $match); + if (!empty($match[ 2 ])) { + if ('nocache' == trim($match[ 2 ])) { + $compiler->tag_nocache = true; + } else { + $compiler->trigger_template_error("illegal value of option flag \"{$match[2]}\"", null, true); + } + } + return preg_replace(array("#^{$ldel}\\s*php\\s*(.)*?{$rdel}#", "#{$ldel}\\s*/\\s*php\\s*{$rdel}$#"), + array(''), $_attr[ 'code' ]); + } + } + + /** + * Lexer code for PHP tags + * + * This code has been moved from lexer here fo easier debugging and maintenance + * + * @param $lex + */ + public function parsePhp($lex) + { + $lex->token = Smarty_Internal_Templateparser::TP_PHP; + $close = 0; + $lex->taglineno = $lex->line; + $closeTag = '?>'; + if (strpos($lex->value, 'is_xml = true; + $lex->phpType = 'xml'; + return; + } elseif (strpos($lex->value, 'phpType = 'php'; + } elseif (strpos($lex->value, '<%') === 0) { + $lex->phpType = 'asp'; + $closeTag = '%>'; + } elseif (strpos($lex->value, '%>') === 0) { + $lex->phpType = 'unmatched'; + } elseif (strpos($lex->value, '?>') === 0) { + if ($lex->is_xml) { + $lex->is_xml = false; + $lex->phpType = 'xml'; + return; + } + $lex->phpType = 'unmatched'; + } elseif (strpos($lex->value, 'phpType = 'script'; + $closeTag = ''; + } elseif (strpos($lex->value, $lex->smarty->left_delimiter) === 0) { + if ($lex->isAutoLiteral()) { + $lex->token = Smarty_Internal_Templateparser::TP_TEXT; + return; + } + $closeTag = "{$lex->smarty->left_delimiter}/php{$lex->smarty->right_delimiter}"; + if ($lex->value == $closeTag) { + $lex->compiler->trigger_template_error("unexpected closing tag '{$closeTag}'"); + } + $lex->phpType = 'tag'; + } + if ($lex->phpType == 'unmatched') { + return; + } + if (($lex->phpType == 'php' || $lex->phpType == 'asp') && + ($lex->compiler->php_handling == Smarty::PHP_PASSTHRU || $lex->compiler->php_handling == Smarty::PHP_QUOTE) + ) { + return; + } + $start = $lex->counter + strlen($lex->value); + $body = true; + if (preg_match('~' . preg_quote($closeTag, '~') . '~i', $lex->data, $match, PREG_OFFSET_CAPTURE, $start)) { + $close = $match[ 0 ][ 1 ]; + } else { + $lex->compiler->trigger_template_error("missing closing tag '{$closeTag}'"); + } + while ($body) { + if (preg_match('~([/][*])|([/][/][^\n]*)|(\'[^\'\\\\]*(?:\\.[^\'\\\\]*)*\')|("[^"\\\\]*(?:\\.[^"\\\\]*)*")~', + $lex->data, $match, PREG_OFFSET_CAPTURE, $start)) { + $value = $match[ 0 ][ 0 ]; + $from = $pos = $match[ 0 ][ 1 ]; + if ($pos > $close) { + $body = false; + } else { + $start = $pos + strlen($value); + $phpCommentStart = $value == '/*'; + if ($phpCommentStart) { + $phpCommentEnd = preg_match('~([*][/])~', $lex->data, $match, PREG_OFFSET_CAPTURE, $start); + if ($phpCommentEnd) { + $pos2 = $match[ 0 ][ 1 ]; + $start = $pos2 + strlen($match[ 0 ][ 0 ]); + } + } + while ($close > $pos && $close < $start) { + if (preg_match('~' . preg_quote($closeTag, '~') . '~i', $lex->data, $match, PREG_OFFSET_CAPTURE, + $from)) { + $close = $match[ 0 ][ 1 ]; + $from = $close + strlen($match[ 0 ][ 0 ]); + } else { + $lex->compiler->trigger_template_error("missing closing tag '{$closeTag}'"); + } + } + if ($phpCommentStart && (!$phpCommentEnd || $pos2 > $close)) { + $lex->taglineno = $lex->line + substr_count(substr($lex->data, $lex->counter, $start), "\n"); + $lex->compiler->trigger_template_error("missing PHP comment closing tag '*/'"); + } + } + } else { + $body = false; + } + } + $lex->value = substr($lex->data, $lex->counter, $close + strlen($closeTag) - $lex->counter); + } + + /* + * Call back function for $php_handling = PHP_QUOTE + * + */ + /** + * @param $match + * + * @return string + */ + private function quote($match) + { + return htmlspecialchars($match[ 0 ], ENT_QUOTES); + } +} diff --git a/libs/sysplugins/smarty_internal_compile_private_print_expression.php b/libs/sysplugins/smarty_internal_compile_private_print_expression.php new file mode 100644 index 0000000..811996b --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_private_print_expression.php @@ -0,0 +1,162 @@ +getAttributes($compiler, $args); + $output = $parameter[ 'value' ]; + // tag modifier + if (!empty($parameter[ 'modifierlist' ])) { + $output = $compiler->compileTag('private_modifier', array(), + array('modifierlist' => $parameter[ 'modifierlist' ], + 'value' => $output)); + } + if (isset($_attr[ 'assign' ])) { + // assign output to variable + return "assign({$_attr['assign']},{$output});?>"; + } else { + // display value + if (!$_attr[ 'nofilter' ]) { + // default modifier + if (!empty($compiler->smarty->default_modifiers)) { + if (empty($compiler->default_modifier_list)) { + $modifierlist = array(); + foreach ($compiler->smarty->default_modifiers as $key => $single_default_modifier) { + preg_match_all('/(\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|:|[^:]+)/', + $single_default_modifier, $mod_array); + for ($i = 0, $count = count($mod_array[ 0 ]); $i < $count; $i ++) { + if ($mod_array[ 0 ][ $i ] != ':') { + $modifierlist[ $key ][] = $mod_array[ 0 ][ $i ]; + } + } + } + $compiler->default_modifier_list = $modifierlist; + } + $output = $compiler->compileTag('private_modifier', array(), + array('modifierlist' => $compiler->default_modifier_list, + 'value' => $output)); + } + // autoescape html + if ($compiler->template->smarty->escape_html) { + $output = "htmlspecialchars({$output}, ENT_QUOTES, '" . addslashes(Smarty::$_CHARSET) . "')"; + } + // loop over registered filters + if (!empty($compiler->template->smarty->registered_filters[ Smarty::FILTER_VARIABLE ])) { + foreach ($compiler->template->smarty->registered_filters[ Smarty::FILTER_VARIABLE ] as $key => + $function) { + if (!is_array($function)) { + $output = "{$function}({$output},\$_smarty_tpl)"; + } elseif (is_object($function[ 0 ])) { + $output = + "\$_smarty_tpl->smarty->registered_filters[Smarty::FILTER_VARIABLE]['{$key}'][0]->{$function[1]}({$output},\$_smarty_tpl)"; + } else { + $output = "{$function[0]}::{$function[1]}({$output},\$_smarty_tpl)"; + } + } + } + // auto loaded filters + if (isset($compiler->smarty->autoload_filters[ Smarty::FILTER_VARIABLE ])) { + foreach ((array) $compiler->template->smarty->autoload_filters[ Smarty::FILTER_VARIABLE ] as $name) + { + $result = $this->compile_output_filter($compiler, $name, $output); + if ($result !== false) { + $output = $result; + } else { + // not found, throw exception + throw new SmartyException("Unable to load filter '{$name}'"); + } + } + } + foreach ($compiler->variable_filters as $filter) { + if (count($filter) == 1 && + ($result = $this->compile_output_filter($compiler, $filter[ 0 ], $output)) !== false + ) { + $output = $result; + } else { + $output = $compiler->compileTag('private_modifier', array(), + array('modifierlist' => array($filter), 'value' => $output)); + } + } + } + + $compiler->has_output = true; + $output = ""; + } + + return $output; + } + + /** + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param string $name name of variable filter + * @param string $output embedded output + * + * @return string + */ + private function compile_output_filter(Smarty_Internal_TemplateCompilerBase $compiler, $name, $output) + { + $plugin_name = "smarty_variablefilter_{$name}"; + $path = $compiler->smarty->loadPlugin($plugin_name); + if ($path) { + /** + if ($compiler->template->caching) { + $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'file' ] = + $path; + $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'function' ] = + $plugin_name; + } else { + $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'file' ] = + $path; + $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'function' ] = + $plugin_name; + } + * */ + return "{$plugin_name}({$output},\$_smarty_tpl)"; + } else { + // not found + return false; + } + } +} diff --git a/libs/sysplugins/smarty_internal_compile_private_registered_block.php b/libs/sysplugins/smarty_internal_compile_private_registered_block.php new file mode 100644 index 0000000..987bc96 --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_private_registered_block.php @@ -0,0 +1,72 @@ +smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $tag ])) { + $tag_info = $compiler->smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $tag ]; + $callback = $tag_info[ 0 ]; + if (is_array($callback)) { + if (is_object($callback[ 0 ])) { + $callable = "array(\$_block_plugin{$this->nesting}, '{$callback[1]}')"; + $callback = + array("\$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]", "->{$callback[1]}"); + } else { + $callable = "array(\$_block_plugin{$this->nesting}, '{$callback[1]}')"; + $callback = + array("\$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]", "::{$callback[1]}"); + } + } else { + $callable = "\$_block_plugin{$this->nesting}"; + $callback = array("\$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0]", ''); + } + } else { + $tag_info = $compiler->default_handler_plugins[ Smarty::PLUGIN_BLOCK ][ $tag ]; + $callback = $tag_info[ 0 ]; + if (is_array($callback)) { + $callable = "array('{$callback[0]}', '{$callback[1]}')"; + $callback = "{$callback[1]}::{$callback[1]}"; + } else { + $callable = null; + } + } + $compiler->tag_nocache = !$tag_info[ 1 ] | $compiler->tag_nocache; + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } elseif ($compiler->template->caching && in_array($_key, $tag_info[ 2 ])) { + $_value = str_replace("'", "^#^", $_value); + $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + return array($callback, $_paramsArray, $callable); + } +} diff --git a/libs/sysplugins/smarty_internal_compile_private_registered_function.php b/libs/sysplugins/smarty_internal_compile_private_registered_function.php new file mode 100644 index 0000000..3754f2b --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_private_registered_function.php @@ -0,0 +1,86 @@ +getAttributes($compiler, $args); + unset($_attr[ 'nocache' ]); + if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ])) { + $tag_info = $compiler->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ]; + $is_registered = true; + } else { + $tag_info = $compiler->default_handler_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ]; + $is_registered = false; + } + // not cacheable? + $compiler->tag_nocache = $compiler->tag_nocache || !$tag_info[ 1 ]; + // convert attributes into parameter array string + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } elseif ($compiler->template->caching && in_array($_key, $tag_info[ 2 ])) { + $_value = str_replace("'", "^#^", $_value); + $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + $_params = 'array(' . implode(",", $_paramsArray) . ')'; + // compile code + if ($is_registered) { + $output = + "call_user_func_array( \$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['{$tag}'][0], array( {$_params},\$_smarty_tpl ) )"; + } else { + $function = $tag_info[ 0 ]; + if (!is_array($function)) { + $output = "{$function}({$_params},\$_smarty_tpl)"; + } else { + $output = "{$function[0]}::{$function[1]}({$_params},\$_smarty_tpl)"; + } + } + if (!empty($parameter[ 'modifierlist' ])) { + $output = $compiler->compileTag('private_modifier', array(), + array('modifierlist' => $parameter[ 'modifierlist' ], + 'value' => $output)); + } + //Does tag create output + $compiler->has_output = true; + $output = "\n"; + return $output; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_private_special_variable.php b/libs/sysplugins/smarty_internal_compile_private_special_variable.php new file mode 100644 index 0000000..0c6be44 --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_private_special_variable.php @@ -0,0 +1,126 @@ +getId($_index[ 0 ])); + if ($variable === false) { + $compiler->trigger_template_error("special \$Smarty variable name index can not be variable", null, true); + } + if (!isset($compiler->smarty->security_policy) || + $compiler->smarty->security_policy->isTrustedSpecialSmartyVar($variable, $compiler) + ) { + switch ($variable) { + case 'foreach': + case 'section': + if (!isset(Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ])) { + $class = 'Smarty_Internal_Compile_' . ucfirst($variable); + Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ] = new $class; + } + return Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ]->compileSpecialVariable(array(), $compiler, $_index); + case 'capture': + if (class_exists('Smarty_Internal_Compile_Capture')) { + return Smarty_Internal_Compile_Capture::compileSpecialVariable(array(), $compiler, $_index); + } + return ''; + case 'now': + return 'time()'; + case 'cookies': + if (isset($compiler->smarty->security_policy) && + !$compiler->smarty->security_policy->allow_super_globals + ) { + $compiler->trigger_template_error("(secure mode) super globals not permitted"); + break; + } + $compiled_ref = '$_COOKIE'; + break; + case 'get': + case 'post': + case 'env': + case 'server': + case 'session': + case 'request': + if (isset($compiler->smarty->security_policy) && + !$compiler->smarty->security_policy->allow_super_globals + ) { + $compiler->trigger_template_error("(secure mode) super globals not permitted"); + break; + } + $compiled_ref = '$_' . strtoupper($variable); + break; + + case 'template': + return 'basename($_smarty_tpl->source->filepath)'; + + case 'template_object': + return '$_smarty_tpl'; + + case 'current_dir': + return 'dirname($_smarty_tpl->source->filepath)'; + + case 'version': + return "Smarty::SMARTY_VERSION"; + + case 'const': + if (isset($compiler->smarty->security_policy) && + !$compiler->smarty->security_policy->allow_constants + ) { + $compiler->trigger_template_error("(secure mode) constants not permitted"); + break; + } + if (strpos($_index[ 1 ], '$') === false && strpos($_index[ 1 ], '\'') === false) { + return "@constant('{$_index[1]}')"; + } else { + return "@constant({$_index[1]})"; + } + + case 'config': + if (isset($_index[ 2 ])) { + return "(is_array(\$tmp = \$_smarty_tpl->smarty->ext->configload->_getConfigVariable(\$_smarty_tpl, $_index[1])) ? \$tmp[$_index[2]] : null)"; + } else { + return "\$_smarty_tpl->smarty->ext->configload->_getConfigVariable(\$_smarty_tpl, $_index[1])"; + } + case 'ldelim': + return "\$_smarty_tpl->smarty->left_delimiter"; + case 'rdelim': + return "\$_smarty_tpl->smarty->right_delimiter"; + default: + $compiler->trigger_template_error('$smarty.' . trim($_index[ 0 ], "'") . ' is not defined'); + break; + } + if (isset($_index[ 1 ])) { + array_shift($_index); + foreach ($_index as $_ind) { + $compiled_ref = $compiled_ref . "[$_ind]"; + } + } + return $compiled_ref; + } + } +} diff --git a/libs/sysplugins/smarty_internal_compile_rdelim.php b/libs/sysplugins/smarty_internal_compile_rdelim.php new file mode 100644 index 0000000..2e6b43c --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_rdelim.php @@ -0,0 +1,40 @@ +getAttributes($compiler, $args); + if ($_attr[ 'nocache' ] === true) { + $compiler->trigger_template_error('nocache option not allowed', null, true); + } + // this tag does not return compiled code + $compiler->has_code = true; + + return $compiler->smarty->right_delimiter; + } +} diff --git a/libs/sysplugins/smarty_internal_compile_section.php b/libs/sysplugins/smarty_internal_compile_section.php new file mode 100644 index 0000000..c3701fc --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_section.php @@ -0,0 +1,469 @@ +loopNesting ++; + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $attributes = array('name' => $compiler->getId($_attr[ 'name' ])); + unset($_attr[ 'name' ]); + foreach ($attributes as $a => $v) { + if ($v === false) { + $compiler->trigger_template_error("'{$a}' attribute/variable has illegal value", null, true); + } + } + $local = "\$__section_{$attributes['name']}_" . $this->counter ++ . '_'; + $sectionVar = "\$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}']"; + $this->openTag($compiler, 'section', array('section', $compiler->nocache, $local, $sectionVar)); + // maybe nocache because of nocache variables + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; + + $initLocal = + array('saved' => "isset(\$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}']) ? \$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}'] : false",); + $initNamedProperty = array(); + $initFor = array(); + $incFor = array(); + $cmpFor = array(); + $propValue = array('index' => "{$sectionVar}->value['index']", 'show' => 'true', 'step' => 1, + 'iteration' => "{$local}iteration", + + ); + $propType = array('index' => 2, 'iteration' => 2, 'show' => 0, 'step' => 0,); + // search for used tag attributes + $this->scanForProperties($attributes, $compiler); + if (!empty($this->matchResults[ 'named' ])) { + $namedAttr = $this->matchResults[ 'named' ]; + } + if (isset($_attr[ 'properties' ]) && preg_match_all("/['](.*?)[']/", $_attr[ 'properties' ], $match)) { + foreach ($match[ 1 ] as $prop) { + if (in_array($prop, $this->nameProperties)) { + $namedAttr[ $prop ] = true; + } else { + $compiler->trigger_template_error("Invalid property '{$prop}'", null, true); + } + } + } + $namedAttr[ 'index' ] = true; + $output = " $attr_value) { + switch ($attr_name) { + case 'loop': + if (is_numeric($attr_value)) { + $v = (int) $attr_value; + $t = 0; + } else { + $v = "(is_array(@\$_loop=$attr_value) ? count(\$_loop) : max(0, (int) \$_loop))"; + $t = 1; + } + if (isset($namedAttr[ 'loop' ])) { + $initNamedProperty[ 'loop' ] = "'loop' => {$v}"; + if ($t == 1) { + $v = "{$sectionVar}->value['loop']"; + } + } elseif ($t == 1) { + $initLocal[ 'loop' ] = $v; + $v = "{$local}loop"; + } + break; + case 'show': + if (is_bool($attr_value)) { + $v = $attr_value ? 'true' : 'false'; + $t = 0; + } else { + $v = "(bool) $attr_value"; + $t = 3; + } + break; + case 'step': + if (is_numeric($attr_value)) { + $v = (int) $attr_value; + $v = ($v == 0) ? 1 : $v; + $t = 0; + break; + } + $initLocal[ 'step' ] = "((int)@$attr_value) == 0 ? 1 : (int)@$attr_value"; + $v = "{$local}step"; + $t = 2; + break; + + case 'max': + case 'start': + if (is_numeric($attr_value)) { + $v = (int) $attr_value; + $t = 0; + break; + } + $v = "(int)@$attr_value"; + $t = 3; + break; + } + if ($t == 3 && $compiler->getId($attr_value)) { + $t = 1; + } + $propValue[ $attr_name ] = $v; + $propType[ $attr_name ] = $t; + } + + if (isset($namedAttr[ 'step' ])) { + $initNamedProperty[ 'step' ] = $propValue[ 'step' ]; + } + if (isset($namedAttr[ 'iteration' ])) { + $propValue[ 'iteration' ] = "{$sectionVar}->value['iteration']"; + } + $incFor[ 'iteration' ] = "{$propValue['iteration']}++"; + $initFor[ 'iteration' ] = "{$propValue['iteration']} = 1"; + + if ($propType[ 'step' ] == 0) { + if ($propValue[ 'step' ] == 1) { + $incFor[ 'index' ] = "{$sectionVar}->value['index']++"; + } elseif ($propValue[ 'step' ] > 1) { + $incFor[ 'index' ] = "{$sectionVar}->value['index'] += {$propValue['step']}"; + } else { + $incFor[ 'index' ] = "{$sectionVar}->value['index'] -= " . - $propValue[ 'step' ]; + } + } else { + $incFor[ 'index' ] = "{$sectionVar}->value['index'] += {$propValue['step']}"; + } + + if (!isset($propValue[ 'max' ])) { + $propValue[ 'max' ] = $propValue[ 'loop' ]; + $propType[ 'max' ] = $propType[ 'loop' ]; + } elseif ($propType[ 'max' ] != 0) { + $propValue[ 'max' ] = "{$propValue['max']} < 0 ? {$propValue['loop']} : {$propValue['max']}"; + $propType[ 'max' ] = 1; + } else { + if ($propValue[ 'max' ] < 0) { + $propValue[ 'max' ] = $propValue[ 'loop' ]; + $propType[ 'max' ] = $propType[ 'loop' ]; + } + } + + if (!isset($propValue[ 'start' ])) { + $start_code = + array(1 => "{$propValue['step']} > 0 ? ", 2 => '0', 3 => ' : ', 4 => $propValue[ 'loop' ], 5 => ' - 1'); + if ($propType[ 'loop' ] == 0) { + $start_code[ 5 ] = ''; + $start_code[ 4 ] = $propValue[ 'loop' ] - 1; + } + if ($propType[ 'step' ] == 0) { + if ($propValue[ 'step' ] > 0) { + $start_code = array(1 => '0'); + $propType[ 'start' ] = 0; + } else { + $start_code[ 1 ] = $start_code[ 2 ] = $start_code[ 3 ] = ''; + $propType[ 'start' ] = $propType[ 'loop' ]; + } + } else { + $propType[ 'start' ] = 1; + } + $propValue[ 'start' ] = join('', $start_code); + } else { + $start_code = + array(1 => "{$propValue['start']} < 0 ? ", 2 => 'max(', 3 => "{$propValue['step']} > 0 ? ", 4 => '0', + 5 => ' : ', 6 => '-1', 7 => ', ', 8 => "{$propValue['start']} + {$propValue['loop']}", 10 => ')', + 11 => ' : ', 12 => 'min(', 13 => $propValue[ 'start' ], 14 => ', ', + 15 => "{$propValue['step']} > 0 ? ", 16 => $propValue[ 'loop' ], 17 => ' : ', + 18 => $propType[ 'loop' ] == 0 ? $propValue[ 'loop' ] - 1 : "{$propValue['loop']} - 1", + 19 => ')'); + if ($propType[ 'step' ] == 0) { + $start_code[ 3 ] = $start_code[ 5 ] = $start_code[ 15 ] = $start_code[ 17 ] = ''; + if ($propValue[ 'step' ] > 0) { + $start_code[ 6 ] = $start_code[ 18 ] = ''; + } else { + $start_code[ 4 ] = $start_code[ 16 ] = ''; + } + } + if ($propType[ 'start' ] == 0) { + if ($propType[ 'loop' ] == 0) { + $start_code[ 8 ] = $propValue[ 'start' ] + $propValue[ 'loop' ]; + } + $propType[ 'start' ] = $propType[ 'step' ] + $propType[ 'loop' ]; + $start_code[ 1 ] = ''; + if ($propValue[ 'start' ] < 0) { + for ($i = 11; $i <= 19; $i ++) { + $start_code[ $i ] = ''; + } + if ($propType[ 'start' ] == 0) { + $start_code = array(max($propValue[ 'step' ] > 0 ? 0 : - 1, + $propValue[ 'start' ] + $propValue[ 'loop' ])); + } + } else { + for ($i = 1; $i <= 11; $i ++) { + $start_code[ $i ] = ''; + } + if ($propType[ 'start' ] == 0) { + $start_code = + array(min($propValue[ 'step' ] > 0 ? $propValue[ 'loop' ] : $propValue[ 'loop' ] - 1, + $propValue[ 'start' ])); + } + } + } + $propValue[ 'start' ] = join('', $start_code); + } + if ($propType[ 'start' ] != 0) { + $initLocal[ 'start' ] = $propValue[ 'start' ]; + $propValue[ 'start' ] = "{$local}start"; + } + + $initFor[ 'index' ] = "{$sectionVar}->value['index'] = {$propValue['start']}"; + + if (!isset($_attr[ 'start' ]) && !isset($_attr[ 'step' ]) && !isset($_attr[ 'max' ])) { + $propValue[ 'total' ] = $propValue[ 'loop' ]; + $propType[ 'total' ] = $propType[ 'loop' ]; + } else { + $propType[ 'total' ] = + $propType[ 'start' ] + $propType[ 'loop' ] + $propType[ 'step' ] + $propType[ 'max' ]; + if ($propType[ 'total' ] == 0) { + $propValue[ 'total' ] = + min(ceil(($propValue[ 'step' ] > 0 ? $propValue[ 'loop' ] - $propValue[ 'start' ] : + (int) $propValue[ 'start' ] + 1) / abs($propValue[ 'step' ])), $propValue[ 'max' ]); + } else { + $total_code = array(1 => 'min(', 2 => 'ceil(', 3 => '(', 4 => "{$propValue['step']} > 0 ? ", + 5 => $propValue[ 'loop' ], 6 => ' - ', 7 => $propValue[ 'start' ], 8 => ' : ', + 9 => $propValue[ 'start' ], 10 => '+ 1', 11 => ')', 12 => '/ ', 13 => 'abs(', + 14 => $propValue[ 'step' ], 15 => ')', 16 => ')', 17 => ", {$propValue['max']})",); + if (!isset($propValue[ 'max' ])) { + $total_code[ 1 ] = $total_code[ 17 ] = ''; + } + if ($propType[ 'loop' ] + $propType[ 'start' ] == 0) { + $total_code[ 5 ] = $propValue[ 'loop' ] - $propValue[ 'start' ]; + $total_code[ 6 ] = $total_code[ 7 ] = ''; + } + if ($propType[ 'start' ] == 0) { + $total_code[ 9 ] = (int) $propValue[ 'start' ] + 1; + $total_code[ 10 ] = ''; + } + if ($propType[ 'step' ] == 0) { + $total_code[ 13 ] = $total_code[ 15 ] = ''; + if ($propValue[ 'step' ] == 1 || $propValue[ 'step' ] == - 1) { + $total_code[ 2 ] = $total_code[ 12 ] = $total_code[ 14 ] = $total_code[ 16 ] = ''; + } elseif ($propValue[ 'step' ] < 0) { + $total_code[ 14 ] = - $propValue[ 'step' ]; + } + $total_code[ 4 ] = ''; + if ($propValue[ 'step' ] > 0) { + $total_code[ 8 ] = $total_code[ 9 ] = $total_code[ 10 ] = ''; + } else { + $total_code[ 5 ] = $total_code[ 6 ] = $total_code[ 7 ] = $total_code[ 8 ] = ''; + } + } + $propValue[ 'total' ] = join('', $total_code); + } + } + + if (isset($namedAttr[ 'loop' ])) { + $initNamedProperty[ 'loop' ] = "'loop' => {$propValue['total']}"; + } + if (isset($namedAttr[ 'total' ])) { + $initNamedProperty[ 'total' ] = "'total' => {$propValue['total']}"; + if ($propType[ 'total' ] > 0) { + $propValue[ 'total' ] = "{$sectionVar}->value['total']"; + } + } elseif ($propType[ 'total' ] > 0) { + $initLocal[ 'total' ] = $propValue[ 'total' ]; + $propValue[ 'total' ] = "{$local}total"; + } + + $cmpFor[ 'iteration' ] = "{$propValue['iteration']} <= {$propValue['total']}"; + + foreach ($initLocal as $key => $code) { + $output .= "{$local}{$key} = {$code};\n"; + } + + $_vars = 'array(' . join(', ', $initNamedProperty) . ')'; + $output .= "{$sectionVar} = new Smarty_Variable({$_vars});\n"; + $cond_code = "{$propValue['total']} != 0"; + if ($propType[ 'total' ] == 0) { + if ($propValue[ 'total' ] == 0) { + $cond_code = 'false'; + } else { + $cond_code = 'true'; + } + } + if ($propType[ 'show' ] > 0) { + $output .= "{$local}show = {$propValue['show']} ? {$cond_code} : false;\n"; + $output .= "if ({$local}show) {\n"; + } elseif ($propValue[ 'show' ] == 'true') { + $output .= "if ({$cond_code}) {\n"; + } else { + $output .= "if (false) {\n"; + } + $jinit = join(', ', $initFor); + $jcmp = join(', ', $cmpFor); + $jinc = join(', ', $incFor); + $output .= "for ({$jinit}; {$jcmp}; {$jinc}){\n"; + if (isset($namedAttr[ 'rownum' ])) { + $output .= "{$sectionVar}->value['rownum'] = {$propValue['iteration']};\n"; + } + if (isset($namedAttr[ 'index_prev' ])) { + $output .= "{$sectionVar}->value['index_prev'] = {$propValue['index']} - {$propValue['step']};\n"; + } + if (isset($namedAttr[ 'index_next' ])) { + $output .= "{$sectionVar}->value['index_next'] = {$propValue['index']} + {$propValue['step']};\n"; + } + if (isset($namedAttr[ 'first' ])) { + $output .= "{$sectionVar}->value['first'] = ({$propValue['iteration']} == 1);\n"; + } + if (isset($namedAttr[ 'last' ])) { + $output .= "{$sectionVar}->value['last'] = ({$propValue['iteration']} == {$propValue['total']});\n"; + } + $output .= "?>"; + + return $output; + } +} + +/** + * Smarty Internal Plugin Compile Sectionelse Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Sectionelse extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {sectionelse} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + + list($openTag, $nocache, $local, $sectionVar) = $this->closeTag($compiler, array('section')); + $this->openTag($compiler, 'sectionelse', array('sectionelse', $nocache, $local, $sectionVar)); + + return ""; + } +} + +/** + * Smarty Internal Plugin Compile Sectionclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Sectionclose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/section} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $compiler->loopNesting --; + // must endblock be nocache? + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } + + list($openTag, $compiler->nocache, $local, $sectionVar) = + $this->closeTag($compiler, array('section', 'sectionelse')); + + $output = ""; + + return $output; + } +} diff --git a/libs/sysplugins/smarty_internal_compile_setfilter.php b/libs/sysplugins/smarty_internal_compile_setfilter.php new file mode 100644 index 0000000..1f3ba8d --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_setfilter.php @@ -0,0 +1,70 @@ +variable_filter_stack[] = $compiler->variable_filters; + $compiler->variable_filters = $parameter[ 'modifier_list' ]; + // this tag does not return compiled code + $compiler->has_code = false; + + return true; + } +} + +/** + * Smarty Internal Plugin Compile Setfilterclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Setfilterclose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/setfilter} tag + * This tag does not generate compiled output. It resets variable filter. + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $_attr = $this->getAttributes($compiler, $args); + // reset variable filter to previous state + if (count($compiler->variable_filter_stack)) { + $compiler->variable_filters = array_pop($compiler->variable_filter_stack); + } else { + $compiler->variable_filters = array(); + } + // this tag does not return compiled code + $compiler->has_code = false; + + return true; + } +} diff --git a/libs/sysplugins/smarty_internal_compile_shared_inheritance.php b/libs/sysplugins/smarty_internal_compile_shared_inheritance.php new file mode 100644 index 0000000..c955765 --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_shared_inheritance.php @@ -0,0 +1,46 @@ +_cache[ 'inheritanceInit' ])) { + $compiler->registerPostCompileCallback(array('Smarty_Internal_Compile_Shared_Inheritance', 'postCompile'), + array($initChildSequence), 'inheritanceInit', $initChildSequence); + + $compiler->_cache[ 'inheritanceInit' ] = true; + } + } + + /** + * Compile inheritance initialization code as prefix + * + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * @param bool|false $initChildSequence if true force child template + */ + static function postCompile(Smarty_Internal_TemplateCompilerBase $compiler, $initChildSequence = false) + { + $compiler->prefixCompiledCode .= "_loadInheritance();\n\$_smarty_tpl->inheritance->init(\$_smarty_tpl, " . + var_export($initChildSequence, true) . ");\n?>\n"; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_while.php b/libs/sysplugins/smarty_internal_compile_while.php new file mode 100644 index 0000000..6025798 --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_while.php @@ -0,0 +1,100 @@ +loopNesting ++; + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $this->openTag($compiler, 'while', $compiler->nocache); + + if (!array_key_exists("if condition", $parameter)) { + $compiler->trigger_template_error("missing while condition", null, true); + } + + // maybe nocache because of nocache variables + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; + if (is_array($parameter[ 'if condition' ])) { + if ($compiler->nocache) { + // create nocache var to make it know for further compiling + if (is_array($parameter[ 'if condition' ][ 'var' ])) { + $var = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; + } else { + $var = $parameter[ 'if condition' ][ 'var' ]; + } + $compiler->setNocacheInVariable($var); + } + $prefixVar = $compiler->getNewPrefixVariable(); + $assignCompiler = new Smarty_Internal_Compile_Assign(); + $assignAttr = array(); + $assignAttr[][ 'value' ] = "{$prefixVar}"; + if (is_array($parameter[ 'if condition' ][ 'var' ])) { + $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; + $_output = ""; + $_output .= $assignCompiler->compile($assignAttr, $compiler, + array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ])); + } else { + $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ]; + $_output = ""; + $_output .= $assignCompiler->compile($assignAttr, $compiler, array()); + } + + return $_output; + } else { + return ""; + } + } +} + +/** + * Smarty Internal Plugin Compile Whileclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Whileclose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/while} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $compiler->loopNesting --; + // must endblock be nocache? + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } + $compiler->nocache = $this->closeTag($compiler, array('while')); + return "\n"; + } +} diff --git a/libs/sysplugins/smarty_internal_compilebase.php b/libs/sysplugins/smarty_internal_compilebase.php new file mode 100644 index 0000000..3fae8ac --- /dev/null +++ b/libs/sysplugins/smarty_internal_compilebase.php @@ -0,0 +1,196 @@ + true, 0 => false, 'true' => true, 'false' => false); + + /** + * Mapping array with attributes as key + * + * @var array + */ + public $mapCache = array(); + + /** + * This function checks if the attributes passed are valid + * The attributes passed for the tag to compile are checked against the list of required and + * optional attributes. Required attributes must be present. Optional attributes are check against + * the corresponding list. The keyword '_any' specifies that any attribute will be accepted + * as valid + * + * @param object $compiler compiler object + * @param array $attributes attributes applied to the tag + * + * @return array of mapped attributes for further processing + */ + public function getAttributes($compiler, $attributes) + { + $_indexed_attr = array(); + if (!isset($this->mapCache[ 'option' ])) { + $this->mapCache[ 'option' ] = array_fill_keys($this->option_flags, true); + } + foreach ($attributes as $key => $mixed) { + // shorthand ? + if (!is_array($mixed)) { + // option flag ? + if (isset($this->mapCache[ 'option' ][ trim($mixed, '\'"') ])) { + $_indexed_attr[ trim($mixed, '\'"') ] = true; + // shorthand attribute ? + } elseif (isset($this->shorttag_order[ $key ])) { + $_indexed_attr[ $this->shorttag_order[ $key ] ] = $mixed; + } else { + // too many shorthands + $compiler->trigger_template_error('too many shorthand attributes', null, true); + } + // named attribute + } else { + foreach ($mixed as $k => $v) { + // option flag? + if (isset($this->mapCache[ 'option' ][ $k ])) { + if (is_bool($v)) { + $_indexed_attr[ $k ] = $v; + } else { + if (is_string($v)) { + $v = trim($v, '\'" '); + } + if (isset($this->optionMap[ $v ])) { + $_indexed_attr[ $k ] = $this->optionMap[ $v ]; + } else { + $compiler->trigger_template_error("illegal value '" . var_export($v, true) . + "' for option flag '{$k}'", null, true); + } + } + // must be named attribute + } else { + $_indexed_attr[ $k ] = $v; + } + } + } + } + // check if all required attributes present + foreach ($this->required_attributes as $attr) { + if (!isset($_indexed_attr[ $attr ])) { + $compiler->trigger_template_error("missing \"" . $attr . "\" attribute", null, true); + } + } + // check for not allowed attributes + if ($this->optional_attributes != array('_any')) { + if (!isset($this->mapCache[ 'all' ])) { + $this->mapCache[ 'all' ] = + array_fill_keys(array_merge($this->required_attributes, $this->optional_attributes, + $this->option_flags), true); + } + foreach ($_indexed_attr as $key => $dummy) { + if (!isset($this->mapCache[ 'all' ][ $key ]) && $key !== 0) { + $compiler->trigger_template_error("unexpected \"" . $key . "\" attribute", null, true); + } + } + } + // default 'false' for all option flags not set + foreach ($this->option_flags as $flag) { + if (!isset($_indexed_attr[ $flag ])) { + $_indexed_attr[ $flag ] = false; + } + } + if (isset($_indexed_attr[ 'nocache' ]) && $_indexed_attr[ 'nocache' ]) { + $compiler->tag_nocache = true; + } + return $_indexed_attr; + } + + /** + * Push opening tag name on stack + * Optionally additional data can be saved on stack + * + * @param object $compiler compiler object + * @param string $openTag the opening tag's name + * @param mixed $data optional data saved + */ + public function openTag($compiler, $openTag, $data = null) + { + array_push($compiler->_tag_stack, array($openTag, $data)); + } + + /** + * Pop closing tag + * Raise an error if this stack-top doesn't match with expected opening tags + * + * @param object $compiler compiler object + * @param array|string $expectedTag the expected opening tag names + * + * @return mixed any type the opening tag's name or saved data + */ + public function closeTag($compiler, $expectedTag) + { + if (count($compiler->_tag_stack) > 0) { + // get stacked info + list($_openTag, $_data) = array_pop($compiler->_tag_stack); + // open tag must match with the expected ones + if (in_array($_openTag, (array) $expectedTag)) { + if (is_null($_data)) { + // return opening tag + return $_openTag; + } else { + // return restored data + return $_data; + } + } + // wrong nesting of tags + $compiler->trigger_template_error("unclosed {$compiler->smarty->left_delimiter}" . $_openTag . + "{$compiler->smarty->right_delimiter} tag"); + + return; + } + // wrong nesting of tags + $compiler->trigger_template_error("unexpected closing tag", null, true); + + return; + } +} diff --git a/libs/sysplugins/smarty_internal_config_file_compiler.php b/libs/sysplugins/smarty_internal_config_file_compiler.php new file mode 100644 index 0000000..ec1cb2b --- /dev/null +++ b/libs/sysplugins/smarty_internal_config_file_compiler.php @@ -0,0 +1,201 @@ +smarty = $smarty; + // get required plugins + $this->lexer_class = $lexer_class; + $this->parser_class = $parser_class; + $this->smarty = $smarty; + $this->config_data[ 'sections' ] = array(); + $this->config_data[ 'vars' ] = array(); + } + + /** + * 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) { + if (!isset($this->smarty->_debug)) { + $this->smarty->_debug = new Smarty_Internal_Debug(); + } + $this->smarty->_debug->start_compile($this->template); + } + // init the lexer/parser to compile the config file + /* @var Smarty_Internal_ConfigFileLexer $this ->lex */ + $this->lex = new $this->lexer_class(str_replace(array("\r\n", + "\r"), "\n", $template->source->getContent()) . "\n", + $this); + /* @var Smarty_Internal_ConfigFileParser $this ->parser */ + $this->parser = new $this->parser_class($this->lex, $this); + + if (function_exists('mb_internal_encoding') + && function_exists('ini_get') + && ((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(); + } + // get tokens from lexer and parse them + while ($this->lex->yylex()) { + if ($this->smarty->_parserdebug) { + echo "
Parsing {$this->parser->yyTokenName[$this->lex->token]} Token {$this->lex->value} Line {$this->lex->line} \n"; + } + $this->parser->doParse($this->lex->token, $this->lex->value); + } + // finish parsing process + $this->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 = + "template->source->filepath . "\" */ ?>\n"; + + $code = 'smarty->ext->configLoad->_loadConfigVars($_smarty_tpl, ' . + var_export($this->config_data, true) . '); ?>'; + return $template_header . $this->template->smarty->ext->_codeFrame->create($this->template, $code); + } + + /** + * 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 expected tokens. + * If parameter $args contains a string this is used as error message + * + * @param string $args individual error message or null + * + * @throws SmartyCompilerException + */ + public function trigger_config_file_error($args = null) + { + // get config 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->template->source->filepath}' on line {$line} '{$match[$line - 1]}' "; + if (isset($args)) { + // individual error message + $error_text .= $args; + } else { + // expected 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); + } +} diff --git a/libs/sysplugins/smarty_internal_configfilelexer.php b/libs/sysplugins/smarty_internal_configfilelexer.php new file mode 100644 index 0000000..d22b514 --- /dev/null +++ b/libs/sysplugins/smarty_internal_configfilelexer.php @@ -0,0 +1,733 @@ + 'START', 2 => 'VALUE', 3 => 'NAKED_STRING_VALUE', 4 => 'COMMENT', 5 => 'SECTION', + 6 => 'TRIPPLE'); + /** + * token names + * + * @var array + */ + public $smarty_token_names = array( // Text for parser error messages + ); + /** + * compiler object + * + * @var Smarty_Internal_Config_File_Compiler + */ + private $compiler = null; + /** + * copy of config_booleanize + * + * @var bool + */ + private $configBooleanize = false; + /** + * storage for assembled token patterns + * + * @var string + */ + private $yy_global_pattern1 = null; + private $yy_global_pattern2 = null; + private $yy_global_pattern3 = null; + private $yy_global_pattern4 = null; + private $yy_global_pattern5 = null; + private $yy_global_pattern6 = null; + private $_yy_state = 1; + private $_yy_stack = array(); + + /** + * constructor + * + * @param string $data template source + * @param Smarty_Internal_Config_File_Compiler $compiler + */ + function __construct($data, Smarty_Internal_Config_File_Compiler $compiler) + { + $this->data = $data . "\n"; //now all lines are \n-terminated + $this->dataLength = strlen($data); + $this->counter = 0; + if (preg_match('/^\xEF\xBB\xBF/', $this->data, $match)) { + $this->counter += strlen($match[0]); + } + $this->line = 1; + $this->compiler = $compiler; + $this->smarty = $compiler->smarty; + $this->configBooleanize = $this->smarty->config_booleanize; + } + + public function PrintTrace() + { + $this->yyTraceFILE = fopen('php://output', 'w'); + $this->yyTracePrompt = '
'; + } // end function + + public function yybegin($state) + { + $this->_yy_state = $state; + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, + "%sState set %s\n", + $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : + $this->_yy_state); + } + } + +public function yylex1() + { + if (!isset($this->yy_global_pattern1)) { + $this->yy_global_pattern1 = + $this->replace("/\G(#|;)|\G(\\[)|\G(\\])|\G(=)|\G([ \t\r]+)|\G(\n)|\G([0-9]*[a-zA-Z_]\\w*)|\G([\S\s])/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[0][1])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . + substr($this->data, + $this->counter, + 5) . '... state START'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r1_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } else if ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } else if ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + + } + + public function replace($input) + { + return $input; + } + + public function yylex() + { + return $this->{'yylex' . $this->_yy_state}(); + } + + function yy_r1_1() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART; + $this->yypushstate(self::COMMENT); + } + + public function yypushstate($state) + { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, + "%sState push %s\n", + $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : + $this->_yy_state); + } + array_push($this->_yy_stack, $this->_yy_state); + $this->_yy_state = $state; + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, + "%snew State %s\n", + $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : + $this->_yy_state); + } + } + + function yy_r1_2() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_OPENB; + $this->yypushstate(self::SECTION); + } + + function yy_r1_3() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB; + } + + function yy_r1_4() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_EQUAL; + $this->yypushstate(self::VALUE); + } + + function yy_r1_5() + { + + return false; + } // end function + + function yy_r1_6() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE; + } + + function yy_r1_7() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_ID; + } + + function yy_r1_8() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_OTHER; + } + +public function yylex2() + { + if (!isset($this->yy_global_pattern2)) { + $this->yy_global_pattern2 = + $this->replace("/\G([ \t\r]+)|\G(\\d+\\.\\d+(?=[ \t\r]*[\n#;]))|\G(\\d+(?=[ \t\r]*[\n#;]))|\G(\"\"\")|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#;]))|\G(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#;]))|\G([a-zA-Z]+(?=[ \t\r]*[\n#;]))|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[0][1])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . + substr($this->data, + $this->counter, + 5) . '... state VALUE'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r2_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } else if ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } else if ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + + } + + function yy_r2_1() + { + + return false; + } + + function yy_r2_2() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_FLOAT; + $this->yypopstate(); + } + + public function yypopstate() + { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, + "%sState pop %s\n", + $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : + $this->_yy_state); + } + $this->_yy_state = array_pop($this->_yy_stack); + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, + "%snew State %s\n", + $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : + $this->_yy_state); + } + + } + + function yy_r2_3() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_INT; + $this->yypopstate(); + } + + function yy_r2_4() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES; + $this->yypushstate(self::TRIPPLE); + } + + function yy_r2_5() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING; + $this->yypopstate(); + } + + function yy_r2_6() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING; + $this->yypopstate(); + } // end function + + function yy_r2_7() + { + + if (!$this->configBooleanize || + !in_array(strtolower($this->value), Array("true", "false", "on", "off", "yes", "no"))) { + $this->yypopstate(); + $this->yypushstate(self::NAKED_STRING_VALUE); + return true; //reprocess in new state + } else { + $this->token = Smarty_Internal_Configfileparser::TPC_BOOL; + $this->yypopstate(); + } + } + + function yy_r2_8() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + $this->yypopstate(); + } + + function yy_r2_9() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + $this->value = ""; + $this->yypopstate(); + } // end function + +public function yylex3() + { + if (!isset($this->yy_global_pattern3)) { + $this->yy_global_pattern3 = $this->replace("/\G([^\n]+?(?=[ \t\r]*\n))/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[0][1])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . + substr($this->data, + $this->counter, + 5) . '... state NAKED_STRING_VALUE'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r3_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } else if ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } else if ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + + } + + function yy_r3_1() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + $this->yypopstate(); + } + +public function yylex4() + { + if (!isset($this->yy_global_pattern4)) { + $this->yy_global_pattern4 = $this->replace("/\G([ \t\r]+)|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[0][1])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . + substr($this->data, + $this->counter, + 5) . '... state COMMENT'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r4_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } else if ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } else if ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + + } + + function yy_r4_1() + { + + return false; + } + + function yy_r4_2() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + } // end function + + function yy_r4_3() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE; + $this->yypopstate(); + } + +public function yylex5() + { + if (!isset($this->yy_global_pattern5)) { + $this->yy_global_pattern5 = $this->replace("/\G(\\.)|\G(.*?(?=[\.=[\]\r\n]))/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[0][1])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . + substr($this->data, + $this->counter, + 5) . '... state SECTION'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r5_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } else if ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } else if ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + + } + + function yy_r5_1() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_DOT; + } + + function yy_r5_2() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_SECTION; + $this->yypopstate(); + } // end function + +public function yylex6() + { + if (!isset($this->yy_global_pattern6)) { + $this->yy_global_pattern6 = $this->replace("/\G(\"\"\"(?=[ \t\r]*[\n#;]))|\G([\S\s])/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern6, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[0][1])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . + substr($this->data, + $this->counter, + 5) . '... state TRIPPLE'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r6_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } else if ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } else if ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + + } + + function yy_r6_1() + { + + $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END; + $this->yypopstate(); + $this->yypushstate(self::START); + } + + function yy_r6_2() + { + + $to = strlen($this->data); + preg_match("/\"\"\"[ \t\r]*[\n#;]/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); + if (isset($match[0][1])) { + $to = $match[0][1]; + } else { + $this->compiler->trigger_template_error("missing or misspelled literal closing tag"); + } + $this->value = substr($this->data, $this->counter, $to - $this->counter); + $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_TEXT; + } + + +} diff --git a/libs/sysplugins/smarty_internal_configfileparser.php b/libs/sysplugins/smarty_internal_configfileparser.php new file mode 100644 index 0000000..4ffc854 --- /dev/null +++ b/libs/sysplugins/smarty_internal_configfileparser.php @@ -0,0 +1,989 @@ +string = $s->string; + $this->metadata = $s->metadata; + } else { + $this->string = (string)$s; + if ($m instanceof TPC_yyToken) { + $this->metadata = $m->metadata; + } else if (is_array($m)) { + $this->metadata = $m; + } + } + } + + public function __toString() + { + return $this->string; + } + + public function offsetExists($offset) + { + return isset($this->metadata[ $offset ]); + } + + public function offsetGet($offset) + { + return $this->metadata[ $offset ]; + } + + public function offsetSet($offset, $value) + { + if ($offset === null) { + if (isset($value[0])) { + $x = ($value instanceof TPC_yyToken) ? $value->metadata : $value; + $this->metadata = array_merge($this->metadata, $x); + + return; + } + $offset = count($this->metadata); + } + if ($value === null) { + return; + } + if ($value instanceof TPC_yyToken) { + if ($value->metadata) { + $this->metadata[ $offset ] = $value->metadata; + } + } else if ($value) { + $this->metadata[ $offset ] = $value; + } + } + + public function offsetUnset($offset) + { + unset($this->metadata[ $offset ]); + } +} + +class TPC_yyStackEntry +{ + public $stateno; /* The state-number */ + public $major; /* The major token value. This is the code + ** number for the token at this stack level */ + public $minor; /* The user-supplied minor token value. This + ** is the value of the token */ +} + +; + + +#line 12 "../smarty/lexer/smarty_internal_configfileparser.y" + +/** + * Smarty Internal Plugin Configfileparse + * + * This is the config file parser. + * It is generated from the smarty_internal_configfileparser.y file + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ +class Smarty_Internal_Configfileparser +{ + #line 25 "../smarty/lexer/smarty_internal_configfileparser.y" + + const TPC_OPENB = 1; + const TPC_SECTION = 2; + const TPC_CLOSEB = 3; + const TPC_DOT = 4; + const TPC_ID = 5; + const TPC_EQUAL = 6; + const TPC_FLOAT = 7; + const TPC_INT = 8; + const TPC_BOOL = 9; + const TPC_SINGLE_QUOTED_STRING = 10; + const TPC_DOUBLE_QUOTED_STRING = 11; + const TPC_TRIPPLE_QUOTES = 12; + const TPC_TRIPPLE_TEXT = 13; + const TPC_TRIPPLE_QUOTES_END = 14; + const TPC_NAKED_STRING = 15; + const TPC_OTHER = 16; + const TPC_NEWLINE = 17; + const TPC_COMMENTSTART = 18; + const YY_NO_ACTION = 60; + const YY_ACCEPT_ACTION = 59; + const YY_ERROR_ACTION = 58; + const YY_SZ_ACTTAB = 38; + const YY_SHIFT_USE_DFLT = -8; + const YY_SHIFT_MAX = 19; + const YY_REDUCE_USE_DFLT = -17; + const YY_REDUCE_MAX = 10; + const YYNOCODE = 29; + const YYSTACKDEPTH = 100; + const YYNSTATE = 36; + const YYNRULE = 22; + const YYERRORSYMBOL = 19; + const YYERRSYMDT = 'yy0'; + const YYFALLBACK = 0; + static public $yy_action = array(32, 31, 30, 29, 35, 13, 19, 3, 24, 26, 59, 9, 14, 1, 16, 25, 11, 28, 25, 11, 17, + 27, 34, 20, 18, 15, 23, 5, 6, 22, 10, 8, 4, 12, 2, 33, 7, 21,); + static public $yy_lookahead = array(7, 8, 9, 10, 11, 12, 5, 23, 15, 16, 20, 21, 2, 23, 4, 17, 18, 14, 17, 18, 13, + 14, 25, 26, 15, 2, 17, 3, 3, 17, 25, 25, 6, 1, 23, 27, 22, 24,); + static public $yy_shift_ofst = array(-8, 1, 1, 1, -7, -2, -2, 32, -8, -8, -8, 9, 10, 7, 25, 24, 23, 3, 12, 26,); + static public $yy_reduce_ofst = array(-10, -3, -3, -3, 8, 6, 5, 13, 11, 14, -16,); + static public $yyExpectedTokens = array(array(), array(5, 17, 18,), array(5, 17, 18,), array(5, 17, 18,), + array(7, 8, 9, 10, 11, 12, 15, 16,), array(17, 18,), array(17, 18,), + array(1,), array(), array(), array(), array(15, 17,), array(2, 4,), + array(13, 14,), array(3,), array(3,), array(2,), array(14,), array(17,), + array(6,), array(), array(), array(), array(), array(), array(), array(), + array(), array(), array(), array(), array(), array(), array(), array(), + array(),); + static public $yy_default = array(44, 37, 41, 40, 58, 58, 58, 36, 44, 39, 44, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 43, 38, 57, 56, 53, 55, 54, 52, 51, 49, 48, 47, 46, 45, 42, 50,); + public static $yyFallback = array(); + public static $yyRuleName = array('start ::= global_vars sections', 'global_vars ::= var_list', + 'sections ::= sections section', 'sections ::=', + 'section ::= OPENB SECTION CLOSEB newline var_list', + 'section ::= OPENB DOT SECTION CLOSEB newline var_list', + 'var_list ::= var_list newline', 'var_list ::= var_list var', 'var_list ::=', + 'var ::= ID EQUAL value', 'value ::= FLOAT', 'value ::= INT', 'value ::= BOOL', + 'value ::= SINGLE_QUOTED_STRING', 'value ::= DOUBLE_QUOTED_STRING', + 'value ::= TRIPPLE_QUOTES TRIPPLE_TEXT TRIPPLE_QUOTES_END', + 'value ::= TRIPPLE_QUOTES TRIPPLE_QUOTES_END', 'value ::= NAKED_STRING', + 'value ::= OTHER', 'newline ::= NEWLINE', 'newline ::= COMMENTSTART NEWLINE', + 'newline ::= COMMENTSTART NAKED_STRING NEWLINE',); + public static $yyRuleInfo = array(array(0 => 20, 1 => 2), array(0 => 21, 1 => 1), array(0 => 22, 1 => 2), + array(0 => 22, 1 => 0), array(0 => 24, 1 => 5), array(0 => 24, 1 => 6), + array(0 => 23, 1 => 2), array(0 => 23, 1 => 2), array(0 => 23, 1 => 0), + array(0 => 26, 1 => 3), array(0 => 27, 1 => 1), array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), array(0 => 27, 1 => 1), array(0 => 27, 1 => 1), + array(0 => 27, 1 => 3), array(0 => 27, 1 => 2), array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), array(0 => 25, 1 => 1), array(0 => 25, 1 => 2), + array(0 => 25, 1 => 3),); + public static $yyReduceMap = array(0 => 0, 2 => 0, 3 => 0, 19 => 0, 20 => 0, 21 => 0, 1 => 1, 4 => 4, 5 => 5, + 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13, 14 => 14, + 15 => 15, 16 => 16, 17 => 17, 18 => 17,); + /** + * helper map + * + * @var array + */ + private static $escapes_single = Array('\\' => '\\', '\'' => '\''); + /** + * result status + * + * @var bool + */ + public $successful = true; + /** + * return value + * + * @var mixed + */ + public $retvalue = 0; + /** + * @var + */ + public $yymajor; + /** + * compiler object + * + * @var Smarty_Internal_Config_File_Compiler + */ + public $compiler = null; + /** + * smarty object + * + * @var Smarty + */ + public $smarty = null; + public $yyTraceFILE; + public $yyTracePrompt; +public $yyidx; +public $yyerrcnt; +public $yystack = array(); + public $yyTokenName = array('$', 'OPENB', 'SECTION', 'CLOSEB', 'DOT', 'ID', 'EQUAL', 'FLOAT', 'INT', 'BOOL', + 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING', 'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', + 'TRIPPLE_QUOTES_END', 'NAKED_STRING', 'OTHER', 'NEWLINE', 'COMMENTSTART', 'error', + 'start', 'global_vars', 'sections', 'var_list', 'section', 'newline', 'var', 'value',); + /** + * lexer object + * + * @var Smarty_Internal_Configfilelexer + */ + private $lex; + /** + * internal error flag + * + * @var bool + */ + private $internalError = false; + /** + * copy of config_overwrite property + * + * @var bool + */ + private $configOverwrite = false; + /** + * copy of config_read_hidden property + * + * @var bool + */ + private $configReadHidden = false; + private $_retvalue; + + /** + * constructor + * + * @param Smarty_Internal_Configfilelexer $lex + * @param Smarty_Internal_Config_File_Compiler $compiler + */ + function __construct(Smarty_Internal_Configfilelexer $lex, Smarty_Internal_Config_File_Compiler $compiler) + { + $this->lex = $lex; + $this->smarty = $compiler->smarty; + $this->compiler = $compiler; + $this->configOverwrite = $this->smarty->config_overwrite; + $this->configReadHidden = $this->smarty->config_read_hidden; + } + + public function Trace($TraceFILE, $zTracePrompt) + { + if (!$TraceFILE) { + $zTracePrompt = 0; + } else if (!$zTracePrompt) { + $TraceFILE = 0; + } + $this->yyTraceFILE = $TraceFILE; + $this->yyTracePrompt = $zTracePrompt; + } + + public function PrintTrace() + { + $this->yyTraceFILE = fopen('php://output', 'w'); + $this->yyTracePrompt = '
'; + } /* Index of top element in stack */ + + public function tokenName($tokenType) + { + if ($tokenType === 0) { + return 'End of Input'; + } + if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) { + return $this->yyTokenName[ $tokenType ]; + } else { + return "Unknown"; + } + } /* Shifts left before out of the error */ + + public function __destruct() + { + while ($this->yystack !== Array()) { + $this->yy_pop_parser_stack(); + } + if (is_resource($this->yyTraceFILE)) { + fclose($this->yyTraceFILE); + } + } /* The parser's stack */ + + public function yy_pop_parser_stack() + { + if (empty($this->yystack)) { + return; + } + $yytos = array_pop($this->yystack); + if ($this->yyTraceFILE && $this->yyidx >= 0) { + fwrite($this->yyTraceFILE, + $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] . "\n"); + } + $yymajor = $yytos->major; + self::yy_destructor($yymajor, $yytos->minor); + $this->yyidx--; + + return $yymajor; + } + + public static function yy_destructor($yymajor, $yypminor) + { + switch ($yymajor) { + default: + break; /* If no destructor action specified: do nothing */ + } + } + + public function yy_get_expected_tokens($token) + { + static $res3 = array(); + static $res4 = array(); + $state = $this->yystack[ $this->yyidx ]->stateno; + $expected = self::$yyExpectedTokens[ $state ]; + if (isset($res3[ $state ][ $token ])) { + if ($res3[ $state ][ $token ]) { + return $expected; + } + } else { + if ($res3[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) { + return $expected; + } + } + $stack = $this->yystack; + $yyidx = $this->yyidx; + do { + $yyact = $this->yy_find_shift_action($token); + if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) { + // reduce action + $done = 0; + do { + if ($done++ == 100) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // too much recursion prevents proper detection + // so give up + return array_unique($expected); + } + $yyruleno = $yyact - self::YYNSTATE; + $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][1]; + $nextstate = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, + self::$yyRuleInfo[ $yyruleno ][0]); + if (isset(self::$yyExpectedTokens[ $nextstate ])) { + $expected = array_merge($expected, self::$yyExpectedTokens[ $nextstate ]); + if (isset($res4[ $nextstate ][ $token ])) { + if ($res4[ $nextstate ][ $token ]) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return array_unique($expected); + } + } else { + if ($res4[ $nextstate ][ $token ] = + in_array($token, self::$yyExpectedTokens[ $nextstate ], true)) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return array_unique($expected); + } + } + } + if ($nextstate < self::YYNSTATE) { + // we need to shift a non-terminal + $this->yyidx++; + $x = new TPC_yyStackEntry; + $x->stateno = $nextstate; + $x->major = self::$yyRuleInfo[ $yyruleno ][0]; + $this->yystack[ $this->yyidx ] = $x; + continue 2; + } else if ($nextstate == self::YYNSTATE + self::YYNRULE + 1) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // the last token was just ignored, we can't accept + // by ignoring input, this is in essence ignoring a + // syntax error! + return array_unique($expected); + } else if ($nextstate === self::YY_NO_ACTION) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // input accepted, but not shifted (I guess) + return $expected; + } else { + $yyact = $nextstate; + } + } while (true); + } + break; + } while (true); + $this->yyidx = $yyidx; + $this->yystack = $stack; + + return array_unique($expected); + } + + public function yy_find_shift_action($iLookAhead) + { + $stateno = $this->yystack[ $this->yyidx ]->stateno; + + /* if ($this->yyidx < 0) return self::YY_NO_ACTION; */ + if (!isset(self::$yy_shift_ofst[ $stateno ])) { + // no shift actions + return self::$yy_default[ $stateno ]; + } + $i = self::$yy_shift_ofst[ $stateno ]; + if ($i === self::YY_SHIFT_USE_DFLT) { + return self::$yy_default[ $stateno ]; + } + if ($iLookAhead == self::YYNOCODE) { + return self::YY_NO_ACTION; + } + $i += $iLookAhead; + if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[ $i ] != $iLookAhead) { + if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) && + ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0) { + if ($this->yyTraceFILE) { + fwrite($this->yyTraceFILE, + $this->yyTracePrompt . "FALLBACK " . $this->yyTokenName[ $iLookAhead ] . " => " . + $this->yyTokenName[ $iFallback ] . "\n"); + } + + return $this->yy_find_shift_action($iFallback); + } + + return self::$yy_default[ $stateno ]; + } else { + return self::$yy_action[ $i ]; + } + } + + public function yy_find_reduce_action($stateno, $iLookAhead) + { + /* $stateno = $this->yystack[$this->yyidx]->stateno; */ + + if (!isset(self::$yy_reduce_ofst[ $stateno ])) { + return self::$yy_default[ $stateno ]; + } + $i = self::$yy_reduce_ofst[ $stateno ]; + if ($i == self::YY_REDUCE_USE_DFLT) { + return self::$yy_default[ $stateno ]; + } + if ($iLookAhead == self::YYNOCODE) { + return self::YY_NO_ACTION; + } + $i += $iLookAhead; + if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[ $i ] != $iLookAhead) { + return self::$yy_default[ $stateno ]; + } else { + return self::$yy_action[ $i ]; + } + } + + function yy_r0() + { + $this->_retvalue = null; + } + + function yy_r1() + { + $this->add_global_vars($this->yystack[ $this->yyidx + 0 ]->minor); + $this->_retvalue = null; + } + + /** + * add config variable to global vars + * + * @param array $vars + */ + private function add_global_vars(Array $vars) + { + if (!isset($this->compiler->config_data['vars'])) { + $this->compiler->config_data['vars'] = Array(); + } + foreach ($vars as $var) { + $this->set_var($var, $this->compiler->config_data); + } + } + + /** + * set a config variable in target array + * + * @param array $var + * @param array $target_array + */ + private function set_var(Array $var, Array &$target_array) + { + $key = $var["key"]; + $value = $var["value"]; + + if ($this->configOverwrite || !isset($target_array['vars'][ $key ])) { + $target_array['vars'][ $key ] = $value; + } else { + settype($target_array['vars'][ $key ], 'array'); + $target_array['vars'][ $key ][] = $value; + } + } + + function yy_r4() + { + $this->add_section_vars($this->yystack[ $this->yyidx + -3 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); + $this->_retvalue = null; + } + + /** + * add config variable to section + * + * @param string $section_name + * @param array $vars + */ + private function add_section_vars($section_name, Array $vars) + { + if (!isset($this->compiler->config_data['sections'][ $section_name ]['vars'])) { + $this->compiler->config_data['sections'][ $section_name ]['vars'] = Array(); + } + foreach ($vars as $var) { + $this->set_var($var, $this->compiler->config_data['sections'][ $section_name ]); + } + } + + function yy_r5() + { + if ($this->configReadHidden) { + $this->add_section_vars($this->yystack[ $this->yyidx + -3 ]->minor, + $this->yystack[ $this->yyidx + 0 ]->minor); + } + $this->_retvalue = null; + } + + function yy_r6() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; + } + + #line 245 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r7() + { + $this->_retvalue = + array_merge($this->yystack[ $this->yyidx + -1 ]->minor, Array($this->yystack[ $this->yyidx + 0 ]->minor)); + } + + #line 250 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r8() + { + $this->_retvalue = Array(); + } + + #line 264 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r9() + { + $this->_retvalue = Array("key" => $this->yystack[ $this->yyidx + -2 ]->minor, + "value" => $this->yystack[ $this->yyidx + 0 ]->minor); + } + + #line 269 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r10() + { + $this->_retvalue = (float)$this->yystack[ $this->yyidx + 0 ]->minor; + } + + #line 277 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r11() + { + $this->_retvalue = (int)$this->yystack[ $this->yyidx + 0 ]->minor; + } + + #line 281 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r12() + { + $this->_retvalue = $this->parse_bool($this->yystack[ $this->yyidx + 0 ]->minor); + } + + #line 285 "../smarty/lexer/smarty_internal_configfileparser.y" + + /** + * parse optional boolean keywords + * + * @param string $str + * + * @return bool + */ + private function parse_bool($str) + { + $str = strtolower($str); + if (in_array($str, array('on', 'yes', 'true'))) { + $res = true; + } else { + $res = false; + } + return $res; + } + + #line 291 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r13() + { + $this->_retvalue = self::parse_single_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor); + } + + #line 296 "../smarty/lexer/smarty_internal_configfileparser.y" + + /** + * parse single quoted string + * remove outer quotes + * unescape inner quotes + * + * @param string $qstr + * + * @return string + */ + private static function parse_single_quoted_string($qstr) + { + $escaped_string = substr($qstr, 1, strlen($qstr) - 2); //remove outer quotes + + $ss = preg_split('/(\\\\.)/', $escaped_string, -1, PREG_SPLIT_DELIM_CAPTURE); + + $str = ""; + foreach ($ss as $s) { + if (strlen($s) === 2 && $s[0] === '\\') { + if (isset(self::$escapes_single[ $s[1] ])) { + $s = self::$escapes_single[ $s[1] ]; + } + } + $str .= $s; + } + return $str; + } + + #line 300 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r14() + { + $this->_retvalue = self::parse_double_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor); + } + + #line 304 "../smarty/lexer/smarty_internal_configfileparser.y" + + /** + * parse double quoted string + * + * @param string $qstr + * + * @return string + */ + private static function parse_double_quoted_string($qstr) + { + $inner_str = substr($qstr, 1, strlen($qstr) - 2); + return stripcslashes($inner_str); + } + + #line 308 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r15() + { + $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[ $this->yyidx + -1 ]->minor); + } + + #line 312 "../smarty/lexer/smarty_internal_configfileparser.y" + + /** + * parse triple quoted string + * + * @param string $qstr + * + * @return string + */ + private static function parse_tripple_double_quoted_string($qstr) + { + return stripcslashes($qstr); + } + + #line 316 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r16() + { + $this->_retvalue = ''; + } + + #line 320 "../smarty/lexer/smarty_internal_configfileparser.y" + + function yy_r17() + { + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; + } + + #line 324 "../smarty/lexer/smarty_internal_configfileparser.y" + + public function doParse($yymajor, $yytokenvalue) + { + $yyerrorhit = 0; /* True if yymajor has invoked an error */ + + if ($this->yyidx === null || $this->yyidx < 0) { + $this->yyidx = 0; + $this->yyerrcnt = -1; + $x = new TPC_yyStackEntry; + $x->stateno = 0; + $x->major = 0; + $this->yystack = array(); + $this->yystack[] = $x; + } + $yyendofinput = ($yymajor == 0); + + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, + "%sInput %s\n", + $this->yyTracePrompt, + $this->yyTokenName[ $yymajor ]); + } + + do { + $yyact = $this->yy_find_shift_action($yymajor); + if ($yymajor < self::YYERRORSYMBOL && !$this->yy_is_expected_token($yymajor)) { + // force a syntax error + $yyact = self::YY_ERROR_ACTION; + } + if ($yyact < self::YYNSTATE) { + $this->yy_shift($yyact, $yymajor, $yytokenvalue); + $this->yyerrcnt--; + if ($yyendofinput && $this->yyidx >= 0) { + $yymajor = 0; + } else { + $yymajor = self::YYNOCODE; + } + } else if ($yyact < self::YYNSTATE + self::YYNRULE) { + $this->yy_reduce($yyact - self::YYNSTATE); + } else if ($yyact == self::YY_ERROR_ACTION) { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, + "%sSyntax Error!\n", + $this->yyTracePrompt); + } + if (self::YYERRORSYMBOL) { + if ($this->yyerrcnt < 0) { + $this->yy_syntax_error($yymajor, $yytokenvalue); + } + $yymx = $this->yystack[ $this->yyidx ]->major; + if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, + "%sDiscard input token %s\n", + $this->yyTracePrompt, + $this->yyTokenName[ $yymajor ]); + } + $this->yy_destructor($yymajor, $yytokenvalue); + $yymajor = self::YYNOCODE; + } else { + while ($this->yyidx >= 0 && $yymx != self::YYERRORSYMBOL && + ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE) { + $this->yy_pop_parser_stack(); + } + if ($this->yyidx < 0 || $yymajor == 0) { + $this->yy_destructor($yymajor, $yytokenvalue); + $this->yy_parse_failed(); + $yymajor = self::YYNOCODE; + } else if ($yymx != self::YYERRORSYMBOL) { + $u2 = 0; + $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2); + } + } + $this->yyerrcnt = 3; + $yyerrorhit = 1; + } else { + if ($this->yyerrcnt <= 0) { + $this->yy_syntax_error($yymajor, $yytokenvalue); + } + $this->yyerrcnt = 3; + $this->yy_destructor($yymajor, $yytokenvalue); + if ($yyendofinput) { + $this->yy_parse_failed(); + } + $yymajor = self::YYNOCODE; + } + } else { + $this->yy_accept(); + $yymajor = self::YYNOCODE; + } + } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0); + } + + public function yy_is_expected_token($token) + { + static $res = array(); + static $res2 = array(); + if ($token === 0) { + return true; // 0 is not part of this + } + $state = $this->yystack[ $this->yyidx ]->stateno; + if (isset($res[ $state ][ $token ])) { + if ($res[ $state ][ $token ]) { + return true; + } + } else { + if ($res[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) { + return true; + } + } + $stack = $this->yystack; + $yyidx = $this->yyidx; + do { + $yyact = $this->yy_find_shift_action($token); + if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) { + // reduce action + $done = 0; + do { + if ($done++ == 100) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // too much recursion prevents proper detection + // so give up + return true; + } + $yyruleno = $yyact - self::YYNSTATE; + $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][1]; + $nextstate = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, + self::$yyRuleInfo[ $yyruleno ][0]); + if (isset($res2[ $nextstate ][ $token ])) { + if ($res2[ $nextstate ][ $token ]) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return true; + } + } else { + if ($res2[ $nextstate ][ $token ] = (isset(self::$yyExpectedTokens[ $nextstate ]) && + in_array($token, + self::$yyExpectedTokens[ $nextstate ], + true))) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return true; + } + } + if ($nextstate < self::YYNSTATE) { + // we need to shift a non-terminal + $this->yyidx++; + $x = new TPC_yyStackEntry; + $x->stateno = $nextstate; + $x->major = self::$yyRuleInfo[ $yyruleno ][0]; + $this->yystack[ $this->yyidx ] = $x; + continue 2; + } else if ($nextstate == self::YYNSTATE + self::YYNRULE + 1) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + if (!$token) { + // end of input: this is valid + return true; + } + // the last token was just ignored, we can't accept + // by ignoring input, this is in essence ignoring a + // syntax error! + return false; + } else if ($nextstate === self::YY_NO_ACTION) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // input accepted, but not shifted (I guess) + return true; + } else { + $yyact = $nextstate; + } + } while (true); + } + break; + } while (true); + $this->yyidx = $yyidx; + $this->yystack = $stack; + + return true; + } + + public function yy_shift($yyNewState, $yyMajor, $yypMinor) + { + $this->yyidx++; + if ($this->yyidx >= self::YYSTACKDEPTH) { + $this->yyidx--; + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt); + } + while ($this->yyidx >= 0) { + $this->yy_pop_parser_stack(); + } + #line 239 "../smarty/lexer/smarty_internal_configfileparser.y" + + $this->internalError = true; + $this->compiler->trigger_config_file_error("Stack overflow in configfile parser"); + + return; + } + $yytos = new TPC_yyStackEntry; + $yytos->stateno = $yyNewState; + $yytos->major = $yyMajor; + $yytos->minor = $yypMinor; + $this->yystack[] = $yytos; + if ($this->yyTraceFILE && $this->yyidx > 0) { + fprintf($this->yyTraceFILE, + "%sShift %d\n", + $this->yyTracePrompt, + $yyNewState); + fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt); + for ($i = 1; $i <= $this->yyidx; $i++) { + fprintf($this->yyTraceFILE, + " %s", + $this->yyTokenName[ $this->yystack[ $i ]->major ]); + } + fwrite($this->yyTraceFILE, "\n"); + } + } + + public function yy_reduce($yyruleno) + { + if ($this->yyTraceFILE && $yyruleno >= 0 && $yyruleno < count(self::$yyRuleName)) { + fprintf($this->yyTraceFILE, + "%sReduce (%d) [%s].\n", + $this->yyTracePrompt, + $yyruleno, + self::$yyRuleName[ $yyruleno ]); + } + + $this->_retvalue = $yy_lefthand_side = null; + if (isset(self::$yyReduceMap[ $yyruleno ])) { + // call the action + $this->_retvalue = null; + $this->{'yy_r' . self::$yyReduceMap[ $yyruleno ]}(); + $yy_lefthand_side = $this->_retvalue; + } + $yygoto = self::$yyRuleInfo[ $yyruleno ][0]; + $yysize = self::$yyRuleInfo[ $yyruleno ][1]; + $this->yyidx -= $yysize; + for ($i = $yysize; $i; $i--) { + // pop all of the right-hand side parameters + array_pop($this->yystack); + } + $yyact = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, $yygoto); + if ($yyact < self::YYNSTATE) { + if (!$this->yyTraceFILE && $yysize) { + $this->yyidx++; + $x = new TPC_yyStackEntry; + $x->stateno = $yyact; + $x->major = $yygoto; + $x->minor = $yy_lefthand_side; + $this->yystack[ $this->yyidx ] = $x; + } else { + $this->yy_shift($yyact, $yygoto, $yy_lefthand_side); + } + } else if ($yyact == self::YYNSTATE + self::YYNRULE + 1) { + $this->yy_accept(); + } + } + + public function yy_accept() + { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt); + } + while ($this->yyidx >= 0) { + $this->yy_pop_parser_stack(); + } + #line 225 "../smarty/lexer/smarty_internal_configfileparser.y" + + $this->successful = !$this->internalError; + $this->internalError = false; + $this->retvalue = $this->_retvalue; + } + + public function yy_syntax_error($yymajor, $TOKEN) + { + #line 232 "../smarty/lexer/smarty_internal_configfileparser.y" + + $this->internalError = true; + $this->yymajor = $yymajor; + $this->compiler->trigger_config_file_error(); + } + + public function yy_parse_failed() + { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt); + } + while ($this->yyidx >= 0) { + $this->yy_pop_parser_stack(); + } + } +} + diff --git a/libs/sysplugins/smarty_internal_data.php b/libs/sysplugins/smarty_internal_data.php new file mode 100644 index 0000000..e1724f1 --- /dev/null +++ b/libs/sysplugins/smarty_internal_data.php @@ -0,0 +1,285 @@ +ext = new Smarty_Internal_Extension_Handler(); + $this->ext->objType = $this->_objType; + } + + /** + * assigns a Smarty variable + * + * @param array|string $tpl_var the template variable name(s) + * @param mixed $value the value to assign + * @param boolean $nocache if true any output of this variable will be not cached + * + * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for + * chaining + */ + public function assign($tpl_var, $value = null, $nocache = false) + { + if (is_array($tpl_var)) { + foreach ($tpl_var as $_key => $_val) { + $this->assign($_key, $_val, $nocache); + } + } else { + if ($tpl_var != '') { + if ($this->_objType === 2) { + /** @var Smarty_Internal_Template $this */ + $this->_assignInScope($tpl_var, $value, $nocache); + } else { + $this->tpl_vars[ $tpl_var ] = new Smarty_Variable($value, $nocache); + } + } + } + return $this; + } + + /** + * appends values to template variables + * + * @api Smarty::append() + * @link http://www.smarty.net/docs/en/api.append.tpl + * + * @param array|string $tpl_var the template variable name(s) + * @param mixed $value the value to append + * @param bool $merge flag if array elements shall be merged + * @param bool $nocache if true any output of this variable will + * be not cached + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function append($tpl_var, $value = null, $merge = false, $nocache = false) + { + return $this->ext->append->append($this, $tpl_var, $value, $merge, $nocache); + } + + /** + * assigns a global Smarty variable + * + * @param string $varName the global variable name + * @param mixed $value the value to assign + * @param boolean $nocache if true any output of this variable will be not cached + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function assignGlobal($varName, $value = null, $nocache = false) + { + return $this->ext->assignGlobal->assignGlobal($this, $varName, $value, $nocache); + } + + /** + * appends values to template variables by reference + * + * @param string $tpl_var the template variable name + * @param mixed &$value the referenced value to append + * @param boolean $merge flag if array elements shall be merged + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function appendByRef($tpl_var, &$value, $merge = false) + { + return $this->ext->appendByRef->appendByRef($this, $tpl_var, $value, $merge); + } + + /** + * assigns values to template variables by reference + * + * @param string $tpl_var the template variable name + * @param $value + * @param boolean $nocache if true any output of this variable will be not cached + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function assignByRef($tpl_var, &$value, $nocache = false) + { + return $this->ext->assignByRef->assignByRef($this, $tpl_var, $value, $nocache); + } + + /** + * Returns a single or all template variables + * + * @api Smarty::getTemplateVars() + * @link http://www.smarty.net/docs/en/api.get.template.vars.tpl + * + * @param string $varName variable name or null + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $_ptr optional pointer to data object + * @param bool $searchParents include parent templates? + * + * @return mixed variable value or or array of variables + */ + public function getTemplateVars($varName = null, Smarty_Internal_Data $_ptr = null, $searchParents = true) + { + return $this->ext->getTemplateVars->getTemplateVars($this, $varName, $_ptr, $searchParents); + } + + /** + * gets the object of a Smarty variable + * + * @param string $variable the name of the Smarty variable + * @param Smarty_Internal_Data $_ptr optional pointer to data object + * @param boolean $searchParents search also in parent data + * @param bool $error_enable + * + * @return Smarty_Variable|Smarty_Undefined_Variable the object of the variable + * @deprecated since 3.1.28 please use Smarty_Internal_Data::getTemplateVars() instead. + */ + public function getVariable($variable = null, Smarty_Internal_Data $_ptr = null, $searchParents = true, + $error_enable = true) + { + return $this->ext->getTemplateVars->_getVariable($this, $variable, $_ptr, $searchParents, $error_enable); + } + + /** + * Follow the parent chain an merge template and config variables + * + * @param \Smarty_Internal_Data|null $data + */ + public function _mergeVars(Smarty_Internal_Data $data = null) + { + if (isset($data)) { + if (!empty($this->tpl_vars)) { + $data->tpl_vars = array_merge($this->tpl_vars, $data->tpl_vars); + } + if (!empty($this->config_vars)) { + $data->config_vars = array_merge($this->config_vars, $data->config_vars); + } + } else { + $data = $this; + } + if (isset($this->parent)) { + $this->parent->_mergeVars($data); + } + } + + /** + * Return true if this instance is a Data obj + * + * @return bool + */ + public function _isDataObj() + { + return $this->_objType === 4; + } + + /** + * Return true if this instance is a template obj + * + * @return bool + */ + public function _isTplObj() + { + return $this->_objType === 2; + } + + /** + * Return true if this instance is a Smarty obj + * + * @return bool + */ + public function _isSmartyObj() + { + return $this->_objType === 1; + } + + /** + * Get Smarty object + * + * @return Smarty + */ + public function _getSmartyObj() + { + return $this->_objType === 1 ? $this : $this->smarty; + } + + /** + * Handle unknown class methods + * + * @param string $name unknown method-name + * @param array $args argument array + * + * @return mixed + * @throws SmartyException + */ + public function __call($name, $args) + { + return $this->ext->_callExternalMethod($this, $name, $args); + } +} diff --git a/libs/sysplugins/smarty_internal_debug.php b/libs/sysplugins/smarty_internal_debug.php new file mode 100644 index 0000000..f16bd3f --- /dev/null +++ b/libs/sysplugins/smarty_internal_debug.php @@ -0,0 +1,426 @@ +_isSubTpl()) { + $this->index ++; + $this->offset ++; + $this->template_data[ $this->index ] = null; + } + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'start_template_time' ] = microtime(true); + } + + /** + * End logging of cache time + * + * @param \Smarty_Internal_Template $template cached template + */ + public function end_template(Smarty_Internal_Template $template) + { + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'total_time' ] += + microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_template_time' ]; + //$this->template_data[$this->index][$key]['properties'] = $template->properties; + } + + /** + * Start logging of compile time + * + * @param \Smarty_Internal_Template $template + */ + public function start_compile(Smarty_Internal_Template $template) + { + static $_is_stringy = array('string' => true, 'eval' => true); + if (!empty($template->compiler->trace_uid)) { + $key = $template->compiler->trace_uid; + if (!isset($this->template_data[ $this->index ][ $key ])) { + if (isset($_is_stringy[ $template->source->type ])) { + $this->template_data[ $this->index ][ $key ][ 'name' ] = + '\'' . substr($template->source->name, 0, 25) . '...\''; + } else { + $this->template_data[ $this->index ][ $key ][ 'name' ] = $template->source->filepath; + } + $this->template_data[ $this->index ][ $key ][ 'compile_time' ] = 0; + $this->template_data[ $this->index ][ $key ][ 'render_time' ] = 0; + $this->template_data[ $this->index ][ $key ][ 'cache_time' ] = 0; + } + } else { + if (isset($this->ignore_uid[ $template->source->uid ])) { + return; + } + $key = $this->get_key($template); + } + $this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true); + } + + /** + * End logging of compile time + * + * @param \Smarty_Internal_Template $template + */ + public function end_compile(Smarty_Internal_Template $template) + { + if (!empty($template->compiler->trace_uid)) { + $key = $template->compiler->trace_uid; + } else { + if (isset($this->ignore_uid[ $template->source->uid ])) { + return; + } + + $key = $this->get_key($template); + } + $this->template_data[ $this->index ][ $key ][ 'compile_time' ] += + microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_time' ]; + } + + /** + * Start logging of render time + * + * @param \Smarty_Internal_Template $template + */ + public function start_render(Smarty_Internal_Template $template) + { + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true); + } + + /** + * End logging of compile time + * + * @param \Smarty_Internal_Template $template + */ + public function end_render(Smarty_Internal_Template $template) + { + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'render_time' ] += + microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_time' ]; + } + + /** + * Start logging of cache time + * + * @param \Smarty_Internal_Template $template cached template + */ + public function start_cache(Smarty_Internal_Template $template) + { + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true); + } + + /** + * End logging of cache time + * + * @param \Smarty_Internal_Template $template cached template + */ + public function end_cache(Smarty_Internal_Template $template) + { + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'cache_time' ] += + microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_time' ]; + } + + /** + * Register template object + * + * @param \Smarty_Internal_Template $template cached template + */ + public function register_template(Smarty_Internal_Template $template) + { + } + + /** + * Register data object + * + * @param \Smarty_Data $data data object + */ + public static function register_data(Smarty_Data $data) + { + } + + /** + * Opens a window for the Smarty Debugging Console and display the data + * + * @param Smarty_Internal_Template|Smarty $obj object to debug + * @param bool $full + */ + public function display_debug($obj, $full = false) + { + if (!$full) { + $this->offset ++; + $savedIndex = $this->index; + $this->index = 9999; + } + $smarty = $obj->_getSmartyObj(); + // create fresh instance of smarty for displaying the debug console + // to avoid problems if the application did overload the Smarty class + $debObj = new Smarty(); + // copy the working dirs from application + $debObj->setCompileDir($smarty->getCompileDir()); + // init properties by hand as user may have edited the original Smarty class + $debObj->setPluginsDir(is_dir(__DIR__ . '/../plugins') ? __DIR__ . '/../plugins' : $smarty->getPluginsDir()); + $debObj->force_compile = false; + $debObj->compile_check = true; + $debObj->left_delimiter = '{'; + $debObj->right_delimiter = '}'; + $debObj->security_policy = null; + $debObj->debugging = false; + $debObj->debugging_ctrl = 'NONE'; + $debObj->error_reporting = E_ALL & ~E_NOTICE; + $debObj->debug_tpl = isset($smarty->debug_tpl) ? $smarty->debug_tpl : 'file:' . __DIR__ . '/../debug.tpl'; + $debObj->registered_plugins = array(); + $debObj->registered_resources = array(); + $debObj->registered_filters = array(); + $debObj->autoload_filters = array(); + $debObj->default_modifiers = array(); + $debObj->escape_html = true; + $debObj->caching = false; + $debObj->compile_id = null; + $debObj->cache_id = null; + // prepare information of assigned variables + $ptr = $this->get_debug_vars($obj); + $_assigned_vars = $ptr->tpl_vars; + ksort($_assigned_vars); + $_config_vars = $ptr->config_vars; + ksort($_config_vars); + $debugging = $smarty->debugging; + + $_template = new Smarty_Internal_Template($debObj->debug_tpl, $debObj); + if ($obj->_isTplObj()) { + $_template->assign('template_name', $obj->source->type . ':' . $obj->source->name); + } + if ($obj->_objType == 1 || $full) { + $_template->assign('template_data', $this->template_data[ $this->index ]); + } else { + $_template->assign('template_data', null); + } + $_template->assign('assigned_vars', $_assigned_vars); + $_template->assign('config_vars', $_config_vars); + $_template->assign('execution_time', microtime(true) - $smarty->start_time); + $_template->assign('display_mode', $debugging == 2 || !$full); + $_template->assign('offset', $this->offset * 50); + echo $_template->fetch(); + if (isset($full)) { + $this->index --; + } + if (!$full) { + $this->index = $savedIndex; + } + } + + /** + * Recursively gets variables from all template/data scopes + * + * @param Smarty_Internal_Template|Smarty_Data $obj object to debug + * + * @return StdClass + */ + public function get_debug_vars($obj) + { + $config_vars = array(); + foreach ($obj->config_vars as $key => $var) { + $config_vars[ $key ][ 'value' ] = $var; + if ($obj->_isTplObj()) { + $config_vars[ $key ][ 'scope' ] = $obj->source->type . ':' . $obj->source->name; + } elseif ($obj->_isDataObj()) { + $tpl_vars[ $key ][ 'scope' ] = $obj->dataObjectName; + } else { + $config_vars[ $key ][ 'scope' ] = 'Smarty object'; + } + } + $tpl_vars = array(); + foreach ($obj->tpl_vars as $key => $var) { + foreach ($var as $varkey => $varvalue) { + if ($varkey == 'value') { + $tpl_vars[ $key ][ $varkey ] = $varvalue; + } else { + if ($varkey == 'nocache') { + if ($varvalue == true) { + $tpl_vars[ $key ][ $varkey ] = $varvalue; + } + } else { + if ($varkey != 'scope' || $varvalue !== 0) { + $tpl_vars[ $key ][ 'attributes' ][ $varkey ] = $varvalue; + } + } + } + } + if ($obj->_isTplObj()) { + $tpl_vars[ $key ][ 'scope' ] = $obj->source->type . ':' . $obj->source->name; + } elseif ($obj->_isDataObj()) { + $tpl_vars[ $key ][ 'scope' ] = $obj->dataObjectName; + } else { + $tpl_vars[ $key ][ 'scope' ] = 'Smarty object'; + } + } + + if (isset($obj->parent)) { + $parent = $this->get_debug_vars($obj->parent); + foreach ($parent->tpl_vars as $name => $pvar) { + if (isset($tpl_vars[ $name ]) && $tpl_vars[ $name ][ 'value' ] === $pvar[ 'value' ]) { + $tpl_vars[ $name ][ 'scope' ] = $pvar[ 'scope' ]; + } + } + $tpl_vars = array_merge($parent->tpl_vars, $tpl_vars); + + foreach ($parent->config_vars as $name => $pvar) { + if (isset($config_vars[ $name ]) && $config_vars[ $name ][ 'value' ] === $pvar[ 'value' ]) { + $config_vars[ $name ][ 'scope' ] = $pvar[ 'scope' ]; + } + } + $config_vars = array_merge($parent->config_vars, $config_vars); + } else { + foreach (Smarty::$global_tpl_vars as $key => $var) { + if (!array_key_exists($key, $tpl_vars)) { + foreach ($var as $varkey => $varvalue) { + if ($varkey == 'value') { + $tpl_vars[ $key ][ $varkey ] = $varvalue; + } else { + if ($varkey == 'nocache') { + if ($varvalue == true) { + $tpl_vars[ $key ][ $varkey ] = $varvalue; + } + } else { + if ($varkey != 'scope' || $varvalue !== 0) { + $tpl_vars[ $key ][ 'attributes' ][ $varkey ] = $varvalue; + } + } + } + } + $tpl_vars[ $key ][ 'scope' ] = 'Global'; + } + } + } + + return (object) array('tpl_vars' => $tpl_vars, 'config_vars' => $config_vars); + } + + /** + * Return key into $template_data for template + * + * @param \Smarty_Internal_Template $template template object + * + * @return string key into $template_data + */ + private function get_key(Smarty_Internal_Template $template) + { + static $_is_stringy = array('string' => true, 'eval' => true); + // calculate Uid if not already done + if ($template->source->uid == '') { + $template->source->filepath; + } + $key = $template->source->uid; + if (isset($this->template_data[ $this->index ][ $key ])) { + return $key; + } else { + if (isset($_is_stringy[ $template->source->type ])) { + $this->template_data[ $this->index ][ $key ][ 'name' ] = + '\'' . substr($template->source->name, 0, 25) . '...\''; + } else { + $this->template_data[ $this->index ][ $key ][ 'name' ] = $template->source->filepath; + } + $this->template_data[ $this->index ][ $key ][ 'compile_time' ] = 0; + $this->template_data[ $this->index ][ $key ][ 'render_time' ] = 0; + $this->template_data[ $this->index ][ $key ][ 'cache_time' ] = 0; + $this->template_data[ $this->index ][ $key ][ 'total_time' ] = 0; + + return $key; + } + } + + /** + * Ignore template + * + * @param \Smarty_Internal_Template $template + */ + public function ignore(Smarty_Internal_Template $template) + { + // calculate Uid if not already done + if ($template->source->uid == '') { + $template->source->filepath; + } + $this->ignore_uid[ $template->source->uid ] = true; + } + + /** + * handle 'URL' debugging mode + * + * @param Smarty $smarty + */ + public function debugUrl(Smarty $smarty) + { + if (isset($_SERVER[ 'QUERY_STRING' ])) { + $_query_string = $_SERVER[ 'QUERY_STRING' ]; + } else { + $_query_string = ''; + } + if (false !== strpos($_query_string, $smarty->smarty_debug_id)) { + if (false !== strpos($_query_string, $smarty->smarty_debug_id . '=on')) { + // enable debugging for this browser session + setcookie('SMARTY_DEBUG', true); + $smarty->debugging = true; + } elseif (false !== strpos($_query_string, $smarty->smarty_debug_id . '=off')) { + // disable debugging for this browser session + setcookie('SMARTY_DEBUG', false); + $smarty->debugging = false; + } else { + // enable debugging for this page + $smarty->debugging = true; + } + } else { + if (isset($_COOKIE[ 'SMARTY_DEBUG' ])) { + $smarty->debugging = true; + } + } + } +} diff --git a/libs/sysplugins/smarty_internal_extension_handler.php b/libs/sysplugins/smarty_internal_extension_handler.php new file mode 100644 index 0000000..340e6de --- /dev/null +++ b/libs/sysplugins/smarty_internal_extension_handler.php @@ -0,0 +1,171 @@ + 0, 'DefaultModifiers' => 0, 'ConfigVars' => 0, + 'DebugTemplate' => 0, 'RegisteredObject' => 0, 'StreamVariable' => 0, + 'TemplateVars' => 0,);# + + private $resolvedProperties = array(); + + /** + * Call external Method + * + * @param \Smarty_Internal_Data $data + * @param string $name external method names + * @param array $args argument array + * + * @return mixed + * @throws SmartyException + */ + public function _callExternalMethod(Smarty_Internal_Data $data, $name, $args) + { + /* @var Smarty $data ->smarty */ + $smarty = isset($data->smarty) ? $data->smarty : $data; + if (!isset($smarty->ext->$name)) { + $class = 'Smarty_Internal_Method_' . $this->upperCase($name); + if (preg_match('/^(set|get)([A-Z].*)$/', $name, $match)) { + $pn = ''; + if (!isset($this->_property_info[ $prop = $match[ 2 ] ])) { + // convert camel case to underscored name + $this->resolvedProperties[ $prop ] = $pn = strtolower(join('_', + preg_split('/([A-Z][^A-Z]*)/', $prop, + - 1, PREG_SPLIT_NO_EMPTY | + PREG_SPLIT_DELIM_CAPTURE))); + $this->_property_info[ $prop ] = + property_exists($data, $pn) ? 1 : ($data->_isTplObj() && property_exists($smarty, $pn) ? 2 : 0); + } + if ($this->_property_info[ $prop ]) { + $pn = $this->resolvedProperties[ $prop ]; + if ($match[ 1 ] == 'get') { + return $this->_property_info[ $prop ] == 1 ? $data->$pn : $data->smarty->$pn; + } else { + return $this->_property_info[ $prop ] == 1 ? $data->$pn = $args[ 0 ] : + $data->smarty->$pn = $args[ 0 ]; + } + } elseif (!class_exists($class)) { + throw new SmartyException("property '$pn' does not exist."); + } + } + if (class_exists($class)) { + $callback = array($smarty->ext->$name = new $class(), $name); + } + } else { + $callback = array($smarty->ext->$name, $name); + } + array_unshift($args, $data); + if (isset($callback) && $callback[ 0 ]->objMap | $data->_objType) { + return call_user_func_array($callback, $args); + } + return call_user_func_array(array(new Smarty_Internal_Undefined(), $name), $args); + } + + /** + * Make first character of name parts upper case + * + * @param string $name + * + * @return string + */ + public function upperCase($name) + { + $_name = explode('_', $name); + $_name = array_map('ucfirst', $_name); + return implode('_', $_name); + } + + /** + * set extension property + * + * @param string $property_name property name + * @param mixed $value value + * + * @throws SmartyException + */ + public function __set($property_name, $value) + { + $this->$property_name = $value; + } + + /** + * get extension object + * + * @param string $property_name property name + * + * @return mixed|Smarty_Template_Cached + * @throws SmartyException + */ + public function __get($property_name) + { + // object properties of runtime template extensions will start with '_' + if ($property_name[ 0 ] == '_') { + $class = 'Smarty_Internal_Runtime' . $this->upperCase($property_name); + } else { + $class = 'Smarty_Internal_Method_' . $this->upperCase($property_name); + } + if (!class_exists($class)) { + return $this->$property_name = new Smarty_Internal_Undefined($class); + } + return $this->$property_name = new $class(); + } + + /** + * Call error handler for undefined method + * + * @param string $name unknown method-name + * @param array $args argument array + * + * @return mixed + * @throws SmartyException + */ + public function __call($name, $args) + { + return call_user_func_array(array(new Smarty_Internal_Undefined(), $name), array($this)); + } + +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_addautoloadfilters.php b/libs/sysplugins/smarty_internal_method_addautoloadfilters.php new file mode 100644 index 0000000..3eef8a2 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_addautoloadfilters.php @@ -0,0 +1,52 @@ +_getSmartyObj(); + if ($type !== null) { + $this->_checkFilterType($type); + if (!empty($smarty->autoload_filters[ $type ])) { + $smarty->autoload_filters[ $type ] = array_merge($smarty->autoload_filters[ $type ], (array) $filters); + } else { + $smarty->autoload_filters[ $type ] = (array) $filters; + } + } else { + foreach ((array) $filters as $type => $value) { + $this->_checkFilterType($type); + if (!empty($smarty->autoload_filters[ $type ])) { + $smarty->autoload_filters[ $type ] = + array_merge($smarty->autoload_filters[ $type ], (array) $value); + } else { + $smarty->autoload_filters[ $type ] = (array) $value; + } + } + } + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_adddefaultmodifiers.php b/libs/sysplugins/smarty_internal_method_adddefaultmodifiers.php new file mode 100644 index 0000000..afb0b68 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_adddefaultmodifiers.php @@ -0,0 +1,42 @@ +_getSmartyObj(); + if (is_array($modifiers)) { + $smarty->default_modifiers = array_merge($smarty->default_modifiers, $modifiers); + } else { + $smarty->default_modifiers[] = $modifiers; + } + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_append.php b/libs/sysplugins/smarty_internal_method_append.php new file mode 100644 index 0000000..af69359 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_append.php @@ -0,0 +1,74 @@ + $_val) { + if ($_key != '') { + $this->append($data, $_key, $_val, $merge, $nocache); + } + } + } else { + if ($tpl_var != '' && isset($value)) { + if (!isset($data->tpl_vars[ $tpl_var ])) { + $tpl_var_inst = $data->ext->getTemplateVars->_getVariable($data, $tpl_var, null, true, false); + if ($tpl_var_inst instanceof Smarty_Undefined_Variable) { + $data->tpl_vars[ $tpl_var ] = new Smarty_Variable(null, $nocache); + } else { + $data->tpl_vars[ $tpl_var ] = clone $tpl_var_inst; + } + } + if (!(is_array($data->tpl_vars[ $tpl_var ]->value) || + $data->tpl_vars[ $tpl_var ]->value instanceof ArrayAccess) + ) { + settype($data->tpl_vars[ $tpl_var ]->value, 'array'); + } + if ($merge && is_array($value)) { + foreach ($value as $_mkey => $_mval) { + $data->tpl_vars[ $tpl_var ]->value[ $_mkey ] = $_mval; + } + } else { + $data->tpl_vars[ $tpl_var ]->value[] = $value; + } + } + if ($data->_isTplObj() && $data->scope) { + $data->ext->_updateScope->_updateScope($data, $tpl_var); + } + } + return $data; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_appendbyref.php b/libs/sysplugins/smarty_internal_method_appendbyref.php new file mode 100644 index 0000000..532ac95 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_appendbyref.php @@ -0,0 +1,50 @@ +tpl_vars[ $tpl_var ])) { + $data->tpl_vars[ $tpl_var ] = new Smarty_Variable(); + } + if (!is_array($data->tpl_vars[ $tpl_var ]->value)) { + settype($data->tpl_vars[ $tpl_var ]->value, 'array'); + } + if ($merge && is_array($value)) { + foreach ($value as $_key => $_val) { + $data->tpl_vars[ $tpl_var ]->value[ $_key ] = &$value[ $_key ]; + } + } else { + $data->tpl_vars[ $tpl_var ]->value[] = &$value; + } + if ($data->_isTplObj() && $data->scope) { + $data->ext->_updateScope->_updateScope($data, $tpl_var); + } + } + return $data; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_assignbyref.php b/libs/sysplugins/smarty_internal_method_assignbyref.php new file mode 100644 index 0000000..0060bbc --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_assignbyref.php @@ -0,0 +1,36 @@ +tpl_vars[ $tpl_var ] = new Smarty_Variable(null, $nocache); + $data->tpl_vars[ $tpl_var ]->value = &$value; + if ($data->_isTplObj() && $data->scope) { + $data->ext->_updateScope->_updateScope($data, $tpl_var); + } + } + return $data; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_assignglobal.php b/libs/sysplugins/smarty_internal_method_assignglobal.php new file mode 100644 index 0000000..3c2b260 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_assignglobal.php @@ -0,0 +1,43 @@ +_isTplObj()) { + $ptr->tpl_vars[ $varName ] = clone Smarty::$global_tpl_vars[ $varName ]; + $ptr = $ptr->parent; + } + } + return $data; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_clearallassign.php b/libs/sysplugins/smarty_internal_method_clearallassign.php new file mode 100644 index 0000000..1e5fec4 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_clearallassign.php @@ -0,0 +1,37 @@ +tpl_vars = array(); + + return $data; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_clearallcache.php b/libs/sysplugins/smarty_internal_method_clearallcache.php new file mode 100644 index 0000000..5879f9a --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_clearallcache.php @@ -0,0 +1,40 @@ +_clearTemplateCache(); + // load cache resource and call clearAll + $_cache_resource = Smarty_CacheResource::load($smarty, $type); + return $_cache_resource->clearAll($smarty, $exp_time); + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_clearassign.php b/libs/sysplugins/smarty_internal_method_clearassign.php new file mode 100644 index 0000000..060a2ac --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_clearassign.php @@ -0,0 +1,44 @@ +tpl_vars[ $curr_var ]); + } + } else { + unset($data->tpl_vars[ $tpl_var ]); + } + + return $data; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_clearcache.php b/libs/sysplugins/smarty_internal_method_clearcache.php new file mode 100644 index 0000000..95649a7 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_clearcache.php @@ -0,0 +1,44 @@ +_clearTemplateCache(); + // load cache resource and call clear + $_cache_resource = Smarty_CacheResource::load($smarty, $type); + return $_cache_resource->clear($smarty, $template_name, $cache_id, $compile_id, $exp_time); + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php b/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php new file mode 100644 index 0000000..0ed9f95 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php @@ -0,0 +1,126 @@ +_clearTemplateCache(); + + $_compile_dir = $smarty->getCompileDir(); + if ($_compile_dir == '/') { //We should never want to delete this! + return 0; + } + $_compile_id = isset($compile_id) ? preg_replace('![^\w]+!', '_', $compile_id) : null; + $_dir_sep = $smarty->use_sub_dirs ? $smarty->ds : '^'; + if (isset($resource_name)) { + $_save_stat = $smarty->caching; + $smarty->caching = false; + /* @var Smarty_Internal_Template $tpl */ + $tpl = $smarty->createTemplate($resource_name); + $smarty->caching = $_save_stat; + if (!$tpl->source->handler->uncompiled && !$tpl->source->handler->recompiled && $tpl->source->exists) { + $_resource_part_1 = basename(str_replace('^', $smarty->ds, $tpl->compiled->filepath)); + $_resource_part_1_length = strlen($_resource_part_1); + } else { + return 0; + } + $_resource_part_2 = str_replace('.php', '.cache.php', $_resource_part_1); + $_resource_part_2_length = strlen($_resource_part_2); + } + $_dir = $_compile_dir; + if ($smarty->use_sub_dirs && isset($_compile_id)) { + $_dir .= $_compile_id . $_dir_sep; + } + if (isset($_compile_id)) { + $_compile_id_part = $_compile_dir . $_compile_id . $_dir_sep; + $_compile_id_part_length = strlen($_compile_id_part); + } + $_count = 0; + try { + $_compileDirs = new RecursiveDirectoryIterator($_dir); + // NOTE: UnexpectedValueException thrown for PHP >= 5.3 + } + catch (Exception $e) { + return 0; + } + $_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST); + foreach ($_compile as $_file) { + if (substr(basename($_file->getPathname()), 0, 1) == '.') { + continue; + } + $_filepath = (string) $_file; + if ($_file->isDir()) { + if (!$_compile->isDot()) { + // delete folder if empty + @rmdir($_file->getPathname()); + } + } else { + // delete only php files + if (substr($_filepath, - 4) !== '.php') { + continue; + } + $unlink = false; + if ((!isset($_compile_id) || (isset($_filepath[ $_compile_id_part_length ]) && $a = + !strncmp($_filepath, $_compile_id_part, $_compile_id_part_length))) && + (!isset($resource_name) || (isset($_filepath[ $_resource_part_1_length ]) && + substr_compare($_filepath, $_resource_part_1, + - $_resource_part_1_length, $_resource_part_1_length) == + 0) || (isset($_filepath[ $_resource_part_2_length ]) && + substr_compare($_filepath, $_resource_part_2, + - $_resource_part_2_length, + $_resource_part_2_length) == 0)) + ) { + if (isset($exp_time)) { + if (is_file($_filepath) && time() - @filemtime($_filepath) >= $exp_time) { + $unlink = true; + } + } else { + $unlink = true; + } + } + + if ($unlink && is_file($_filepath) && @unlink($_filepath)) { + $_count ++; + if (function_exists('opcache_invalidate') + && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1) + ) { + opcache_invalidate($_filepath, true); + } elseif (function_exists('apc_delete_file')) { + apc_delete_file($_filepath); + } + } + } + } + return $_count; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_clearconfig.php b/libs/sysplugins/smarty_internal_method_clearconfig.php new file mode 100644 index 0000000..3712478 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_clearconfig.php @@ -0,0 +1,41 @@ +config_vars[ $name ]); + } else { + $data->config_vars = array(); + } + return $data; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_compileallconfig.php b/libs/sysplugins/smarty_internal_method_compileallconfig.php new file mode 100644 index 0000000..767031b --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_compileallconfig.php @@ -0,0 +1,33 @@ +compileAll($smarty, $extension, $force_compile, $time_limit, $max_errors, true); + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_compilealltemplates.php b/libs/sysplugins/smarty_internal_method_compilealltemplates.php new file mode 100644 index 0000000..0abed21 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_compilealltemplates.php @@ -0,0 +1,119 @@ +compileAll($smarty, $extension, $force_compile, $time_limit, $max_errors); + } + + /** + * Compile all template or config files + * + * @param \Smarty $smarty + * @param string $extension template file name extension + * @param bool $force_compile force all to recompile + * @param int $time_limit set maximum execution time + * @param int $max_errors set maximum allowed errors + * @param bool $isConfig flag true if called for config files + * + * @return int number of template files compiled + */ + protected function compileAll(Smarty $smarty, $extension, $force_compile, $time_limit, $max_errors, + $isConfig = false) + { + // switch off time limit + if (function_exists('set_time_limit')) { + @set_time_limit($time_limit); + } + $_count = 0; + $_error_count = 0; + $sourceDir = $isConfig ? $smarty->getConfigDir() : $smarty->getTemplateDir(); + // loop over array of source directories + foreach ($sourceDir as $_dir) { + $_dir_1 = new RecursiveDirectoryIterator($_dir, defined('FilesystemIterator::FOLLOW_SYMLINKS') ? + FilesystemIterator::FOLLOW_SYMLINKS : 0); + $_dir_2 = new RecursiveIteratorIterator($_dir_1); + foreach ($_dir_2 as $_fileinfo) { + $_file = $_fileinfo->getFilename(); + if (substr(basename($_fileinfo->getPathname()), 0, 1) == '.' || strpos($_file, '.svn') !== false) { + continue; + } + if (!substr_compare($_file, $extension, - strlen($extension)) == 0) { + continue; + } + if ($_fileinfo->getPath() !== substr($_dir, 0, - 1)) { + $_file = substr($_fileinfo->getPath(), strlen($_dir)) . $smarty->ds . $_file; + } + echo "\n
", $_dir, '---', $_file; + flush(); + $_start_time = microtime(true); + $_smarty = clone $smarty; + // + $_smarty->_cache = array(); + $_smarty->ext = new Smarty_Internal_Extension_Handler(); + $_smarty->ext->objType = $_smarty->_objType; + $_smarty->force_compile = $force_compile; + try { + /* @var Smarty_Internal_Template $_tpl */ + $_tpl = new $smarty->template_class($_file, $_smarty); + $_tpl->caching = Smarty::CACHING_OFF; + $_tpl->source = + $isConfig ? Smarty_Template_Config::load($_tpl) : Smarty_Template_Source::load($_tpl); + if ($_tpl->mustCompile()) { + $_tpl->compileTemplateSource(); + $_count ++; + echo ' compiled in ', microtime(true) - $_start_time, ' seconds'; + flush(); + } else { + echo ' is up to date'; + flush(); + } + } + catch (Exception $e) { + echo "\n
------>Error: ", $e->getMessage(), "

\n"; + $_error_count ++; + } + // free memory + unset($_tpl); + $_smarty->_clearTemplateCache(); + if ($max_errors !== null && $_error_count == $max_errors) { + echo "\n

too many errors\n"; + exit(); + } + } + } + echo "\n
"; + return $_count; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_configload.php b/libs/sysplugins/smarty_internal_method_configload.php new file mode 100644 index 0000000..6113eaf --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_configload.php @@ -0,0 +1,183 @@ +_loadConfigFile($data, $config_file, $sections, null); + return $data; + } + + /** + * load a config file, optionally load just selected sections + * + * @api Smarty::configLoad() + * @link http://www.smarty.net/docs/en/api.config.load.tpl + * + * @param \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template $data + * @param string $config_file filename + * @param mixed $sections array of section names, single + * section or null + * @param int $scope scope into which config variables + * shall be loaded + * + * @return \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function _loadConfigFile(Smarty_Internal_Data $data, $config_file, $sections = null, $scope = 0) + { + /* @var \Smarty $smarty */ + $smarty = $data->_getSmartyObj(); + /* @var \Smarty_Internal_Template $confObj */ + $confObj = new Smarty_Internal_Template($config_file, $smarty, $data, null, null, null, null, true); + $confObj->caching = Smarty::CACHING_OFF; + $confObj->source->config_sections = $sections; + $confObj->source->scope = $scope; + $confObj->compiled = Smarty_Template_Compiled::load($confObj); + $confObj->compiled->render($confObj); + if ($data->_isTplObj()) { + $data->compiled->file_dependency[ $confObj->source->uid ] = + array($confObj->source->filepath, $confObj->source->getTimeStamp(), $confObj->source->type); + } + } + + /** + * load config variables into template object + * + * @param \Smarty_Internal_Template $tpl + * @param array $new_config_vars + * + */ + public function _loadConfigVars(Smarty_Internal_Template $tpl, $new_config_vars) + { + $this->_assignConfigVars($tpl->parent->config_vars, $tpl, $new_config_vars); + $tagScope = $tpl->source->scope; + if ($tagScope >= 0) { + if ($tagScope == Smarty::SCOPE_LOCAL) { + $this->_updateVarStack($tpl, $new_config_vars); + $tagScope = 0; + if (!$tpl->scope) { + return; + } + } + if ($tpl->parent->_isTplObj() && ($tagScope || $tpl->parent->scope)) { + $mergedScope = $tagScope | $tpl->scope; + if ($mergedScope) { + // update scopes + foreach ($tpl->smarty->ext->_updateScope->_getAffectedScopes($tpl->parent, $mergedScope) as $ptr) { + $this->_assignConfigVars($ptr->config_vars, $tpl, $new_config_vars); + if ($tagScope && $ptr->_isTplObj() && isset($tpl->_cache[ 'varStack' ])) { + $this->_updateVarStack($tpl, $new_config_vars); + } + } + } + } + } + } + + /** + * Assign all config variables in given scope + * + * @param array $config_vars config variables in scope + * @param \Smarty_Internal_Template $tpl + * @param array $new_config_vars loaded config variables + */ + public function _assignConfigVars(&$config_vars, Smarty_Internal_Template $tpl, $new_config_vars) + { + // copy global config vars + foreach ($new_config_vars[ 'vars' ] as $variable => $value) { + if ($tpl->smarty->config_overwrite || !isset($config_vars[ $variable ])) { + $config_vars[ $variable ] = $value; + } else { + $config_vars[ $variable ] = array_merge((array) $config_vars[ $variable ], (array) $value); + } + } + // scan sections + $sections = $tpl->source->config_sections; + if (!empty($sections)) { + foreach ((array) $sections as $tpl_section) { + if (isset($new_config_vars[ 'sections' ][ $tpl_section ])) { + foreach ($new_config_vars[ 'sections' ][ $tpl_section ][ 'vars' ] as $variable => $value) { + if ($tpl->smarty->config_overwrite || !isset($config_vars[ $variable ])) { + $config_vars[ $variable ] = $value; + } else { + $config_vars[ $variable ] = array_merge((array) $config_vars[ $variable ], (array) $value); + } + } + } + } + } + } + + /** + * Update config variables in template local variable stack + * + * @param \Smarty_Internal_Template $tpl + * @param array $config_vars + */ + public function _updateVarStack(Smarty_Internal_Template $tpl, $config_vars) + { + $i = 0; + while (isset($tpl->_cache[ 'varStack' ][ $i ])) { + $this->_assignConfigVars($tpl->_cache[ 'varStack' ][ $i ][ 'config' ], $tpl, $config_vars); + $i ++; + } + } + + /** + * gets a config variable value + * + * @param \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template $data + * @param string $varName the name of the config variable + * @param bool $errorEnable + * + * @return null|string the value of the config variable + */ + public function _getConfigVariable(Smarty_Internal_Data $data, $varName, $errorEnable = true) + { + $_ptr = $data; + while ($_ptr !== null) { + if (isset($_ptr->config_vars[ $varName ])) { + // found it, return it + return $_ptr->config_vars[ $varName ]; + } + // not found, try at parent + $_ptr = $_ptr->parent; + } + if ($data->smarty->error_unassigned && $errorEnable) { + // force a notice + $x = $$varName; + } + return null; + } +} diff --git a/libs/sysplugins/smarty_internal_method_createdata.php b/libs/sysplugins/smarty_internal_method_createdata.php new file mode 100644 index 0000000..43ce894 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_createdata.php @@ -0,0 +1,44 @@ +_getSmartyObj(); + $dataObj = new Smarty_Data($parent, $smarty, $name); + if ($smarty->debugging) { + Smarty_Internal_Debug::register_data($dataObj); + } + return $dataObj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_getautoloadfilters.php b/libs/sysplugins/smarty_internal_method_getautoloadfilters.php new file mode 100644 index 0000000..d945a01 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_getautoloadfilters.php @@ -0,0 +1,37 @@ + array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type + * was specified + */ + public function getAutoloadFilters(Smarty_Internal_TemplateBase $obj, $type = null) + { + $smarty = $obj->_getSmartyObj(); + if ($type !== null) { + $this->_checkFilterType($type); + return isset($smarty->autoload_filters[ $type ]) ? $smarty->autoload_filters[ $type ] : array(); + } + return $smarty->autoload_filters; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_getconfigvariable.php b/libs/sysplugins/smarty_internal_method_getconfigvariable.php new file mode 100644 index 0000000..4dd3982 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_getconfigvariable.php @@ -0,0 +1,34 @@ +ext->configLoad->_getConfigVariable($data, $varName, $errorEnable); + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_getconfigvars.php b/libs/sysplugins/smarty_internal_method_getconfigvars.php new file mode 100644 index 0000000..b75cf81 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_getconfigvars.php @@ -0,0 +1,58 @@ +config_vars[ $varname ])) { + return $_ptr->config_vars[ $varname ]; + } + } else { + $var_array = array_merge($_ptr->config_vars, $var_array); + } + // not found, try at parent + if ($search_parents) { + $_ptr = $_ptr->parent; + } else { + $_ptr = null; + } + } + if (isset($varname)) { + return ''; + } else { + return $var_array; + } + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_getdebugtemplate.php b/libs/sysplugins/smarty_internal_method_getdebugtemplate.php new file mode 100644 index 0000000..52073c1 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_getdebugtemplate.php @@ -0,0 +1,35 @@ +_getSmartyObj(); + return $smarty->debug_tpl; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_getdefaultmodifiers.php b/libs/sysplugins/smarty_internal_method_getdefaultmodifiers.php new file mode 100644 index 0000000..f65ab79 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_getdefaultmodifiers.php @@ -0,0 +1,35 @@ +_getSmartyObj(); + return $smarty->default_modifiers; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_getglobal.php b/libs/sysplugins/smarty_internal_method_getglobal.php new file mode 100644 index 0000000..7a8a9bc --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_getglobal.php @@ -0,0 +1,47 @@ +value; + } else { + return ''; + } + } else { + $_result = array(); + foreach (Smarty::$global_tpl_vars AS $key => $var) { + $_result[ $key ] = $var->value; + } + return $_result; + } + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_getregisteredobject.php b/libs/sysplugins/smarty_internal_method_getregisteredobject.php new file mode 100644 index 0000000..c5c0646 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_getregisteredobject.php @@ -0,0 +1,44 @@ +_getSmartyObj(); + if (!isset($smarty->registered_objects[ $object_name ])) { + throw new SmartyException("'$object_name' is not a registered object"); + } + if (!is_object($smarty->registered_objects[ $object_name ][ 0 ])) { + throw new SmartyException("registered '$object_name' is not an object"); + } + return $smarty->registered_objects[ $object_name ][ 0 ]; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_getstreamvariable.php b/libs/sysplugins/smarty_internal_method_getstreamvariable.php new file mode 100644 index 0000000..b922fd0 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_getstreamvariable.php @@ -0,0 +1,51 @@ +smarty) ? $data->smarty : $data; + if ($smarty->error_unassigned) { + throw new SmartyException('Undefined stream variable "' . $variable . '"'); + } else { + return null; + } + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_gettags.php b/libs/sysplugins/smarty_internal_method_gettags.php new file mode 100644 index 0000000..5718b69 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_gettags.php @@ -0,0 +1,62 @@ +_getSmartyObj(); + if ($obj->_isTplObj() && !isset($template)) { + $tpl = clone $obj; + } elseif (isset($template) && $template->_isTplObj()) { + $tpl = clone $template; + } elseif (isset($template) && is_string($template)) { + /* @var Smarty_Internal_Template $tpl */ + $tpl = new $smarty->template_class($template, $smarty); + // checks if template exists + if (!$tpl->source->exists) { + throw new SmartyException("Unable to load template {$tpl->source->type} '{$tpl->source->name}'"); + } + } + if (isset($tpl)) { + $tpl->smarty = clone $tpl->smarty; + $tpl->smarty->_cache[ 'get_used_tags' ] = true; + $tpl->_cache[ 'used_tags' ] = array(); + $tpl->smarty->merge_compiled_includes = false; + $tpl->smarty->disableSecurity(); + $tpl->caching = false; + $tpl->loadCompiler(); + $tpl->compiler->compileTemplate($tpl); + return $tpl->_cache[ 'used_tags' ]; + } + throw new SmartyException("Missing template specification"); + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_gettemplatevars.php b/libs/sysplugins/smarty_internal_method_gettemplatevars.php new file mode 100644 index 0000000..1759646 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_gettemplatevars.php @@ -0,0 +1,116 @@ +_getVariable($data, $varName, $_ptr, $searchParents, false); + if (is_object($_var)) { + return $_var->value; + } else { + return null; + } + } else { + $_result = array(); + if ($_ptr === null) { + $_ptr = $data; + } + while ($_ptr !== null) { + foreach ($_ptr->tpl_vars AS $key => $var) { + if (!array_key_exists($key, $_result)) { + $_result[ $key ] = $var->value; + } + } + // not found, try at parent + if ($searchParents) { + $_ptr = $_ptr->parent; + } else { + $_ptr = null; + } + } + if ($searchParents && isset(Smarty::$global_tpl_vars)) { + foreach (Smarty::$global_tpl_vars AS $key => $var) { + if (!array_key_exists($key, $_result)) { + $_result[ $key ] = $var->value; + } + } + } + return $_result; + } + } + + /** + * gets the object of a Smarty variable + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string $varName the name of the Smarty variable + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $_ptr optional pointer to data object + * @param bool $searchParents search also in parent data + * @param bool $errorEnable + * + * @return \Smarty_Variable + */ + public function _getVariable(Smarty_Internal_Data $data, $varName, Smarty_Internal_Data $_ptr = null, + $searchParents = true, $errorEnable = true) + { + if ($_ptr === null) { + $_ptr = $data; + } + while ($_ptr !== null) { + if (isset($_ptr->tpl_vars[ $varName ])) { + // found it, return it + return $_ptr->tpl_vars[ $varName ]; + } + // not found, try at parent + if ($searchParents) { + $_ptr = $_ptr->parent; + } else { + $_ptr = null; + } + } + if (isset(Smarty::$global_tpl_vars[ $varName ])) { + // found it, return it + return Smarty::$global_tpl_vars[ $varName ]; + } + /* @var \Smarty $smarty */ + $smarty = isset($data->smarty) ? $data->smarty : $data; + if ($smarty->error_unassigned && $errorEnable) { + // force a notice + $x = $$varName; + } + + return new Smarty_Undefined_Variable; + } + +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_loadfilter.php b/libs/sysplugins/smarty_internal_method_loadfilter.php new file mode 100644 index 0000000..d092d87 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_loadfilter.php @@ -0,0 +1,77 @@ + true, 'post' => true, 'output' => true, 'variable' => true); + + /** + * load a filter of specified type and name + * + * @api Smarty::loadFilter() + * + * @link http://www.smarty.net/docs/en/api.load.filter.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $type filter type + * @param string $name filter name + * + * @return bool + * @throws SmartyException if filter could not be loaded + */ + public function loadFilter(Smarty_Internal_TemplateBase $obj, $type, $name) + { + $smarty = $obj->_getSmartyObj(); + $this->_checkFilterType($type); + $_plugin = "smarty_{$type}filter_{$name}"; + $_filter_name = $_plugin; + if (is_callable($_plugin)) { + $smarty->registered_filters[ $type ][ $_filter_name ] = $_plugin; + return true; + } + if ($smarty->loadPlugin($_plugin)) { + if (class_exists($_plugin, false)) { + $_plugin = array($_plugin, 'execute'); + } + if (is_callable($_plugin)) { + $smarty->registered_filters[ $type ][ $_filter_name ] = $_plugin; + return true; + } + } + throw new SmartyException("{$type}filter \"{$name}\" not found or callable"); + } + + /** + * Check if filter type is valid + * + * @param string $type + * + * @throws \SmartyException + */ + public function _checkFilterType($type) + { + if (!isset($this->filterTypes[ $type ])) { + throw new SmartyException("Illegal filter type \"{$type}\""); + } + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_loadplugin.php b/libs/sysplugins/smarty_internal_method_loadplugin.php new file mode 100644 index 0000000..50f3bfc --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_loadplugin.php @@ -0,0 +1,111 @@ +loadPlugin() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_LoadPlugin +{ + /** + * Cache of searched plugin files + * + * @var array + */ + public $plugin_files = array(); + + /** + * Takes unknown classes and loads plugin files for them + * class name format: Smarty_PluginType_PluginName + * plugin filename format: plugintype.pluginname.php + * + * @param \Smarty $smarty + * @param string $plugin_name class plugin name to load + * @param bool $check check if already loaded + * + * @return bool|string + * @throws \SmartyException + */ + public function loadPlugin(Smarty $smarty, $plugin_name, $check) + { + // if function or class exists, exit silently (already loaded) + if ($check && (is_callable($plugin_name) || class_exists($plugin_name, false))) { + return true; + } + if (!preg_match('#^smarty_((internal)|([^_]+))_(.+)$#i', $plugin_name, $match)) { + throw new SmartyException("plugin {$plugin_name} is not a valid name format"); + } + if (!empty($match[ 2 ])) { + $file = SMARTY_SYSPLUGINS_DIR . strtolower($plugin_name) . '.php'; + if (isset($this->plugin_files[ $file ])) { + if ($this->plugin_files[ $file ] !== false) { + return $this->plugin_files[ $file ]; + } else { + return false; + } + } else { + if (is_file($file)) { + $this->plugin_files[ $file ] = $file; + require_once($file); + return $file; + } else { + $this->plugin_files[ $file ] = false; + return false; + } + } + } + // plugin filename is expected to be: [type].[name].php + $_plugin_filename = "{$match[1]}.{$match[4]}.php"; + $_lower_filename = strtolower($_plugin_filename); + if (isset($this->plugin_files)) { + if (isset($this->plugin_files[ 'plugins_dir' ][ $_lower_filename ])) { + if (!$smarty->use_include_path || $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] !== false) { + return $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ]; + } + } + if (!$smarty->use_include_path || $smarty->ext->_getIncludePath->isNewIncludePath($smarty)) { + unset($this->plugin_files[ 'include_path' ]); + } else { + if (isset($this->plugin_files[ 'include_path' ][ $_lower_filename ])) { + return $this->plugin_files[ 'include_path' ][ $_lower_filename ]; + } + } + } + $_file_names = array($_plugin_filename); + if ($_lower_filename != $_plugin_filename) { + $_file_names[] = $_lower_filename; + } + $_p_dirs = $smarty->getPluginsDir(); + if (!isset($this->plugin_files[ 'plugins_dir' ][ $_lower_filename ])) { + // loop through plugin dirs and find the plugin + foreach ($_p_dirs as $_plugin_dir) { + foreach ($_file_names as $name) { + $file = $_plugin_dir . $name; + if (is_file($file)) { + $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] = $file; + require_once($file); + return $file; + } + $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] = false; + } + } + } + if ($smarty->use_include_path) { + foreach ($_file_names as $_file_name) { + // try PHP include_path + $file = $smarty->ext->_getIncludePath->getIncludePath($_p_dirs, $_file_name, $smarty); + $this->plugin_files[ 'include_path' ][ $_lower_filename ] = $file; + if ($file !== false) { + require_once($file); + return $file; + } + } + } + // no plugin loaded + return false; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_mustcompile.php b/libs/sysplugins/smarty_internal_method_mustcompile.php new file mode 100644 index 0000000..0950ba9 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_mustcompile.php @@ -0,0 +1,51 @@ +source->exists) { + if ($_template->_isSubTpl()) { + $parent_resource = " in '$_template->parent->template_resource}'"; + } else { + $parent_resource = ''; + } + throw new SmartyException("Unable to load template {$_template->source->type} '{$_template->source->name}'{$parent_resource}"); + } + if ($_template->mustCompile === null) { + $_template->mustCompile = (!$_template->source->handler->uncompiled && + ($_template->smarty->force_compile || $_template->source->handler->recompiled || + !$_template->compiled->exists || ($_template->smarty->compile_check && + $_template->compiled->getTimeStamp() < + $_template->source->getTimeStamp()))); + } + + return $_template->mustCompile; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_registercacheresource.php b/libs/sysplugins/smarty_internal_method_registercacheresource.php new file mode 100644 index 0000000..ae38727 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_registercacheresource.php @@ -0,0 +1,40 @@ +_getSmartyObj(); + $smarty->registered_cache_resources[ $name ] = $resource_handler; + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_registerclass.php b/libs/sysplugins/smarty_internal_method_registerclass.php new file mode 100644 index 0000000..5469b98 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_registerclass.php @@ -0,0 +1,46 @@ +_getSmartyObj(); + // test if exists + if (!class_exists($class_impl)) { + throw new SmartyException("Undefined class '$class_impl' in register template class"); + } + // register the class + $smarty->registered_classes[ $class_name ] = $class_impl; + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php b/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php new file mode 100644 index 0000000..43088a1 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php @@ -0,0 +1,42 @@ +_getSmartyObj(); + if (is_callable($callback)) { + $smarty->default_config_handler_func = $callback; + } else { + throw new SmartyException("Default config handler not callable"); + } + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php b/libs/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php new file mode 100644 index 0000000..d9aecb4 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php @@ -0,0 +1,43 @@ +_getSmartyObj(); + if (is_callable($callback)) { + $smarty->default_plugin_handler_func = $callback; + } else { + throw new SmartyException("Default plugin handler '$callback' not callable"); + } + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php b/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php new file mode 100644 index 0000000..569ea10 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php @@ -0,0 +1,82 @@ +_getSmartyObj(); + if (is_callable($callback)) { + $smarty->default_template_handler_func = $callback; + } else { + throw new SmartyException("Default template handler not callable"); + } + return $obj; + } + + /** + * get default content from template or config resource handler + * + * @param Smarty_Template_Source $source + * + * @throws \SmartyException + */ + public static function _getDefaultTemplate(Smarty_Template_Source $source) + { + if ($source->isConfig) { + $default_handler = $source->smarty->default_config_handler_func; + } else { + $default_handler = $source->smarty->default_template_handler_func; + } + $_content = $_timestamp = null; + $_return = call_user_func_array($default_handler, + array($source->type, $source->name, &$_content, &$_timestamp, $source->smarty)); + if (is_string($_return)) { + $source->exists = is_file($_return); + if ($source->exists) { + $source->timestamp = filemtime($_return); + } else { + throw new SmartyException("Default handler: Unable to load " . + ($source->isConfig ? 'config' : 'template') . + " default file '{$_return}' for '{$source->type}:{$source->name}'"); + } + $source->name = $source->filepath = $_return; + $source->uid = sha1($source->filepath); + } elseif ($_return === true) { + $source->content = $_content; + $source->exists = true; + $source->uid = $source->name = sha1($_content); + $source->handler = Smarty_Resource::load($source->smarty, 'eval'); + } else { + $source->exists = false; + throw new SmartyException('Default handler: No ' . ($source->isConfig ? 'config' : 'template') . + " default content for '{$source->type}:{$source->name}'"); + } + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_registerfilter.php b/libs/sysplugins/smarty_internal_method_registerfilter.php new file mode 100644 index 0000000..ea8f75a --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_registerfilter.php @@ -0,0 +1,88 @@ + true, 'post' => true, 'output' => true, 'variable' => true); + + /** + * Registers a filter function + * + * @api Smarty::registerFilter() + * + * @link http://www.smarty.net/docs/en/api.register.filter.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $type filter type + * @param callback $callback + * @param string|null $name optional filter name + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function registerFilter(Smarty_Internal_TemplateBase $obj, $type, $callback, $name = null) + { + $smarty = $obj->_getSmartyObj(); + $this->_checkFilterType($type); + $name = isset($name) ? $name : $this->_getFilterName($callback); + if (!is_callable($callback)) { + throw new SmartyException("{$type}filter \"{$name}\" not callable"); + } + $smarty->registered_filters[ $type ][ $name ] = $callback; + return $obj; + } + + /** + * Return internal filter name + * + * @param callback $function_name + * + * @return string internal filter name + */ + public function _getFilterName($function_name) + { + if (is_array($function_name)) { + $_class_name = (is_object($function_name[ 0 ]) ? get_class($function_name[ 0 ]) : $function_name[ 0 ]); + + return $_class_name . '_' . $function_name[ 1 ]; + } elseif (is_string($function_name)) { + return $function_name; + } else { + return 'closure'; + } + } + + /** + * Check if filter type is valid + * + * @param string $type + * + * @throws \SmartyException + */ + public function _checkFilterType($type) + { + if (!isset($this->filterTypes[ $type ])) { + throw new SmartyException("Illegal filter type \"{$type}\""); + } + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_registerobject.php b/libs/sysplugins/smarty_internal_method_registerobject.php new file mode 100644 index 0000000..ba699b2 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_registerobject.php @@ -0,0 +1,72 @@ +_getSmartyObj(); + // test if allowed methods callable + if (!empty($allowed_methods_properties)) { + foreach ((array) $allowed_methods_properties as $method) { + if (!is_callable(array($object, $method)) && !property_exists($object, $method)) { + throw new SmartyException("Undefined method or property '$method' in registered object"); + } + } + } + // test if block methods callable + if (!empty($block_methods)) { + foreach ((array) $block_methods as $method) { + if (!is_callable(array($object, $method))) { + throw new SmartyException("Undefined method '$method' in registered object"); + } + } + } + // register the object + $smarty->registered_objects[ $object_name ] = + array($object, (array) $allowed_methods_properties, (boolean) $format, (array) $block_methods); + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_registerplugin.php b/libs/sysplugins/smarty_internal_method_registerplugin.php new file mode 100644 index 0000000..91f0659 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_registerplugin.php @@ -0,0 +1,51 @@ +_getSmartyObj(); + if (isset($smarty->registered_plugins[ $type ][ $name ])) { + throw new SmartyException("Plugin tag \"{$name}\" already registered"); + } elseif (!is_callable($callback)) { + throw new SmartyException("Plugin \"{$name}\" not callable"); + } else { + $smarty->registered_plugins[ $type ][ $name ] = array($callback, (bool) $cacheable, (array) $cache_attr); + } + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_registerresource.php b/libs/sysplugins/smarty_internal_method_registerresource.php new file mode 100644 index 0000000..44534b7 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_registerresource.php @@ -0,0 +1,44 @@ +_getSmartyObj(); + $smarty->registered_resources[ $name ] = + $resource_handler instanceof Smarty_Resource ? $resource_handler : array($resource_handler, false); + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_setautoloadfilters.php b/libs/sysplugins/smarty_internal_method_setautoloadfilters.php new file mode 100644 index 0000000..df5ca64 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_setautoloadfilters.php @@ -0,0 +1,70 @@ + true, 'post' => true, 'output' => true, 'variable' => true); + + /** + * Set autoload filters + * + * @api Smarty::setAutoloadFilters() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param array $filters filters to load automatically + * @param string $type "pre", "output", … specify the + * filter type to set. Defaults to + * none treating $filters' keys as + * the appropriate types + * + * @return \Smarty|\Smarty_Internal_Template + */ + public function setAutoloadFilters(Smarty_Internal_TemplateBase $obj, $filters, $type = null) + { + $smarty = $obj->_getSmartyObj(); + if ($type !== null) { + $this->_checkFilterType($type); + $smarty->autoload_filters[ $type ] = (array) $filters; + } else { + foreach ((array) $filters as $type => $value) { + $this->_checkFilterType($type); + } + $smarty->autoload_filters = (array) $filters; + } + return $obj; + } + + /** + * Check if filter type is valid + * + * @param string $type + * + * @throws \SmartyException + */ + public function _checkFilterType($type) + { + if (!isset($this->filterTypes[ $type ])) { + throw new SmartyException("Illegal filter type \"{$type}\""); + } + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_setdebugtemplate.php b/libs/sysplugins/smarty_internal_method_setdebugtemplate.php new file mode 100644 index 0000000..76c87de --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_setdebugtemplate.php @@ -0,0 +1,41 @@ +_getSmartyObj(); + if (!is_readable($tpl_name)) { + throw new SmartyException("Unknown file '{$tpl_name}'"); + } + $smarty->debug_tpl = $tpl_name; + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_setdefaultmodifiers.php b/libs/sysplugins/smarty_internal_method_setdefaultmodifiers.php new file mode 100644 index 0000000..81434b9 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_setdefaultmodifiers.php @@ -0,0 +1,38 @@ +_getSmartyObj(); + $smarty->default_modifiers = (array) $modifiers; + return $obj; + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_method_unloadfilter.php b/libs/sysplugins/smarty_internal_method_unloadfilter.php new file mode 100644 index 0000000..9aa1d22 --- /dev/null +++ b/libs/sysplugins/smarty_internal_method_unloadfilter.php @@ -0,0 +1,42 @@ +_getSmartyObj(); + $this->_checkFilterType($type); + if (isset($smarty->registered_filters[ $type ])) { + $_filter_name = "smarty_{$type}filter_{$name}"; + if (isset($smarty->registered_filters[ $type ][ $_filter_name ])) { + unset ($smarty->registered_filters[ $type ][ $_filter_name ]); + if (empty($smarty->registered_filters[ $type ])) { + unset($smarty->registered_filters[ $type ]); + } + } + } + return $obj; + } +} \ No newline at end of file