From 8f4a4e7c5f2afc1121b5d362c8b0b308336b4725 Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Fri, 17 Feb 2023 09:14:53 +0900 Subject: [PATCH] Smary Extended for composer --- .gitignore | 1 + composer.json | 23 + src/Autoloader.php | 111 + src/Smarty.class.php | 1405 ++++++++ src/bootstrap.php | 16 + src/debug.tpl | 175 + src/functions.php | 51 + src/plugins/block.t.php | 211 ++ src/plugins/block.textformat.php | 121 + src/plugins/function.counter.php | 62 + src/plugins/function.cycle.php | 92 + src/plugins/function.fetch.php | 204 ++ src/plugins/function.html_checkboxes.php | 296 ++ src/plugins/function.html_image.php | 158 + src/plugins/function.html_options.php | 260 ++ src/plugins/function.html_radios.php | 266 ++ src/plugins/function.html_select_date.php | 395 +++ src/plugins/function.html_select_time.php | 354 ++ src/plugins/function.html_table.php | 164 + src/plugins/function.mailto.php | 142 + src/plugins/function.math.php | 142 + src/plugins/function.popup.php | 119 + src/plugins/function.popup_init.php | 40 + src/plugins/modifier.capitalize.php | 147 + src/plugins/modifier.count.php | 36 + src/plugins/modifier.date_format.php | 86 + src/plugins/modifier.debug_print_var.php | 103 + src/plugins/modifier.escape.php | 187 ++ src/plugins/modifier.explode.php | 25 + src/plugins/modifier.mb_wordwrap.php | 71 + src/plugins/modifier.number_format.php | 26 + src/plugins/modifier.regex_replace.php | 55 + src/plugins/modifier.replace.php | 37 + src/plugins/modifier.spacify.php | 26 + src/plugins/modifier.truncate.php | 62 + src/plugins/modifiercompiler.cat.php | 28 + .../modifiercompiler.count_characters.php | 32 + .../modifiercompiler.count_paragraphs.php | 26 + .../modifiercompiler.count_sentences.php | 26 + src/plugins/modifiercompiler.count_words.php | 31 + src/plugins/modifiercompiler.default.php | 32 + src/plugins/modifiercompiler.escape.php | 85 + src/plugins/modifiercompiler.from_charset.php | 30 + src/plugins/modifiercompiler.indent.php | 30 + src/plugins/modifiercompiler.lower.php | 29 + src/plugins/modifiercompiler.nl2br.php | 23 + src/plugins/modifiercompiler.noprint.php | 20 + src/plugins/modifiercompiler.round.php | 23 + src/plugins/modifiercompiler.str_repeat.php | 23 + .../modifiercompiler.string_format.php | 24 + src/plugins/modifiercompiler.strip.php | 30 + src/plugins/modifiercompiler.strip_tags.php | 28 + src/plugins/modifiercompiler.strlen.php | 23 + src/plugins/modifiercompiler.to_charset.php | 30 + src/plugins/modifiercompiler.unescape.php | 52 + src/plugins/modifiercompiler.upper.php | 28 + src/plugins/modifiercompiler.wordwrap.php | 39 + src/plugins/outputfilter.trimwhitespace.php | 89 + src/plugins/shared.escape_special_chars.php | 26 + src/plugins/shared.literal_compiler_param.php | 35 + src/plugins/shared.make_timestamp.php | 49 + src/plugins/shared.mb_str_replace.php | 87 + src/plugins/shared.mb_unicode.php | 51 + .../variablefilter.htmlspecialchars.php | 19 + src/sysplugins/smarty_cacheresource.php | 219 ++ .../smarty_cacheresource_custom.php | 297 ++ .../smarty_cacheresource_keyvaluestore.php | 538 +++ src/sysplugins/smarty_data.php | 68 + src/sysplugins/smarty_internal_block.php | 90 + .../smarty_internal_cacheresource_file.php | 235 ++ .../smarty_internal_compile_append.php | 52 + .../smarty_internal_compile_assign.php | 96 + .../smarty_internal_compile_block.php | 189 ++ .../smarty_internal_compile_block_child.php | 24 + .../smarty_internal_compile_block_parent.php | 31 + .../smarty_internal_compile_break.php | 117 + .../smarty_internal_compile_call.php | 89 + .../smarty_internal_compile_capture.php | 105 + .../smarty_internal_compile_child.php | 79 + .../smarty_internal_compile_config_load.php | 96 + .../smarty_internal_compile_continue.php | 25 + .../smarty_internal_compile_debug.php | 40 + .../smarty_internal_compile_eval.php | 70 + .../smarty_internal_compile_extends.php | 158 + .../smarty_internal_compile_for.php | 164 + .../smarty_internal_compile_foreach.php | 343 ++ .../smarty_internal_compile_function.php | 236 ++ src/sysplugins/smarty_internal_compile_if.php | 207 ++ .../smarty_internal_compile_include.php | 347 ++ .../smarty_internal_compile_insert.php | 157 + .../smarty_internal_compile_ldelim.php | 37 + .../smarty_internal_compile_make_nocache.php | 62 + .../smarty_internal_compile_nocache.php | 73 + .../smarty_internal_compile_parent.php | 31 + ..._internal_compile_private_block_plugin.php | 124 + ...nternal_compile_private_foreachsection.php | 228 ++ ...ternal_compile_private_function_plugin.php | 78 + ...arty_internal_compile_private_modifier.php | 161 + ..._compile_private_object_block_function.php | 42 + ...ternal_compile_private_object_function.php | 85 + ...ernal_compile_private_print_expression.php | 161 + ...ernal_compile_private_registered_block.php | 72 + ...al_compile_private_registered_function.php | 91 + ...ernal_compile_private_special_variable.php | 130 + .../smarty_internal_compile_rdelim.php | 34 + .../smarty_internal_compile_section.php | 462 +++ .../smarty_internal_compile_setfilter.php | 68 + ...ty_internal_compile_shared_inheritance.php | 49 + .../smarty_internal_compile_while.php | 100 + .../smarty_internal_compilebase.php | 203 ++ .../smarty_internal_config_file_compiler.php | 211 ++ .../smarty_internal_configfilelexer.php | 739 +++++ .../smarty_internal_configfileparser.php | 1046 ++++++ src/sysplugins/smarty_internal_data.php | 272 ++ src/sysplugins/smarty_internal_debug.php | 425 +++ .../smarty_internal_errorhandler.php | 101 + .../smarty_internal_extension_handler.php | 197 ++ ...rty_internal_method_addautoloadfilters.php | 53 + ...ty_internal_method_adddefaultmodifiers.php | 42 + .../smarty_internal_method_append.php | 74 + .../smarty_internal_method_appendbyref.php | 49 + .../smarty_internal_method_assignbyref.php | 36 + .../smarty_internal_method_assignglobal.php | 44 + .../smarty_internal_method_clearallassign.php | 36 + .../smarty_internal_method_clearallcache.php | 41 + .../smarty_internal_method_clearassign.php | 43 + .../smarty_internal_method_clearcache.php | 50 + ..._internal_method_clearcompiledtemplate.php | 131 + .../smarty_internal_method_clearconfig.php | 41 + ...marty_internal_method_compileallconfig.php | 36 + ...ty_internal_method_compilealltemplates.php | 130 + .../smarty_internal_method_configload.php | 182 + .../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 | 50 + .../smarty_internal_method_gettags.php | 63 + ...smarty_internal_method_gettemplatevars.php | 119 + .../smarty_internal_method_literals.php | 100 + .../smarty_internal_method_loadfilter.php | 77 + .../smarty_internal_method_loadplugin.php | 111 + .../smarty_internal_method_mustcompile.php | 50 + ..._internal_method_registercacheresource.php | 42 + .../smarty_internal_method_registerclass.php | 46 + ...al_method_registerdefaultconfighandler.php | 42 + ...al_method_registerdefaultpluginhandler.php | 43 + ..._method_registerdefaulttemplatehandler.php | 88 + .../smarty_internal_method_registerfilter.php | 87 + .../smarty_internal_method_registerobject.php | 84 + .../smarty_internal_method_registerplugin.php | 58 + ...marty_internal_method_registerresource.php | 39 + ...rty_internal_method_setautoloadfilters.php | 72 + ...marty_internal_method_setdebugtemplate.php | 41 + ...ty_internal_method_setdefaultmodifiers.php | 38 + .../smarty_internal_method_unloadfilter.php | 43 + ...nternal_method_unregistercacheresource.php | 40 + ...marty_internal_method_unregisterfilter.php | 43 + ...marty_internal_method_unregisterobject.php | 40 + ...marty_internal_method_unregisterplugin.php | 41 + ...rty_internal_method_unregisterresource.php | 40 + .../smarty_internal_nocache_insert.php | 51 + src/sysplugins/smarty_internal_parsetree.php | 50 + .../smarty_internal_parsetree_code.php | 42 + .../smarty_internal_parsetree_dq.php | 95 + .../smarty_internal_parsetree_dqcontent.php | 42 + .../smarty_internal_parsetree_tag.php | 67 + .../smarty_internal_parsetree_template.php | 169 + .../smarty_internal_parsetree_text.php | 57 + .../smarty_internal_resource_eval.php | 94 + .../smarty_internal_resource_extends.php | 126 + .../smarty_internal_resource_file.php | 180 + .../smarty_internal_resource_php.php | 116 + .../smarty_internal_resource_stream.php | 78 + .../smarty_internal_resource_string.php | 108 + .../smarty_internal_runtime_cachemodify.php | 68 + ...rty_internal_runtime_cacheresourcefile.php | 139 + .../smarty_internal_runtime_capture.php | 174 + .../smarty_internal_runtime_codeframe.php | 103 + .../smarty_internal_runtime_filterhandler.php | 69 + .../smarty_internal_runtime_foreach.php | 162 + ...smarty_internal_runtime_getincludepath.php | 181 + .../smarty_internal_runtime_inheritance.php | 251 ++ .../smarty_internal_runtime_make_nocache.php | 54 + .../smarty_internal_runtime_tplfunction.php | 177 + .../smarty_internal_runtime_updatecache.php | 183 ++ .../smarty_internal_runtime_updatescope.php | 115 + .../smarty_internal_runtime_writefile.php | 91 + ...smarty_internal_smartytemplatecompiler.php | 184 ++ src/sysplugins/smarty_internal_template.php | 741 +++++ .../smarty_internal_templatebase.php | 401 +++ .../smarty_internal_templatecompilerbase.php | 1749 ++++++++++ .../smarty_internal_templatelexer.php | 1095 ++++++ .../smarty_internal_templateparser.php | 2926 +++++++++++++++++ .../smarty_internal_testinstall.php | 605 ++++ src/sysplugins/smarty_internal_undefined.php | 67 + src/sysplugins/smarty_resource.php | 260 ++ src/sysplugins/smarty_resource_custom.php | 104 + src/sysplugins/smarty_resource_recompiled.php | 94 + src/sysplugins/smarty_resource_uncompiled.php | 49 + src/sysplugins/smarty_security.php | 680 ++++ src/sysplugins/smarty_template_cached.php | 257 ++ src/sysplugins/smarty_template_compiled.php | 257 ++ src/sysplugins/smarty_template_config.php | 100 + .../smarty_template_resource_base.php | 152 + src/sysplugins/smarty_template_source.php | 213 ++ src/sysplugins/smarty_undefined_variable.php | 33 + src/sysplugins/smarty_variable.php | 48 + src/sysplugins/smartycompilerexception.php | 73 + src/sysplugins/smartyexception.php | 19 + 214 files changed, 32039 insertions(+) create mode 100644 .gitignore create mode 100644 composer.json create mode 100644 src/Autoloader.php create mode 100644 src/Smarty.class.php create mode 100644 src/bootstrap.php create mode 100644 src/debug.tpl create mode 100644 src/functions.php create mode 100644 src/plugins/block.t.php create mode 100644 src/plugins/block.textformat.php create mode 100644 src/plugins/function.counter.php create mode 100644 src/plugins/function.cycle.php create mode 100644 src/plugins/function.fetch.php create mode 100644 src/plugins/function.html_checkboxes.php create mode 100644 src/plugins/function.html_image.php create mode 100644 src/plugins/function.html_options.php create mode 100644 src/plugins/function.html_radios.php create mode 100644 src/plugins/function.html_select_date.php create mode 100644 src/plugins/function.html_select_time.php create mode 100644 src/plugins/function.html_table.php create mode 100644 src/plugins/function.mailto.php create mode 100644 src/plugins/function.math.php create mode 100644 src/plugins/function.popup.php create mode 100644 src/plugins/function.popup_init.php create mode 100644 src/plugins/modifier.capitalize.php create mode 100644 src/plugins/modifier.count.php create mode 100644 src/plugins/modifier.date_format.php create mode 100644 src/plugins/modifier.debug_print_var.php create mode 100644 src/plugins/modifier.escape.php create mode 100644 src/plugins/modifier.explode.php create mode 100644 src/plugins/modifier.mb_wordwrap.php create mode 100644 src/plugins/modifier.number_format.php create mode 100644 src/plugins/modifier.regex_replace.php create mode 100644 src/plugins/modifier.replace.php create mode 100644 src/plugins/modifier.spacify.php create mode 100644 src/plugins/modifier.truncate.php create mode 100644 src/plugins/modifiercompiler.cat.php create mode 100644 src/plugins/modifiercompiler.count_characters.php create mode 100644 src/plugins/modifiercompiler.count_paragraphs.php create mode 100644 src/plugins/modifiercompiler.count_sentences.php create mode 100644 src/plugins/modifiercompiler.count_words.php create mode 100644 src/plugins/modifiercompiler.default.php create mode 100644 src/plugins/modifiercompiler.escape.php create mode 100644 src/plugins/modifiercompiler.from_charset.php create mode 100644 src/plugins/modifiercompiler.indent.php create mode 100644 src/plugins/modifiercompiler.lower.php create mode 100644 src/plugins/modifiercompiler.nl2br.php create mode 100644 src/plugins/modifiercompiler.noprint.php create mode 100644 src/plugins/modifiercompiler.round.php create mode 100644 src/plugins/modifiercompiler.str_repeat.php create mode 100644 src/plugins/modifiercompiler.string_format.php create mode 100644 src/plugins/modifiercompiler.strip.php create mode 100644 src/plugins/modifiercompiler.strip_tags.php create mode 100644 src/plugins/modifiercompiler.strlen.php create mode 100644 src/plugins/modifiercompiler.to_charset.php create mode 100644 src/plugins/modifiercompiler.unescape.php create mode 100644 src/plugins/modifiercompiler.upper.php create mode 100644 src/plugins/modifiercompiler.wordwrap.php create mode 100644 src/plugins/outputfilter.trimwhitespace.php create mode 100644 src/plugins/shared.escape_special_chars.php create mode 100644 src/plugins/shared.literal_compiler_param.php create mode 100644 src/plugins/shared.make_timestamp.php create mode 100644 src/plugins/shared.mb_str_replace.php create mode 100644 src/plugins/shared.mb_unicode.php create mode 100644 src/plugins/variablefilter.htmlspecialchars.php create mode 100644 src/sysplugins/smarty_cacheresource.php create mode 100644 src/sysplugins/smarty_cacheresource_custom.php create mode 100644 src/sysplugins/smarty_cacheresource_keyvaluestore.php create mode 100644 src/sysplugins/smarty_data.php create mode 100644 src/sysplugins/smarty_internal_block.php create mode 100644 src/sysplugins/smarty_internal_cacheresource_file.php create mode 100644 src/sysplugins/smarty_internal_compile_append.php create mode 100644 src/sysplugins/smarty_internal_compile_assign.php create mode 100644 src/sysplugins/smarty_internal_compile_block.php create mode 100644 src/sysplugins/smarty_internal_compile_block_child.php create mode 100644 src/sysplugins/smarty_internal_compile_block_parent.php create mode 100644 src/sysplugins/smarty_internal_compile_break.php create mode 100644 src/sysplugins/smarty_internal_compile_call.php create mode 100644 src/sysplugins/smarty_internal_compile_capture.php create mode 100644 src/sysplugins/smarty_internal_compile_child.php create mode 100644 src/sysplugins/smarty_internal_compile_config_load.php create mode 100644 src/sysplugins/smarty_internal_compile_continue.php create mode 100644 src/sysplugins/smarty_internal_compile_debug.php create mode 100644 src/sysplugins/smarty_internal_compile_eval.php create mode 100644 src/sysplugins/smarty_internal_compile_extends.php create mode 100644 src/sysplugins/smarty_internal_compile_for.php create mode 100644 src/sysplugins/smarty_internal_compile_foreach.php create mode 100644 src/sysplugins/smarty_internal_compile_function.php create mode 100644 src/sysplugins/smarty_internal_compile_if.php create mode 100644 src/sysplugins/smarty_internal_compile_include.php create mode 100644 src/sysplugins/smarty_internal_compile_insert.php create mode 100644 src/sysplugins/smarty_internal_compile_ldelim.php create mode 100644 src/sysplugins/smarty_internal_compile_make_nocache.php create mode 100644 src/sysplugins/smarty_internal_compile_nocache.php create mode 100644 src/sysplugins/smarty_internal_compile_parent.php create mode 100644 src/sysplugins/smarty_internal_compile_private_block_plugin.php create mode 100644 src/sysplugins/smarty_internal_compile_private_foreachsection.php create mode 100644 src/sysplugins/smarty_internal_compile_private_function_plugin.php create mode 100644 src/sysplugins/smarty_internal_compile_private_modifier.php create mode 100644 src/sysplugins/smarty_internal_compile_private_object_block_function.php create mode 100644 src/sysplugins/smarty_internal_compile_private_object_function.php create mode 100644 src/sysplugins/smarty_internal_compile_private_print_expression.php create mode 100644 src/sysplugins/smarty_internal_compile_private_registered_block.php create mode 100644 src/sysplugins/smarty_internal_compile_private_registered_function.php create mode 100644 src/sysplugins/smarty_internal_compile_private_special_variable.php create mode 100644 src/sysplugins/smarty_internal_compile_rdelim.php create mode 100644 src/sysplugins/smarty_internal_compile_section.php create mode 100644 src/sysplugins/smarty_internal_compile_setfilter.php create mode 100644 src/sysplugins/smarty_internal_compile_shared_inheritance.php create mode 100644 src/sysplugins/smarty_internal_compile_while.php create mode 100644 src/sysplugins/smarty_internal_compilebase.php create mode 100644 src/sysplugins/smarty_internal_config_file_compiler.php create mode 100644 src/sysplugins/smarty_internal_configfilelexer.php create mode 100644 src/sysplugins/smarty_internal_configfileparser.php create mode 100644 src/sysplugins/smarty_internal_data.php create mode 100644 src/sysplugins/smarty_internal_debug.php create mode 100644 src/sysplugins/smarty_internal_errorhandler.php create mode 100644 src/sysplugins/smarty_internal_extension_handler.php create mode 100644 src/sysplugins/smarty_internal_method_addautoloadfilters.php create mode 100644 src/sysplugins/smarty_internal_method_adddefaultmodifiers.php create mode 100644 src/sysplugins/smarty_internal_method_append.php create mode 100644 src/sysplugins/smarty_internal_method_appendbyref.php create mode 100644 src/sysplugins/smarty_internal_method_assignbyref.php create mode 100644 src/sysplugins/smarty_internal_method_assignglobal.php create mode 100644 src/sysplugins/smarty_internal_method_clearallassign.php create mode 100644 src/sysplugins/smarty_internal_method_clearallcache.php create mode 100644 src/sysplugins/smarty_internal_method_clearassign.php create mode 100644 src/sysplugins/smarty_internal_method_clearcache.php create mode 100644 src/sysplugins/smarty_internal_method_clearcompiledtemplate.php create mode 100644 src/sysplugins/smarty_internal_method_clearconfig.php create mode 100644 src/sysplugins/smarty_internal_method_compileallconfig.php create mode 100644 src/sysplugins/smarty_internal_method_compilealltemplates.php create mode 100644 src/sysplugins/smarty_internal_method_configload.php create mode 100644 src/sysplugins/smarty_internal_method_createdata.php create mode 100644 src/sysplugins/smarty_internal_method_getautoloadfilters.php create mode 100644 src/sysplugins/smarty_internal_method_getconfigvariable.php create mode 100644 src/sysplugins/smarty_internal_method_getconfigvars.php create mode 100644 src/sysplugins/smarty_internal_method_getdebugtemplate.php create mode 100644 src/sysplugins/smarty_internal_method_getdefaultmodifiers.php create mode 100644 src/sysplugins/smarty_internal_method_getglobal.php create mode 100644 src/sysplugins/smarty_internal_method_getregisteredobject.php create mode 100644 src/sysplugins/smarty_internal_method_getstreamvariable.php create mode 100644 src/sysplugins/smarty_internal_method_gettags.php create mode 100644 src/sysplugins/smarty_internal_method_gettemplatevars.php create mode 100644 src/sysplugins/smarty_internal_method_literals.php create mode 100644 src/sysplugins/smarty_internal_method_loadfilter.php create mode 100644 src/sysplugins/smarty_internal_method_loadplugin.php create mode 100644 src/sysplugins/smarty_internal_method_mustcompile.php create mode 100644 src/sysplugins/smarty_internal_method_registercacheresource.php create mode 100644 src/sysplugins/smarty_internal_method_registerclass.php create mode 100644 src/sysplugins/smarty_internal_method_registerdefaultconfighandler.php create mode 100644 src/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php create mode 100644 src/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php create mode 100644 src/sysplugins/smarty_internal_method_registerfilter.php create mode 100644 src/sysplugins/smarty_internal_method_registerobject.php create mode 100644 src/sysplugins/smarty_internal_method_registerplugin.php create mode 100644 src/sysplugins/smarty_internal_method_registerresource.php create mode 100644 src/sysplugins/smarty_internal_method_setautoloadfilters.php create mode 100644 src/sysplugins/smarty_internal_method_setdebugtemplate.php create mode 100644 src/sysplugins/smarty_internal_method_setdefaultmodifiers.php create mode 100644 src/sysplugins/smarty_internal_method_unloadfilter.php create mode 100644 src/sysplugins/smarty_internal_method_unregistercacheresource.php create mode 100644 src/sysplugins/smarty_internal_method_unregisterfilter.php create mode 100644 src/sysplugins/smarty_internal_method_unregisterobject.php create mode 100644 src/sysplugins/smarty_internal_method_unregisterplugin.php create mode 100644 src/sysplugins/smarty_internal_method_unregisterresource.php create mode 100644 src/sysplugins/smarty_internal_nocache_insert.php create mode 100644 src/sysplugins/smarty_internal_parsetree.php create mode 100644 src/sysplugins/smarty_internal_parsetree_code.php create mode 100644 src/sysplugins/smarty_internal_parsetree_dq.php create mode 100644 src/sysplugins/smarty_internal_parsetree_dqcontent.php create mode 100644 src/sysplugins/smarty_internal_parsetree_tag.php create mode 100644 src/sysplugins/smarty_internal_parsetree_template.php create mode 100644 src/sysplugins/smarty_internal_parsetree_text.php create mode 100644 src/sysplugins/smarty_internal_resource_eval.php create mode 100644 src/sysplugins/smarty_internal_resource_extends.php create mode 100644 src/sysplugins/smarty_internal_resource_file.php create mode 100644 src/sysplugins/smarty_internal_resource_php.php create mode 100644 src/sysplugins/smarty_internal_resource_stream.php create mode 100644 src/sysplugins/smarty_internal_resource_string.php create mode 100644 src/sysplugins/smarty_internal_runtime_cachemodify.php create mode 100644 src/sysplugins/smarty_internal_runtime_cacheresourcefile.php create mode 100644 src/sysplugins/smarty_internal_runtime_capture.php create mode 100644 src/sysplugins/smarty_internal_runtime_codeframe.php create mode 100644 src/sysplugins/smarty_internal_runtime_filterhandler.php create mode 100644 src/sysplugins/smarty_internal_runtime_foreach.php create mode 100644 src/sysplugins/smarty_internal_runtime_getincludepath.php create mode 100644 src/sysplugins/smarty_internal_runtime_inheritance.php create mode 100644 src/sysplugins/smarty_internal_runtime_make_nocache.php create mode 100644 src/sysplugins/smarty_internal_runtime_tplfunction.php create mode 100644 src/sysplugins/smarty_internal_runtime_updatecache.php create mode 100644 src/sysplugins/smarty_internal_runtime_updatescope.php create mode 100644 src/sysplugins/smarty_internal_runtime_writefile.php create mode 100644 src/sysplugins/smarty_internal_smartytemplatecompiler.php create mode 100644 src/sysplugins/smarty_internal_template.php create mode 100644 src/sysplugins/smarty_internal_templatebase.php create mode 100644 src/sysplugins/smarty_internal_templatecompilerbase.php create mode 100644 src/sysplugins/smarty_internal_templatelexer.php create mode 100644 src/sysplugins/smarty_internal_templateparser.php create mode 100644 src/sysplugins/smarty_internal_testinstall.php create mode 100644 src/sysplugins/smarty_internal_undefined.php create mode 100644 src/sysplugins/smarty_resource.php create mode 100644 src/sysplugins/smarty_resource_custom.php create mode 100644 src/sysplugins/smarty_resource_recompiled.php create mode 100644 src/sysplugins/smarty_resource_uncompiled.php create mode 100644 src/sysplugins/smarty_security.php create mode 100644 src/sysplugins/smarty_template_cached.php create mode 100644 src/sysplugins/smarty_template_compiled.php create mode 100644 src/sysplugins/smarty_template_config.php create mode 100644 src/sysplugins/smarty_template_resource_base.php create mode 100644 src/sysplugins/smarty_template_source.php create mode 100644 src/sysplugins/smarty_undefined_variable.php create mode 100644 src/sysplugins/smarty_variable.php create mode 100644 src/sysplugins/smartycompilerexception.php create mode 100644 src/sysplugins/smartyexception.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..22d0d82 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +vendor diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..1362f45 --- /dev/null +++ b/composer.json @@ -0,0 +1,23 @@ +{ + "name": "egrajp/smarty-extended", + "description": "Smarty, extended with gettext, checkbox/radio labels and index numbers", + "type": "library", + "keywords": [ + "templating" + ], + "homepage": "https://smarty-php.github.io/smarty/", + "license": "LGPL-3.0", + "autoload": { + "psr-4": { + "Smarty\\": "src/" + } + }, + "authors": [ + { + "name": "Clemens Schwaighofer", + "email": "clemens.schwaighofer@egplusww.com" + } + ], + "minimum-stability": "dev", + "require": {} +} diff --git a/src/Autoloader.php b/src/Autoloader.php new file mode 100644 index 0000000..da7e32a --- /dev/null +++ b/src/Autoloader.php @@ -0,0 +1,111 @@ + 'Smarty.class.php'); + + /** + * Registers Smarty_Autoloader backward compatible to older installations. + * + * @param bool $prepend Whether to prepend the autoloader or not. + */ + public static function registerBC($prepend = false) + { + /** + * register the class autoloader + */ + if (!defined('SMARTY_SPL_AUTOLOAD')) { + define('SMARTY_SPL_AUTOLOAD', 0); + } + if (SMARTY_SPL_AUTOLOAD + && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false + ) { + $registeredAutoLoadFunctions = spl_autoload_functions(); + if (!isset($registeredAutoLoadFunctions[ 'spl_autoload' ])) { + spl_autoload_register(); + } + } else { + self::register($prepend); + } + } + + /** + * Registers Smarty_Autoloader as an SPL autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not. + */ + public static function register($prepend = false) + { + self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : __DIR__ . DIRECTORY_SEPARATOR; + self::$SMARTY_SYSPLUGINS_DIR = defined('SMARTY_SYSPLUGINS_DIR') ? SMARTY_SYSPLUGINS_DIR : + self::$SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR; + spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend); + } + + /** + * Handles auto loading of classes. + * + * @param string $class A class name. + */ + public static function autoload($class) + { + if ($class[ 0 ] !== 'S' || strpos($class, 'Smarty') !== 0) { + return; + } + $_class = smarty_strtolower_ascii($class); + if (isset(self::$rootClasses[ $_class ])) { + $file = self::$SMARTY_DIR . self::$rootClasses[ $_class ]; + if (is_file($file)) { + include $file; + } + } else { + $file = self::$SMARTY_SYSPLUGINS_DIR . $_class . '.php'; + if (is_file($file)) { + include $file; + } + } + return; + } +} diff --git a/src/Smarty.class.php b/src/Smarty.class.php new file mode 100644 index 0000000..5351b57 --- /dev/null +++ b/src/Smarty.class.php @@ -0,0 +1,1405 @@ + + * @author Uwe Tews + * @author Rodney Rehm + * @package Smarty + */ +/** + * set SMARTY_DIR to absolute path to Smarty library files. + * Sets SMARTY_DIR only if user application has not already defined it. + */ +if (!defined('SMARTY_DIR')) { + /** + * + */ + define('SMARTY_DIR', __DIR__ . DIRECTORY_SEPARATOR); +} +/** + * set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins. + * Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it. + */ +if (!defined('SMARTY_SYSPLUGINS_DIR')) { + /** + * + */ + define('SMARTY_SYSPLUGINS_DIR', SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR); +} +if (!defined('SMARTY_PLUGINS_DIR')) { + /** + * + */ + define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DIRECTORY_SEPARATOR); +} +if (!defined('SMARTY_MBSTRING')) { + /** + * + */ + define('SMARTY_MBSTRING', function_exists('mb_get_info')); +} + +/** + * Load helper functions + */ +if (!defined('SMARTY_HELPER_FUNCTIONS_LOADED')) { + include __DIR__ . '/functions.php'; +} + +/** + * Load Smarty_Autoloader + */ +if (!class_exists('Smarty_Autoloader')) { + include __DIR__ . '/bootstrap.php'; +} + +/** + * Load always needed external class files + */ +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_data.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_extension_handler.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_templatebase.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_template.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_resource.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_variable.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_source.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_resource_base.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_resource_file.php'; + +/** + * This is the main Smarty class + * + * @package Smarty + * + * The following methods will be dynamically loaded by the extension handler when they are called. + * They are located in a corresponding Smarty_Internal_Method_xxxx class + * + * @method int clearAllCache(int $exp_time = null, string $type = null) + * @method int clearCache(string $template_name, string $cache_id = null, string $compile_id = null, int $exp_time = null, string $type = null) + * @method int compileAllTemplates(string $extension = '.tpl', bool $force_compile = false, int $time_limit = 0, $max_errors = null) + * @method int compileAllConfig(string $extension = '.conf', bool $force_compile = false, int $time_limit = 0, $max_errors = null) + * @method int clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) + */ +class Smarty extends Smarty_Internal_TemplateBase +{ + /** + * smarty version + */ + const SMARTY_VERSION = '4.3.0'; + /** + * define variable scopes + */ + const SCOPE_LOCAL = 1; + const SCOPE_PARENT = 2; + const SCOPE_TPL_ROOT = 4; + const SCOPE_ROOT = 8; + const SCOPE_SMARTY = 16; + const SCOPE_GLOBAL = 32; + /** + * define caching modes + */ + const CACHING_OFF = 0; + const CACHING_LIFETIME_CURRENT = 1; + const CACHING_LIFETIME_SAVED = 2; + /** + * define constant for clearing cache files be saved expiration dates + */ + const CLEAR_EXPIRED = -1; + /** + * define compile check modes + */ + const COMPILECHECK_OFF = 0; + const COMPILECHECK_ON = 1; + const COMPILECHECK_CACHEMISS = 2; + /** + * define debug modes + */ + const DEBUG_OFF = 0; + const DEBUG_ON = 1; + const DEBUG_INDIVIDUAL = 2; + + /** + * filter types + */ + const FILTER_POST = 'post'; + const FILTER_PRE = 'pre'; + const FILTER_OUTPUT = 'output'; + const FILTER_VARIABLE = 'variable'; + /** + * plugin types + */ + const PLUGIN_FUNCTION = 'function'; + const PLUGIN_BLOCK = 'block'; + const PLUGIN_COMPILER = 'compiler'; + const PLUGIN_MODIFIER = 'modifier'; + const PLUGIN_MODIFIERCOMPILER = 'modifiercompiler'; + + /** + * assigned global tpl vars + */ + public static $global_tpl_vars = array(); + + /** + * Flag denoting if Multibyte String functions are available + */ + public static $_MBSTRING = SMARTY_MBSTRING; + + /** + * The character set to adhere to (e.g. "UTF-8") + */ + public static $_CHARSET = SMARTY_MBSTRING ? 'UTF-8' : 'ISO-8859-1'; + + /** + * The date format to be used internally + * (accepts date() and strftime()) + */ + public static $_DATE_FORMAT = '%b %e, %Y'; + + /** + * Flag denoting if PCRE should run in UTF-8 mode + */ + public static $_UTF8_MODIFIER = 'u'; + + /** + * Flag denoting if operating system is windows + */ + public static $_IS_WINDOWS = false; + + /** + * auto literal on delimiters with whitespace + * + * @var boolean + */ + public $auto_literal = true; + + /** + * display error on not assigned variables + * + * @var boolean + */ + public $error_unassigned = false; + + /** + * look up relative file path in include_path + * + * @var boolean + */ + public $use_include_path = false; + + /** + * flag if template_dir is normalized + * + * @var bool + */ + public $_templateDirNormalized = false; + + /** + * joined template directory string used in cache keys + * + * @var string + */ + public $_joined_template_dir = null; + + /** + * flag if config_dir is normalized + * + * @var bool + */ + public $_configDirNormalized = false; + + /** + * joined config directory string used in cache keys + * + * @var string + */ + public $_joined_config_dir = null; + + /** + * default template handler + * + * @var callable + */ + public $default_template_handler_func = null; + + /** + * default config handler + * + * @var callable + */ + public $default_config_handler_func = null; + + /** + * default plugin handler + * + * @var callable + */ + public $default_plugin_handler_func = null; + + /** + * flag if template_dir is normalized + * + * @var bool + */ + public $_compileDirNormalized = false; + + /** + * flag if plugins_dir is normalized + * + * @var bool + */ + public $_pluginsDirNormalized = false; + + /** + * flag if template_dir is normalized + * + * @var bool + */ + public $_cacheDirNormalized = false; + + /** + * force template compiling? + * + * @var boolean + */ + public $force_compile = false; + + /** + * use sub dirs for compiled/cached files? + * + * @var boolean + */ + public $use_sub_dirs = false; + + /** + * allow ambiguous resources (that are made unique by the resource handler) + * + * @var boolean + */ + public $allow_ambiguous_resources = false; + + /** + * merge compiled includes + * + * @var boolean + */ + public $merge_compiled_includes = false; + + /* + * flag for behaviour when extends: resource and {extends} tag are used simultaneous + * if false disable execution of {extends} in templates called by extends resource. + * (behaviour as versions < 3.1.28) + * + * @var boolean + */ + public $extends_recursion = true; + + /** + * force cache file creation + * + * @var boolean + */ + public $force_cache = false; + + /** + * template left-delimiter + * + * @var string + */ + public $left_delimiter = "{"; + + /** + * template right-delimiter + * + * @var string + */ + public $right_delimiter = "}"; + + /** + * array of strings which shall be treated as literal by compiler + * + * @var array string + */ + public $literals = array(); + + /** + * class name + * This should be instance of Smarty_Security. + * + * @var string + * @see Smarty_Security + */ + public $security_class = 'Smarty_Security'; + + /** + * implementation of security class + * + * @var Smarty_Security + */ + public $security_policy = null; + + /** + * controls if the php template file resource is allowed + * + * @var bool + */ + public $allow_php_templates = false; + + /** + * debug mode + * Setting this to true enables the debug-console. + * + * @var boolean + */ + public $debugging = false; + + /** + * This determines if debugging is enable-able from the browser. + * + * + * @var string + */ + public $debugging_ctrl = 'NONE'; + + /** + * Name of debugging URL-param. + * Only used when $debugging_ctrl is set to 'URL'. + * The name of the URL-parameter that activates debugging. + * + * @var string + */ + public $smarty_debug_id = 'SMARTY_DEBUG'; + + /** + * Path of debug template. + * + * @var string + */ + public $debug_tpl = null; + + /** + * When set, smarty uses this value as error_reporting-level. + * + * @var int + */ + public $error_reporting = null; + + /** + * Controls whether variables with the same name overwrite each other. + * + * @var boolean + */ + public $config_overwrite = true; + + /** + * Controls whether config values of on/true/yes and off/false/no get converted to boolean. + * + * @var boolean + */ + public $config_booleanize = true; + + /** + * Controls whether hidden config sections/vars are read from the file. + * + * @var boolean + */ + public $config_read_hidden = false; + + /** + * locking concurrent compiles + * + * @var boolean + */ + public $compile_locking = true; + + /** + * Controls whether cache resources should use locking mechanism + * + * @var boolean + */ + public $cache_locking = false; + + /** + * seconds to wait for acquiring a lock before ignoring the write lock + * + * @var float + */ + public $locking_timeout = 10; + + /** + * resource type used if none given + * Must be an valid key of $registered_resources. + * + * @var string + */ + public $default_resource_type = 'file'; + + /** + * caching type + * Must be an element of $cache_resource_types. + * + * @var string + */ + public $caching_type = 'file'; + + /** + * config type + * + * @var string + */ + public $default_config_type = 'file'; + + /** + * check If-Modified-Since headers + * + * @var boolean + */ + public $cache_modified_check = false; + + /** + * registered plugins + * + * @var array + */ + public $registered_plugins = array(); + + /** + * registered objects + * + * @var array + */ + public $registered_objects = array(); + + /** + * registered classes + * + * @var array + */ + public $registered_classes = array(); + + /** + * registered filters + * + * @var array + */ + public $registered_filters = array(); + + /** + * registered resources + * + * @var array + */ + public $registered_resources = array(); + + /** + * registered cache resources + * + * @var array + */ + public $registered_cache_resources = array(); + + /** + * autoload filter + * + * @var array + */ + public $autoload_filters = array(); + + /** + * default modifier + * + * @var array + */ + public $default_modifiers = array(); + + /** + * autoescape variable output + * + * @var boolean + */ + public $escape_html = false; + + /** + * start time for execution time calculation + * + * @var int + */ + public $start_time = 0; + + /** + * required by the compiler for BC + * + * @var string + */ + public $_current_file = null; + + /** + * internal flag to enable parser debugging + * + * @var bool + */ + public $_parserdebug = false; + + /** + * This object type (Smarty = 1, template = 2, data = 4) + * + * @var int + */ + public $_objType = 1; + + /** + * Debug object + * + * @var Smarty_Internal_Debug + */ + public $_debug = null; + + /** + * template directory + * + * @var array + */ + protected $template_dir = array('./templates/'); + + /** + * flags for normalized template directory entries + * + * @var array + */ + protected $_processedTemplateDir = array(); + + /** + * config directory + * + * @var array + */ + protected $config_dir = array('./configs/'); + + /** + * flags for normalized template directory entries + * + * @var array + */ + protected $_processedConfigDir = array(); + + /** + * compile directory + * + * @var string + */ + protected $compile_dir = './templates_c/'; + + /** + * plugins directory + * + * @var array + */ + protected $plugins_dir = array(); + + /** + * cache directory + * + * @var string + */ + protected $cache_dir = './cache/'; + + /** + * removed properties + * + * @var string[] + */ + protected $obsoleteProperties = array( + 'resource_caching', 'template_resource_caching', 'direct_access_security', + '_dir_perms', '_file_perms', 'plugin_search_order', + 'inheritance_merge_compiled_includes', 'resource_cache_mode', + ); + + /** + * List of private properties which will call getter/setter on a direct access + * + * @var string[] + */ + protected $accessMap = array( + 'template_dir' => 'TemplateDir', 'config_dir' => 'ConfigDir', + 'plugins_dir' => 'PluginsDir', 'compile_dir' => 'CompileDir', + 'cache_dir' => 'CacheDir', + ); + + /** + * PHP7 Compatibility mode + * @var bool + */ + private $isMutingUndefinedOrNullWarnings = false; + + /** + * Initialize new Smarty object + */ + public function __construct() + { + $this->_clearTemplateCache(); + parent::__construct(); + if (is_callable('mb_internal_encoding')) { + mb_internal_encoding(Smarty::$_CHARSET); + } + $this->start_time = microtime(true); + if (isset($_SERVER[ 'SCRIPT_NAME' ])) { + Smarty::$global_tpl_vars[ 'SCRIPT_NAME' ] = new Smarty_Variable($_SERVER[ 'SCRIPT_NAME' ]); + } + // Check if we're running on windows + Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; + // let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8 + if (Smarty::$_CHARSET !== 'UTF-8') { + Smarty::$_UTF8_MODIFIER = ''; + } + } + + /** + * Check if a template resource exists + * + * @param string $resource_name template name + * + * @return bool status + * @throws \SmartyException + */ + public function templateExists($resource_name) + { + // create source object + $source = Smarty_Template_Source::load(null, $this, $resource_name); + return $source->exists; + } + + /** + * Loads security class and enables security + * + * @param string|Smarty_Security $security_class if a string is used, it must be class-name + * + * @return Smarty current Smarty instance for chaining + * @throws \SmartyException + */ + public function enableSecurity($security_class = null) + { + Smarty_Security::enableSecurity($this, $security_class); + return $this; + } + + /** + * Disable security + * + * @return Smarty current Smarty instance for chaining + */ + public function disableSecurity() + { + $this->security_policy = null; + return $this; + } + + /** + * Add template directory(s) + * + * @param string|array $template_dir directory(s) of template sources + * @param string $key of the array element to assign the template dir to + * @param bool $isConfig true for config_dir + * + * @return Smarty current Smarty instance for chaining + */ + public function addTemplateDir($template_dir, $key = null, $isConfig = false) + { + if ($isConfig) { + $processed = &$this->_processedConfigDir; + $dir = &$this->config_dir; + $this->_configDirNormalized = false; + } else { + $processed = &$this->_processedTemplateDir; + $dir = &$this->template_dir; + $this->_templateDirNormalized = false; + } + if (is_array($template_dir)) { + foreach ($template_dir as $k => $v) { + if (is_int($k)) { + // indexes are not merged but appended + $dir[] = $v; + } else { + // string indexes are overridden + $dir[ $k ] = $v; + unset($processed[ $key ]); + } + } + } else { + if ($key !== null) { + // override directory at specified index + $dir[ $key ] = $template_dir; + unset($processed[ $key ]); + } else { + // append new directory + $dir[] = $template_dir; + } + } + return $this; + } + + /** + * Get template directories + * + * @param mixed $index index of directory to get, null to get all + * @param bool $isConfig true for config_dir + * + * @return array|string list of template directories, or directory of $index + */ + public function getTemplateDir($index = null, $isConfig = false) + { + if ($isConfig) { + $dir = &$this->config_dir; + } else { + $dir = &$this->template_dir; + } + if ($isConfig ? !$this->_configDirNormalized : !$this->_templateDirNormalized) { + $this->_normalizeTemplateConfig($isConfig); + } + if ($index !== null) { + return isset($dir[ $index ]) ? $dir[ $index ] : null; + } + return $dir; + } + + /** + * Set template directory + * + * @param string|array $template_dir directory(s) of template sources + * @param bool $isConfig true for config_dir + * + * @return \Smarty current Smarty instance for chaining + */ + public function setTemplateDir($template_dir, $isConfig = false) + { + if ($isConfig) { + $this->config_dir = array(); + $this->_processedConfigDir = array(); + } else { + $this->template_dir = array(); + $this->_processedTemplateDir = array(); + } + $this->addTemplateDir($template_dir, null, $isConfig); + return $this; + } + + /** + * Add config directory(s) + * + * @param string|array $config_dir directory(s) of config sources + * @param mixed $key key of the array element to assign the config dir to + * + * @return Smarty current Smarty instance for chaining + */ + public function addConfigDir($config_dir, $key = null) + { + return $this->addTemplateDir($config_dir, $key, true); + } + + /** + * Get config directory + * + * @param mixed $index index of directory to get, null to get all + * + * @return array configuration directory + */ + public function getConfigDir($index = null) + { + return $this->getTemplateDir($index, true); + } + + /** + * Set config directory + * + * @param $config_dir + * + * @return Smarty current Smarty instance for chaining + */ + public function setConfigDir($config_dir) + { + return $this->setTemplateDir($config_dir, true); + } + + /** + * Adds directory of plugin files + * + * @param null|array|string $plugins_dir + * + * @return Smarty current Smarty instance for chaining + */ + public function addPluginsDir($plugins_dir) + { + if (empty($this->plugins_dir)) { + $this->plugins_dir[] = SMARTY_PLUGINS_DIR; + } + $this->plugins_dir = array_merge($this->plugins_dir, (array)$plugins_dir); + $this->_pluginsDirNormalized = false; + return $this; + } + + /** + * Get plugin directories + * + * @return array list of plugin directories + */ + public function getPluginsDir() + { + if (empty($this->plugins_dir)) { + $this->plugins_dir[] = SMARTY_PLUGINS_DIR; + $this->_pluginsDirNormalized = false; + } + if (!$this->_pluginsDirNormalized) { + if (!is_array($this->plugins_dir)) { + $this->plugins_dir = (array)$this->plugins_dir; + } + foreach ($this->plugins_dir as $k => $v) { + $this->plugins_dir[ $k ] = $this->_realpath(rtrim($v ?? '', '/\\') . DIRECTORY_SEPARATOR, true); + } + $this->_cache[ 'plugin_files' ] = array(); + $this->_pluginsDirNormalized = true; + } + return $this->plugins_dir; + } + + /** + * Set plugins directory + * + * @param string|array $plugins_dir directory(s) of plugins + * + * @return Smarty current Smarty instance for chaining + */ + public function setPluginsDir($plugins_dir) + { + $this->plugins_dir = (array)$plugins_dir; + $this->_pluginsDirNormalized = false; + return $this; + } + + /** + * Get compiled directory + * + * @return string path to compiled templates + */ + public function getCompileDir() + { + if (!$this->_compileDirNormalized) { + $this->_normalizeDir('compile_dir', $this->compile_dir); + $this->_compileDirNormalized = true; + } + return $this->compile_dir; + } + + /** + * + * @param string $compile_dir directory to store compiled templates in + * + * @return Smarty current Smarty instance for chaining + */ + public function setCompileDir($compile_dir) + { + $this->_normalizeDir('compile_dir', $compile_dir); + $this->_compileDirNormalized = true; + return $this; + } + + /** + * Get cache directory + * + * @return string path of cache directory + */ + public function getCacheDir() + { + if (!$this->_cacheDirNormalized) { + $this->_normalizeDir('cache_dir', $this->cache_dir); + $this->_cacheDirNormalized = true; + } + return $this->cache_dir; + } + + /** + * Set cache directory + * + * @param string $cache_dir directory to store cached templates in + * + * @return Smarty current Smarty instance for chaining + */ + public function setCacheDir($cache_dir) + { + $this->_normalizeDir('cache_dir', $cache_dir); + $this->_cacheDirNormalized = true; + return $this; + } + + /** + * creates a template object + * + * @param string $template the resource handle of the template file + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + * @param boolean $do_clone flag is Smarty object shall be cloned + * + * @return \Smarty_Internal_Template template object + * @throws \SmartyException + */ + public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) + { + if ($cache_id !== null && (is_object($cache_id) || is_array($cache_id))) { + $parent = $cache_id; + $cache_id = null; + } + if ($parent !== null && is_array($parent)) { + $data = $parent; + $parent = null; + } else { + $data = null; + } + if (!$this->_templateDirNormalized) { + $this->_normalizeTemplateConfig(false); + } + $_templateId = $this->_getTemplateId($template, $cache_id, $compile_id); + $tpl = null; + if ($this->caching && isset(Smarty_Internal_Template::$isCacheTplObj[ $_templateId ])) { + $tpl = $do_clone ? clone Smarty_Internal_Template::$isCacheTplObj[ $_templateId ] : + Smarty_Internal_Template::$isCacheTplObj[ $_templateId ]; + $tpl->inheritance = null; + $tpl->tpl_vars = $tpl->config_vars = array(); + } elseif (!$do_clone && isset(Smarty_Internal_Template::$tplObjCache[ $_templateId ])) { + $tpl = clone Smarty_Internal_Template::$tplObjCache[ $_templateId ]; + $tpl->inheritance = null; + $tpl->tpl_vars = $tpl->config_vars = array(); + } else { + /* @var Smarty_Internal_Template $tpl */ + $tpl = new $this->template_class($template, $this, null, $cache_id, $compile_id, null, null); + $tpl->templateId = $_templateId; + } + if ($do_clone) { + $tpl->smarty = clone $tpl->smarty; + } + $tpl->parent = $parent ? $parent : $this; + // fill data if present + if (!empty($data) && is_array($data)) { + // set up variable values + foreach ($data as $_key => $_val) { + $tpl->tpl_vars[ $_key ] = new Smarty_Variable($_val); + } + } + if ($this->debugging || $this->debugging_ctrl === 'URL') { + $tpl->smarty->_debug = new Smarty_Internal_Debug(); + // check URL debugging control + if (!$this->debugging && $this->debugging_ctrl === 'URL') { + $tpl->smarty->_debug->debugUrl($tpl->smarty); + } + } + return $tpl; + } + + /** + * Takes unknown classes and loads plugin files for them + * class name format: Smarty_PluginType_PluginName + * plugin filename format: plugintype.pluginname.php + * + * @param string $plugin_name class plugin name to load + * @param bool $check check if already loaded + * + * @return string |boolean filepath of loaded file or false + * @throws \SmartyException + */ + public function loadPlugin($plugin_name, $check = true) + { + return $this->ext->loadPlugin->loadPlugin($this, $plugin_name, $check); + } + + /** + * Get unique template id + * + * @param string $template_name + * @param null|mixed $cache_id + * @param null|mixed $compile_id + * @param null $caching + * @param \Smarty_Internal_Template $template + * + * @return string + * @throws \SmartyException + */ + public function _getTemplateId( + $template_name, + $cache_id = null, + $compile_id = null, + $caching = null, + Smarty_Internal_Template $template = null + ) { + $template_name = (strpos($template_name, ':') === false) ? "{$this->default_resource_type}:{$template_name}" : + $template_name; + $cache_id = $cache_id === null ? $this->cache_id : $cache_id; + $compile_id = $compile_id === null ? $this->compile_id : $compile_id; + $caching = (int)($caching === null ? $this->caching : $caching); + if ((isset($template) && strpos($template_name, ':.') !== false) || $this->allow_ambiguous_resources) { + $_templateId = + Smarty_Resource::getUniqueTemplateName((isset($template) ? $template : $this), $template_name) . + "#{$cache_id}#{$compile_id}#{$caching}"; + } else { + $_templateId = $this->_joined_template_dir . "#{$template_name}#{$cache_id}#{$compile_id}#{$caching}"; + } + if (isset($_templateId[ 150 ])) { + $_templateId = sha1($_templateId); + } + return $_templateId; + } + + /** + * Normalize path + * - remove /./ and /../ + * - make it absolute if required + * + * @param string $path file path + * @param bool $realpath if true - convert to absolute + * false - convert to relative + * null - keep as it is but + * remove /./ /../ + * + * @return string + */ + public function _realpath($path, $realpath = null) + { + $nds = array('/' => '\\', '\\' => '/'); + preg_match( + '%^(?(?:[[:alpha:]]:[\\\\/]|/|[\\\\]{2}[[:alpha:]]+|[[:print:]]{2,}:[/]{2}|[\\\\])?)(?(.*))$%u', + $path, + $parts + ); + $path = $parts[ 'path' ]; + if ($parts[ 'root' ] === '\\') { + $parts[ 'root' ] = substr(getcwd(), 0, 2) . $parts[ 'root' ]; + } else { + if ($realpath !== null && !$parts[ 'root' ]) { + $path = getcwd() . DIRECTORY_SEPARATOR . $path; + } + } + // normalize DIRECTORY_SEPARATOR + $path = str_replace($nds[ DIRECTORY_SEPARATOR ], DIRECTORY_SEPARATOR, $path); + $parts[ 'root' ] = str_replace($nds[ DIRECTORY_SEPARATOR ], DIRECTORY_SEPARATOR, $parts[ 'root' ]); + do { + $path = preg_replace( + array('#[\\\\/]{2}#', '#[\\\\/][.][\\\\/]#', '#[\\\\/]([^\\\\/.]+)[\\\\/][.][.][\\\\/]#'), + DIRECTORY_SEPARATOR, + $path, + -1, + $count + ); + } while ($count > 0); + return $realpath !== false ? $parts[ 'root' ] . $path : str_ireplace(getcwd(), '.', $parts[ 'root' ] . $path); + } + + /** + * Empty template objects cache + */ + public function _clearTemplateCache() + { + Smarty_Internal_Template::$isCacheTplObj = array(); + Smarty_Internal_Template::$tplObjCache = array(); + } + + /** + * @param boolean $use_sub_dirs + */ + public function setUseSubDirs($use_sub_dirs) + { + $this->use_sub_dirs = $use_sub_dirs; + } + + /** + * @param int $error_reporting + */ + public function setErrorReporting($error_reporting) + { + $this->error_reporting = $error_reporting; + } + + /** + * @param boolean $escape_html + */ + public function setEscapeHtml($escape_html) + { + $this->escape_html = $escape_html; + } + + /** + * Return auto_literal flag + * + * @return boolean + */ + public function getAutoLiteral() + { + return $this->auto_literal; + } + + /** + * Set auto_literal flag + * + * @param boolean $auto_literal + */ + public function setAutoLiteral($auto_literal = true) + { + $this->auto_literal = $auto_literal; + } + + /** + * @param boolean $force_compile + */ + public function setForceCompile($force_compile) + { + $this->force_compile = $force_compile; + } + + /** + * @param boolean $merge_compiled_includes + */ + public function setMergeCompiledIncludes($merge_compiled_includes) + { + $this->merge_compiled_includes = $merge_compiled_includes; + } + + /** + * Get left delimiter + * + * @return string + */ + public function getLeftDelimiter() + { + return $this->left_delimiter; + } + + /** + * Set left delimiter + * + * @param string $left_delimiter + */ + public function setLeftDelimiter($left_delimiter) + { + $this->left_delimiter = $left_delimiter; + } + + /** + * Get right delimiter + * + * @return string $right_delimiter + */ + public function getRightDelimiter() + { + return $this->right_delimiter; + } + + /** + * Set right delimiter + * + * @param string + */ + public function setRightDelimiter($right_delimiter) + { + $this->right_delimiter = $right_delimiter; + } + + /** + * @param boolean $debugging + */ + public function setDebugging($debugging) + { + $this->debugging = $debugging; + } + + /** + * @param boolean $config_overwrite + */ + public function setConfigOverwrite($config_overwrite) + { + $this->config_overwrite = $config_overwrite; + } + + /** + * @param boolean $config_booleanize + */ + public function setConfigBooleanize($config_booleanize) + { + $this->config_booleanize = $config_booleanize; + } + + /** + * @param boolean $config_read_hidden + */ + public function setConfigReadHidden($config_read_hidden) + { + $this->config_read_hidden = $config_read_hidden; + } + + /** + * @param boolean $compile_locking + */ + public function setCompileLocking($compile_locking) + { + $this->compile_locking = $compile_locking; + } + + /** + * @param string $default_resource_type + */ + public function setDefaultResourceType($default_resource_type) + { + $this->default_resource_type = $default_resource_type; + } + + /** + * @param string $caching_type + */ + public function setCachingType($caching_type) + { + $this->caching_type = $caching_type; + } + + /** + * Test install + * + * @param null $errors + */ + public function testInstall(&$errors = null) + { + Smarty_Internal_TestInstall::testInstall($this, $errors); + } + + /** + * Get Smarty object + * + * @return Smarty + */ + public function _getSmartyObj() + { + return $this; + } + + /** + * <> Generic getter. + * Calls the appropriate getter function. + * Issues an E_USER_NOTICE if no valid getter is found. + * + * @param string $name property name + * + * @return mixed + */ + public function __get($name) + { + if (isset($this->accessMap[ $name ])) { + $method = 'get' . $this->accessMap[ $name ]; + return $this->{$method}(); + } elseif (isset($this->_cache[ $name ])) { + return $this->_cache[ $name ]; + } elseif (in_array($name, $this->obsoleteProperties)) { + return null; + } else { + trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); + } + return null; + } + + /** + * <> Generic setter. + * Calls the appropriate setter function. + * Issues an E_USER_NOTICE if no valid setter is found. + * + * @param string $name property name + * @param mixed $value parameter passed to setter + * + */ + public function __set($name, $value) + { + if (isset($this->accessMap[ $name ])) { + $method = 'set' . $this->accessMap[ $name ]; + $this->{$method}($value); + } elseif (in_array($name, $this->obsoleteProperties)) { + return; + } elseif (is_object($value) && method_exists($value, $name)) { + $this->$name = $value; + } else { + trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); + } + } + + /** + * Normalize and set directory string + * + * @param string $dirName cache_dir or compile_dir + * @param string $dir filepath of folder + */ + private function _normalizeDir($dirName, $dir) + { + $this->{$dirName} = $this->_realpath(rtrim($dir ?? '', "/\\") . DIRECTORY_SEPARATOR, true); + } + + /** + * Normalize template_dir or config_dir + * + * @param bool $isConfig true for config_dir + */ + private function _normalizeTemplateConfig($isConfig) + { + if ($isConfig) { + $processed = &$this->_processedConfigDir; + $dir = &$this->config_dir; + } else { + $processed = &$this->_processedTemplateDir; + $dir = &$this->template_dir; + } + if (!is_array($dir)) { + $dir = (array)$dir; + } + foreach ($dir as $k => $v) { + if (!isset($processed[ $k ])) { + $dir[ $k ] = $v = $this->_realpath(rtrim($v ?? '', "/\\") . DIRECTORY_SEPARATOR, true); + $processed[ $k ] = true; + } + } + $isConfig ? $this->_configDirNormalized = true : $this->_templateDirNormalized = true; + $isConfig ? $this->_joined_config_dir = join('#', $this->config_dir) : + $this->_joined_template_dir = join('#', $this->template_dir); + } + + /** + * Mutes errors for "undefined index", "undefined array key" and "trying to read property of null". + * + * @void + */ + public function muteUndefinedOrNullWarnings(): void { + $this->isMutingUndefinedOrNullWarnings = true; + } + + /** + * Indicates if Smarty will mute errors for "undefined index", "undefined array key" and "trying to read property of null". + * @bool + */ + public function isMutingUndefinedOrNullWarnings(): bool { + return $this->isMutingUndefinedOrNullWarnings; + } + +} diff --git a/src/bootstrap.php b/src/bootstrap.php new file mode 100644 index 0000000..a226ac0 --- /dev/null +++ b/src/bootstrap.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +/** + * Load and register Smarty Autoloader + */ +if (!class_exists('Smarty_Autoloader')) { + include __DIR__ . '/Autoloader.php'; +} +Smarty_Autoloader::register(true); diff --git a/src/debug.tpl b/src/debug.tpl new file mode 100644 index 0000000..4f82a58 --- /dev/null +++ b/src/debug.tpl @@ -0,0 +1,175 @@ +{capture name='_smarty_debug' assign=debug_output} + + + + Smarty Debug Console + + + + +

Smarty {Smarty::SMARTY_VERSION} Debug Console + - {if isset($template_name)}{$template_name|debug_print_var nofilter} {/if}{if !empty($template_data)}Total Time {$execution_time|string_format:"%.5f"}{/if}

+ + {if !empty($template_data)} +

included templates & config files (load time in seconds)

+
+ {foreach $template_data as $template} + {$template.name} +
   + (compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"}) + +
+ {/foreach} +
+ {/if} + +

assigned template variables

+ + + {foreach $assigned_vars as $vars} + + + + + {/foreach} +
+

${$vars@key}

+ {if isset($vars['nocache'])}Nocache
{/if} + {if isset($vars['scope'])}Origin: {$vars['scope']|debug_print_var nofilter}{/if} +
+

Value

+ {$vars['value']|debug_print_var:10:80 nofilter} +
+ {if isset($vars['attributes'])} +

Attributes

+ {$vars['attributes']|debug_print_var nofilter} + {/if} +
+ +

assigned config file variables

+ + + {foreach $config_vars as $vars} + + + + + {/foreach} + +
+

#{$vars@key}#

+ {if isset($vars['scope'])}Origin: {$vars['scope']|debug_print_var nofilter}{/if} +
+ {$vars['value']|debug_print_var:10:80 nofilter} +
+ + +{/capture} + diff --git a/src/functions.php b/src/functions.php new file mode 100644 index 0000000..bac00e5 --- /dev/null +++ b/src/functions.php @@ -0,0 +1,51 @@ +register_block('t', 'smarty_translate'); + * + * NOTE: native php support for conext sensitive does not exist + * Those jumps are disabled + * + * @package smarty-gettext + * @version $Id: block.t.php 4738 2022-05-06 01:28:48Z clemens $ + * @link http://smarty-gettext.sf.net/ + * @author Sagi Bashari + * @copyright 2004 Sagi Bashari + * @copyright Elan Ruusamäe + * @copyright Clemens Schwaighofer + */ + +/** + * Replaces arguments in a string with their values. + * Arguments are represented by % followed by their number. + * + * @param string $str Source string + * @param mixed mixed Arguments, can be passed in an array or through single variables. + * @return string Modified string + */ +function smarty_gettext_strarg($str/*, $varargs... */) +{ + $tr = []; + $p = 0; + + $nargs = func_num_args(); + for ($i = 1; $i < $nargs; $i++) { + $arg = func_get_arg($i); + + if (is_array($arg)) { + foreach ($arg as $aarg) { + $tr['%' . ++$p] = $aarg; + } + } else { + $tr['%' . ++$p] = $arg; + } + } + + return strtr($str, $tr); +} + +/** + * Smarty block function, provides gettext support for smarty. + * + * The block content is the text that should be translated. + * + * Any parameter that is sent to the function will be represented as %n in the translation text, + * where n is 1 for the first parameter. The following parameters are reserved: + * - escape - sets escape mode: + * - 'html' for HTML escaping, this is the default. + * - 'js' for javascript escaping. + * - 'url' for url escaping. + * - 'no'/'off'/0 - turns off escaping + * - plural - The plural version of the text (2nd parameter of ngettext()) + * - count - The item count for plural mode (3rd parameter of ngettext()) + * - domain - Textdomain to be used, default if skipped (dgettext() instead of gettext()) + * - context - gettext context. reserved for future use. + * + */ + +// cs modified: __ calls instead of direct gettext calls + +function smarty_block_t($params, $text) +{ + if (!isset($text)) { + return $text; + } + + // set escape mode, default html escape + if (isset($params['escape'])) { + $escape = $params['escape']; + unset($params['escape']); + } else { + $escape = 'html'; + } + + // set plural parameters 'plural' and 'count'. + if (isset($params['plural'])) { + $plural = $params['plural']; + unset($params['plural']); + + // set count + if (isset($params['count'])) { + $count = $params['count']; + unset($params['count']); + } + } + + // get domain param + if (isset($params['domain'])) { + $domain = $params['domain']; + unset($params['domain']); + } else { + $domain = null; + } + + // get context param + if (isset($params['context'])) { + $context = $params['context']; + unset($params['context']); + } else { + $context = null; + } + + // use plural if required parameters are set + if (isset($count) && isset($plural)) { + if (isset($domain) && isset($context)) { + if (is_callable('_dnpgettext')) { + $text = _dnpgettext($domain, $context, $text, $plural, $count); + }/* elseif (is_callable('dnpgettext')) { + $text = dnpgettext($domain, $context, $text, $plural, $count); + } */ + } elseif (isset($domain)) { + if (is_callable('_dngettext')) { + $text = _dngettext($domain, $text, $plural, $count); + } elseif (is_callable('dngettext')) { + $text = dngettext($domain, $text, $plural, $count); + } + } elseif (isset($context)) { + if (is_callable('_npgettext')) { + $text = _npgettext($context, $text, $plural, $count); + }/* elseif (is_callable('npgettext')) { + $text = npgettext($context, $text, $plural, $count); + } */ + } else { + if (is_callable('_ngettext')) { + $text = _ngettext($text, $plural, $count); + } elseif (is_callable('ngettext')) { + $text = ngettext($text, $plural, $count); + } + } + } else { // use normal + if (isset($domain) && isset($context)) { + if (is_callable('_dpgettext')) { + $text = _dpgettext($domain, $context, $text); + }/* elseif (is_callable('dpgettext')) { + $text = dpgettext($domain, $context, $text); + } */ + } elseif (isset($domain)) { + if (is_callable('_dgettext')) { + $text = _dgettext($domain, $text); + } elseif (is_callable('dpgettext')) { + $text = dgettext($domain, $text); + } + } elseif (isset($context)) { + if (is_callable('_pgettext')) { + $text = _pgettext($context, $text); + }/* elseif (is_callable('pgettext')) { + $text = pgettext($context, $text); + } */ + } else { + if (is_callable('_gettext')) { + $text = _gettext($text); + } elseif (is_callable('gettext')) { + $text = gettext($text); + } + } + } + + // run strarg if there are parameters + if (count($params)) { + $text = smarty_gettext_strarg($text, $params); + } + + switch ($escape) { + case 'html': + // default + $text = nl2br(htmlspecialchars($text)); + break; + case 'javascript': + case 'js': + // javascript escape + $text = strtr( + $text, + [ + '\\' => '\\\\', + "'" => "\\'", + '"' => '\\"', + "\r" => '\\r', + "\n" => '\\n', + ' '<\/' + ] + ); + break; + case 'url': + // url escape + $text = urlencode($text); + break; + // below is a list for explicit OFF + case 'no': + case 'off': + case 'false': + case '0': + case 0: + // explicit OFF + default: + break; + } + + return $text; +} + +// __END__ diff --git a/src/plugins/block.textformat.php b/src/plugins/block.textformat.php new file mode 100644 index 0000000..fed090e --- /dev/null +++ b/src/plugins/block.textformat.php @@ -0,0 +1,121 @@ + + * @throws \SmartyException + */ +function smarty_block_textformat($params, $content, Smarty_Internal_Template $template, &$repeat) +{ + if (is_null($content)) { + return; + } + if (Smarty::$_MBSTRING) { + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_modifier_mb_wordwrap', + 'file' => SMARTY_PLUGINS_DIR . 'modifier.mb_wordwrap.php' + ) + ) + ); + } + $style = null; + $indent = 0; + $indent_first = 0; + $indent_char = ' '; + $wrap = 80; + $wrap_char = "\n"; + $wrap_cut = false; + $assign = null; + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'style': + case 'indent_char': + case 'wrap_char': + case 'assign': + $$_key = (string)$_val; + break; + case 'indent': + case 'indent_first': + case 'wrap': + $$_key = (int)$_val; + break; + case 'wrap_cut': + $$_key = (bool)$_val; + break; + default: + trigger_error("textformat: unknown attribute '{$_key}'"); + } + } + if ($style === 'email') { + $wrap = 72; + } + // split into paragraphs + $_paragraphs = preg_split('![\r\n]{2}!', $content); + foreach ($_paragraphs as &$_paragraph) { + if (!$_paragraph) { + continue; + } + // convert mult. spaces & special chars to single space + $_paragraph = + preg_replace( + array( + '!\s+!' . Smarty::$_UTF8_MODIFIER, + '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER + ), + array( + ' ', + '' + ), + $_paragraph + ); + // indent first line + if ($indent_first > 0) { + $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph; + } + // wordwrap sentences + if (Smarty::$_MBSTRING) { + $_paragraph = smarty_modifier_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); + } else { + $_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); + } + // indent lines + if ($indent > 0) { + $_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph); + } + } + $_output = implode($wrap_char . $wrap_char, $_paragraphs); + if ($assign) { + $template->assign($assign, $_output); + } else { + return $_output; + } +} diff --git a/src/plugins/function.counter.php b/src/plugins/function.counter.php new file mode 100644 index 0000000..5479545 --- /dev/null +++ b/src/plugins/function.counter.php @@ -0,0 +1,62 @@ + + * @link https://www.smarty.net/manual/en/language.function.counter.php {counter} + * (Smarty online manual) + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @return string|null + */ +function smarty_function_counter($params, $template) +{ + static $counters = array(); + $name = (isset($params[ 'name' ])) ? $params[ 'name' ] : 'default'; + if (!isset($counters[ $name ])) { + $counters[ $name ] = array('start' => 1, 'skip' => 1, 'direction' => 'up', 'count' => 1); + } + $counter =& $counters[ $name ]; + if (isset($params[ 'start' ])) { + $counter[ 'start' ] = $counter[ 'count' ] = (int)$params[ 'start' ]; + } + if (!empty($params[ 'assign' ])) { + $counter[ 'assign' ] = $params[ 'assign' ]; + } + if (isset($counter[ 'assign' ])) { + $template->assign($counter[ 'assign' ], $counter[ 'count' ]); + } + if (isset($params[ 'print' ])) { + $print = (bool)$params[ 'print' ]; + } else { + $print = empty($counter[ 'assign' ]); + } + if ($print) { + $retval = $counter[ 'count' ]; + } else { + $retval = null; + } + if (isset($params[ 'skip' ])) { + $counter[ 'skip' ] = $params[ 'skip' ]; + } + if (isset($params[ 'direction' ])) { + $counter[ 'direction' ] = $params[ 'direction' ]; + } + if ($counter[ 'direction' ] === 'down') { + $counter[ 'count' ] -= $counter[ 'skip' ]; + } else { + $counter[ 'count' ] += $counter[ 'skip' ]; + } + return $retval; +} diff --git a/src/plugins/function.cycle.php b/src/plugins/function.cycle.php new file mode 100644 index 0000000..7935699 --- /dev/null +++ b/src/plugins/function.cycle.php @@ -0,0 +1,92 @@ + + * @author credit to Mark Priatel + * @author credit to Gerard + * @author credit to Jason Sweat + * @version 1.3 + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @return string|null + */ +function smarty_function_cycle($params, $template) +{ + static $cycle_vars; + $name = (empty($params[ 'name' ])) ? 'default' : $params[ 'name' ]; + $print = (isset($params[ 'print' ])) ? (bool)$params[ 'print' ] : true; + $advance = (isset($params[ 'advance' ])) ? (bool)$params[ 'advance' ] : true; + $reset = (isset($params[ 'reset' ])) ? (bool)$params[ 'reset' ] : false; + if (!isset($params[ 'values' ])) { + if (!isset($cycle_vars[ $name ][ 'values' ])) { + trigger_error('cycle: missing \'values\' parameter'); + return; + } + } else { + if (isset($cycle_vars[ $name ][ 'values' ]) && $cycle_vars[ $name ][ 'values' ] !== $params[ 'values' ]) { + $cycle_vars[ $name ][ 'index' ] = 0; + } + $cycle_vars[ $name ][ 'values' ] = $params[ 'values' ]; + } + if (isset($params[ 'delimiter' ])) { + $cycle_vars[ $name ][ 'delimiter' ] = $params[ 'delimiter' ]; + } elseif (!isset($cycle_vars[ $name ][ 'delimiter' ])) { + $cycle_vars[ $name ][ 'delimiter' ] = ','; + } + if (is_array($cycle_vars[ $name ][ 'values' ])) { + $cycle_array = $cycle_vars[ $name ][ 'values' ]; + } else { + $cycle_array = explode($cycle_vars[ $name ][ 'delimiter' ], $cycle_vars[ $name ][ 'values' ]); + } + if (!isset($cycle_vars[ $name ][ 'index' ]) || $reset) { + $cycle_vars[ $name ][ 'index' ] = 0; + } + if (isset($params[ 'assign' ])) { + $print = false; + $template->assign($params[ 'assign' ], $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]); + } + if ($print) { + $retval = $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]; + } else { + $retval = null; + } + if ($advance) { + if ($cycle_vars[ $name ][ 'index' ] >= count($cycle_array) - 1) { + $cycle_vars[ $name ][ 'index' ] = 0; + } else { + $cycle_vars[ $name ][ 'index' ]++; + } + } + return $retval; +} diff --git a/src/plugins/function.fetch.php b/src/plugins/function.fetch.php new file mode 100644 index 0000000..4a3e881 --- /dev/null +++ b/src/plugins/function.fetch.php @@ -0,0 +1,204 @@ + + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @throws SmartyException + * @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable + */ +function smarty_function_fetch($params, $template) +{ + if (empty($params[ 'file' ])) { + trigger_error('[plugin] fetch parameter \'file\' cannot be empty', E_USER_NOTICE); + return; + } + // strip file protocol + if (stripos($params[ 'file' ], 'file://') === 0) { + $params[ 'file' ] = substr($params[ 'file' ], 7); + } + $protocol = strpos($params[ 'file' ], '://'); + if ($protocol !== false) { + $protocol = strtolower(substr($params[ 'file' ], 0, $protocol)); + } + if (isset($template->smarty->security_policy)) { + if ($protocol) { + // remote resource (or php stream, …) + if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) { + return; + } + } else { + // local file + if (!$template->smarty->security_policy->isTrustedResourceDir($params[ 'file' ])) { + return; + } + } + } + $content = ''; + if ($protocol === 'http') { + // http fetch + if ($uri_parts = parse_url($params[ 'file' ])) { + // set defaults + $host = $server_name = $uri_parts[ 'host' ]; + $timeout = 30; + $accept = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*'; + $agent = 'Smarty Template Engine ' . Smarty::SMARTY_VERSION; + $referer = ''; + $uri = !empty($uri_parts[ 'path' ]) ? $uri_parts[ 'path' ] : '/'; + $uri .= !empty($uri_parts[ 'query' ]) ? '?' . $uri_parts[ 'query' ] : ''; + $_is_proxy = false; + if (empty($uri_parts[ 'port' ])) { + $port = 80; + } else { + $port = $uri_parts[ 'port' ]; + } + if (!empty($uri_parts[ 'user' ])) { + $user = $uri_parts[ 'user' ]; + } + if (!empty($uri_parts[ 'pass' ])) { + $pass = $uri_parts[ 'pass' ]; + } + // loop through parameters, setup headers + foreach ($params as $param_key => $param_value) { + switch ($param_key) { + case 'file': + case 'assign': + case 'assign_headers': + break; + case 'user': + if (!empty($param_value)) { + $user = $param_value; + } + break; + case 'pass': + if (!empty($param_value)) { + $pass = $param_value; + } + break; + case 'accept': + if (!empty($param_value)) { + $accept = $param_value; + } + break; + case 'header': + if (!empty($param_value)) { + if (!preg_match('![\w\d-]+: .+!', $param_value)) { + trigger_error("[plugin] invalid header format '{$param_value}'", E_USER_NOTICE); + return; + } else { + $extra_headers[] = $param_value; + } + } + break; + case 'proxy_host': + if (!empty($param_value)) { + $proxy_host = $param_value; + } + break; + case 'proxy_port': + if (!preg_match('!\D!', $param_value)) { + $proxy_port = (int)$param_value; + } else { + trigger_error("[plugin] invalid value for attribute '{$param_key }'", E_USER_NOTICE); + return; + } + break; + case 'agent': + if (!empty($param_value)) { + $agent = $param_value; + } + break; + case 'referer': + if (!empty($param_value)) { + $referer = $param_value; + } + break; + case 'timeout': + if (!preg_match('!\D!', $param_value)) { + $timeout = (int)$param_value; + } else { + trigger_error("[plugin] invalid value for attribute '{$param_key}'", E_USER_NOTICE); + return; + } + break; + default: + trigger_error("[plugin] unrecognized attribute '{$param_key}'", E_USER_NOTICE); + return; + } + } + if (!empty($proxy_host) && !empty($proxy_port)) { + $_is_proxy = true; + $fp = fsockopen($proxy_host, $proxy_port, $errno, $errstr, $timeout); + } else { + $fp = fsockopen($server_name, $port, $errno, $errstr, $timeout); + } + if (!$fp) { + trigger_error("[plugin] unable to fetch: $errstr ($errno)", E_USER_NOTICE); + return; + } else { + if ($_is_proxy) { + fputs($fp, 'GET ' . $params[ 'file' ] . " HTTP/1.0\r\n"); + } else { + fputs($fp, "GET $uri HTTP/1.0\r\n"); + } + if (!empty($host)) { + fputs($fp, "Host: $host\r\n"); + } + if (!empty($accept)) { + fputs($fp, "Accept: $accept\r\n"); + } + if (!empty($agent)) { + fputs($fp, "User-Agent: $agent\r\n"); + } + if (!empty($referer)) { + fputs($fp, "Referer: $referer\r\n"); + } + if (isset($extra_headers) && is_array($extra_headers)) { + foreach ($extra_headers as $curr_header) { + fputs($fp, $curr_header . "\r\n"); + } + } + if (!empty($user) && !empty($pass)) { + fputs($fp, 'Authorization: BASIC ' . base64_encode("$user:$pass") . "\r\n"); + } + fputs($fp, "\r\n"); + while (!feof($fp)) { + $content .= fgets($fp, 4096); + } + fclose($fp); + $csplit = preg_split("!\r\n\r\n!", $content, 2); + $content = $csplit[ 1 ]; + if (!empty($params[ 'assign_headers' ])) { + $template->assign($params[ 'assign_headers' ], preg_split("!\r\n!", $csplit[ 0 ])); + } + } + } else { + trigger_error("[plugin fetch] unable to parse URL, check syntax", E_USER_NOTICE); + return; + } + } else { + $content = @file_get_contents($params[ 'file' ]); + if ($content === false) { + throw new SmartyException("{fetch} cannot read resource '" . $params[ 'file' ] . "'"); + } + } + if (!empty($params[ 'assign' ])) { + $template->assign($params[ 'assign' ], $content); + } else { + return $content; + } +} diff --git a/src/plugins/function.html_checkboxes.php b/src/plugins/function.html_checkboxes.php new file mode 100644 index 0000000..0ed418e --- /dev/null +++ b/src/plugins/function.html_checkboxes.php @@ -0,0 +1,296 @@ +' output=$names} + * {html_checkboxes values=$ids checked=$checked separator='
' output=$names} + * + * Params: + * + * - name (optional) - string default "checkbox" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie
or   + * - output (optional) - the output next to each checkbox + * - assign (optional) - assign the output as an array to this variable + * - escape (optional) - escape the content (not value), defaults to true + * + * @link https://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} + * (Smarty online manual) + * @author Christopher Kvarme + * @author credits to Monte Ohrt + * @version 1.0 + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @return string + * @uses smarty_function_escape_special_chars() + * @throws \SmartyException + */ +function smarty_function_html_checkboxes($params, Smarty_Internal_Template $template) +{ + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php' + ) + ) + ); + $name = 'checkbox'; + $values = null; + $options = null; + $selected = array(); + $separator = ''; + $escape = true; + $labels = true; + $label_ids = false; + $output = null; + $pos = null; + $extra = ''; + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'name': + case 'separator': + $$_key = (string)$_val; + break; + case 'escape': + case 'labels': + case 'label_ids': + $$_key = (bool)$_val; + break; + case 'options': + $$_key = (array)$_val; + break; + case 'values': + case 'output': + $$_key = array_values((array)$_val); + break; + case 'checked': + case 'selected': + if (is_array($_val)) { + $selected = array(); + foreach ($_val as $_sel) { + if (is_object($_sel)) { + if (method_exists($_sel, '__toString')) { + $_sel = smarty_function_escape_special_chars((string)$_sel->__toString()); + } else { + trigger_error( + 'html_checkboxes: selected attribute contains an object of class \'' . + get_class($_sel) . '\' without __toString() method', + E_USER_NOTICE + ); + continue; + } + } else { + $_sel = smarty_function_escape_special_chars((string)$_sel); + } + $selected[ $_sel ] = true; + } + } elseif (is_object($_val)) { + if (method_exists($_val, '__toString')) { + $selected = smarty_function_escape_special_chars((string)$_val->__toString()); + } else { + trigger_error( + 'html_checkboxes: selected attribute is an object of class \'' . get_class($_val) . + '\' without __toString() method', + E_USER_NOTICE + ); + } + } else { + $selected = smarty_function_escape_special_chars((string)$_val); + } + break; + case 'checkboxes': + trigger_error( + 'html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', + E_USER_WARNING + ); + $options = (array)$_val; + break; + case 'assign': + break; + case 'pos': + $$_key = array_values((array)$_val); + break; + case 'strict': + break; + case 'disabled': + case 'readonly': + if (!empty($params[ 'strict' ])) { + if (!is_scalar($_val)) { + trigger_error( + "html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute", + E_USER_NOTICE + ); + } + if ($_val === true || $_val === $_key) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; + } + break; + } + // omit break; to fall through! + // no break + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + trigger_error("html_checkboxes: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); + } + break; + } + } + if (!isset($options) && !isset($values)) { + return ''; + } /* raise error here? */ + $_html_result = array(); + if (isset($options)) { + foreach ($options as $_key => $_val) { + $_pos = isset($pos[ $_key ]) ? $pos[ $_key ] : ''; + $_html_result[] = + smarty_function_html_checkboxes_output( + $name, + $_key, + $_val, + $selected, + $extra, + $separator, + $labels, + $label_ids, + $_pos, + $escape + ); + } + } else { + foreach ($values as $_i => $_key) { + $_val = isset($output[ $_i ]) ? $output[ $_i ] : ''; + $_pos = isset($pos[ $_i ]) ? $pos[ $_i ] : ''; + $_html_result[] = + smarty_function_html_checkboxes_output( + $name, + $_key, + $_val, + $selected, + $extra, + $separator, + $labels, + $label_ids, + $_pos, + $escape + ); + } + } + if (!empty($params[ 'assign' ])) { + $template->assign($params[ 'assign' ], $_html_result); + } else { + return implode("\n", $_html_result); + } +} + +/** + * @param $name + * @param $value + * @param $output + * @param $selected + * @param $extra + * @param $separator + * @param $labels + * @param $label_ids + * @param $pos + * @param bool $escape + * + * @return string + */ +function smarty_function_html_checkboxes_output( + $name, + $value, + $output, + $selected, + $extra, + $separator, + $labels, + $label_ids, + $pos, + $escape = true +) { + $_output = ''; + if (is_object($value)) { + if (method_exists($value, '__toString')) { + $value = (string)$value->__toString(); + } else { + trigger_error( + 'html_options: value is an object of class \'' . get_class($value) . + '\' without __toString() method', + E_USER_NOTICE + ); + return ''; + } + } else { + $value = (string)$value; + } + if (is_object($output)) { + if (method_exists($output, '__toString')) { + $output = (string)$output->__toString(); + } else { + trigger_error( + 'html_options: output is an object of class \'' . get_class($output) . + '\' without __toString() method', + E_USER_NOTICE + ); + return ''; + } + } else { + $output = (string)$output; + } + if ($labels) { + if ($label_ids) { + $_id = smarty_function_escape_special_chars( + preg_replace( + '![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, + '_', + $name . '_' . $value + ) + ); + $_output .= '