gluon-web-remote

Web remote Administration for big size of gluon routers
git clone git://archive.git.mtrnord.blog/MTRNord/gluon-web-remote.git
Log | Files | Refs | README

commit e9161e8cf8ba9df6be58bed7662c17059dfa725c
parent 3484a39a8d676b6c1fed8b293061753359bb9bb6
Author: MTRNord <mtrnord1@gmail.com>
Date:   Sat, 31 Oct 2015 19:10:07 +0000

Add Smarty

Diffstat:
Mlibaries | 3+++
Mlibs/php-ssh/.noninteractive | 0
Alibs/smarty/COMPOSER_RELEASE_NOTES.txt | 29+++++++++++++++++++++++++++++
Alibs/smarty/COPYING.lib | 166+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/INHERITANCE_RELEASE_NOTES.txt | 35+++++++++++++++++++++++++++++++++++
Alibs/smarty/NEW_FEATURES.txt | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/README | 574+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/README.md | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/SMARTY_2_BC_NOTES.txt | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/SMARTY_3.0_BC_NOTES.txt | 25+++++++++++++++++++++++++
Alibs/smarty/SMARTY_3.1_NOTES.txt | 306+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/change_log.txt | 2649+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/composer.json | 43+++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/demo/configs/test.conf | 5+++++
Alibs/smarty/demo/index.php | 30++++++++++++++++++++++++++++++
Alibs/smarty/demo/plugins/cacheresource.apc.php | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/demo/plugins/cacheresource.memcache.php | 97+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/demo/plugins/cacheresource.mysql.php | 162+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/demo/plugins/cacheresource.pdo.php | 323+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/demo/plugins/cacheresource.pdo_gzip.php | 44++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/demo/plugins/resource.extendsall.php | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/demo/plugins/resource.mysql.php | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/demo/plugins/resource.mysqls.php | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/demo/templates/footer.tpl | 2++
Alibs/smarty/demo/templates/header.tpl | 5+++++
Alibs/smarty/demo/templates/index.tpl | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/lexer/smarty_internal_configfilelexer.plex | 318+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/lexer/smarty_internal_configfileparser.y | 362+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/lexer/smarty_internal_templatelexer.plex | 771+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/lexer/smarty_internal_templateparser.y | 1329+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rlibs/smarty/Autoloader.php -> libs/smarty/libs/Autoloader.php | 0
Rlibs/smarty/Smarty.class.php -> libs/smarty/libs/Smarty.class.php | 0
Rlibs/smarty/SmartyBC.class.php -> libs/smarty/libs/SmartyBC.class.php | 0
Rlibs/smarty/debug.tpl -> libs/smarty/libs/debug.tpl | 0
Alibs/smarty/libs/plugins/block.textformat.php | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.counter.php | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.cycle.php | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.fetch.php | 221+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.html_checkboxes.php | 237+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.html_image.php | 163+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.html_options.php | 196+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.html_radios.php | 221+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.html_select_date.php | 387+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.html_select_time.php | 364+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.html_table.php | 176+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.mailto.php | 155+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/function.math.php | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifier.capitalize.php | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifier.date_format.php | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifier.debug_print_var.php | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifier.escape.php | 198+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifier.regex_replace.php | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifier.replace.php | 34++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifier.spacify.php | 27+++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifier.truncate.php | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.cat.php | 29+++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.count_characters.php | 32++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.count_paragraphs.php | 27+++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.count_sentences.php | 27+++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.count_words.php | 31+++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.default.php | 35+++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.escape.php | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.from_charset.php | 33+++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.indent.php | 33+++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.lower.php | 31+++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.noprint.php | 21+++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.string_format.php | 25+++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.strip.php | 33+++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.strip_tags.php | 29+++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.to_charset.php | 33+++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.unescape.php | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.upper.php | 29+++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/modifiercompiler.wordwrap.php | 47+++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/outputfilter.trimwhitespace.php | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/shared.escape_special_chars.php | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/shared.literal_compiler_param.php | 35+++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/shared.make_timestamp.php | 43+++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/shared.mb_str_replace.php | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/shared.mb_unicode.php | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/shared.mb_wordwrap.php | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibs/smarty/libs/plugins/variablefilter.htmlspecialchars.php | 19+++++++++++++++++++
Rlibs/smarty/sysplugins/smarty_cacheresource.php -> libs/smarty/libs/sysplugins/smarty_cacheresource.php | 0
Rlibs/smarty/sysplugins/smarty_cacheresource_custom.php -> libs/smarty/libs/sysplugins/smarty_cacheresource_custom.php | 0
Rlibs/smarty/sysplugins/smarty_cacheresource_keyvaluestore.php -> libs/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php | 0
Rlibs/smarty/sysplugins/smarty_data.php -> libs/smarty/libs/sysplugins/smarty_data.php | 0
Rlibs/smarty/sysplugins/smarty_internal_cacheresource_file.php -> libs/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_append.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_append.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_assign.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_assign.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_block.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_block.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_break.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_break.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_call.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_call.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_capture.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_capture.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_config_load.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_config_load.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_continue.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_continue.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_debug.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_debug.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_eval.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_eval.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_extends.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_extends.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_for.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_for.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_foreach.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_foreach.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_function.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_function.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_if.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_if.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_include.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_include.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_include_php.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_include_php.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_insert.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_insert.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_ldelim.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_nocache.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_nocache.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_private_block_plugin.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_private_function_plugin.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_private_modifier.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_private_object_block_function.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php | 0
Alibs/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rlibs/smarty/sysplugins/smarty_internal_compile_private_php.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_private_php.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_private_print_expression.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_private_registered_block.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_private_registered_function.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_private_special_variable.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_rdelim.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_section.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_section.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_setfilter.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compile_while.php -> libs/smarty/libs/sysplugins/smarty_internal_compile_while.php | 0
Rlibs/smarty/sysplugins/smarty_internal_compilebase.php -> libs/smarty/libs/sysplugins/smarty_internal_compilebase.php | 0
Rlibs/smarty/sysplugins/smarty_internal_config_file_compiler.php -> libs/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php | 0
Rlibs/smarty/sysplugins/smarty_internal_configfilelexer.php -> libs/smarty/libs/sysplugins/smarty_internal_configfilelexer.php | 0
Rlibs/smarty/sysplugins/smarty_internal_configfileparser.php -> libs/smarty/libs/sysplugins/smarty_internal_configfileparser.php | 0
Rlibs/smarty/sysplugins/smarty_internal_data.php -> libs/smarty/libs/sysplugins/smarty_internal_data.php | 0
Rlibs/smarty/sysplugins/smarty_internal_debug.php -> libs/smarty/libs/sysplugins/smarty_internal_debug.php | 0
Alibs/smarty/libs/sysplugins/smarty_internal_extension_codeframe.php | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rlibs/smarty/sysplugins/smarty_internal_extension_config.php -> libs/smarty/libs/sysplugins/smarty_internal_extension_config.php | 0
Alibs/smarty/libs/sysplugins/smarty_internal_extension_defaulttemplatehandler.php | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rlibs/smarty/sysplugins/smarty_internal_filter_handler.php -> libs/smarty/libs/sysplugins/smarty_internal_filter_handler.php | 0
Rlibs/smarty/sysplugins/smarty_internal_function_call_handler.php -> libs/smarty/libs/sysplugins/smarty_internal_function_call_handler.php | 0
Rlibs/smarty/sysplugins/smarty_internal_get_include_path.php -> libs/smarty/libs/sysplugins/smarty_internal_get_include_path.php | 0
Rlibs/smarty/sysplugins/smarty_internal_nocache_insert.php -> libs/smarty/libs/sysplugins/smarty_internal_nocache_insert.php | 0
Rlibs/smarty/sysplugins/smarty_internal_parsetree.php -> libs/smarty/libs/sysplugins/smarty_internal_parsetree.php | 0
Rlibs/smarty/sysplugins/smarty_internal_parsetree_code.php -> libs/smarty/libs/sysplugins/smarty_internal_parsetree_code.php | 0
Rlibs/smarty/sysplugins/smarty_internal_parsetree_dq.php -> libs/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php | 0
Rlibs/smarty/sysplugins/smarty_internal_parsetree_dqcontent.php -> libs/smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php | 0
Rlibs/smarty/sysplugins/smarty_internal_parsetree_tag.php -> libs/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php | 0
Rlibs/smarty/sysplugins/smarty_internal_parsetree_template.php -> libs/smarty/libs/sysplugins/smarty_internal_parsetree_template.php | 0
Rlibs/smarty/sysplugins/smarty_internal_parsetree_text.php -> libs/smarty/libs/sysplugins/smarty_internal_parsetree_text.php | 0
Rlibs/smarty/sysplugins/smarty_internal_resource_eval.php -> libs/smarty/libs/sysplugins/smarty_internal_resource_eval.php | 0
Rlibs/smarty/sysplugins/smarty_internal_resource_extends.php -> libs/smarty/libs/sysplugins/smarty_internal_resource_extends.php | 0
Rlibs/smarty/sysplugins/smarty_internal_resource_file.php -> libs/smarty/libs/sysplugins/smarty_internal_resource_file.php | 0
Rlibs/smarty/sysplugins/smarty_internal_resource_php.php -> libs/smarty/libs/sysplugins/smarty_internal_resource_php.php | 0
Rlibs/smarty/sysplugins/smarty_internal_resource_registered.php -> libs/smarty/libs/sysplugins/smarty_internal_resource_registered.php | 0
Rlibs/smarty/sysplugins/smarty_internal_resource_stream.php -> libs/smarty/libs/sysplugins/smarty_internal_resource_stream.php | 0
Rlibs/smarty/sysplugins/smarty_internal_resource_string.php -> libs/smarty/libs/sysplugins/smarty_internal_resource_string.php | 0
Rlibs/smarty/sysplugins/smarty_internal_smartytemplatecompiler.php -> libs/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php | 0
Rlibs/smarty/sysplugins/smarty_internal_template.php -> libs/smarty/libs/sysplugins/smarty_internal_template.php | 0
Rlibs/smarty/sysplugins/smarty_internal_templatebase.php -> libs/smarty/libs/sysplugins/smarty_internal_templatebase.php | 0
Rlibs/smarty/sysplugins/smarty_internal_templatecompilerbase.php -> libs/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php | 0
Alibs/smarty/libs/sysplugins/smarty_internal_templatelexer.php | 1369+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rlibs/smarty/sysplugins/smarty_internal_templateparser.php -> libs/smarty/libs/sysplugins/smarty_internal_templateparser.php | 0
Rlibs/smarty/sysplugins/smarty_internal_testinstall.php -> libs/smarty/libs/sysplugins/smarty_internal_testinstall.php | 0
Rlibs/smarty/sysplugins/smarty_internal_utility.php -> libs/smarty/libs/sysplugins/smarty_internal_utility.php | 0
Rlibs/smarty/sysplugins/smarty_internal_write_file.php -> libs/smarty/libs/sysplugins/smarty_internal_write_file.php | 0
Rlibs/smarty/sysplugins/smarty_resource.php -> libs/smarty/libs/sysplugins/smarty_resource.php | 0
Rlibs/smarty/sysplugins/smarty_resource_custom.php -> libs/smarty/libs/sysplugins/smarty_resource_custom.php | 0
Rlibs/smarty/sysplugins/smarty_resource_recompiled.php -> libs/smarty/libs/sysplugins/smarty_resource_recompiled.php | 0
Rlibs/smarty/sysplugins/smarty_resource_uncompiled.php -> libs/smarty/libs/sysplugins/smarty_resource_uncompiled.php | 0
Rlibs/smarty/sysplugins/smarty_security.php -> libs/smarty/libs/sysplugins/smarty_security.php | 0
Rlibs/smarty/sysplugins/smarty_template_cached.php -> libs/smarty/libs/sysplugins/smarty_template_cached.php | 0
Rlibs/smarty/sysplugins/smarty_template_compiled.php -> libs/smarty/libs/sysplugins/smarty_template_compiled.php | 0
Rlibs/smarty/sysplugins/smarty_template_config.php -> libs/smarty/libs/sysplugins/smarty_template_config.php | 0
Rlibs/smarty/sysplugins/smarty_template_source.php -> libs/smarty/libs/sysplugins/smarty_template_source.php | 0
Rlibs/smarty/sysplugins/smarty_undefined_variable.php -> libs/smarty/libs/sysplugins/smarty_undefined_variable.php | 0
Rlibs/smarty/sysplugins/smarty_variable.php -> libs/smarty/libs/sysplugins/smarty_variable.php | 0
Rlibs/smarty/sysplugins/smartycompilerexception.php -> libs/smarty/libs/sysplugins/smartycompilerexception.php | 0
Rlibs/smarty/sysplugins/smartyexception.php -> libs/smarty/libs/sysplugins/smartyexception.php | 0
Dlibs/smarty/sysplugins/smarty_internal_extension_codeframe.php | 127-------------------------------------------------------------------------------
Dlibs/smarty/sysplugins/smarty_internal_extension_defaulttemplatehandler.php | 85-------------------------------------------------------------------------------
Dlibs/smarty/sysplugins/smarty_internal_templatelexer.php | 1368-------------------------------------------------------------------------------
Mnodes/nodesFFFL.json | 2++
Av3.1.27.zip | 0
174 files changed, 13818 insertions(+), 1580 deletions(-)

diff --git a/libaries b/libaries @@ -1,2 +1,4 @@ design: https://github.com/FezVrasta/bootstrap-material-design php-ssh: https://github.com/Herzult/php-ssh + +Smarty +\ No newline at end of file diff --git a/libs/php-ssh/.noninteractive b/libs/php-ssh/.noninteractive diff --git a/libs/smarty/COMPOSER_RELEASE_NOTES.txt b/libs/smarty/COMPOSER_RELEASE_NOTES.txt @@ -0,0 +1,29 @@ + + +Starting with Smarty 3.1.21 Composer has been configured to load the packages from github. + +******************************************************************************* +* * +* NOTE: Because of this change you must clear your local composer cache with * +* the "composer clearcache" command * +* * +******************************************************************************* + +To get the latest stable version use + "require": { + "smarty/smarty": "~3.1" + } +in your composer.json file. + +To get the trunk version use + "require": { + "smarty/smarty": "~3.1@dev" + } + +The "smarty/smarty" package will start at libs/.... subfolder. + +To retrieve the development and documentation folders add + "require-dev": { + "smarty/smarty-dev": "~3.1@dev" + } + diff --git a/libs/smarty/COPYING.lib b/libs/smarty/COPYING.lib @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. +\ No newline at end of file diff --git a/libs/smarty/INHERITANCE_RELEASE_NOTES.txt b/libs/smarty/INHERITANCE_RELEASE_NOTES.txt @@ -0,0 +1,35 @@ +In Smarty 3.1 template inheritance is a compile time process. All the extending of {block} tags +is done at compile time and the parent and child templates are compiled in a single compiled template. +{include} subtemplate could also {block} tags. Such subtemplate could not compiled by it's own because +it could be used in other context where the {block} extended with a different result. For that reasion +the compiled code of {include} subtemplates gets also merged in compiled inheritance template. + +Merging the code into a single compile template has some drawbacks. +1. You could not use variable file names in {include} Smarty would use the {include} of compilation time. +2. You could not use individual compile_id in {include} +3. Seperate caching of subtemplate was not possible +4. Any change of the template directory structure between calls was not necessarily seen. + +Starting with 3.1.15 some of the above conditions got checked and resulted in an exception. It turned out +that a couple of users did use some of above and now got exceptions. + +To resolve this starting with 3.1.16 there is a new configuration parameter $inheritance_merge_compiled_includes. +For most backward compatibility its default setting is true. +With this setting all {include} subtemplate will be merge into the compiled inheritance template, but the above cases +could be rejected by exception. + + +If $smarty->inheritance_merge_compiled_includes = false; {include} subtemplate will not be merged. +You must now manually merge all {include} subtemplate which do contain {block} tags. This is done by setting the "inline" option. +{include file='foo.bar' inline} + +1. In case of a variable file name like {include file=$foo inline} you must use the variable in a compile_id $smarty->compile_id = $foo; +2. If you use individual compile_id in {include file='foo.tpl' compile_id=$bar inline} it must be used in the + global compile_id as well $smarty->compile_id = $bar; +3. If call templates with different template_dir configurations and a parent could same named child template from different folders + you must make the folder name part of the compile_id. + + +In the upcomming major release Smarty 3.2 inheritance will no longer be a compile time process. +All restrictions will be then removed. + diff --git a/libs/smarty/NEW_FEATURES.txt b/libs/smarty/NEW_FEATURES.txt @@ -0,0 +1,86 @@ + + +This file contains a brief description of new features which have been added to Smarty 3.1 + +Smarty 3.1.22 + + Namespace support within templates + ================================== + Within templates you can now use namespace specifications on: + - Constants like foo\bar\FOO + - Class names like foo\bar\Baz::FOO, foo\bar\Baz::$foo, foo\bar\Baz::foo() + - PHP function names like foo\bar\baz() + + Security + ======== + - disable special $smarty variable - + The Smarty_Security class has the new property $disabled_special_smarty_vars. + It's an array which can be loaded with the $smarty special variable names like + 'template_object', 'template', 'current_dir' and others which will be disabled. + Note: That this security check is performed at compile time. + + - limit template nesting - + Property $max_template_nesting of Smarty_Security does set the maximum template nesting level. + The main template is level 1. The nesting level is checked at run time. When the maximum will be exceeded + an Exception will be thrown. The default setting is 0 which does disable this check. + + - trusted static methods - + The Smarty_Security class has the new property $trusted_static_methods to restrict access to static methods. + It's an nested array of trusted class and method names. + Format: + array ( + 'class_1' => array('method_1', 'method_2'), // allowed methods + 'class_2' => array(), // all methods of class allowed + ) + To disable access for all methods of all classes set $trusted_static_methods = null; + The default value is an empty array() which does enables all methods of all classes, but for backward compatibility + the setting of $static_classes will be checked. + Note: That this security check is performed at compile time. + + - trusted static properties - + The Smarty_Security class has the new property $trusted_static_properties to restrict access to static properties. + It's an nested array of trusted class and property names. + Format: + array ( + 'class_1' => array('prop_1', 'prop_2'), // allowed properties listed + 'class_2' => array(), // all properties of class allowed + } + To disable access for all properties of all classes set $trusted_static_properties = null; + The default value is an empty array() which does enables all properties of all classes, but for backward compatibility + the setting of $static_classes will be checked. + Note: That this security check is performed at compile time. + + - trusted constants . + The Smarty_Security class has the new property $trusted_constants to restrict access to constants. + It's an array of trusted constant names. + Format: + array ( + 'SMARTY_DIR' , // allowed constant + } + If the array is empty (default) the usage of constants can be controlled with the + Smarty_Security::$allow_constants property (default true) + + + + Compiled Templates + ================== + Smarty does now automatically detects a change of the $merge_compiled_includes and $escape_html + property and creates different compiled templates files depending on the setting. + + Same applies to config files and the $config_overwrite, $config_booleanize and + $config_read_hidden properties. + + Debugging + ========= + The layout of the debug window has been changed for better readability + + New class constants + Smarty::DEBUG_OFF + Smarty::DEBUG_ON + Smarty::DEBUG_INDIVIDUAL + have been introduced for setting the $debugging property. + + Smarty::DEBUG_INDIVIDUAL will create for each display() and fetch() call an individual gebug window. + + . + +\ No newline at end of file diff --git a/libs/smarty/README b/libs/smarty/README @@ -0,0 +1,574 @@ +Smarty 3.x + +Author: Monte Ohrt <monte at ohrt dot com > +Author: Uwe Tews + +AN INTRODUCTION TO SMARTY 3 + +NOTICE FOR 3.1 release: + +Please see the SMARTY_3.1_NOTES.txt file that comes with the distribution. + +NOTICE for 3.0.5 release: + +Smarty now follows the PHP error_reporting level by default. If PHP does not mask E_NOTICE and you try to access an unset template variable, you will now get an E_NOTICE warning. To revert to the old behavior: + +$smarty->error_reporting = E_ALL & ~E_NOTICE; + +NOTICE for 3.0 release: + +IMPORTANT: Some API adjustments have been made between the RC4 and 3.0 release. +We felt it is better to make these now instead of after a 3.0 release, then have to +immediately deprecate APIs in 3.1. Online documentation has been updated +to reflect these changes. Specifically: + +---- API CHANGES RC4 -> 3.0 ---- + +$smarty->register->* +$smarty->unregister->* +$smarty->utility->* +$samrty->cache->* + +Have all been changed to local method calls such as: + +$smarty->clearAllCache() +$smarty->registerFoo() +$smarty->unregisterFoo() +$smarty->testInstall() +etc. + +Registration of function, block, compiler, and modifier plugins have been +consolidated under two API calls: + +$smarty->registerPlugin(...) +$smarty->unregisterPlugin(...) + +Registration of pre, post, output and variable filters have been +consolidated under two API calls: + +$smarty->registerFilter(...) +$smarty->unregisterFilter(...) + +Please refer to the online documentation for all specific changes: + +http://www.smarty.net/documentation + +---- + +The Smarty 3 API has been refactored to a syntax geared +for consistency and modularity. The Smarty 2 API syntax is still supported, but +will throw a deprecation notice. You can disable the notices, but it is highly +recommended to adjust your syntax to Smarty 3, as the Smarty 2 syntax must run +through an extra rerouting wrapper. + +Basically, all Smarty methods now follow the "fooBarBaz" camel case syntax. Also, +all Smarty properties now have getters and setters. So for example, the property +$smarty->cache_dir can be set with $smarty->setCacheDir('foo/') and can be +retrieved with $smarty->getCacheDir(). + +Some of the Smarty 3 APIs have been revoked such as the "is*" methods that were +just duplicate functions of the now available "get*" methods. + +Here is a rundown of the Smarty 3 API: + +$smarty->fetch($template, $cache_id = null, $compile_id = null, $parent = null) +$smarty->display($template, $cache_id = null, $compile_id = null, $parent = null) +$smarty->isCached($template, $cache_id = null, $compile_id = null) +$smarty->createData($parent = null) +$smarty->createTemplate($template, $cache_id = null, $compile_id = null, $parent = null) +$smarty->enableSecurity() +$smarty->disableSecurity() +$smarty->setTemplateDir($template_dir) +$smarty->addTemplateDir($template_dir) +$smarty->templateExists($resource_name) +$smarty->loadPlugin($plugin_name, $check = true) +$smarty->loadFilter($type, $name) +$smarty->setExceptionHandler($handler) +$smarty->addPluginsDir($plugins_dir) +$smarty->getGlobal($varname = null) +$smarty->getRegisteredObject($name) +$smarty->getDebugTemplate() +$smarty->setDebugTemplate($tpl_name) +$smarty->assign($tpl_var, $value = null, $nocache = false) +$smarty->assignGlobal($varname, $value = null, $nocache = false) +$smarty->assignByRef($tpl_var, &$value, $nocache = false) +$smarty->append($tpl_var, $value = null, $merge = false, $nocache = false) +$smarty->appendByRef($tpl_var, &$value, $merge = false) +$smarty->clearAssign($tpl_var) +$smarty->clearAllAssign() +$smarty->configLoad($config_file, $sections = null) +$smarty->getVariable($variable, $_ptr = null, $search_parents = true, $error_enable = true) +$smarty->getConfigVariable($variable) +$smarty->getStreamVariable($variable) +$smarty->getConfigVars($varname = null) +$smarty->clearConfig($varname = null) +$smarty->getTemplateVars($varname = null, $_ptr = null, $search_parents = true) +$smarty->clearAllCache($exp_time = null, $type = null) +$smarty->clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null) + +$smarty->registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = array()) + +$smarty->registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) + +$smarty->registerFilter($type, $function_name) +$smarty->registerResource($resource_type, $function_names) +$smarty->registerDefaultPluginHandler($function_name) +$smarty->registerDefaultTemplateHandler($function_name) + +$smarty->unregisterPlugin($type, $tag) +$smarty->unregisterObject($object_name) +$smarty->unregisterFilter($type, $function_name) +$smarty->unregisterResource($resource_type) + +$smarty->compileAllTemplates($extension = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null) +$smarty->clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) +$smarty->testInstall() + +// then all the getters/setters, available for all properties. Here are a few: + +$caching = $smarty->getCaching(); // get $smarty->caching +$smarty->setCaching(true); // set $smarty->caching +$smarty->setDeprecationNotices(false); // set $smarty->deprecation_notices +$smarty->setCacheId($id); // set $smarty->cache_id +$debugging = $smarty->getDebugging(); // get $smarty->debugging + + +FILE STRUCTURE + +The Smarty 3 file structure is similar to Smarty 2: + +/libs/ + Smarty.class.php +/libs/sysplugins/ + internal.* +/libs/plugins/ + function.mailto.php + modifier.escape.php + ... + +A lot of Smarty 3 core functionality lies in the sysplugins directory; you do +not need to change any files here. The /libs/plugins/ folder is where Smarty +plugins are located. You can add your own here, or create a separate plugin +directory, just the same as Smarty 2. You will still need to create your own +/cache/, /templates/, /templates_c/, /configs/ folders. Be sure /cache/ and +/templates_c/ are writable. + +The typical way to use Smarty 3 should also look familiar: + +require('Smarty.class.php'); +$smarty = new Smarty; +$smarty->assign('foo','bar'); +$smarty->display('index.tpl'); + + +However, Smarty 3 works completely different on the inside. Smarty 3 is mostly +backward compatible with Smarty 2, except for the following items: + +*) Smarty 3 is PHP 5 only. It will not work with PHP 4. +*) The {php} tag is disabled by default. Enable with $smarty->allow_php_tag=true. +*) Delimiters surrounded by whitespace are no longer treated as Smarty tags. + Therefore, { foo } will not compile as a tag, you must use {foo}. This change + Makes Javascript/CSS easier to work with, eliminating the need for {literal}. + This can be disabled by setting $smarty->auto_literal = false; +*) The Smarty 3 API is a bit different. Many Smarty 2 API calls are deprecated + but still work. You will want to update your calls to Smarty 3 for maximum + efficiency. + + +There are many things that are new to Smarty 3. Here are the notable items: + +LEXER/PARSER +============ + +Smarty 3 now uses a lexing tokenizer for its parser/compiler. Basically, this +means Smarty has some syntax additions that make life easier such as in-template +math, shorter/intuitive function parameter options, infinite function recursion, +more accurate error handling, etc. + + +WHAT IS NEW IN SMARTY TEMPLATE SYNTAX +===================================== + +Smarty 3 allows expressions almost anywhere. Expressions can include PHP +functions as long as they are not disabled by the security policy, object +methods and properties, etc. The {math} plugin is no longer necessary but +is still supported for BC. + +Examples: +{$x+$y} will output the sum of x and y. +{$foo = strlen($bar)} function in assignment +{assign var=foo value= $x+$y} in attributes +{$foo = myfunct( ($x+$y)*3 )} as function parameter +{$foo[$x+3]} as array index + +Smarty tags can be used as values within other tags. +Example: {$foo={counter}+3} + +Smarty tags can also be used inside double quoted strings. +Example: {$foo="this is message {counter}"} + +You can define arrays within templates. +Examples: +{assign var=foo value=[1,2,3]} +{assign var=foo value=['y'=>'yellow','b'=>'blue']} +Arrays can be nested. +{assign var=foo value=[1,[9,8],3]} + +There is a new short syntax supported for assigning variables. +Example: {$foo=$bar+2} + +You can assign a value to a specific array element. If the variable exists but +is not an array, it is converted to an array before the new values are assigned. +Examples: +{$foo['bar']=1} +{$foo['bar']['blar']=1} + +You can append values to an array. If the variable exists but is not an array, +it is converted to an array before the new values are assigned. +Example: {$foo[]=1} + +You can use a PHP-like syntax for accessing array elements, as well as the +original "dot" notation. +Examples: +{$foo[1]} normal access +{$foo['bar']} +{$foo['bar'][1]} +{$foo[$x+$x]} index may contain any expression +{$foo[$bar[1]]} nested index +{$foo[section_name]} smarty section access, not array access! + +The original "dot" notation stays, and with improvements. +Examples: +{$foo.a.b.c} => $foo['a']['b']['c'] +{$foo.a.$b.c} => $foo['a'][$b]['c'] with variable index +{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] with expression as index +{$foo.a.{$b.c}} => $foo['a'][$b['c']] with nested index + +note that { and } are used to address ambiguties when nesting the dot syntax. + +Variable names themselves can be variable and contain expressions. +Examples: +$foo normal variable +$foo_{$bar} variable name containing other variable +$foo_{$x+$y} variable name containing expressions +$foo_{$bar}_buh_{$blar} variable name with multiple segments +{$foo_{$x}} will output the variable $foo_1 if $x has a value of 1. + +Object method chaining is implemented. +Example: {$object->method1($x)->method2($y)} + +{for} tag added for looping (replacement for {section} tag): +{for $x=0, $y=count($foo); $x<$y; $x++} .... {/for} +Any number of statements can be used separated by comma as the first +inital expression at {for}. + +{for $x = $start to $end step $step} ... {/for}is in the SVN now . +You can use also +{for $x = $start to $end} ... {/for} +In this case the step value will be automaticall 1 or -1 depending on the start and end values. +Instead of $start and $end you can use any valid expression. +Inside the loop the following special vars can be accessed: +$x@iteration = number of iteration +$x@total = total number of iterations +$x@first = true on first iteration +$x@last = true on last iteration + + +The Smarty 2 {section} syntax is still supported. + +New shorter {foreach} syntax to loop over an array. +Example: {foreach $myarray as $var}...{/foreach} + +Within the foreach loop, properties are access via: + +$var@key foreach $var array key +$var@iteration foreach current iteration count (1,2,3...) +$var@index foreach current index count (0,1,2...) +$var@total foreach $var array total +$var@first true on first iteration +$var@last true on last iteration + +The Smarty 2 {foreach} tag syntax is still supported. + +NOTE: {$bar[foo]} still indicates a variable inside of a {section} named foo. +If you want to access an array element with index foo, you must use quotes +such as {$bar['foo']}, or use the dot syntax {$bar.foo}. + +while block tag is now implemented: +{while $foo}...{/while} +{while $x lt 10}...{/while} + +Direct access to PHP functions: +Just as you can use PHP functions as modifiers directly, you can now access +PHP functions directly, provided they are permitted by security settings: +{time()} + +There is a new {function}...{/function} block tag to implement a template function. +This enables reuse of code sequences like a plugin function. It can call itself recursively. +Template function must be called with the new {call name=foo...} tag. + +Example: + +Template file: +{function name=menu level=0} + <ul class="level{$level}"> + {foreach $data as $entry} + {if is_array($entry)} + <li>{$entry@key}</li> + {call name=menu data=$entry level=$level+1} + {else} + <li>{$entry}</li> + {/if} + {/foreach} + </ul> +{/function} + +{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' => + ['item3-3-1','item3-3-2']],'item4']} + +{call name=menu data=$menu} + + +Generated output: + * item1 + * item2 + * item3 + o item3-1 + o item3-2 + o item3-3 + + item3-3-1 + + item3-3-2 + * item4 + +The function tag itself must have the "name" attribute. This name is the tag +name when calling the function. The function tag may have any number of +additional attributes. These will be default settings for local variables. + +New {nocache} block function: +{nocache}...{/nocache} will declare a section of the template to be non-cached +when template caching is enabled. + +New nocache attribute: +You can declare variable/function output as non-cached with the nocache attribute. +Examples: + +{$foo nocache=true} +{$foo nocache} /* same */ + +{foo bar="baz" nocache=true} +{foo bar="baz" nocache} /* same */ + +{time() nocache=true} +{time() nocache} /* same */ + +Or you can also assign the variable in your script as nocache: +$smarty->assign('foo',$something,true); // third param is nocache setting +{$foo} /* non-cached */ + +$smarty.current_dir returns the directory name of the current template. + +You can use strings directly as templates with the "string" resource type. +Examples: +$smarty->display('string:This is my template, {$foo}!'); // php +{include file="string:This is my template, {$foo}!"} // template + + + +VARIABLE SCOPE / VARIABLE STORAGE +================================= + +In Smarty 2, all assigned variables were stored within the Smarty object. +Therefore, all variables assigned in PHP were accessible by all subsequent +fetch and display template calls. + +In Smarty 3, we have the choice to assign variables to the main Smarty object, +to user-created data objects, and to user-created template objects. +These objects can be chained. The object at the end of a chain can access all +variables belonging to that template and all variables within the parent objects. +The Smarty object can only be the root of a chain, but a chain can be isolated +from the Smarty object. + +All known Smarty assignment interfaces will work on the data and template objects. + +Besides the above mentioned objects, there is also a special storage area for +global variables. + +A Smarty data object can be created as follows: +$data = $smarty->createData(); // create root data object +$data->assign('foo','bar'); // assign variables as usual +$data->config_load('my.conf'); // load config file + +$data= $smarty->createData($smarty); // create data object having a parent link to +the Smarty object + +$data2= $smarty->createData($data); // create data object having a parent link to +the $data data object + +A template object can be created by using the createTemplate method. It has the +same parameter assignments as the fetch() or display() method. +Function definition: +function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null) + +The first parameter can be a template name, a smarty object or a data object. + +Examples: +$tpl = $smarty->createTemplate('mytpl.tpl'); // create template object not linked to any parent +$tpl->assign('foo','bar'); // directly assign variables +$tpl->config_load('my.conf'); // load config file + +$tpl = $smarty->createTemplate('mytpl.tpl',$smarty); // create template having a parent link to the Smarty object +$tpl = $smarty->createTemplate('mytpl.tpl',$data); // create template having a parent link to the $data object + +The standard fetch() and display() methods will implicitly create a template object. +If the $parent parameter is not specified in these method calls, the template object +is will link back to the Smarty object as it's parent. + +If a template is called by an {include...} tag from another template, the +subtemplate links back to the calling template as it's parent. + +All variables assigned locally or from a parent template are accessible. If the +template creates or modifies a variable by using the {assign var=foo...} or +{$foo=...} tags, these new values are only known locally (local scope). When the +template exits, none of the new variables or modifications can be seen in the +parent template(s). This is same behavior as in Smarty 2. + +With Smarty 3, we can assign variables with a scope attribute which allows the +availablility of these new variables or modifications globally (ie in the parent +templates.) + +Possible scopes are local, parent, root and global. +Examples: +{assign var=foo value='bar'} // no scope is specified, the default 'local' +{$foo='bar'} // same, local scope +{assign var=foo value='bar' scope='local'} // same, local scope + +{assign var=foo value='bar' scope='parent'} // Values will be available to the parent object +{$foo='bar' scope='parent'} // (normally the calling template) + +{assign var=foo value='bar' scope='root'} // Values will be exported up to the root object, so they can +{$foo='bar' scope='root'} // be seen from all templates using the same root. + +{assign var=foo value='bar' scope='global'} // Values will be exported to global variable storage, +{$foo='bar' scope='global'} // they are available to any and all templates. + + +The scope attribute can also be attached to the {include...} tag. In this case, +the specified scope will be the default scope for all assignments within the +included template. + + +PLUGINS +======= + +Smarty3 are following the same coding rules as in Smarty2. +The only difference is that the template object is passed as additional third parameter. + +smarty_plugintype_name (array $params, object $smarty, object $template) + +The Smarty 2 plugins are still compatible as long as they do not make use of specific Smarty2 internals. + + +TEMPLATE INHERITANCE: +===================== + +With template inheritance you can define blocks, which are areas that can be +overriden by child templates, so your templates could look like this: + +parent.tpl: +<html> + <head> + <title>{block name='title'}My site name{/block}</title> + </head> + <body> + <h1>{block name='page-title'}Default page title{/block}</h1> + <div id="content"> + {block name='content'} + Default content + {/block} + </div> + </body> +</html> + +child.tpl: +{extends file='parent.tpl'} +{block name='title'} +Child title +{/block} + +grandchild.tpl: +{extends file='child.tpl'} +{block name='title'}Home - {$smarty.block.parent}{/block} +{block name='page-title'}My home{/block} +{block name='content'} + {foreach $images as $img} + <img src="{$img.url}" alt="{$img.description}" /> + {/foreach} +{/block} + +We redefined all the blocks here, however in the title block we used {$smarty.block.parent}, +which tells Smarty to insert the default content from the parent template in its place. +The content block was overriden to display the image files, and page-title has also be +overriden to display a completely different title. + +If we render grandchild.tpl we will get this: +<html> + <head> + <title>Home - Child title</title> + </head> + <body> + <h1>My home</h1> + <div id="content"> + <img src="/example.jpg" alt="image" /> + <img src="/example2.jpg" alt="image" /> + <img src="/example3.jpg" alt="image" /> + </div> + </body> +</html> + +NOTE: In the child templates everything outside the {extends} or {block} tag sections +is ignored. + +The inheritance tree can be as big as you want (meaning you can extend a file that +extends another one that extends another one and so on..), but be aware that all files +have to be checked for modifications at runtime so the more inheritance the more overhead you add. + +Instead of defining the parent/child relationships with the {extends} tag in the child template you +can use the resource as follow: + +$smarty->display('extends:parent.tpl|child.tpl|grandchild.tpl'); + +Child {block} tags may optionally have a append or prepend attribute. In this case the parent block content +is appended or prepended to the child block content. + +{block name='title' append} My title {/block} + + +PHP STREAMS: +============ + +(see online documentation) + +VARIBLE FILTERS: +================ + +(see online documentation) + + +STATIC CLASS ACCESS AND NAMESPACE SUPPORT +========================================= + +You can register a class with optional namespace for the use in the template like: + +$smarty->register->templateClass('foo','name\name2\myclass'); + +In the template you can use it like this: +{foo::method()} etc. + + +======================= + +Please look through it and send any questions/suggestions/etc to the forums. + +http://www.phpinsider.com/smarty-forum/viewtopic.php?t=14168 + +Monte and Uwe diff --git a/libs/smarty/README.md b/libs/smarty/README.md @@ -0,0 +1,52 @@ +#Smarty 3 template engine +##Distribution repository + +*Read the NEW_FEATURES file for recent extensions to Smarty 3.1 functionality* + +Smarty versions 3.1.11 or later are now on github and can be installed with Composer. + + +The "smarty/smarty" package will start at libs/.... subfolder. + +To get the latest stable version of Smarty 3.1 use + + "require": { + "smarty/smarty": "~3.1" + } + +in your composer.json file. + + To get the trunk version use + + "require": { + "smarty/smarty": "~3.1@dev" + } + +For a specific version use something like + + "require": { + "smarty/smarty": "3.1.19" + } + +PHPUnit test can be installed by corresponding composer entries like + + "require": { + "smarty/smarty-phpunit": "3.1.19" + } + +Similar applies for the lexer/parser generator + + "require": { + "smarty/smarty-lexer": "3.1.19" + } + +Or you could use + + "require": { + "smarty/smarty-dev": "3.1.19" + } + +Which is a wrapper to install all 3 packages + + +Composer can also be used for Smarty2 versions 2.6.24 to 2.6.28 diff --git a/libs/smarty/SMARTY_2_BC_NOTES.txt b/libs/smarty/SMARTY_2_BC_NOTES.txt @@ -0,0 +1,109 @@ += Known incompatibilities with Smarty 2 = + +== Syntax == + +Smarty 3 API has a new syntax. Much of the Smarty 2 syntax is supported +by a wrapper but deprecated. See the README that comes with Smarty 3 for more +information. + +The {$array|@mod} syntax has always been a bit confusing, where an "@" is required +to apply a modifier to an array instead of the individual elements. Normally you +always want the modifier to apply to the variable regardless of its type. In Smarty 3, +{$array|mod} and {$array|@mod} behave identical. It is safe to drop the "@" and the +modifier will still apply to the array. If you really want the modifier to apply to +each array element, you must loop the array in-template, or use a custom modifier that +supports array iteration. Most smarty functions already escape values where necessary +such as {html_options} + +== PHP Version == +Smarty 3 is PHP 5 only. It will not work with PHP 4. + +== {php} Tag == +The {php} tag is disabled by default. The use of {php} tags is +deprecated. It can be enabled with $smarty->allow_php_tag=true. + +But if you scatter PHP code which belongs together into several +{php} tags it may not work any longer. + +== Delimiters and whitespace == +Delimiters surrounded by whitespace are no longer treated as Smarty tags. +Therefore, { foo } will not compile as a tag, you must use {foo}. This change +Makes Javascript/CSS easier to work with, eliminating the need for {literal}. +This can be disabled by setting $smarty->auto_literal = false; + +== Unquoted Strings == +Smarty 2 was a bit more forgiving (and ambiguous) when it comes to unquoted strings +in parameters. Smarty3 is more restrictive. You can still pass strings without quotes +so long as they contain no special characters. (anything outside of A-Za-z0-9_) + +For example filename strings must be quoted +<source lang="smarty"> +{include file='path/foo.tpl'} +</source> + +== Extending the Smarty class == +Smarty 3 makes use of the __construct method for initialization. If you are extending +the Smarty class, its constructor is not called implicitly if the your child class defines +its own constructor. In order to run Smarty's constructor, a call to parent::__construct() +within your child constructor is required. + +<source lang="php"> +class MySmarty extends Smarty { + function __construct() { + parent::__construct(); + + // your initialization code goes here + + } +} +</source> + +== Autoloader == +Smarty 3 does register its own autoloader with spl_autoload_register. If your code has +an existing __autoload function then this function must be explicitly registered on +the __autoload stack. See http://us3.php.net/manual/en/function.spl-autoload-register.php +for further details. + +== Plugin Filenames == +Smarty 3 optionally supports the PHP spl_autoloader. The autoloader requires filenames +to be lower case. Because of this, Smarty plugin file names must also be lowercase. +In Smarty 2, mixed case file names did work. + +== Scope of Special Smarty Variables == +In Smarty 2 the special Smarty variables $smarty.section... and $smarty.foreach... +had global scope. If you had loops with the same name in subtemplates you could accidentally +overwrite values of parent template. + +In Smarty 3 these special Smarty variable have only local scope in the template which +is defining the loop. If you need their value in a subtemplate you have to pass them +as parameter. +<source lang="smarty"> +{include file='path/foo.tpl' index=$smarty.section.foo.index} +</source> + +== SMARTY_RESOURCE_CHAR_SET == +Smarty 3 sets the constant SMARTY_RESOURCE_CHAR_SET to utf-8 as default template charset. +This is now used also on modifiers like escape as default charset. If your templates use +other charsets make sure that you define the constant accordingly. Otherwise you may not +get any output. + +== newline at {if} tags == +A \n was added to the compiled code of the {if},{else},{elseif},{/if} tags to get output of newlines as expected by the template source. +If one of the {if} tags is at the line end you will now get a newline in the HTML output. + +== trigger_error() == +The API function trigger_error() has been removed because it did just map to PHP trigger_error. +However it's still included in the Smarty2 API wrapper. + +== Smarty constants == +The constants +SMARTY_PHP_PASSTHRU +SMARTY_PHP_QUOTE +SMARTY_PHP_REMOVE +SMARTY_PHP_ALLOW +have been replaced with class constants +Smarty::PHP_PASSTHRU +Smarty::PHP_QUOTE +Smarty::PHP_REMOVE +Smarty::PHP_ALLOW + diff --git a/libs/smarty/SMARTY_3.0_BC_NOTES.txt b/libs/smarty/SMARTY_3.0_BC_NOTES.txt @@ -0,0 +1,24 @@ +== Smarty2 backward compatibility == +All Smarty2 specific API functions and deprecated functionallity has been moved +to the SmartyBC class. + +== {php} Tag == +The {php} tag is no longer available in the standard Smarty calls. +The use of {php} tags is deprecated and only available in the SmartyBC class. + +== {include_php} Tag == +The {include_php} tag is no longer available in the standard Smarty calls. +The use of {include_php} tags is deprecated and only available in the SmartyBC class. + +== php template resource == +The support of the php template resource is removed. + +== $cache_dir, $compile_dir, $config_dir, $template_dir access == +The mentioned properties can't be accessed directly any longer. You must use +corresponding getter/setters like addConfigDir(), setConfigDir(), getConfigDir() + +== obsolete Smarty class properties == +The following no longer used properties are removed: +$allow_php_tag +$allow_php_template +$deprecation_notices +\ No newline at end of file diff --git a/libs/smarty/SMARTY_3.1_NOTES.txt b/libs/smarty/SMARTY_3.1_NOTES.txt @@ -0,0 +1,306 @@ +Smarty 3.1 Notes +================ + +Smarty 3.1 is a departure from 2.0 compatibility. Most notably, all +backward compatibility has been moved to a separate class file named +SmartyBC.class.php. If you require compatibility with 2.0, you will +need to use this class. + +Some differences from 3.0 are also present. 3.1 begins the journey of +requiring setters/getters for property access. So far this is only +implemented on the five directory properties: template_dir, +plugins_dir, configs_dir, compile_dir and cache_dir. These properties +are now protected, it is required to use the setters/getters instead. +That said, direct property access will still work, however slightly +slower since they will now fall through __set() and __get() and in +turn passed through the setter/getter methods. 3.2 will exhibit a full +list of setter/getter methods for all (currently) public properties, +so code-completion in your IDE will work as expected. + +There is absolutely no PHP allowed in templates any more. All +deprecated features of Smarty 2.0 are gone. Again, use the SmartyBC +class if you need any backward compatibility. + +Internal Changes + + Full UTF-8 Compatibility + +The plugins shipped with Smarty 3.1 have been rewritten to fully +support UTF-8 strings if Multibyte String is available. Without +MBString UTF-8 cannot be handled properly. For those rare cases where +templates themselves have to juggle encodings, the new modifiers +to_charset and from_charset may come in handy. + + Plugin API and Performance + +All Plugins (modifiers, functions, blocks, resources, +default_template_handlers, etc) are now receiving the +Smarty_Internal_Template instance, where they were supplied with the +Smarty instance in Smarty 3.0. *. As The Smarty_Internal_Template +mimics the behavior of Smarty, this API simplification should not +require any changes to custom plugins. + +The plugins shipped with Smarty 3.1 have been rewritten for better +performance. Most notably {html_select_date} and {html_select_time} +have been improved vastly. Performance aside, plugins have also been +reviewed and generalized in their API. {html_select_date} and +{html_select_time} now share almost all available options. + +The escape modifier now knows the $double_encode option, which will +prevent entities from being encoded again. + +The capitalize modifier now know the $lc_rest option, which makes sure +all letters following a captial letter are lower-cased. + +The count_sentences modifier now accepts (.?!) as +legitimate endings of a sentence - previously only (.) was +accepted + +The new unescape modifier is there to reverse the effects of the +escape modifier. This applies to the escape formats html, htmlall and +entity. + + default_template_handler_func + +The invocation of $smarty->$default_template_handler_func had to be +altered. Instead of a Smarty_Internal_Template, the fifth argument is +now provided with the Smarty instance. New footprint: + + +/** + * Default Template Handler + * + * called when Smarty's file: resource is unable to load a requested file + * + * @param string $type resource type (e.g. "file", "string", "eval", "resource") + * @param string $name resource name (e.g. "foo/bar.tpl") + * @param string &$content template's content + * @param integer &$modified template's modification time + * @param Smarty $smarty Smarty instance + * @return string|boolean path to file or boolean true if $content and $modified + * have been filled, boolean false if no default template + * could be loaded + */ +function default_template_handler_func($type, $name, &$content, &$modified, Smarty $smarty) { + if (false) { + // return corrected filepath + return "/tmp/some/foobar.tpl"; + } elseif (false) { + // return a template directly + $content = "the template source"; + $modified = time(); + return true; + } else { + // tell smarty that we failed + return false; + } +} + + Stuff done to the compiler + +Many performance improvements have happened internally. One notable +improvement is that all compiled templates are now handled as PHP +functions. This speeds up repeated templates tremendously, as each one +calls an (in-memory) PHP function instead of performing another file +include/scan. + +New Features + + Template syntax + + {block}..{/block} + +The {block} tag has a new hide option flag. It does suppress the block +content if no corresponding child block exists. +EXAMPLE: +parent.tpl +{block name=body hide} child content "{$smarty.block.child}" was +inserted {block} +In the above example the whole block will be suppressed if no child +block "body" is existing. + + {setfilter}..{/setfilter} + +The new {setfilter} block tag allows the definition of filters which +run on variable output. +SYNTAX: +{setfilter filter1|filter2|filter3....} +Smarty3 will lookup up matching filters in the following search order: +1. varibale filter plugin in plugins_dir. +2. a valid modifier. A modifier specification will also accept +additional parameter like filter2:'foo' +3. a PHP function +{/setfilter} will turn previous filter setting off again. +{setfilter} tags can be nested. +EXAMPLE: +{setfilter filter1} + {$foo} + {setfilter filter2} + {$bar} + {/setfilter} + {$buh} +{/setfilter} +{$blar} +In the above example filter1 will run on the output of $foo, filter2 +on $bar, filter1 again on $buh and no filter on $blar. +NOTES: +- {$foo nofilter} will suppress the filters +- These filters will run in addition to filters defined by +registerFilter('variable',...), autoLoadFilter('variable',...) and +defined default modifier. +- {setfilter} will effect only the current template, not included +subtemplates. + + Resource API + +Smarty 3.1 features a new approach to resource management. The +Smarty_Resource API allows simple, yet powerful integration of custom +resources for templates and configuration files. It offers simple +functions for loading data from a custom resource (e.g. database) as +well as define new template types adhering to the special +non-compiling (e,g, plain php) and non-compile-caching (e.g. eval: +resource type) resources. + +See demo/plugins/resource.mysql.php for an example custom database +resource. + +Note that old-fashioned registration of callbacks for resource +management has been deprecated but is still possible with SmartyBC. + + CacheResource API + +In line with the Resource API, the CacheResource API offers a more +comfortable handling of output-cache data. With the +Smarty_CacheResource_Custom accessing databases is made simple. With +the introduction of Smarty_CacheResource_KeyValueStore the +implementation of resources like memcache or APC became a no-brainer; +simple hash-based storage systems are now supporting hierarchical +output-caches. + +See demo/plugins/cacheresource.mysql.php for an example custom +database CacheResource. +See demo/plugins/cacheresource.memcache.php for an example custom +memcache CacheResource using the KeyValueStore helper. + +Note that old-fashioned registration of $cache_handler is not possible +anymore. As the functionality had not been ported to Smarty 3.0.x +properly, it has been dropped from 3.1 completely. + +Locking facilities have been implemented to avoid concurrent cache +generation. Enable cache locking by setting +$smarty->cache_locking = true; + + Relative Paths in Templates (File-Resource) + +As of Smarty 3.1 {include file="../foo.tpl"} and {include +file="./foo.tpl"} will resolve relative to the template they're in. +Relative paths are available with {include file="..."} and +{extends file="..."}. As $smarty->fetch('../foo.tpl') and +$smarty->fetch('./foo.tpl') cannot be relative to a template, an +exception is thrown. + + Addressing a specific $template_dir + +Smarty 3.1 introduces the $template_dir index notation. +$smarty->fetch('[foo]bar.tpl') and {include file="[foo]bar.tpl"} +require the template bar.tpl to be loaded from $template_dir['foo']; +Smarty::setTemplateDir() and Smarty::addTemplateDir() offer ways to +define indexes along with the actual directories. + + Mixing Resources in extends-Resource + +Taking the php extends: template resource one step further, it is now +possible to mix resources within an extends: call like +$smarty->fetch("extends:file:foo.tpl|db:bar.tpl"); + +To make eval: and string: resources available to the inheritance +chain, eval:base64:TPL_STRING and eval:urlencode:TPL_STRING have been +introduced. Supplying the base64 or urlencode flags will trigger +decoding the TPL_STRING in with either base64_decode() or urldecode(). + + extends-Resource in template inheritance + +Template based inheritance may now inherit from php's extends: +resource like {extends file="extends:foo.tpl|db:bar.tpl"}. + + New Smarty property escape_html + +$smarty->escape_html = true will autoescape all template variable +output by calling htmlspecialchars({$output}, ENT_QUOTES, +SMARTY_RESOURCE_CHAR_SET). +NOTE: +This is a compile time option. If you change the setting you must make +sure that the templates get recompiled. + + New option at Smarty property compile_check + +The automatic recompilation of modified templates can now be +controlled by the following settings: +$smarty->compile_check = COMPILECHECK_OFF (false) - template files +will not be checked +$smarty->compile_check = COMPILECHECK_ON (true) - template files will +always be checked +$smarty->compile_check = COMPILECHECK_CACHEMISS - template files will +be checked if caching is enabled and there is no existing cache file +or it has expired + + Automatic recompilation on Smarty version change + +Templates will now be automatically recompiled on Smarty version +changes to avoide incompatibillities in the compiled code. Compiled +template checked against the current setting of the SMARTY_VERSION +constant. + + default_config_handler_func() + +Analogous to the default_template_handler_func() +default_config_handler_func() has been introduced. + + default_plugin_handler_func() + +An optional default_plugin_handler_func() can be defined which gets called +by the compiler on tags which can't be resolved internally or by plugins. +The default_plugin_handler() can map tags to plugins on the fly. + +New getters/setters + +The following setters/getters will be part of the official +documentation, and will be strongly recommended. Direct property +access will still work for the foreseeable future... it will be +transparently routed through the setters/getters, and consequently a +bit slower. + +array|string getTemplateDir( [string $index] ) +replaces $smarty->template_dir; and $smarty->template_dir[$index]; +Smarty setTemplateDir( array|string $path ) +replaces $smarty->template_dir = "foo"; and $smarty->template_dir = +array("foo", "bar"); +Smarty addTemplateDir( array|string $path, [string $index]) +replaces $smarty->template_dir[] = "bar"; and +$smarty->template_dir[$index] = "bar"; + +array|string getConfigDir( [string $index] ) +replaces $smarty->config_dir; and $smarty->config_dir[$index]; +Smarty setConfigDir( array|string $path ) +replaces $smarty->config_dir = "foo"; and $smarty->config_dir = +array("foo", "bar"); +Smarty addConfigDir( array|string $path, [string $index]) +replaces $smarty->config_dir[] = "bar"; and +$smarty->config_dir[$index] = "bar"; + +array getPluginsDir() +replaces $smarty->plugins_dir; +Smarty setPluginsDir( array|string $path ) +replaces $smarty->plugins_dir = "foo"; +Smarty addPluginsDir( array|string $path ) +replaces $smarty->plugins_dir[] = "bar"; + +string getCompileDir() +replaces $smarty->compile_dir; +Smarty setCompileDir( string $path ) +replaces $smarty->compile_dir = "foo"; + +string getCacheDir() +replaces $smarty->cache_dir; +Smarty setCacheDir( string $path ) +replaces $smarty->cache_dir; diff --git a/libs/smarty/change_log.txt b/libs/smarty/change_log.txt @@ -0,0 +1,2649 @@ + ===== 3.1.27===== (18.06.2015) +18.06.2015 + - bugfix another update on file path normalization failed on path containing something like "/.foo/" https://github.com/smarty-php/smarty/issues/56 + + ===== 3.1.26===== (18.06.2015) +18.06.2015 + - bugfix file path normalization failed on path containing something like "/.foo/" https://github.com/smarty-php/smarty/issues/56 + +17.06.2015 + - bugfix calling a plugin with nocache option but no other attributes like {foo nocache} caused call to undefined function https://github.com/smarty-php/smarty/issues/55 + + ===== 3.1.25===== (15.06.2015) + 15.06.2015 + - optimization of smarty_cachereource_keyvaluestore.php code + + 14.06.2015 + - bugfix a relative sub template path could fail if template_dir path did contain /../ https://github.com/smarty-php/smarty/issues/50 + - optimization rework of path normalization + - bugfix an output tag with variable, modifier followed by an operator like {$foo|modifier+1} did fail https://github.com/smarty-php/smarty/issues/53 + + 13.06.2015 + - bugfix a custom cache resource using smarty_cachereource_keyvaluestore.php did fail if php.ini mbstring.func_overload = 2 (forum topic 25568) + + 11.06.2015 + - bugfix the lexer could hang on very large quoted strings (forum topic 25570) + + 08.06.2015 + - bugfix using {$foo} as array index like $bar.{$foo} or in double quoted string like "some {$foo} thing" failed https://github.com/smarty-php/smarty/issues/49 + + 04.06.2015 + - bugfix possible error message on unset() while compiling {block} tags https://github.com/smarty-php/smarty/issues/46 + + 01.06.2015 + - bugfix <?xml ... ?> including template variables broken since 3.1.22 https://github.com/smarty-php/smarty/issues/47 + + 27.05.2015 + - bugfix {include} with variable file name must not create by default individual cache file (since 3.1.22) https://github.com/smarty-php/smarty/issues/43 + + 24.05.2015 + - bugfix if condition string 'neq' broken due to a typo https://github.com/smarty-php/smarty/issues/42 + + ===== 3.1.24===== (23.05.2015) + 23.05.2015 + - improvement on php_handling to allow very large PHP sections, better error handling + - improvement allow extreme large comment sections (forum 25538) + + 21.05.2015 + - bugfix broken PHP 5.2 compatibility when compiling <?php tags https://github.com/smarty-php/smarty/issues/40 + - bugfix named {foreach} comparison like $smarty.foreach.foobar.index > 1 did compile into wrong code https://github.com/smarty-php/smarty/issues/41 + + 19.05.2015 + - bugfix compiler did overwrite existing variable value when setting the nocache attribute https://github.com/smarty-php/smarty/issues/39 + - bugfix output filter trimwhitespace could run into the pcre.backtrack_limit on large output (code.google issue 220) + - bugfix compiler could run into the pcre.backtrack_limit on larger comment or {php} tag sections (forum 25538) + + 18.05.2015 + - improvement introduce shortcuts in lexer/parser rules for most frequent terms for higher + compilation speed + + 16.05.2015 + - bugfix {php}{/php} did work just for single lines https://github.com/smarty-php/smarty/issues/33 + - improvement remove not needed ?><?php transitions from compiled code + - improvement reduce number of lexer tokens on operators and if conditions + - improvement higher compilation speed by modified lexer/parser generator at "smarty/smarty-lexer" + + 13.05.2015 + - improvement remove not needed ?><?php transitions from compiled code + - improvement of debugging: + - use fresh Smarty object to display the debug console because of possible problems when the Smarty + was extended or Smarty properties had been modified in the class source + - display Smarty version number + - Truncate lenght of Origin display and extend strin value display to 80 character + - bugfix in Smarty_Security 'nl2br' should be a trusted modifier, not PHP function (code.google issue 223) + + 12.05.2015 + - bugfix {$smarty.constant.TEST} did fail on undefined constant https://github.com/smarty-php/smarty/issues/28 + - bugfix access to undefined config variable like {#undef#} did fail https://github.com/smarty-php/smarty/issues/29 + - bugfix in nested {foreach} saved item attributes got overwritten https://github.com/smarty-php/smarty/issues/33 + + ===== 3.1.23 ===== (12.05.2015) + 12.05.2015 + - bugfix of smaller performance issue introduce in 3.1.22 when caching is enabled + - bugfix missig entry for smarty-temmplate-config in autoloader + + ===== 3.1.22 ===== tag was deleted because 3.1.22 did fail caused by the missing entry for smarty-temmplate-config in autoloader + 10.05.2015 + - bugfix custom cache resource did not observe compile_id and cache_id when $cache_locking == true + - bugfix cache lock was not handled correctly after timeout when $cache_locking == true + - improvement added constants for $debugging + + 07.05.2015 + - improvement of the debugging console. Read NEW_FEATURES.txt + - optimization of resource class loading + + 06.05.2015 + - bugfix in 3.1.22-dev cache resource must not be loaded for subtemplates + - bugfix/improvement in 3.1.22-dev cache locking did not work as expected + + 05.05.2015 + - optimization on cache update when main template is modified + - optimization move <?php ?> handling from parser to new compiler module + + 05.05.2015 + - bugfix code could be messed up when {tags} are used in multiple attributes https://github.com/smarty-php/smarty/issues/23 + + 04.05.2015 + - bugfix Smarty_Resource::parseResourceName incompatible with Google AppEngine (https://github.com/smarty-php/smarty/issues/22) + - improvement use is_file() checks to avoid errors suppressed by @ which could still cause problems (https://github.com/smarty-php/smarty/issues/24) + + 28.04.2015 + - bugfix plugins of merged subtemplates not loaded in 3.1.22-dev (forum topic 25508) 2nd fix + + 28.04.2015 + - bugfix plugins of merged subtemplates not loaded in 3.1.22-dev (forum topic 25508) + + 23.04.2015 + - bugfix a nocache template variable used as parameter at {insert} was by mistake cached + + 20.04.2015 + - bugfix at a template function containing nocache code a parmeter could overwrite a template variable of same name + + 27.03.2015 + - bugfix Smarty_Security->allow_constants=false; did also disable true, false and null (change of 16.03.2015) + - improvement added a whitelist for trusted constants to security Smarty_Security::$trusted_constants (forum topic 25471) + + 20.03.2015 + - bugfix make sure that function properties get saved only in compiled files containing the fuction definition {forum topic 25452} + - bugfix correct update of global variable values on exit of template functions. (reported under Smarty Developers) + + 16.03.2015 + - bugfix problems with {function}{/function} and {call} tags in different subtemplate cache files {forum topic 25452} + - bugfix Smarty_Security->allow_constants=false; did not disallow direct usage of defined constants like {SMARTY_DIR} {forum topic 25457} + - bugfix {block}{/block} tags did not work inside double quoted strings https://github.com/smarty-php/smarty/issues/18 + + + 15.03.2015 + - bugfix $smarty->compile_check must be restored before rendering of a just updated cache file {forum 25452} + + 14.03.2015 + - bugfix {nocache} {/nocache} tags corrupted code when used within a nocache section caused by a nocache template variable. + + - bugfix template functions defined with {function} in an included subtemplate could not be called in nocache + mode with {call... nocache} if the subtemplate had it's own cache file {forum 25452} + + 10.03.2015 + - bugfix {include ... nocache} whith variable file or compile_id attribute was not executed in nocache mode. + + 12.02.2015 + - bugfix multiple Smarty::fetch() of same template when $smarty->merge_compiled_includes = true; could cause function already defined error + + 11.02.2015 + - bugfix recursive {includes} did create E_NOTICE message when $smarty->merge_compiled_includes = true; (github issue #16) + + 22.01.2015 + - new feature security can now control access to static methods and properties + see also NEW_FEATURES.txt + + 21.01.2015 + - bugfix clearCompiledTemplates(), clearAll() and clear() could try to delete whole drive at wrong path permissions because realpath() fail (forum 25397) + - bugfix 'self::' and 'parent::' was interpreted in template syntax as static class + + 04.01.2015 + - push last weeks changes to github + + - different optimizations + - improvement automatically create different versions of compiled templates and config files depending + on property settings. + - optimization restructure template processing by moving code into classes it better belongs to + - optimization restructure config file processing + + 31.12.2014 + - bugfix use function_exists('mb_get_info') for setting Smarty::$_MBSTRING. + Function mb_split could be overloaded depending on php.ini mbstring.func_overload + + + 29.12.2014 + - new feature security can now limit the template nesting level by property $max_template_nesting + see also NEW_FEATURES.txt (forum 25370) + + 29.12.2014 + - new feature security can now disable special $smarty variables listed in property $disabled_special_smarty_vars + see also NEW_FEATURES.txt (forum 25370) + + 27.12.2014 + - bugfix clear internal _is_file_cache when plugins_dir was modified + + 13.12.2014 + - improvement optimization of lexer and parser resulting in a up to 30% higher compiling speed + + 11.12.2014 + - bugfix resolve parser ambiguity between constant print tag {CONST} and other smarty tags after change of 09.12.2014 + + 09.12.2014 + - bugfix variables $null, $true and $false did not work after the change of 12.11.2014 (forum 25342) + - bugfix call of template function by a variable name did not work after latest changes (forum 25342) + + 23.11.2014 + - bugfix a plugin with attached modifier could fail if the tag was immediately followed by another Smarty tag (since 3.1.21) (forum 25326) + + 13.11.2014 + - improvement move autoload code into Autoloader.php. Use Composer autoloader when possible + + 12.11.2014 + - new feature added support of namespaces to template code + + 08.11.2014 - 10.11.2014 + - bugfix subtemplate called in nocache mode could be called with wrong compile_id when it did change on one of the calling templates + - improvement add code of template functions called in nocache mode dynamically to cache file (related to bugfix of 01.11.2014) + - bugfix Debug Console did not include all data from merged compiled subtemplates + + 04.11.2014 + - new feature $smarty->debug = true; => overwrite existing Debug Console window (old behaviour) + $smarty->debug = 2; => individual Debug Console window by template name + + 03.11.2014 + - bugfix Debug Console did not show included subtemplates since 3.1.17 (forum 25301) + - bugfix Modifier debug_print_var did not limit recursion or prevent recursive object display at Debug Console + (ATTENTION: parameter order has changed to be able to specify maximum recursion) + - bugfix Debug consol did not include subtemplate information with $smarty->merge_compiled_includes = true + - improvement The template variables are no longer displayed as objects on the Debug Console + - improvement $smarty->createData($parent = null, $name = null) new optional name parameter for display at Debug Console + - addition of some hooks for future extension of Debug Console + + 01.11.2014 + - bugfix and enhancement on subtemplate {include} and template {function} tags. + * Calling a template which has a nocache section could fail if it was called from a cached and a not cached subtemplate. + * Calling the same subtemplate cached and not cached with the $smarty->merge_compiled_includes enabled could cause problems + * Many smaller related changes + + 30.10.2014 + - bugfix access to class constant by object like {$object::CONST} or variable class name {$class::CONST} did not work (forum 25301) + + 26.10.2014 + - bugfix E_NOTICE message was created during compilation when ASP tags '<%' or '%>' are in template source text + - bugfix merge_compiled_includes option failed when caching enables and same subtemplate was included cached and not cached + + ===== 3.1.21 ===== (18.10.2014) + 18.10.2014 + - composer moved to github + + 17.10.2014 + - bugfix on $php_handling security and optimization of smarty_internal_parsetree (Thue Kristensen) + + 16.10.2014 + - bugfix composer.json update + + 15.10.2014 + - bugfix calling a new created cache file with fetch() and Smarty::CACHING_LIFETIME_SAVED multiple times did fail (forum 22350) + + 14.10.2014 + - bugfix any tag placed within "<script language=php>" will throw a security exception to close all thinkable holes + - bugfix classmap in root composer.json should start at "libs/..." + - improvement cache is_file(file_exists) results of loadPlugin() to avoid unnecessary calls during compilation (Issue 201} + + 12.10.2014 + - bugfix a comment like "<script{*foo*} language=php>" bypassed $php_handling checking (Thue Kristensen) + - bugfix change of 08.10.2014 could create E_NOTICE meassage when using "<?php" tags + - bugfix "<script language=php>" with $php_handling PHP_PASSTHRU was executed in {nocache} sections + + ===== 3.1.20 ===== (09.10.2014) + 08.10.2014 + - bugfix security mode of "<script language=php>" must be controlled by $php_handling property (Thue Kristensen) + + 01.10.2014 + - bugfix template resource of inheritance blocks could get invalid if the default resource type is not 'file'(Issue 202) + - bugfix existing child {block} tag must override parent {block} tag append / prepend setting (topic 25259) + + 02.08.2014 + - bugfix modifier wordwrap did output break string wrong if first word was exceeding length with cut = true (topic 25193) + + 24.07.2014 + - bugfix cache clear when cache folder does not exist + + 16.07.2014 + - enhancement remove BOM automatically from template source (topic 25161) + + 04.07.2014 + - bugfix the bufix of 02.06.2014 broke correct handling of child templates with same name but different template folders in extends resource (issue 194 and topic 25099) + + ===== 3.1.19 ===== (30.06.2014) + 20.06.2014 + - bugfix template variables could not be passed as parameter in {include} when the include was in a {nocache} section (topic 25131) + + 17.06.2014 + - bugfix large template text of some charsets could cause parsing errors (topic 24630) + + 08.06.2014 + - bugfix registered objects did not work after spelling fixes of 06.06.2014 + - bugfix {block} tags within {literal} .. {/literal} got not displayed correctly (topic 25024) + - bugfix UNC WINDOWS PATH like "\\psf\path\to\dir" did not work as template directory (Issue 192) + - bugfix {html_image} security check did fail on files relative to basedir (Issue 191) + + 06.06.2014 + - fixed PHPUnit outputFilterTrimWhitespaceTests.php assertion of test result + - fixed spelling, PHPDoc , minor errors, code cleanup + + 02.06.2014 + - using multiple cwd with relative template dirs could result in identical compiled file names. (issue 194 and topic 25099) + + 19.04.2014 + - bugfix calling createTemplate(template, data) with empty data array caused notice of array to string conversion (Issue 189) + - bugfix clearCompiledTemplate() did not delete files on WINDOWS when a compile_id was specified + + 18.04.2014 + - revert bugfix of 5.4.2014 because %-e date format is not supported on all operating systems + + ===== 3.1.18 ===== (07.04.2014) + 06.04.2014 + - bugfix template inheritance fail when using custom resource after patch of 8.3.2014 (Issue 187) + - bugfix update of composer file (Issue 168 and 184) + + 05.04.2014 + - bugfix default date format leads to extra spaces when displaying dates with single digit days (Issue 165) + + 26.03.2014 + - bugfix Smart_Resource_Custom should not lowercase the resource name (Issue 183) + + 24.03.2014 + - bugfix using a {foreach} property like @iteration could fail when used in inheritance parent templates (Issue 182) + + 20.03.2014 + - bugfix $smarty->auto_literal and mbsting.func_overload 2, 6 or 7 did fail (forum topic 24899) + + 18.03.2014 + - revert change of 17.03.2014 + +17.03.2014 + - bugfix $smarty->auto_literal and mbsting.func_overload 2, 6 or 7 did fail (forum topic 24899) + + 15.03.2014 + - bugfix Smarty_CacheResource_Keyvaluestore did use different keys on read/writes and clearCache() calls (Issue 169) + + 13.03.2014 + - bugfix clearXxx() change of 27.1.2014 did not work when specifing cache_id or compile_id (forum topic 24868 and 24867) + + ===== 3.1.17 ===== + 08.03.2014 + - bugfix relative file path {include} within {block} of child templates did throw exception on first call (Issue 177) + + 17.02.2014 + - bugfix Smarty failed when executing PHP on HHVM (Hip Hop 2.4) because uniqid('',true) does return string with ',' (forum topic 20343) + + 16.02.2014 + - bugfix a '//' or '\\' in template_dir path could produce wrong path on relative filepath in {include} (Issue 175) + + 05.02.2014 + - bugfix shared.literal_compiler_param.php did throw an exception when literal did contain a '-' (smarty-developers group) + + 27.01.2014 + - bugfix $smarty->debugging = true; did show the variable of the $smarty object not the variables used in display() call (forum topic 24764) + - bugfix clearCompiledTemplate(), clearAll() and clear() should use realpath to avoid possible exception from RecursiveDirectoryIterator (Issue 171) + + 26.01.2014 + - bugfix undo block nesting checks for {nocache} for reasons like forum topic 23280 (forum topic 24762) + + 18.01.2014 + - bugfix the compiler did fail when using template inheritance and recursive {include} (smarty-developers group) + + 11.01.2014 + - bugfix "* }" (spaces before right delimiter) was interpreted by mistake as comment end tag (Issue 170) + - internals content cache should be clear when updating cache file + + 08.01.2014 + - bugfix Smarty_CacheResource_Custom did not handle template resource type specifications on clearCache() calls (Issue 169) + - bugfix SmartyBC.class.php should use require_once to load Smarty.class.php (forum topic 24683) + + ===== 3.1.16 ===== + 15.12.2013 + - bugfix {include} with {block} tag handling (forum topic 24599, 24594, 24682) (Issue 161) + Read 3.1.16_RELEASE_NOTES for more details + - enhancement additional debug output at $smarty->_parserdebug = true; + + 07.11.2013 + - bugfix too restrictive handling of {include} within {block} tags. 3.1.15 did throw errors where 3.1.14 did not (forum topic 24599) + - bugfix compiler could fail if PHP mbstring.func_overload is enabled (Issue 164) + + 28.10.2013 + - bugfix variable resource name at custom resource plugin did not work within {block} tags (Issue 163) + - bugfix notice "Trying to get property of non-object" removed (Issue 163) + - bugfix correction of modifier capitalize fix from 3.10.2013 (issue 159) + - bugfix multiple {block}s with same name in parent did not work (forum topic 24631) + + 20.10.2013 + - bugfix a variable file name at {extends} tag did fail (forum topic 24618) + + 14.10.2013 + - bugfix yesterdays fix could result in an undefined variable + + 13.10.2013 + - bugfix variable names on {include} in template inheritance did unextepted error message (forum topic 24594) (Issue 161) +.- bugfix relative includes with same name like {include './foo.tpl'} from different folder failed (forum topic 24590)(Issue 161) + + 04.10.2013 + - bugfix variable file names at {extends} had been disbabled by mistake with the rewrite of + template inheritance of 24.08.2013 (forum topic 24585) + +03.10.2013 + - bugfix loops using modifier capitalize did eat up memory (issue 159) + + ===== Smarty 3.1.15 ===== +01.10.2013 + - use current delimiters in compiler error messages (issue 157) + - improvement on performance when using error handler and multiple template folders (issue 152) + +17.09.2013 + - improvement added patch for additional SmartyCompilerException properties for better access to scource information (forum topic 24559) + +16.09.2013 + - bugfix recompiled templates did not show on first request with zend opcache cache (forum topic 24320) + +13.09.2013 + - bugfix html_select_time defaulting error for the Meridian dropdown (forum topic 24549) + +09.09.2012 +- bugfix incorrect compiled code with array(object,method) callback at registered Variable Filter (forum topic 24542) + +27.08.2013 +- bugfix delimiter followed by linebreak did not work as auto literal after update from 24.08.2013 (forum topic 24518) + +24.08.2013 +- bugfix and enhancement + Because several recent problems with template inheritance the {block} tag compiler has been rewriten + - Error messages shown now the correct child template file and line number + - The compiler could fail on some larger UTF-8 text block (forum topic 24455) + - The {strip} tag can now be placed outside {block} tags in child templates (forum topic 24289) +- change SmartyException::$escape is now false by default +- change PHP traceback has been remove for SmartyException and SmartyCompilerException + +14.08.2013 +- bugfix compiled filepath of config file did not observe different config_dir (forum topic 24493) + +13.08.2013 +- bugfix the internal resource cache did not observe config_dir changes (forum topic 24493) + +12.08.2013 +- bugfix internal $tmpx variables must be unique over all inheritance templates (Issue 149) + +10.08.2013 +- bugfix a newline was eaten when a <?xml ... ?> was passed by a Smarty variable and caching was enabled (forum topic 24482) + +29.07.2013 +- bugfix headers already send warning thrown when using 'SMARTY_DEBUG=on' from URL (Issue 148) + +27.07.2013 +- enhancement allow access to properties of registered opjects for Smarty2 BC (forum topic 24344) + +26.07.2013 +- bugfix template inheritance nesting problem (forum topic 24387) + +15.7.2013 +- update code generated by PSR-2 standards fixer which introduced PHP 5.4 incompatibilities of 14.7.2013 + +14.7.2013 +- bugfix increase of internal maximum parser stacksize to allow more complex tag code {forum topic 24426} +- update for PHP 5.4 compatibility +- reformat source to PSR-2 standard + +12.7.2013 +- bugfix Do not remove '//' from file path at normalization (Issue 142) + +2.7.2013 +- bugfix trimwhitespace would replace captured items in wrong order (forum topic 24387) + +===== Smarty-3.1.14 ===== +27.06.2013 +- bugfix removed PHP 5.5 deprecated preg_replace /e option in modifier capitalize (forum topic 24389) + +17.06.2013 +- fixed spelling in sources and documentation (from smarty-developers forum Veres Lajos) +- enhancement added constant SMARTY::CLEAR_EXPIRED for the change of 26.05.2013 (forum topic 24310) +- bugfix added smarty_security.php to composer.json (Issue 135) + +26.05.2013 +- enhancement an expire_time of -1 in clearCache() and clearAllCache() will delete outdated cache files + by their individual cache_lifetime used at creation (forum topic 24310) + +21.05.2013 +- bugfix modifier strip_tags:true was compiled into wrong code (Forum Topic 24287) +- bugfix /n after ?> in Smarty.class.php did start output buffering (Issue 138) + +25.04.2013 +- bugfix escape and wordrap modifier could be compiled into wrong code when used in {nocache}{/nocache} + section but caching is disabled (Forum Topic 24260) + +05.04.2013 +- bugfix post filter must not run when compiling inheritance child blocks (Forum Topic 24094) +- bugfix after the fix for Issue #130 compiler exceptions got double escaped (Forum Topic 24199) + +28.02.2013 +- bugfix nocache blocks could be lost when using CACHING_LIFETIME_SAVED (Issue #133) +- bugfix Compile ID gets nulled when compiling child blocks (Issue #134) + + +24.01.2013 +- bugfix wrong tag type in smarty_internal_templatecompilerbase.php could cause wrong plugin search order (Forum Topic 24028) + +===== Smarty-3.1.13 ===== +13.01.2013 +- enhancement allow to disable exception message escaping by SmartyException::$escape = false; (Issue #130) + +09.01.2013 +- bugfix compilation did fail when a prefilter did modify an {extends} tag c +- bugfix template inheritance could fail if nested {block} tags in childs did contain {$smarty.block.child} (Issue #127) +- bugfix template inheritance could fail if {block} tags in childs did have similar name as used plugins (Issue #128) +- added abstract method declaration doCompile() in Smarty_Internal_TemplateCompilerBase (Forum Topic 23969) + +06.01.2013 +- Allow '://' URL syntax in template names of stream resources (Issue #129) + +27.11.2012 +- bugfix wrong variable usage in smarty_internal_utility.php (Issue #125) + +26.11.2012 +- bugfix global variable assigned within template function are not seen after template function exit (Forum Topic 23800) + +24.11.2012 +- made SmartyBC loadable via composer (Issue #124) + +20.11.2012 +- bugfix assignGlobal() called from plugins did not work (Forum Topic 23771) + +13.11.2012 +- adding attribute "strict" to html_options, html_checkboxes, html_radios to only print disabled/readonly attributes if their values are true or "disabled"/"readonly" (Issue #120) + +01.11.2012 +- bugfix muteExcpetedErrors() would screw up for non-readable paths (Issue #118) + +===== Smarty-3.1.12 ===== +14.09.2012 +- bugfix template inheritance failed to compile with delimiters {/ and /} (Forum Topic 23008) + +11.09.2012 +- bugfix escape Smarty exception messages to avoid possible script execution + +10.09.2012 +- bugfix tag option flags and shorttag attributes did not work when rdel started with '=' (Forum Topic 22979) + +31.08.2012 +- bugfix resolving relative paths broke in some circumstances (Issue #114) + +22.08.2012 +- bugfix test MBString availability through mb_split, as it could've been compiled without regex support (--enable-mbregex). + Either we get MBstring's full package, or we pretend it's not there at all. + +21.08.2012 +- bugfix $auto_literal = false did not work with { block} tags in child templates + (problem was reintroduced after fix in 3.1.7)(Forum Topic 20581) + +17.08.2012 +- bugfix compiled code of nocache sections could contain wrong escaping (Forum Topic 22810) + +15.08.2012 +- bugfix template inheritance did produce wrong code if subtemplates with {block} was + included several times (from smarty-developers forum) + +14.08.2012 +- bugfix PHP5.2 compatibility compromised by SplFileInfo::getBasename() (Issue 110) + +01.08.2012 +- bugfix avoid PHP error on $smarty->configLoad(...) with invalid section specification (Forum Topic 22608) + +30.07.2012 +-bugfix {assign} in a nocache section should not overwrite existing variable values + during compilation (issue 109) + +28.07.2012 +- bugfix array access of config variables did not work (Forum Topic 22527) + +19.07.2012 +- bugfix the default plugin handler did create wrong compiled code for static class methods + from external script files (issue 108) + +===== Smarty-3.1.11 ===== +30.06.2012 +- bugfix {block.. hide} did not work as nested child (Forum Topic 22216) + +25.06.2012 +- bugfix the default plugin handler did not allow static class methods for modifier (issue 85) + +24.06.2012 +- bugfix escape modifier support for PHP < 5.2.3 (Forum Topic 21176) + +11.06.2012 +- bugfix the patch for Topic 21856 did break tabs between tag attributes (Forum Topic 22124) + +===== Smarty-3.1.10 ===== +09.06.2012 +- bugfix the compiler did ignore registered compiler plugins for closing tags (Forum Topic 22094) +- bugfix the patch for Topic 21856 did break multiline tags (Forum Topic 22124) + +===== Smarty-3.1.9 ===== +07.06.2012 +- bugfix fetch() and display() with relative paths (Issue 104) +- bugfix treat "0000-00-00" as 0 in modifier.date_format (Issue 103) + +24.05.2012 +- bugfix Smarty_Internal_Write_File::writeFile() could cause race-conditions on linux systems (Issue 101) +- bugfix attribute parameter names of plugins may now contain also "-" and ":" (Forum Topic 21856) +- bugfix add compile_id to cache key of of source (Issue 97) + +22.05.2012 +- bugfix recursive {include} within {section} did fail (Smarty developer group) + +12.05.2012 +- bugfix {html_options} did not properly escape values (Issue 98) + +03.05.2012 +- bugfix make HTTP protocall version variable (issue 96) + +02.05.2012 +- bugfix {nocache}{block}{plugin}... did produce wrong compiled code when caching is disabled (Forum Topic 21572, issue 95) + +12.04.2012 +- bugfix Smarty did eat the linebreak after the <?xml...?> closing tag (Issue 93) +- bugfix concurrent cache updates could create a warning (Forum Topic 21403) + +08.04.2012 +- bugfix "\\" was not escaped correctly when generating nocache code (Forum Topic 21364) + +30.03.2012 +- bugfix template inheritance did not throw exception when a parent template was deleted (issue 90) + +27.03.2012 +- bugfix prefilter did run multiple times on inline subtemplates compiled into several main templates (Forum Topic 21325) +- bugfix implement Smarty2's behaviour of variables assigned by reference in SmartyBC. {assign} will affect all references. + (issue 88) + +21.03.2012 +- bugfix compileAllTemplates() and compileAllConfig() did not return the number of compiled files (Forum Topic 21286) + +13.03.2012 +- correction of yesterdays bugfix (Forum Topic 21175 and 21182) + +12.03.2012 +- bugfix a double quoted string of "$foo" did not compile into PHP "$foo" (Forum Topic 21175) +- bugfix template inheritance did set $merge_compiled_includes globally true + +03.03.2012 +- optimization of compiling speed when same modifier was used several times + +02.03.2012 +- enhancement the default plugin handler can now also resolve undefined modifier (Smarty::PLUGIN_MODIFIER) + (Issue 85) + +===== Smarty-3.1.8 ===== +19.02.2012 +- bugfix {include} could result in a fatal error if used in appended or prepended nested {block} tags + (reported by mh and Issue 83) +- enhancement added Smarty special variable $smarty.template_object to return the current template object (Forum Topic 20289) + + +07.02.2012 +- bugfix increase entropy of internal function names in compiled and cached template files (Forum Topic 20996) +- enhancement cacheable parameter added to default plugin handler, same functionality as in registerPlugin (request by calguy1000) + +06.02.2012 +- improvement stream_resolve_include_path() added to Smarty_Internal_Get_Include_Path (Forum Topic 20980) +- bugfix fetch('extends:foo.tpl') always yielded $source->exists == true (Forum Topic 20980) +- added modifier unescape:"url", fix (Forum Topic 20980) +- improvement replaced some calls of preg_replace with str_replace (Issue 73) + +30.01.2012 +- bugfix Smarty_Security internal $_resource_dir cache wasn't properly propagated + +27.01.2012 +- bugfix Smarty did not a template name of "0" (Forum Topic 20895) + +20.01.2012 +- bugfix typo in Smarty_Internal_Get_IncludePath did cause runtime overhead (Issue 74) +- improvment remove unneeded assigments (Issue 75 and 76) +- fixed typo in template parser +- bugfix output filter must not run before writing cache when template does contain nocache code (Issue 71) + +02.01.2012 +- bugfix {block foo nocache} did not load plugins within child {block} in nocache mode (Forum Topic 20753) + +29.12.2011 +- bugfix enable more entropy in Smarty_Internal_Write_File for "more uniqueness" and Cygwin compatibility (Forum Topic 20724) +- bugfix embedded quotes in single quoted strings did not compile correctly in {nocache} sections (Forum Topic 20730) + +28.12.2011 +- bugfix Smarty's internal header code must be excluded from postfilters (issue 71) + +22.12.2011 +- bugfix the new lexer of 17.12.2011 did fail if mbstring.func_overload != 0 (issue 70) (Forum Topic 20680) +- bugfix template inheritace did fail if mbstring.func_overload != 0 (issue 70) (Forum Topic 20680) + +20.12.2011 +- bugfix template inheritance: {$smarty.block.child} in nested child {block} tags did not return + content after {$smarty.block.child} (Forum Topic 20564) + +===== Smarty-3.1.7 ===== +18.12.2011 +- bugfix strings ending with " in multiline strings of config files failed to compile (issue #67) +- added chaining to Smarty_Internal_Templatebase +- changed unloadFilter() to not return a boolean in favor of chaining and API conformity +- bugfix unregisterObject() raised notice when object to unregister did not exist +- changed internals to use Smarty::$_MBSTRING ($_CHARSET, $_DATE_FORMAT) for better unit testing +- added Smarty::$_UTF8_MODIFIER for proper PCRE charset handling (Forum Topic 20452) +- added Smarty_Security::isTrustedUri() and Smarty_Security::$trusted_uri to validate + remote resource calls through {fetch} and {html_image} (Forum Topic 20627) + +17.12.2011 +- improvement of compiling speed by new handling of plain text blocks in the lexer/parser (issue #68) + +16.12.2011 +- bugfix the source exits flag and timestamp was not setup when template was in php include path (issue #69) + +9.12.2011 +- bugfix {capture} tags around recursive {include} calls did throw exception (Forum Topic 20549) +- bugfix $auto_literal = false did not work with { block} tags in child templates (Forum Topic 20581) +- bugfix template inheritance: do not include code of {include} in overloaded {block} into compiled + parent template (Issue #66} +- bugfix template inheritance: {$smarty.block.child} in nested child {block} tags did not return expected + result (Forum Topic 20564) + +===== Smarty-3.1.6 ===== +30.11.2011 +- bugfix is_cache() for individual cached subtemplates with $smarty->caching = CACHING_OFF did produce + an exception (Forum Topic 20531) + +29.11.2011 +- bugfix added exception if the default plugin handler did return a not static callback (Forum Topic 20512) + +25.11.2011 +- bugfix {html_select_date} and {html_slecet_time} did not default to current time if "time" was not specified + since r4432 (issue 60) + +24.11.2011 +- bugfix a subtemplate later used as main template did use old variable values + +21.11.2011 +- bugfix cache file could include unneeded modifier plugins under certain condition + +18.11.2011 +- bugfix declare all directory properties private to map direct access to getter/setter also on extended Smarty class + +16.11.2011 +- bugfix Smarty_Resource::load() did not always return a proper resource handler (Forum Topic 20414) +- added escape argument to html_checkboxes and html_radios (Forum Topic 20425) + +===== Smarty-3.1.5 ===== +14.11.2011 +- bugfix allow space between function name and open bracket (forum topic 20375) + +09.11.2011 +- bugfix different behaviour of uniqid() on cygwin. See https://bugs.php.net/bug.php?id=34908 + (forum topic 20343) + +01.11.2011 +- bugfix {if} and {while} tags without condition did not throw a SmartyCompilerException (Issue #57) +- bugfix multiline strings in config files could fail on longer strings (reopened Issue #55) + +22.10.2011 +- bugfix smarty_mb_from_unicode() would not decode unicode-points properly +- bugfix use catch Exception instead UnexpectedValueException in + clearCompiledTemplate to be PHP 5.2 compatible + +21.10.2011 +- bugfix apostrophe in plugins_dir path name failed (forum topic 20199) +- improvement sha1() for array keys longer than 150 characters +- add Smarty::$allow_ambiguous_resources to activate unique resource handling (Forum Topic 20128) + +20.10.2011 +- @silenced unlink() in Smarty_Internal_Write_File since debuggers go haywire without it. +- bugfix Smarty::clearCompiledTemplate() threw an Exception if $cache_id was not present in $compile_dir when $use_sub_dirs = true. +- bugfix {html_select_date} and {html_select_time} did not properly handle empty time arguments (Forum Topic 20190) +- improvement removed unnecessary sha1() + +19.10.2011 +- revert PHP4 constructor message +- fixed PHP4 constructor message + +===== Smarty-3.1.4 ===== +19.10.2011 +- added exception when using PHP4 style constructor + +16.10.2011 +- bugfix testInstall() did not propery check cache_dir and compile_dir + +15.10.2011 +- bugfix Smarty_Resource and Smarty_CacheResource runtime caching (Forum Post 75264) + +14.10.2011 +- bugfix unique_resource did not properly apply to compiled resources (Forum Topic 20128) +- add locking to custom resources (Forum Post 75252) +- add Smarty_Internal_Template::clearCache() to accompany isCached() fetch() etc. + +13.10.2011 +- add caching for config files in Smarty_Resource +- bugfix disable of caching after isCached() call did not work (Forum Topic 20131) +- add concept unique_resource to combat potentially ambiguous template_resource values when custom resource handlers are used (Forum Topic 20128) +- bugfix multiline strings in config files could fail on longer strings (Issue #55) + +11.10.2011 +- add runtime checks for not matching {capture}/{/capture} calls (Forum Topic 20120) + +10.10.2011 +- bugfix variable name typo in {html_options} and {html_checkboxes} (Issue #54) +- bugfix <?xml> tag did create wrong output when caching enabled and the tag was in included subtemplate +- bugfix Smarty_CacheResource_mysql example was missing strtotime() calls + +===== Smarty-3.1.3 ===== +07.10.2011 +- improvement removed html comments from {mailto} (Forum Topic 20092) +- bugfix testInstall() would not show path to internal plugins_dir (Forum Post 74627) +- improvement testInstall() now showing resolved paths and checking the include_path if necessary +- bugfix html_options plugin did not handle object values properly (Issue #49, Forum Topic 20049) +- improvement html_checkboxes and html_radios to accept null- and object values, and label_ids attribute +- improvement removed some unnecessary count()s +- bugfix parent pointer was not set when fetch() for other template was called on template object + +06.10.2011 +- bugfix switch lexer internals depending on mbstring.func_overload +- bugfix start_year and end_year of {html_select_date} did not use current year as offset base (Issue #53) + +05.10.2011 +- bugfix of problem introduced with r4342 by replacing strlen() with isset() +- add environment configuration issue with mbstring.func_overload Smarty cannot compensate for (Issue #45) +- bugfix nofilter tag option did not disable default modifier +- bugfix html_options plugin did not handle null- and object values properly (Issue #49, Forum Topic 20049) + +04.10.2011 +- bugfix assign() in plugins called in subtemplates did change value also in parent template +- bugfix of problem introduced with r4342 on math plugin +- bugfix output filter should not run on individually cached subtemplates +- add unloadFilter() method +- bugfix has_nocache_code flag was not reset before compilation + +===== Smarty-3.1.2 ===== +03.10.2011 +- improvement add internal $joined_template_dir property instead computing it on the fly several times + +01.10.2011 +- improvement replaced most in_array() calls by more efficient isset() on array_flip()ed haystacks +- improvement replaced some strlen($foo) > 3 calls by isset($foo[3]) +- improvement Smarty_Internal_Utility::clearCompiledTemplate() removed redundant strlen()s + +29.09.2011 +- improvement of Smarty_Internal_Config::loadConfigVars() dropped the in_array for index look up + +28.09.2011 +- bugfix on template functions called nocache calling other template functions + +27.09.2011 +- bugfix possible warning "attempt to modify property of non-object" in {section} (issue #34) +- added chaining to Smarty_Internal_Data so $smarty->assign('a',1)->assign('b',2); is possible now +- bugfix remove race condition when a custom resource did change timestamp during compilation +- bugfix variable property did not work on objects variable in template +- bugfix smarty_make_timestamp() failed to process DateTime objects properly +- bugfix wrong resource could be used on compile check of custom resource + +26.09.2011 +- bugfix repeated calls to same subtemplate did not make use of cached template object + +24.09.2011 +- removed internal muteExpectedErrors() calls in favor of having the implementor call this once from his application +- optimized muteExpectedErrors() to pass errors to the latest registered error handler, if appliccable +- added compile_dir and cache_dir to list of muted directories +- improvment better error message for undefined templates at {include} + +23.09.2011 +- remove unused properties +- optimization use real function instead anonymous function for preg_replace_callback +- bugfix a relative {include} in child template blocks failed +- bugfix direct setting of $template_dir, $config_dir, $plugins_dir in __construct() of an + extended Smarty class created problems +- bugfix error muting was not implemented for cache locking + +===== Smarty 3.1.1 ===== +22.09.2011 +- bugfix {foreachelse} does fail if {section} was nested inside {foreach} +- bugfix debug.tpl did not display correctly when it was compiled with escape_html = true + +21.09.2011 +- bugfix look for mixed case plugin file names as in 3.0 if not found try all lowercase +- added $error_muting to suppress error messages even for badly implemented error_handlers +- optimized autoloader +- reverted ./ and ../ handling in fetch() and display() - they're allowed again + +20.09.2011 +- bugfix removed debug echo output while compiling template inheritance +- bugfix relative paths in $template_dir broke relative path resolving in {include "../foo.tpl"} +- bugfix {include} did not work inside nested {block} tags +- bugfix {assign} with scope root and global did not work in all cases + +19.09.2011 +- bugfix regression in Smarty_CacheReource_KeyValueStore introduced by r4261 +- bugfix output filter shall not run on included subtemplates + +18.09.2011 +- bugfix template caching did not care about file.tpl in different template_dir +- bugfix {include $file} was broken when merge_compiled_incluges = true +- bugfix {include} was broken when merge_compiled_incluges = true and same indluded template + was used in different main templates in one compilation run +- bugfix for Smarty2 style compiler plugins on unnamed attribute passing like {tag $foo $bar} +- bugfix debug.tpl did not display correctly when it was compiled with escape_html = true + +17.09.2011 +- bugfix lock_id for file resource would create invalid filepath +- bugfix resource caching did not care about file.tpl in different template_dir + +===== Smarty 3.1.0 ===== +15/09/2011 +- optimization of {foreach}; call internal _count() method only when "total" or "last" {foreach} properties are used + +11/09/2011 +- added unregisterObject() method + +06/09/2011 +- bugfix isset() did not work in templates on config variables + +03/09/2011 +- bugfix createTemplate() must default to cache_id and compile_id of Smarty object +- bugfix Smarty_CacheResource_KeyValueStore must include $source->uid in cache filepath to keep templates with same + name but different folders separated +- added cacheresource.apc.php example in demo folder + +02/09/2011 +- bugfix cache lock file must use absolute filepath + +01/09/2011 +- update of cache locking + +30/08/2011 +- added locking mechanism to CacheResource API (implemented with File and KeyValueStores) + +28/08/2011 +- bugfix clearCompileTemplate() did not work for specific template subfolder or resource + +27/08/2011 +- bugfix {$foo|bar+1} did create syntax error + +26/08/2011 +- bugfix when generating nocache code which contains double \ +- bugfix handle race condition if cache file was deleted between filemtime and include + +17/08/2011 +- bugfix CacheResource_Custom bad internal fetch() call + +15/08/2011 +- bugfix CacheResource would load content twice for KeyValueStore and Custom handlers + +06/08/2011 +- bugfix {include} with scope attribute could execute in wrong scope +- optimization of compile_check processing + +03/08/2011 +- allow comment tags to comment {block} tags out in child templates + +26/07/2011 +- bugfix experimental getTags() method did not work + +24/07/2011 +- sure opened output buffers are closed on exception +- bugfix {foreach} did not work on IteratorAggregate + +22/07/2011 +- clear internal caches on clearAllCache(), clearCache(), clearCompiledTemplate() + +21/07/2011 +- bugfix value changes of variable values assigned to Smarty object could not be seen on repeated $smarty->fetch() calls + +17/07/2011 +- bugfix {$smarty.block.child} did drop a notice at undefined child + +15/07/2011 +- bugfix individual cache_lifetime of {include} did not work correctly inside {block} tags +- added caches for Smarty_Internal_TemplateSource and Smarty_Internal_TemplateCompiled to reduce I/O for multiple cache_id rendering + +14/07/2011 +- made Smarty::loadPlugin() respect the include_path if required + +13/07/2011 +- optimized internal file write functionality +- bugfix PHP did eat line break on nocache sections +- fixed typo of Smarty_Security properties $allowed_modifiers and $disabled_modifiers + +06/07/2011 +- bugfix variable modifier must run befor gereral filtering/escaping + +04/07/2011 +- bugfix use (?P<name>) syntax at preg_match as some pcre libraries failed on (?<name>) +- some performance improvement when using generic getter/setter on template objects + +30/06/2011 +- bugfix generic getter/setter of Smarty properties used on template objects did throw exception +- removed is_dir and is_readable checks from directory setters for better performance + +28/06/2011 +- added back support of php template resource as undocumented feature +- bugfix automatic recompilation on version change could drop undefined index notice on old 3.0 cache and compiled files +- update of README_3_1_DEV.txt and moved into the distribution folder +- improvement show first characters of eval and string templates instead sha1 Uid in debug window + +===== Smarty 3.1-RC1 ===== +25/06/2011 +- revert change of 17/06/2011. $_smarty varibale removed. call loadPlugin() from inside plugin code if required +- code cleanup, remove no longer used properties and methods +- update of PHPdoc comments + +23/06/2011 +- bugfix {html_select_date} would not respect current time zone + +19/06/2011 +- added $errors argument to testInstall() functions to suppress output. +- added plugin-file checks to testInstall() + +18/06/2011 +- bugfix mixed use of same subtemplate inline and not inline in same script could cause a warning during compilation + +17/06/2011 +- bugfix/change use $_smarty->loadPlugin() when loading nested depending plugins via loadPlugin +- bugfix {include ... inline} within {block}...{/block} did fail + +16/06/2011 +- bugfix do not overwrite '$smarty' template variable when {include ... scope=parent} is called +- bugfix complete empty inline subtemplates did fail + +15/06/2011 +- bugfix template variables where not accessable within inline subtemplates + +12/06/2011 +- bugfix removed unneeded merging of template variable when fetching includled subtemplates + +10/06/2011 +- made protected properties $template_dir, $plugins_dir, $cache_dir, $compile_dir, $config_dir accessible via magic methods + +09/06/2011 +- fix smarty security_policy issue in plugins {html_image} and {fetch} + +05/06/2011 +- update of SMARTY_VERSION +- bugfix made getTags() working again + +04/06/2011 +- allow extends resource in file attribute of {extends} tag + +03/06/2011 +- added {setfilter} tag to set filters for variable output +- added escape_html property to control autoescaping of variable output + +27/05/2011 +- added allowed/disabled tags and modifiers in security for sandboxing + +23/05/2011 +- added base64: and urlencode: arguments to eval and string resource types + +22/05/2011 +- made time-attribute of {html_select_date} and {html_select_time} accept arrays as defined by attributes prefix and field_array + +13/05/2011 +- remove setOption / getOption calls from SamrtyBC class + +02/05/2011 +- removed experimental setOption() getOption() methods +- output returned content also on opening tag calls of block plugins +- rewrite of default plugin handler +- compile code of variable filters for better performance + +20/04/2011 +- allow {php} {include_php} tags and PHP_ALLOW handling only with the SmartyBC class +- removed support of php template resource + +20/04/2011 +- added extendsall resource example +- optimization of template variable access +- optimization of subtemplate handling {include} +- optimization of template class + +01/04/2011 +- bugfix quote handling in capitalize modifier + +28/03/2011 +- bugfix stripslashes() requried when using PCRE e-modifier + +04/03/2011 +- upgrade to new PHP_LexerGenerator version 0.4.0 for better performance + +27/02/2011 +- ignore .svn folders when clearing cache and compiled files +- string resources do not need a modify check + +26/02/2011 +- replaced smarty_internal_wrapper by SmartyBC class +- load utility functions as static methods instead through __call() +- bugfix in extends resource when subresources are used +- optimization of modify checks + +25/02/2011 +- use $smarty->error_unassigned to control NOTICE handling on unassigned variables + +21/02/2011 +- added new new compile_check mode COMPILECHECK_CACHEMISS +- corrected new cloning behaviour of createTemplate() +- do no longer store the compiler object as property in the compile_tag classes to avoid possible memory leaks + during compilation + +19/02/2011 +- optimizations on merge_compiled_includes handling +- a couple of optimizations and bugfixes related to new resource structure + +17/02/2011 +- changed ./ and ../ behaviour + +14/02/2011 +- added {block ... hide} option to suppress block if no child is defined + +13/02/2011 +- update handling of recursive subtemplate calls +- bugfix replace $smarty->triggerError() by exception in smarty_internal_resource_extends.php + +12/02/2011 +- new class Smarty_Internal_TemplateBase with shared methods of Smarty and Template objects +- optimizations of template processing +- made register... methods permanet +- code for default_plugin_handler +- add automatic recompilation at version change + +04/02/2011 +- change in Smarty_CacheResource_Custom +- bugfix cache_lifetime did not compile correctly at {include} after last update +- moved isCached processing into CacheResource class +- bugfix new CacheResource API did not work with disabled compile_check + +03/02/2011 +- handle template content as function to improve speed on multiple calls of same subtemplate and isCached()/display() calls +- bugfixes and improvents in the new resource API +- optimizations of template class code + +25/01/2011 +- optimized function html_select_time + +22/01/2011 +- added Smarty::$use_include_path configuration directive for Resource API + +21/01/2011 +- optimized function html_select_date + +19/01/2011 +- optimized outputfilter trimwhitespace + +18/01/2011 +- bugfix Config to use Smarty_Resource to fetch sources +- optimized Smarty_Security's isTrustedDir() and isTrustedPHPDir() + +17/01/2011 +- bugfix HTTP headers for CGI SAPIs + +16/01/2011 +- optimized internals of Smarty_Resource and Smarty_CacheResource + +14/01/2011 +- added modifiercompiler escape to improve performance of escaping html, htmlall, url, urlpathinfo, quotes, javascript +- added support to choose template_dir to load from: [index]filename.tpl + +12/01/2011 +- added unencode modifier to revert results of encode modifier +- added to_charset and from_charset modifier for character encoding + +11/01/2011 +- added SMARTY_MBSTRING to generalize MBString detection +- added argument $lc_rest to modifier.capitalize to lower-case anything but the first character of a word +- changed strip modifier to consider unicode white-space, too +- changed wordwrap modifier to accept UTF-8 strings +- changed count_sentences modifier to consider unicode characters and treat sequences delimited by ? and ! as sentences, too +- added argument $double_encode to modifier.escape (applies to html and htmlall only) +- changed escape modifier to be UTF-8 compliant +- changed textformat block to be UTF-8 compliant +- optimized performance of mailto function +- fixed spacify modifier so characters are not prepended and appended, made it unicode compatible +- fixed truncate modifier to properly use mb_string if possible +- removed UTF-8 frenzy from count_characters modifier +- fixed count_words modifier to treat "hello-world" as a single word like str_count_words() does +- removed UTF-8 frenzy from upper modifier +- removed UTF-8 frenzy from lower modifier + +01/01/2011 +- optimize smarty_modified_escape for hex, hexentity, decentity. + +28/12/2010 +- changed $tpl_vars, $config_vars and $parent to belong to Smarty_Internal_Data +- added Smarty::registerCacheResource() for dynamic cache resource object registration + +27/12/2010 +- added Smarty_CacheResource API and refactored existing cache resources accordingly +- added Smarty_CacheResource_Custom and Smarty_CacheResource_Mysql + +26/12/2010 +- added Smarty_Resource API and refactored existing resources accordingly +- added Smarty_Resource_Custom and Smarty_Resource_Mysql +- bugfix Smarty::createTemplate() to return properly cloned template instances + +24/12/2010 +- optimize smarty_function_escape_special_chars() for PHP >= 5.2.3 + +===== SVN 3.0 trunk ===== +14/05/2011 +- bugfix error handling at stream resources + +13/05/2011 +- bugfix condition starting with "-" did fail at {if} and {while} tags + +22/04/2011 +- bugfix allow only fixed string as file attribute at {extends} tag + +01/04/2011 +- bugfix do not run filters and default modifier when displaying the debug template +- bugfix of embedded double quotes within multi line strings (""") + +29/03/2011 +- bugfix on error message in smarty_internal_compile_block.php +- bugfix mb handling in strip modifier +- bugfix for Smarty2 style registered compiler function on unnamed attribute passing like {tag $foo $bar} + +17/03/2011 +- bugfix on default {function} parameters when {function} was used in nocache sections +- bugfix on compiler object destruction. compiler_object property was by mistake unset. + +09/03/2011 +-bugfix a variable filter should run before modifiers on an output tag (see change of 23/07/2010) + +08/03/2011 +- bugfix loading config file without section should load only defaults + +03/03/2011 +- bugfix "smarty" template variable was not recreated when cached templated had expired +- bugfix internal rendered_content must be cleared after subtemplate was included + +01/03/2011 +- bugfix replace modifier did not work in 3.0.7 on systems without multibyte support +- bugfix {$smarty.template} could return in 3.0.7 parent template name instead of + child name when it needed to compile + +25/02/2011 +- bugfix for Smarty2 style compiler plugins on unnamed attribute passing like {tag $foo $bar} + +24/02/2011 +- bugfix $smarty->clearCache('some.tpl') did by mistake cache the template object + +18/02/2011 +- bugfix removed possible race condition when isCached() was called for an individually cached subtemplate +- bugfix force default debug.tpl to be loaded by the file resource + +17/02/2011 +-improvement not to delete files starting with '.' from cache and template_c folders on clearCompiledTemplate() and clearCache() + +16/02/2011 +-fixed typo in exception message of Smarty_Internal_Template +-improvement allow leading spaces on } tag closing if auto_literal is enabled + +13/02/2011 +- bufix replace $smarty->triggerError() by exception +- removed obsolete {popup_init..} plugin from demo templates +- bugfix replace $smarty->triggerError() by exception in smarty_internal_resource_extends.php + +===== Smarty 3.0.7 ===== +09/02/2011 +- patched vulnerability when using {$smarty.template} + +01/02/2011 +- removed assert() from config and template parser + +31/01/2011 +- bugfix the lexer/parser did fail on special characters like VT + +16/01/2011 +-bugfix of ArrayAccess object handling in internal _count() method +-bugfix of Iterator object handling in internal _count() method + +14/01/2011 +-bugfix removed memory leak while processing compileAllTemplates + +12/01/2011 +- bugfix in {if} and {while} tag compiler when using assignments as condition and nocache mode + +10/01/2011 +- bugfix when using {$smarty.block.child} and name of {block} was in double quoted string +- bugfix updateParentVariables() was called twice when leaving {include} processing + +- bugfix mb_str_replace in replace and escape modifiers work with utf8 + +31/12/2010 +- bugfix dynamic configuration of $debugging_crtl did not work +- bugfix default value of $config_read_hidden changed to false +- bugfix format of attribute array on compiler plugins +- bugfix getTemplateVars() could return value from wrong scope + +28/12/2010 +- bugfix multiple {append} tags failed to compile. + +22/12/2010 +- update do not clone the Smarty object an internal createTemplate() calls to increase performance + +21/12/2010 +- update html_options to support class and id attrs + +17/12/2010 +- bugfix added missing support of $cache_attrs for registered plugins + +15/12/2010 +- bugfix assignment as condition in {while} did drop an E_NOTICE + +14/12/2010 +- bugfix when passing an array as default parameter at {function} tag + +13/12/2010 +- bugfix {$smarty.template} in child template did not return right content +- bugfix Smarty3 did not search the PHP include_path for template files + +===== Smarty 3.0.6 ===== + +12/12/2010 +- bugfix fixed typo regarding yesterdays change to allow streamWrapper + +11/12/2010 +- bugfix nested block tags in template inheritance child templates did not work correctly +- bugfix {$smarty.current_dir} in child template did not point to dir of child template +- bugfix changed code when writing temporary compiled files to allow stream_wrapper + +06/12/2010 +- bugfix getTemplateVars() should return 'null' instead dropping E_NOTICE on an unassigned variable + +05/12/2010 +- bugfix missing declaration of $smarty in Smarty class +- bugfix empty($foo) in {if} did drop a notice when $foo was not assigned + +01/12/2010 +- improvement of {debug} tag output + +27/11/2010 +-change run output filter before cache file is written. (same as in Smarty2) + +24/11/2011 +-bugfix on parser at !$foo|modifier +-change parser logic when assignments used as condition in {if] and {while} to allow assign to array element + +23/11/2011 +-bugfix allow integer as attribute name in plugin calls +-change trimm whitespace from error message, removed long list of expected tokens + +22/11/2010 +- bugfix on template inheritance when an {extends} tag was inserted by a prefilter +- added error message for illegal variable file attributes at {extends...} tags + +===== Smarty 3.0.5 ===== + + +19/11/2010 +- bugfix on block plugins with modifiers + +18/11/2010 +- change on handling of unassigned template variable -- default will drop E_NOTICE +- bugfix on Smarty2 wrapper load_filter() did not work + +17/11/2010 +- bugfix on {call} with variable function name +- bugfix on {block} if name did contain '-' +- bugfix in function.fetch.php , referece to undefined $smarty + +16/11/2010 +- bugfix whitespace in front of "<?php" in smarty_internal_compile_private_block_plugin.php +- bugfix {$smarty.now} did compile incorrectly +- bugfix on reset(),end(),next(),prev(),current() within templates +- bugfix on default parameter for {function} + +15/11/2010 +- bugfix when using {$smarty.session} as object +- bugfix scoping problem on $smarty object passed to filters +- bugfix captured content could not be accessed globally +- bugfix Smarty2 wrapper functions could not be call from within plugins + +===== Smarty 3.0.4 ===== + +14/11/2010 +- bugfix isset() did not allow multiple parameter +- improvment of some error messages +- bugfix html_image did use removed property $request_use_auto_globals +- small performace patch in Smarty class + +13/11/2010 +- bugfix overloading problem when $smarty->fetch()/display() have been used in plugins + (introduced with 3.0.2) +- code cleanup + +===== Smarty 3.0.3 ===== + +13/11/2010 +- bugfix on {debug} +- reverted location of loadPlugin() to Smarty class +- fixed comments in plugins +- fixed internal_config (removed unwanted code line) +- improvement remove last linebreak from {function} definition + +===== Smarty 3.0.2 ===== + +12/11/2010 +- reactivated $error_reporting property handling +- fixed typo in compile_continue +- fixed security in {fetch} plugin +- changed back plugin parameters to two. second is template object + with transparent access to Smarty object +- fixed {config_load} scoping form compile time to run time + +===== Smarty 3.0.0 ===== + + + +11/11/2010 +- major update including some API changes + +10/11/2010 +- observe compile_id also for config files + +09/11/2010 +-bugfix on complex expressions as start value for {for} tag +request_use_auto_globals +04/11/2010 +- bugfix do not allow access of dynamic and private object members of assigned objects when + security is enabled. + +01/11/2010 +- bugfix related to E_NOTICE change. {if empty($foo)} did fail when $foo contained a string + +28/10/2010 +- bugfix on compiling modifiers within $smarty special vars like {$smarty.post.{$foo|lower}} + +27/10/2010 +- bugfix default parameter values did not work for template functions included with {include} + +25/10/2010 +- bugfix for E_NOTICE change, array elements did not work as modifier parameter + +20/10/2010 +- bugfix for the E_NOTICE change + +19/10/2010 +- change Smarty does no longer mask out E_NOTICE by default during template processing + +13/10/2010 +- bugfix removed ambiguity between ternary and stream variable in template syntax +- bugfix use caching properties of template instead of smarty object when compiling child {block} +- bugfix {*block}...{/block*} did throw an exception in template inheritance +- bugfix on template inheritance using nested eval or string resource in {extends} tags +- bugfix on output buffer handling in isCached() method + +===== RC4 ===== + +01/10/2010 +- added {break} and {continue} tags for flow control of {foreach},{section},{for} and {while} loops +- change of 'string' resource. It's no longer evaluated and compiled files are now stored +- new 'eval' resource which evaluates a template without saving the compiled file +- change in isCached() method to allow multiple calls for the same template + +25/09/2010 +- bugfix on some compiling modifiers + +24/09/2010 +- bugfix merge_compiled_includes flag was not restored correctly in {block} tag + +22/09/2010 +- bugfix on default modifier + +18/09/2010 +- bugfix untility compileAllConfig() did not create sha1 code for compiled template file names if template_dir was defined with no trailing DS +- bugfix on templateExists() for extends resource + +17/09/2010 +- bugfix {$smarty.template} and {$smarty.current_dir} did not compile correctly within {block} tags +- bugfix corrected error message on missing template files in extends resource +- bugfix untility compileAllTemplates() did not create sha1 code for compiled template file names if template_dir was defined with no trailing DS + +16/09/2010 +- bugfix when a doublequoted modifier parameter did contain Smarty tags and ':' + +15/09/2010 +- bugfix resolving conflict between '<%'/'%>' as custom Smarty delimiter and ASP tags +- use ucfirst for resource name on internal resource class names + +12/09/2010 +- bugfix for change of 08/09/2010 (final {block} tags in subtemplates did not produce correct results) + +10/09/2010 +- bugfix for change of 08/09/2010 (final {block} tags in subtemplates did not produce correct results) + +08/09/2010 +- allow multiple template inheritance branches starting in subtemplates + +07/09/2010 +- bugfix {counter} and {cycle} plugin assigned result to smarty variable not in local(template) scope +- bugfix templates containing just {strip} {/strip} tags did produce an error + + +23/08/2010 +- fixed E_STRICT errors for uninitialized variables + +22/08/2010 +- added attribute cache_id to {include} tag + +13/08/2010 +- remove exception_handler property from Smarty class +- added Smarty's own exceptions SmartyException and SmartyCompilerException + +09/08/2010 +- bugfix on modifier with doublequoted strings as parameter containing embedded tags + +06/08/2010 +- bugfix when cascading some modifier like |strip|strip_tags modifier + +05/08/2010 +- added plugin type modifiercompiler to produce compiled modifier code +- changed standard modifier plugins to the compiling versions whenever possible +- bugfix in nocache sections {include} must not cache the subtemplate + +02/08/2010 +- bugfix strip did not work correctly in conjunction with comment lines + +31/07/2010 +- bugfix on nocache attribute at {assign} and {append} + +30/07/2010 +- bugfix passing scope attributes in doublequoted strings did not work at {include} {assign} and {append} + +25/07/2010 +- another bugfix of change from 23/07/2010 when compiling modifier + +24/07/2010 +- bugfix of change from 23/07/2010 when compiling modifier + +23/07/2010 +- changed execution order. A variable filter does now run before modifiers on output of variables +- bugfix use always { and } as delimiter for debug.tpl + + +22/07/2010 +- bugfix in templateExists() method + +20/07/2010 +- fixed handling of { strip } tag with whitespaces + +15/07/2010 +- bufix {$smarty.template} does include now the relative path, not just filename + +===== RC3 ===== + + + + +15/07/2010 +- make the date_format modifier work also on objects of the DateTime class +- implementation of parsetrees in the parser to close security holes and remove unwanted empty line in HTML output + +08/07/2010 +- bugfix on assigning multidimensional arrays within templates +- corrected bugfix for truncate modifier + +07/07/2010 +- bugfix the truncate modifier needs to check if the string is utf-8 encoded or not +- bugfix support of script files relative to trusted_dir + +06/07/2010 +- create exception on recursive {extends} calls +- fixed reported line number at "unexpected closing tag " exception +- bugfix on escape:'mail' modifier +- drop exception if 'item' variable is equal 'from' variable in {foreach} tag + +01/07/2010 +- removed call_user_func_array calls for optimization of compiled code when using registered modifiers and plugins + +25/06/2010 +- bugfix escaping " when block tags are used within doublequoted strings + +24/06/2010 +- replace internal get_time() calls with standard PHP5 microtime(true) calls in Smarty_Internal_Utility +- added $smarty->register->templateClass() and $smarty->unregister->templateClass() methods for supporting static classes with namespace + + +22/06/2010 +- allow spaces between typecast and value in template syntax +- bugfix get correct count of traversables in {foreach} tag + +21/06/2010 +- removed use of PHP shortags SMARTY_PHP_PASSTHRU mode +- improved speed of cache->clear() when a compile_id was specified and use_sub_dirs is true + +20/06/2010 +- replace internal get_time() calls with standard PHP5 microtime(true) calls +- closed security hole when php.ini asp_tags = on + +18/06/2010 +- added __toString method to the Smarty_Variable class + + +14/06/2010 +- make handling of Smarty comments followed by newline BC to Smarty2 + + +===== RC2 ===== + + + +13/06/2010 +- bugfix Smarty3 did not handle hexadecimals like 0x0F as numerical value +- bugifx Smarty3 did not accept numerical constants like .1 or 2. (without a leading or trailing digit) + +11/06/2010 +- bugfix the lexer did fail on larger {literal} ... {/literal} sections + +03/06/2010 +- bugfix on calling template functions like Smarty tags + +01/06/2010 +- bugfix on template functions used with template inheritance +- removed /* vim: set expandtab: */ comments +- bugfix of auto literal problem introduce with fix of 31/05/2010 + +31/05/2010 +- bugfix the parser did not allow some smarty variables with special name like $for, $if, $else and others. + +27/05/2010 +- bugfix on object chaining using variable properties +- make scope of {counter} and {cycle} tags again global as in Smarty2 + +26/05/2010 +- bugfix removed decrepated register_resource call in smarty_internal_template.php + +25/05/2010 +- rewrite of template function handling to improve speed +- bugfix on file dependency when merge_compiled_includes = true + + +16/05/2010 +- bugfix when passing parameter with numeric name like {foo 1='bar' 2='blar'} + +14/05/2010 +- bugfix compile new config files if compile_check and force_compile = false +- added variable static classes names to template syntax + +11/05/2010 +- bugfix make sure that the cache resource is loaded in all conditions when template methods getCached... are called externally +- reverted the change 0f 30/04/2010. With the exception of forward references template functions can be again called by a standard tag. + +10/05/2010 +- bugfix on {foreach} and {for} optimizations of 27/04/2010 + +09/05/2010 +- update of template and config file parser because of minor parser generator bugs + +07/05/2010 +- bugfix on {insert} + +06/05/2010 +- bugfix when merging compiled templates and objects are passed as parameter of the {include} tag + +05/05/2010 +- bugfix on {insert} to cache parameter +- implementation of $smarty->default_modifiers as in Smarty2 +- bugfix on getTemplateVars method + +01/05/2010 +- bugfix on handling of variable method names at object chaning + +30/04/2010 +- bugfix when comparing timestamps in sysplugins/smarty_internal_config.php +- work around of a substr_compare bug in older PHP5 versions +- bugfix on template inheritance for tag names starting with "block" +- bugfix on {function} tag with name attribute in doublequoted strings +- fix to make calling of template functions unambiguously by madatory usage of the {call} tag + +===== RC1 ===== + +27/04/2010 +- change default of $debugging_ctrl to 'NONE' +- optimization of compiled code of {foreach} and {for} loops +- change of compiler for config variables + +27/04/2010 +- bugfix in $smarty->cache->clear() method. (do not cache template object) + + +17/04/2010 +- security fix in {math} plugin + + +12/04/2010 +- bugfix in smarty_internal_templatecompilerbase (overloaded property) +- removed parser restrictions in using true,false and null as ID + +07/04/2010 +- bugfix typo in smarty_internal_templatecompilerbase + +31/03/2010 +- compile locking by touching old compiled files to avoid concurrent compilations + +29/03/2010 +- bugfix allow array definitions as modifier parameter +- bugfix observe compile_check property when loading config files +- added the template object as third filter parameter + +25/03/2010 +- change of utility->compileAllTemplates() log messages +- bugfix on nocache code in {function} tags +- new method utility->compileAllConfig() to compile all config files + +24/03/2010 +- bugfix on register->modifier() error messages + +23/03/2010 +- bugfix on template inheritance when calling multiple child/parent relations +- bugfix on caching mode SMARTY_CACHING_LIFETIME_SAVED and cache_lifetime = 0 + +22/03/2010 +- bugfix make directory separator operating system independend in compileAllTemplates() + +21/03/2010 +- removed unused code in compileAllTemplates() + +19/03/2010 +- bugfix for multiple {/block} tags on same line + +17/03/2010 +- bugfix make $smarty->cache->clear() function independent from caching status + +16/03/2010 +- bugfix on assign attribute at registered template objects +- make handling of modifiers on expression BC to Smarty2 + +15/03/2010 +- bugfix on block plugin calls + +11/03/2010 +- changed parsing of <?php and ?> back to Smarty2 behaviour + +08/03/2010 +- bugfix on uninitialized properties in smarty_internal_template +- bugfix on $smarty->disableSecurity() + +04/03/2010 +- bugfix allow uppercase chars in registered resource names +- bugfix on accessing chained objects of static classes + +01/03/2010 +- bugfix on nocache code in {block} tags if child template was included by {include} + +27/02/2010 +- allow block tags inside double quoted string + +26/02/2010 +- cache modified check implemented +- support of access to a class constant from an object (since PHP 5.3) + +24/02/2010 +- bugfix on expressions in doublequoted string enclosed in backticks +- added security property $static_classes for static class security + +18/02/2010 +- bugfix on parsing Smarty tags inside <?xml ... ?> +- bugfix on truncate modifier + +17/02/2010 +- removed restriction that modifiers did require surrounding parenthesis in some cases +- added {$smarty.block.child} special variable for template inheritance + +16/02/2010 +- bugfix on <?xml ... ?> tags for all php_handling modes +- bugfix on parameter of variablefilter.htmlspecialchars.php plugin + +14/02/2010 +- added missing _plugins property in smarty.class.php +- bugfix $smarty.const... inside doublequoted strings and backticks was compiled into wrong PHP code + +12/02/2010 +- bugfix on nested {block} tags +- changed Smarty special variable $smarty.parent to $smarty.block.parent +- added support of nested {bock} tags + +10/02/2010 +- avoid possible notice on $smarty->cache->clear(...), $smarty->clear_cache(....) +- allow Smarty tags inside <? ... ?> tags in SMARTY_PHP_QUOTE and SMARTY_PHP_PASSTHRU mode +- bugfix at new "for" syntax like {for $x=1 to 10 step 2} + +09/02/2010 +- added $smarty->_tag_stack for tracing block tag hierarchy + +08/02/2010 +- bugfix use template fullpath at §smarty->cache->clear(...), $smarty->clear_cache(....) +- bugfix of cache filename on extended templates when force_compile=true + +07/02/2010 +- bugfix on changes of 05/02/2010 +- preserve line endings type form template source +- API changes (see README file) + +05/02/2010 +- bugfix on modifier and block plugins with same name + +02/02/2010 +- retaining newlines at registered functions and function plugins + +01/25/2010 +- bugfix cache resource was not loaded when caching was globally off but enabled at a template object +- added test that $_SERVER['SCRIPT_NAME'] does exist in Smarty.class.php + +01/22/2010 +- new method $smarty->createData([$parent]) for creating a data object (required for bugfixes below) +- bugfix config_load() method now works also on a data object +- bugfix get_config_vars() method now works also on a data and template objects +- bugfix clear_config() method now works also on a data and template objects + +01/19/2010 +- bugfix on plugins if same plugin was called from a nocache section first and later from a cached section + + +###beta 7### + + +01/17/2010 +- bugfix on $smarty.const... in double quoted strings + +01/16/2010 +- internal change of config file lexer/parser on handling of section names +- bugfix on registered objects (format parameter of register_object was not handled correctly) + +01/14/2010 +- bugfix on backslash within single quoted strings +- bugfix allow absolute filepath for config files +- bugfix on special Smarty variable $smarty.cookies +- revert handling of newline on no output tags like {if...} +- allow special characters in config file section names for Smarty2 BC + +01/13/2010 +- bugfix on {if} tags + +01/12/2010 +- changed back modifier handling in parser. Some restrictions still apply: + if modifiers are used in side {if...} expression or in mathematical expressions + parentheses must be used. +- bugfix the {function..} tag did not accept the name attribute in double quotes +- closed possible security hole at <?php ... ?> tags +- bugfix of config file parser on large config files + + +###beta 6#### + +01/11/2010 +- added \n to the compiled code of the {if},{else},{elseif},{/if} tags to get output of newlines as expected by the template source +- added missing support of insert plugins +- added optional nocache attribute to {block} tags in parent template +- updated <?php...?> handling supporting now heredocs and newdocs. (thanks to Thue Jnaus Kristensen) + +01/09/2010 +- bugfix on nocache {block} tags in parent templates + +01/08/2010 +- bugfix on variable filters. filter/nofilter attributes did not work on output statements + +01/07/2010 +- bugfix on file dependency at template inheritance +- bugfix on nocache code at template inheritance + +01/06/2010 +- fixed typo in smarty_internal_resource_registered +- bugfix for custom delimiter at extends resource and {extends} tag + +01/05/2010 +- bugfix sha1() calculations at extends resource and some general improvments on sha1() handling + + +01/03/2010 +- internal change on building cache files + +01/02/2010 +- update cached_timestamp at the template object after cache file is written to avoid possible side effects +- use internally always SMARTY_CACHING_LIFETIME_* constants + +01/01/2010 +- bugfix for obtaining plugins which must be included (related to change of 12/30/2009) +- bugfix for {php} tag (trow an exception if allow_php_tag = false) + +12/31/2009 +- optimization of generated code for doublequoted strings containing variables +- rewrite of {function} tag handling + - can now be declared in an external subtemplate + - can contain nocache sections (nocache_hash handling) + - can be called in noccache sections (nocache_hash handling) + - new {call..} tag to call template functions with a variable name {call name=$foo} +- fixed nocache_hash handling in merged compiled templates + +12/30/2009 +- bugfix for plugins defined in the script as smarty_function_foo + +12/29/2009 +- use sha1() for filepath encoding +- updates on nocache_hash handling +- internal change on merging some data +- fixed cache filename for custom resources + +12/28/2009 +- update for security fixes +- make modifier plugins always trusted +- fixed bug loading modifiers in child template at template inheritance + +12/27/2009 +--- this is a major update with a couple of internal changes --- +- new config file lexer/parser (thanks to Thue Jnaus Kristensen) +- template lexer/parser fixes for PHP and {literal} handing (thanks to Thue Jnaus Kristensen) +- fix on registered plugins with different type but same name +- rewrite of plugin handling (optimized execution speed) +- closed a security hole regarding PHP code injection into cache files +- fixed bug in clear cache handling +- Renamed a couple of internal classes +- code cleanup for merging compiled templates +- couple of runtime optimizations (still not all done) +- update of getCachedTimestamp() +- fixed bug on modifier plugins at nocache output + +12/19/2009 +- bugfix on comment lines in config files + +12/17/2009 +- bugfix of parent/global variable update at included/merged subtemplates +- encode final template filepath into filename of compiled and cached files +- fixed {strip} handling in auto literals + +12/16/2009 +- update of changelog +- added {include file='foo.tpl' inline} inline option to merge compiled code of subtemplate into the calling template + +12/14/2009 +- fixed sideefect of last modification (objects in array index did not work anymore) + +12/13/2009 +- allow boolean negation ("!") as operator on variables outside {if} tag + +12/12/2009 +- bugfix on single quotes inside {function} tag +- fix short append/prepend attributes in {block} tags + +12/11/2009 +- bugfix on clear_compiled_tpl (avoid possible warning) + +12/10/2009 +- bugfix on {function} tags and template inheritance + +12/05/2009 +- fixed problem when a cached file was fetched several times +- removed unneeded lexer code + +12/04/2009 +- added max attribute to for loop +- added security mode allow_super_globals + +12/03/2009 +- template inheritance: child templates can now call functions defined by the {function} tag in the parent template +- added {for $foo = 1 to 5 step 2} syntax +- bugfix for {$foo.$x.$y.$z} + +12/01/2009 +- fixed parsing of names of special formated tags like if,elseif,while,for,foreach +- removed direct access to constants in templates because of some syntax problems +- removed cache resource plugin for mysql from the distribution +- replaced most hard errors (exceptions) by softerrors(trigger_error) in plugins +- use $template_class property for template class name when compiling {include},{eval} and {extends} tags + +11/30/2009 +- map 'true' to SMARTY_CACHING_LIFETIME_CURRENT for the $smarty->caching parameter +- allow {function} tags within {block} tags + +11/28/2009 +- ignore compile_id at debug template +- added direct access to constants in templates +- some lexer/parser optimizations + +11/27/2009 +- added cache resource MYSQL plugin + +11/26/2009 +- bugfix on nested doublequoted strings +- correct line number on unknown tag error message +- changed {include} compiled code +- fix on checking dynamic varibales with error_unassigned = true + +11/25/2009 +- allow the following writing for boolean: true, TRUE, True, false, FALSE, False +- {strip} tag functionality rewritten + +11/24/2009 +- bugfix for $smarty->config_overwrite = false + +11/23/2009 +- suppress warnings on unlink caused by race conditions +- correct line number on unknown tag error message + +------- beta 5 +11/23/2009 +- fixed configfile parser for text starting with a numeric char +- the default_template_handler_func may now return a filepath to a template source + +11/20/2009 +- bugfix for empty config files +- convert timestamps of registered resources to integer + +11/19/2009 +- compiled templates are no longer touched with the filemtime of template source + +11/18/2009 +- allow integer as attribute name in plugin calls + +------- beta 4 +11/18/2009 +- observe umask settings when setting file permissions +- avoide unneeded cache file creation for subtemplates which did occur in some situations +- make $smarty->_current_file available during compilation for Smarty2 BC + +11/17/2009 +- sanitize compile_id and cache_id (replace illegal chars with _) +- use _dir_perms and _file_perms properties at file creation +- new constant SMARTY_RESOURCE_DATE_FORMAT (default '%b %e, %Y') which is used as default format in modifier date_format +- added {foreach $array as $key=>$value} syntax +- renamed extend tag and resource to extends: {extends file='foo.tol'} , $smarty->display('extends:foo.tpl|bar.tpl); +- bugfix cycle plugin + +11/15/2009 +- lexer/parser optimizations on quoted strings + +11/14/2009 +- bugfix on merging compiled templates when source files got removed or renamed. +- bugfix modifiers on registered object tags +- fixed locaion where outputfilters are running +- fixed config file definitions at EOF +- fix on merging compiled templates with nocache sections in nocache includes +- parser could run into a PHP error on wrong file attribute + +11/12/2009 +- fixed variable filenames in {include_php} and {insert} +- added scope to Smarty variables in the {block} tag compiler +- fix on nocache code in child {block} tags + +11/11/2009 +- fixed {foreachelse}, {forelse}, {sectionelse} compiled code at nocache variables +- removed checking for reserved variables +- changed debugging handling + +11/10/2009 +- fixed preg_qoute on delimiters + +11/09/2009 +- lexer/parser bugfix +- new SMARTY_SPL_AUTOLOAD constant to control the autoloader option +- bugfix for {function} block tags in included templates + +11/08/2009 +- fixed alphanumeric array index +- bugfix on complex double quoted strings + +11/05/2009 +- config_load method can now be called on data and template objects + +11/04/2009 +- added typecasting support for template variables +- bugfix on complex indexed special Smarty variables + +11/03/2009 +- fixed parser error on objects with special smarty vars +- fixed file dependency for {incude} inside {block} tag +- fixed not compiling on non existing compiled templates when compile_check = false +- renamed function names of autoloaded Smarty methods to Smarty_Method_.... +- new security_class property (default is Smarty_Security) + +11/02/2009 +- added neq,lte,gte,mod as aliases to if conditions +- throw exception on illegal Smarty() constructor calls + +10/31/2009 +- change of filenames in sysplugins folder for internal spl_autoload function +- lexer/parser changed for increased compilation speed + +10/27/2009 +- fixed missing quotes in include_php.php + +10/27/2009 +- fixed typo in method.register_resource +- pass {} through as literal + +10/26/2009 +- merge only compiled subtemplates into the compiled code of the main template + +10/24/2009 +- fixed nocache vars at internal block tags +- fixed merging of recursive includes + +10/23/2009 +- fixed nocache var problem + +10/22/2009 +- fix trimwhitespace outputfilter parameter + +10/21/2009 +- added {$foo++}{$foo--} syntax +- buxfix changed PHP "if (..):" to "if (..){" because of possible bad code when concenating PHP tags +- autoload Smarty internal classes +- fixed file dependency for config files +- some code optimizations +- fixed function definitions on some autoloaded methods +- fixed nocache variable inside if condition of {if} tag + +10/20/2009 +- check at compile time for variable filter to improve rendering speed if no filter is used +- fixed bug at combination of {elseif} tag and {...} in double quoted strings of static class parameter + +10/19/2009 +- fixed compiled template merging on variable double quoted strings as name +- fixed bug in caching mode 2 and cache_lifetime -1 +- fixed modifier support on block tags + +10/17/2009 +- remove ?>\n<?php and ?><?php sequences from compiled template + +10/15/2009 +- buxfix on assigning array elements inside templates +- parser bugfix on array access + +10/15/2009 +- allow bit operator '&' inside {if} tag +- implementation of ternary operator + +10/13/2009 +- do not recompile evaluated templates if reused just with other data +- recompile config files when config properties did change +- some lexer/parser otimizations + +10/11/2009 +- allow {block} tags inside included templates +- bugfix for resource plugins in Smarty2 format +- some optimizations of internal.template.php + +10/11/2009 +- fixed bug when template with same name is used with different data objects +- fixed bug with double quoted name attribute at {insert} tag +- reenabled assign_by_ref and append_by_ref methods + +10/07/2009 +- removed block nesting checks for {capture} + +10/05/2009 +- added support of "isinstance" to {if} tag + +10/03/2009 +- internal changes to improve performance +- fix registering of filters for classes + +10/01/2009 +- removed default timezone setting +- reactivated PHP resource for simple PHP templates. Must set allow_php_templates = true to enable +- {PHP} tag can be enabled by allow_php_tag = true + +09/30/2009 +- fixed handling template_exits method for all resource types +- bugfix for other cache resources than file +- the methods assign_by_ref is now wrapped to assign, append_by_ref to append +- allow arrays of variables pass in display, fetch and createTemplate calls + $data = array('foo'=>'bar','foo2'=>'blar'); + $smarty->display('my.tpl',$data); + +09/29/2009 +- changed {php} tag handling +- removed support of Smarty::instance() +- removed support of PHP resource type +- improved execution speed of {foreach} tags +- fixed bug in {section} tag + +09/23/2009 +- improvements and bugfix on {include} tag handling +NOTICE: existing compiled template and cache files must be deleted + +09/19/2009 +- replace internal "eval()" calls by "include" during rendering process +- speed improvment for templates which have included subtemplates + the compiled code of included templates is merged into the compiled code of the parent template +- added logical operator "xor" for {if} tag +- changed parameter ordering for Smarty2 BC + fetch($template, $cache_id = null, $compile_id = null, $parent = null) + display($template, $cache_id = null, $compile_id = null, $parent = null) + createTemplate($template, $cache_id = null, $compile_id = null, $parent = null) +- property resource_char_set is now replaced by constant SMARTY_RESOURCE_CHAR_SET +- fixed handling of classes in registered blocks +- speed improvement of lexer on text sections + +09/01/2009 +- dropped nl2br as plugin +- added '<>' as comparission operator in {if} tags +- cached caching_lifetime property to cache_liftime for backward compatibility with Smarty2. + {include} optional attribute is also now cache_lifetime +- fixed trigger_error method (moved into Smarty class) +- version is now Beta!!! + + +08/30/2009 +- some speed optimizations on loading internal plugins + + +08/29/2009 +- implemented caching of registered Resources +- new property 'auto_literal'. if true(default) '{ ' and ' }' interpreted as literal, not as Smarty delimiter + + +08/28/2009 +- Fix on line breaks inside {if} tags + +08/26/2009 +- implemented registered resources as in Smarty2. NOTE: caching does not work yet +- new property 'force_cache'. if true it forces the creation of a new cache file +- fixed modifiers on arrays +- some speed optimization on loading internal classes + + +08/24/2009 +- fixed typo in lexer definition for '!==' operator +- bugfix - the ouput of plugins was not cached +- added global variable SCRIPT_NAME + +08/21/2009 +- fixed problems whitespace in conjuction with custom delimiters +- Smarty tags can now be used as value anywhere + +08/18/2009 +- definition of template class name moded in internal.templatebase.php +- whitespace parser changes + +08/12/2009 +- fixed parser problems + +08/11/2009 +- fixed parser problems with custom delimiter + +08/10/2009 +- update of mb support in plugins + + +08/09/2009 +- fixed problems with doublequoted strings at name attribute of {block} tag +- bugfix at scope attribute of {append} tag + +08/08/2009 +- removed all internal calls of Smarty::instance() +- fixed code in double quoted strings + +08/05/2009 +- bugfix mb_string support +- bugfix of \n.\t etc in double quoted strings + +07/29/2009 +- added syntax for variable config vars like #$foo# + +07/28/2009 +- fixed parsing of $smarty.session vars containing objects + +07/22/2009 +- fix of "$" handling in double quoted strings + +07/21/2009 +- fix that {$smarty.current_dir} return correct value within {block} tags. + +07/20/2009 +- drop error message on unmatched {block} {/block} pairs + +07/01/2009 +- fixed smarty_function_html_options call in plugin function.html_select_date.php (missing ,) + +06/24/2009 +- fixed smarty_function_html_options call in plugin function.html_select_date.php + +06/22/2009 +- fix on \n and spaces inside smarty tags +- removed request_use_auto_globals propert as it is no longer needed because Smarty 3 will always run under PHP 5 + + +06/18/2009 +- fixed compilation of block plugins when caching enabled +- added $smarty.current_dir which returns the current working directory + +06/14/2009 +- fixed array access on super globals +- allow smarty tags within xml tags + +06/13/2009 +- bugfix at extend resource: create unique files for compiled template and cache for each combination of template files +- update extend resource to handle appen and prepend block attributes +- instantiate classes of plugins instead of calling them static + +06/03/2009 +- fixed repeat at block plugins + +05/25/2009 +- fixed problem with caching of compiler plugins + +05/14/2009 +- fixed directory separator handling + +05/09/2009 +- syntax change for stream variables +- fixed bug when using absolute template filepath and caching + +05/08/2009 +- fixed bug of {nocache} tag in included templates + +05/06/2009 +- allow that plugins_dir folder names can end without directory separator + +05/05/2009 +- fixed E_STRICT incompabilities +- {function} tag bug fix +- security policy definitions have been moved from plugins folder to file Security.class.php in libs folder +- added allow_super_global configuration to security + +04/30/2009 +- functions defined with the {function} tag now always have global scope + +04/29/2009 +- fixed problem with directory setter methods +- allow that cache_dir can end without directory separator + +04/28/2009 +- the {function} tag can no longer overwrite standard smarty tags +- inherit functions defined by the {fuction} tag into subtemplates +- added {while <statement>} sytax to while tag + +04/26/2009 +- added trusted stream checking to security +- internal changes at file dependency check for caching + +04/24/2009 +- changed name of {template} tag to {function} +- added new {template} tag + +04/23/2009 +- fixed access of special smarty variables from included template + +04/22/2009 +- unified template stream syntax with standard Smarty resource syntax $smarty->display('mystream:mytemplate') + +04/21/2009 +- change of new style syntax for forach. Now: {foreach $array as $var} like in PHP + +04/20/2009 +- fixed "$foo.bar ..." variable replacement in double quoted strings +- fixed error in {include} tag with variable file attribute + +04/18/2009 +- added stream resources ($smarty->display('mystream://mytemplate')) +- added stream variables {$mystream:myvar} + +04/14/2009 +- fixed compile_id handling on {include} tags +- fixed append/prepend attributes in {block} tag +- added {if 'expression' is in 'array'} syntax +- use crc32 as hash for compiled config files. + +04/13/2009 +- fixed scope problem with parent variables when appending variables within templates. +- fixed code for {block} without childs (possible sources for notice errors removed) + +04/12/2009 +- added append and prepend attribute to {block} tag + +04/11/2009 +- fixed variables in 'file' attribute of {extend} tag +- fixed problems in modifiers (if mb string functions not present) + +04/10/2009 +- check if mb string functions available otherwise fallback to normal string functions +- added global variable scope SMARTY_GLOBAL_SCOPE +- enable 'variable' filter by default +- fixed {$smarty.block.parent.foo} +- implementation of a 'variable' filter as replacement for default modifier + +04/09/2009 +- fixed execution of filters defined by classes +- compile the always the content of {block} tags to make shure that the filters are running over it +- syntax corrections on variable object property +- syntax corrections on array access in dot syntax + +04/08/2009 +- allow variable object property + +04/07/2009 +- changed variable scopes to SMARTY_LOCAL_SCOPE, SMARTY_PARENT_SCOPE, SMARTY_ROOT_SCOPE to avoid possible conflicts with user constants +- Smarty variable global attribute replaced with scope attribute + +04/06/2009 +- variable scopes LOCAL_SCOPE, PARENT_SCOPE, ROOT_SCOPE +- more getter/setter methods + +04/05/2009 +- replaced new array looping syntax {for $foo in $array} with {foreach $foo in $array} to avoid confusion +- added append array for short form of assign {$foo[]='bar'} and allow assignments to nested arrays {$foo['bla']['blue']='bar'} + +04/04/2009 +- make output of template default handlers cachable and save compiled source +- some fixes on yesterdays update + +04/03/2006 +- added registerDefaultTemplateHandler method and functionallity +- added registerDefaultPluginHandler method and functionallity +- added {append} tag to extend Smarty array variabled + +04/02/2009 +- added setter/getter methods +- added $foo@first and $foo@last properties at {for} tag +- added $set_timezone (true/false) property to setup optionally the default time zone + +03/31/2009 +- bugfix smarty.class and internal.security_handler +- added compile_check configuration +- added setter/getter methods + +03/30/2009 +- added all major setter/getter methods + +03/28/2009 +- {block} tags can be nested now +- md5 hash function replace with crc32 for speed optimization +- file order for exted resource inverted +- clear_compiled_tpl and clear_cache_all will not touch .svn folder any longer + +03/27/2009 +- added extend resource + +03/26/2009 +- fixed parser not to create error on `word` in double quoted strings +- allow PHP array(...) +- implemented $smarty.block.name.parent to access parent block content +- fixed smarty.class + + +03/23/2009 +- fixed {foreachelse} and {forelse} tags + +03/22/2009 +- fixed possible sources for notice errors +- rearrange SVN into distribution and development folders + +03/21/2009 +- fixed exceptions in function plugins +- fixed notice error in Smarty.class.php +- allow chained objects to span multiple lines +- fixed error in modifiers + +03/20/2009 +- moved /plugins folder into /libs folder +- added noprint modifier +- autoappend a directory separator if the xxxxx_dir definition have no trailing one + +03/19/2009 +- allow array definition as modifier parameter +- changed modifier to use multi byte string funktions. + +03/17/2009 +- bugfix + +03/15/2009 +- added {include_php} tag for BC +- removed @ error suppression +- bugfix fetch did always repeat output of first call when calling same template several times +- PHPunit tests extended + +03/13/2009 +- changed block syntax to be Smarty like {block:titel} -> {block name=titel} +- compiling of {block} and {extend} tags rewriten for better performance +- added special Smarty variable block ($smarty.block.foo} returns the parent definition of block foo +- optimization of {block} tag compiled code. +- fixed problem with escaped double quotes in double quoted strings + +03/12/2009 +- added support of template inheritance by {extend } and {block } tags. +- bugfix comments within literals +- added scope attribuie to {include} tag + +03/10/2009 +- couple of bugfixes and improvements +- PHPunit tests extended + +03/09/2009 +- added support for global template vars. {assign_global...} $smarty->assign_global(...) +- added direct_access_security +- PHPunit tests extended +- added missing {if} tag conditions like "is div by" etc. + +03/08/2009 +- splitted up the Compiler class to make it easier to use a coustom compiler +- made default plugins_dir relative to Smarty root and not current working directory +- some changes to make the lexer parser better configurable +- implemented {section} tag for Smarty2 BC + +03/07/2009 +- fixed problem with comment tags +- fixed problem with #xxxx in double quoted string +- new {while} tag implemented +- made lexer and paser class configurable as $smarty property +- Smarty method get_template_vars implemented +- Smarty method get_registered_object implemented +- Smarty method trigger_error implemented +- PHPunit tests extended + +03/06/2009 +- final changes on config variable handling +- parser change - unquoted strings will by be converted into single quoted strings +- PHPunit tests extended +- some code cleanup +- fixed problem on catenate strings with expression +- update of count_words modifier +- bugfix on comment tags + + +03/05/2009 +- bugfix on <?xml...> tag with caching enabled +- changes on exception handling (by Monte) + +03/04/2009 +- added support for config variables +- bugfix on <?xml...> tag + +03/02/2009 +- fixed unqouted strings within modifier parameter +- bugfix parsing of mofifier parameter + +03/01/2009 +- modifier chaining works now as in Smarty2 + +02/28/2009 +- changed handling of unqouted strings + +02/26/2009 +- bugfix +- changed $smarty.capture.foo to be global for Smarty2 BC. + +02/24/2009 +- bugfix {php} {/php} tags for backward compatibility +- bugfix for expressions on arrays +- fixed usage of "null" value +- added $smarty.foreach.foo.first and $smarty.foreach.foo.last + +02/06/2009 +- bugfix for request variables without index for example $smarty.get +- experimental solution for variable functions in static class + +02/05/2009 +- update of popup plugin +- added config variables to template parser (load config functions still missing) +- parser bugfix for empty quoted strings + +02/03/2009 +- allow array of objects as static class variabales. +- use htmlentities at source output at template errors. + +02/02/2009 +- changed search order on modifiers to look at plugins folder first +- parser bug fix for modifier on array elements $foo.bar|modifier +- parser bug fix on single quoted srings +- internal: splitted up compiler plugin files + +02/01/2009 +- allow method chaining on static classes +- special Smarty variables $smarty.... implemented +- added {PHP} {/PHP} tags for backward compatibility + +01/31/2009 +- added {math} plugin for Smarty2 BC +- added template_exists method +- changed Smarty3 method enable_security() to enableSecurity() to follow camelCase standards + +01/30/2009 +- bugfix in single quoted strings +- changed syntax for variable property access from $foo:property to $foo@property because of ambiguous syntax at modifiers + +01/29/2009 +- syntax for array definition changed from (1,2,3) to [1,2,3] to remove ambiguous syntax +- allow {for $foo in [1,2,3]} syntax +- bugfix in double quoted strings +- allow <?xml...?> tags in template even if short_tags are enabled + +01/28/2009 +- fixed '!==' if condition. + +01/28/2009 +- added support of {strip} {/strip} tag. + +01/27/2009 +- bug fix on backticks in double quoted strings at objects + +01/25/2009 +- Smarty2 modfiers added to SVN + +01/25/2009 +- bugfix allow arrays at object properties in Smarty syntax +- the template object is now passed as additional parameter at plugin calls +- clear_compiled_tpl method completed + +01/20/2009 +- access to class constants implemented ( class::CONSTANT ) +- access to static class variables implemented ( class::$variable ) +- call of static class methods implemented ( class::method() ) + +01/16/2009 +- reallow leading _ in variable names {$_var} +- allow array of objects {$array.index->method()} syntax +- finished work on clear_cache and clear_cache_all methods + +01/11/2009 +- added support of {literal} tag +- added support of {ldelim} and {rdelim} tags +- make code compatible to run with E_STRICT error setting + +01/08/2009 +- moved clear_assign and clear_all_assign to internal.templatebase.php +- added assign_by_ref, append and append_by_ref methods + +01/02/2009 +- added load_filter method +- fished work on filter handling +- optimization of plugin loading + +12/30/2008 +- added compiler support of registered object +- added backtick support in doubled quoted strings for backward compatibility +- some minor bug fixes and improvments + +12/23/2008 +- fixed problem of not working "not" operator in if-expressions +- added handling of compiler function plugins +- finished work on (un)register_compiler_function method +- finished work on (un)register_modifier method +- plugin handling from plugins folder changed for modifier plugins + deleted - internal.modifier.php +- added modifier chaining to parser + +12/17/2008 +- finished (un)register_function method +- finished (un)register_block method +- added security checking for PHP functions in PHP templates +- plugin handling from plugins folder rewritten + new - internal.plugin_handler.php + deleted - internal.block.php + deleted - internal.function.php +- removed plugin checking from security handler + +12/16/2008 + +- new start of this change_log file diff --git a/libs/smarty/composer.json b/libs/smarty/composer.json @@ -0,0 +1,43 @@ +{ + "name": "smarty/smarty", + "type": "library", + "description": "Smarty - the compiling PHP template engine", + "keywords": ["templating"], + "homepage": "http://www.smarty.net", + "license": "LGPL-3.0", + "authors": [ + { + "name": "Monte Ohrt", + "email": "monte@ohrt.com" + }, + { + "name": "Uwe Tews", + "email": "uwe.tews@googlemail.com" + }, + { + "name": "Rodney Rehm", + "email": "rodney.rehm@medialize.de" + } + ], + "support": { + "irc": "irc://irc.freenode.org/smarty", + "issues": "https://github.com/smarty-php/smarty/issues", + "forum": "http://www.smarty.net/forums/" + }, + "require": { + "php": ">=5.2" + }, + "autoload": { + "classmap": [ + "libs/Smarty.class.php", + "libs/SmartyBC.class.php", + "libs/sysplugins/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + } + +} diff --git a/libs/smarty/demo/configs/test.conf b/libs/smarty/demo/configs/test.conf @@ -0,0 +1,5 @@ +title = Welcome to Smarty! +cutoff_size = 40 + +[setup] +bold = true diff --git a/libs/smarty/demo/index.php b/libs/smarty/demo/index.php @@ -0,0 +1,30 @@ +<?php +/** + * Example Application + * + * @package Example-application + */ + +require '../libs/Smarty.class.php'; + +$smarty = new Smarty; + +//$smarty->force_compile = true; +$smarty->debugging = true; +$smarty->caching = true; +$smarty->cache_lifetime = 120; + +$smarty->assign("Name", "Fred Irving Johnathan Bradley Peppergill", true); +$smarty->assign("FirstName", array("John", "Mary", "James", "Henry")); +$smarty->assign("LastName", array("Doe", "Smith", "Johnson", "Case")); +$smarty->assign("Class", array(array("A", "B", "C", "D"), array("E", "F", "G", "H"), + array("I", "J", "K", "L"), array("M", "N", "O", "P"))); + +$smarty->assign("contacts", array(array("phone" => "1", "fax" => "2", "cell" => "3"), + array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234"))); + +$smarty->assign("option_values", array("NY", "NE", "KS", "IA", "OK", "TX")); +$smarty->assign("option_output", array("New York", "Nebraska", "Kansas", "Iowa", "Oklahoma", "Texas")); +$smarty->assign("option_selected", "NE"); + +$smarty->display('index.tpl'); diff --git a/libs/smarty/demo/plugins/cacheresource.apc.php b/libs/smarty/demo/plugins/cacheresource.apc.php @@ -0,0 +1,83 @@ +<?php + +/** + * APC CacheResource + * CacheResource Implementation based on the KeyValueStore API to use + * memcache as the storage resource for Smarty's output caching. + * * + * + * @package CacheResource-examples + * @author Uwe Tews + */ +class Smarty_CacheResource_Apc extends Smarty_CacheResource_KeyValueStore +{ + public function __construct() + { + // test if APC is present + if (!function_exists('apc_cache_info')) { + throw new Exception('APC Template Caching Error: APC is not installed'); + } + } + + /** + * Read values for a set of keys from cache + * + * @param array $keys list of keys to fetch + * + * @return array list of values with the given keys used as indexes + * @return boolean true on success, false on failure + */ + protected function read(array $keys) + { + $_res = array(); + $res = apc_fetch($keys); + foreach ($res as $k => $v) { + $_res[$k] = $v; + } + + return $_res; + } + + /** + * Save values for a set of keys to cache + * + * @param array $keys list of values to save + * @param int $expire expiration time + * + * @return boolean true on success, false on failure + */ + protected function write(array $keys, $expire = null) + { + foreach ($keys as $k => $v) { + apc_store($k, $v, $expire); + } + + return true; + } + + /** + * Remove values from cache + * + * @param array $keys list of keys to delete + * + * @return boolean true on success, false on failure + */ + protected function delete(array $keys) + { + foreach ($keys as $k) { + apc_delete($k); + } + + return true; + } + + /** + * Remove *all* values from cache + * + * @return boolean true on success, false on failure + */ + protected function purge() + { + return apc_clear_cache('user'); + } +} diff --git a/libs/smarty/demo/plugins/cacheresource.memcache.php b/libs/smarty/demo/plugins/cacheresource.memcache.php @@ -0,0 +1,97 @@ +<?php + +/** + * Memcache CacheResource + * CacheResource Implementation based on the KeyValueStore API to use + * memcache as the storage resource for Smarty's output caching. + * Note that memcache has a limitation of 256 characters per cache-key. + * To avoid complications all cache-keys are translated to a sha1 hash. + * + * @package CacheResource-examples + * @author Rodney Rehm + */ +class Smarty_CacheResource_Memcache extends Smarty_CacheResource_KeyValueStore +{ + /** + * memcache instance + * + * @var Memcache + */ + protected $memcache = null; + + public function __construct() + { + $this->memcache = new Memcache(); + $this->memcache->addServer('127.0.0.1', 11211); + } + + /** + * Read values for a set of keys from cache + * + * @param array $keys list of keys to fetch + * + * @return array list of values with the given keys used as indexes + * @return boolean true on success, false on failure + */ + protected function read(array $keys) + { + $_keys = $lookup = array(); + foreach ($keys as $k) { + $_k = sha1($k); + $_keys[] = $_k; + $lookup[$_k] = $k; + } + $_res = array(); + $res = $this->memcache->get($_keys); + foreach ($res as $k => $v) { + $_res[$lookup[$k]] = $v; + } + + return $_res; + } + + /** + * Save values for a set of keys to cache + * + * @param array $keys list of values to save + * @param int $expire expiration time + * + * @return boolean true on success, false on failure + */ + protected function write(array $keys, $expire = null) + { + foreach ($keys as $k => $v) { + $k = sha1($k); + $this->memcache->set($k, $v, 0, $expire); + } + + return true; + } + + /** + * Remove values from cache + * + * @param array $keys list of keys to delete + * + * @return boolean true on success, false on failure + */ + protected function delete(array $keys) + { + foreach ($keys as $k) { + $k = sha1($k); + $this->memcache->delete($k); + } + + return true; + } + + /** + * Remove *all* values from cache + * + * @return boolean true on success, false on failure + */ + protected function purge() + { + $this->memcache->flush(); + } +} diff --git a/libs/smarty/demo/plugins/cacheresource.mysql.php b/libs/smarty/demo/plugins/cacheresource.mysql.php @@ -0,0 +1,162 @@ +<?php + +/** + * MySQL CacheResource + * CacheResource Implementation based on the Custom API to use + * MySQL as the storage resource for Smarty's output caching. + * Table definition: + * <pre>CREATE TABLE IF NOT EXISTS `output_cache` ( + * `id` CHAR(40) NOT NULL COMMENT 'sha1 hash', + * `name` VARCHAR(250) NOT NULL, + * `cache_id` VARCHAR(250) NULL DEFAULT NULL, + * `compile_id` VARCHAR(250) NULL DEFAULT NULL, + * `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + * `content` LONGTEXT NOT NULL, + * PRIMARY KEY (`id`), + * INDEX(`name`), + * INDEX(`cache_id`), + * INDEX(`compile_id`), + * INDEX(`modified`) + * ) ENGINE = InnoDB;</pre> + * + * @package CacheResource-examples + * @author Rodney Rehm + */ +class Smarty_CacheResource_Mysql extends Smarty_CacheResource_Custom +{ + // PDO instance + protected $db; + protected $fetch; + protected $fetchTimestamp; + protected $save; + + public function __construct() + { + try { + $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty"); + } + catch (PDOException $e) { + throw new SmartyException('Mysql Resource failed: ' . $e->getMessage()); + } + $this->fetch = $this->db->prepare('SELECT modified, content FROM output_cache WHERE id = :id'); + $this->fetchTimestamp = $this->db->prepare('SELECT modified FROM output_cache WHERE id = :id'); + $this->save = $this->db->prepare('REPLACE INTO output_cache (id, name, cache_id, compile_id, content) + VALUES (:id, :name, :cache_id, :compile_id, :content)'); + } + + /** + * fetch cached content and its modification time from data source + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param string $content cached content + * @param integer $mtime cache modification timestamp (epoch) + * + * @return void + */ + protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime) + { + $this->fetch->execute(array('id' => $id)); + $row = $this->fetch->fetch(); + $this->fetch->closeCursor(); + if ($row) { + $content = $row['content']; + $mtime = strtotime($row['modified']); + } else { + $content = null; + $mtime = null; + } + } + + /** + * Fetch cached content's modification timestamp from data source + * + * @note implementing this method is optional. Only implement it if modification times can be accessed faster than loading the complete cached content. + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * + * @return integer|boolean timestamp (epoch) the template was modified, or false if not found + */ + protected function fetchTimestamp($id, $name, $cache_id, $compile_id) + { + $this->fetchTimestamp->execute(array('id' => $id)); + $mtime = strtotime($this->fetchTimestamp->fetchColumn()); + $this->fetchTimestamp->closeCursor(); + + return $mtime; + } + + /** + * Save content to cache + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer|null $exp_time seconds till expiration time in seconds or null + * @param string $content content to cache + * + * @return boolean success + */ + protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content) + { + $this->save->execute(array( + 'id' => $id, + 'name' => $name, + 'cache_id' => $cache_id, + 'compile_id' => $compile_id, + 'content' => $content, + )); + + return !!$this->save->rowCount(); + } + + /** + * Delete content from cache + * + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer|null $exp_time seconds till expiration or null + * + * @return integer number of deleted caches + */ + protected function delete($name, $cache_id, $compile_id, $exp_time) + { + // delete the whole cache + if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) { + // returning the number of deleted caches would require a second query to count them + $query = $this->db->query('TRUNCATE TABLE output_cache'); + + return - 1; + } + // build the filter + $where = array(); + // equal test name + if ($name !== null) { + $where[] = 'name = ' . $this->db->quote($name); + } + // equal test compile_id + if ($compile_id !== null) { + $where[] = 'compile_id = ' . $this->db->quote($compile_id); + } + // range test expiration time + if ($exp_time !== null) { + $where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)'; + } + // equal test cache_id and match sub-groups + if ($cache_id !== null) { + $where[] = '(cache_id = ' . $this->db->quote($cache_id) + . ' OR cache_id LIKE ' . $this->db->quote($cache_id . '|%') . ')'; + } + // run delete query + $query = $this->db->query('DELETE FROM output_cache WHERE ' . join(' AND ', $where)); + + return $query->rowCount(); + } +} diff --git a/libs/smarty/demo/plugins/cacheresource.pdo.php b/libs/smarty/demo/plugins/cacheresource.pdo.php @@ -0,0 +1,322 @@ +<?php + +/** + * PDO Cache Handler + * Allows you to store Smarty Cache files into your db. + * Example table : + * CREATE TABLE `smarty_cache` ( + * `id` char(40) NOT NULL COMMENT 'sha1 hash', + * `name` varchar(250) NOT NULL, + * `cache_id` varchar(250) DEFAULT NULL, + * `compile_id` varchar(250) DEFAULT NULL, + * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + * `expire` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + * `content` mediumblob NOT NULL, + * PRIMARY KEY (`id`), + * KEY `name` (`name`), + * KEY `cache_id` (`cache_id`), + * KEY `compile_id` (`compile_id`), + * KEY `modified` (`modified`), + * KEY `expire` (`expire`) + * ) ENGINE=InnoDB + * Example usage : + * $cnx = new PDO("mysql:host=localhost;dbname=mydb", "username", "password"); + * $smarty->setCachingType('pdo'); + * $smarty->loadPlugin('Smarty_CacheResource_Pdo'); + * $smarty->registerCacheResource('pdo', new Smarty_CacheResource_Pdo($cnx, 'smarty_cache')); + * + * @author Beno!t POLASZEK - 2014 + */ +class Smarty_CacheResource_Pdo extends Smarty_CacheResource_Custom +{ + + protected $fetchStatements = Array('default' => 'SELECT %2$s + FROM %1$s + WHERE 1 + AND id = :id + AND cache_id IS NULL + AND compile_id IS NULL', + + 'withCacheId' => 'SELECT %2$s + FROM %1$s + WHERE 1 + AND id = :id + AND cache_id = :cache_id + AND compile_id IS NULL', + + 'withCompileId' => 'SELECT %2$s + FROM %1$s + WHERE 1 + AND id = :id + AND compile_id = :compile_id + AND cache_id IS NULL', + + 'withCacheIdAndCompileId' => 'SELECT %2$s + FROM %1$s + WHERE 1 + AND id = :id + AND cache_id = :cache_id + AND compile_id = :compile_id'); + protected $insertStatement = 'INSERT INTO %s + + SET id = :id, + name = :name, + cache_id = :cache_id, + compile_id = :compile_id, + modified = CURRENT_TIMESTAMP, + expire = DATE_ADD(CURRENT_TIMESTAMP, INTERVAL :expire SECOND), + content = :content + + ON DUPLICATE KEY UPDATE + name = :name, + cache_id = :cache_id, + compile_id = :compile_id, + modified = CURRENT_TIMESTAMP, + expire = DATE_ADD(CURRENT_TIMESTAMP, INTERVAL :expire SECOND), + content = :content'; + + protected $deleteStatement = 'DELETE FROM %1$s WHERE %2$s'; + protected $truncateStatement = 'TRUNCATE TABLE %s'; + + protected $fetchColumns = 'modified, content'; + protected $fetchTimestampColumns = 'modified'; + + protected $pdo, $table, $database; + + /* + * Constructor + * + * @param PDO $pdo PDO : active connection + * @param string $table : table (or view) name + * @param string $database : optionnal - if table is located in another db + */ + public function __construct(PDO $pdo, $table, $database = null) + { + + if (is_null($table)) { + throw new SmartyException("Table name for caching can't be null"); + } + + $this->pdo = $pdo; + $this->table = $table; + $this->database = $database; + + $this->fillStatementsWithTableName(); + } + + /* + * Fills the table name into the statements. + * + * @return Current Instance + * @access protected + */ + protected function fillStatementsWithTableName() + { + + foreach ($this->fetchStatements AS &$statement) { + $statement = sprintf($statement, $this->getTableName(), '%s'); + } + + $this->insertStatement = sprintf($this->insertStatement, $this->getTableName()); + $this->deleteStatement = sprintf($this->deleteStatement, $this->getTableName(), '%s'); + $this->truncateStatement = sprintf($this->truncateStatement, $this->getTableName()); + + return $this; + } + + /* + * Gets the fetch statement, depending on what you specify + * + * @param string $columns : the column(s) name(s) you want to retrieve from the database + * @param string $id unique cache content identifier + * @param string|null $cache_id cache id + * @param string|null $compile_id compile id + * @access protected + */ + protected function getFetchStatement($columns, $id, $cache_id = null, $compile_id = null) + { + + if (!is_null($cache_id) && !is_null($compile_id)) { + $query = $this->fetchStatements['withCacheIdAndCompileId'] AND $args = Array('id' => $id, 'cache_id' => $cache_id, 'compile_id' => $compile_id); + } elseif (is_null($cache_id) && !is_null($compile_id)) { + $query = $this->fetchStatements['withCompileId'] AND $args = Array('id' => $id, 'compile_id' => $compile_id); + } elseif (!is_null($cache_id) && is_null($compile_id)) { + $query = $this->fetchStatements['withCacheId'] AND $args = Array('id' => $id, 'cache_id' => $cache_id); + } else { + $query = $this->fetchStatements['default'] AND $args = Array('id' => $id); + } + + $query = sprintf($query, $columns); + + $stmt = $this->pdo->prepare($query); + + foreach ($args AS $key => $value) { + $stmt->bindValue($key, $value); + } + + return $stmt; + } + + /** + * fetch cached content and its modification time from data source + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string|null $cache_id cache id + * @param string|null $compile_id compile id + * @param string $content cached content + * @param integer $mtime cache modification timestamp (epoch) + * + * @return void + * @access protected + */ + protected function fetch($id, $name, $cache_id = null, $compile_id = null, &$content, &$mtime) + { + + $stmt = $this->getFetchStatement($this->fetchColumns, $id, $cache_id, $compile_id); + $stmt ->execute(); + $row = $stmt->fetch(); + $stmt ->closeCursor(); + + if ($row) { + $content = $this->outputContent($row['content']); + $mtime = strtotime($row['modified']); + } else { + $content = null; + $mtime = null; + } + } + + /** + * Fetch cached content's modification timestamp from data source + * {@internal implementing this method is optional. + * Only implement it if modification times can be accessed faster than loading the complete cached content.}} + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string|null $cache_id cache id + * @param string|null $compile_id compile id + * + * @return integer|boolean timestamp (epoch) the template was modified, or false if not found + * @access protected + */ + // protected function fetchTimestamp($id, $name, $cache_id = null, $compile_id = null) { + // $stmt = $this->getFetchStatement($this->fetchTimestampColumns, $id, $cache_id, $compile_id); + // $stmt -> execute(); + // $mtime = strtotime($stmt->fetchColumn()); + // $stmt -> closeCursor(); + // return $mtime; + // } + + /** + * Save content to cache + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string|null $cache_id cache id + * @param string|null $compile_id compile id + * @param integer|null $exp_time seconds till expiration time in seconds or null + * @param string $content content to cache + * + * @return boolean success + * @access protected + */ + protected function save($id, $name, $cache_id = null, $compile_id = null, $exp_time, $content) + { + + $stmt = $this->pdo->prepare($this->insertStatement); + + $stmt ->bindValue('id', $id); + $stmt ->bindValue('name', $name); + $stmt ->bindValue('cache_id', $cache_id, (is_null($cache_id)) ? PDO::PARAM_NULL : PDO::PARAM_STR); + $stmt ->bindValue('compile_id', $compile_id, (is_null($compile_id)) ? PDO::PARAM_NULL : PDO::PARAM_STR); + $stmt ->bindValue('expire', (int) $exp_time, PDO::PARAM_INT); + $stmt ->bindValue('content', $this->inputContent($content)); + $stmt ->execute(); + + return !!$stmt->rowCount(); + } + + /* + * Encodes the content before saving to database + * + * @param string $content + * @return string $content + * @access protected + */ + protected function inputContent($content) + { + return $content; + } + + /* + * Decodes the content before saving to database + * + * @param string $content + * @return string $content + * @access protected + */ + protected function outputContent($content) + { + return $content; + } + + /** + * Delete content from cache + * + * @param string|null $name template name + * @param string|null $cache_id cache id + * @param string|null $compile_id compile id + * @param integer|null|-1 $exp_time seconds till expiration or null + * + * @return integer number of deleted caches + * @access protected + */ + protected function delete($name = null, $cache_id = null, $compile_id = null, $exp_time = null) + { + + // delete the whole cache + if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) { + // returning the number of deleted caches would require a second query to count them + $this->pdo->query($this->truncateStatement); + return - 1; + } + // build the filter + $where = array(); + // equal test name + if ($name !== null) { + $where[] = 'name = ' . $this->pdo->quote($name); + } + // equal test cache_id and match sub-groups + if ($cache_id !== null) { + $where[] = '(cache_id = ' . $this->pdo->quote($cache_id) + . ' OR cache_id LIKE ' . $this->pdo->quote($cache_id . '|%') . ')'; + } + // equal test compile_id + if ($compile_id !== null) { + $where[] = 'compile_id = ' . $this->pdo->quote($compile_id); + } + // for clearing expired caches + if ($exp_time === Smarty::CLEAR_EXPIRED) { + $where[] = 'expire < CURRENT_TIMESTAMP'; + } // range test expiration time + elseif ($exp_time !== null) { + $where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)'; + } + // run delete query + $query = $this->pdo->query(sprintf($this->deleteStatement, join(' AND ', $where))); + return $query->rowCount(); + } + + /** + * Gets the formatted table name + * + * @return string + * @access protected + */ + protected function getTableName() + { + return (is_null($this->database)) ? "`{$this->table}`" : "`{$this->database}`.`{$this->table}`"; + } +} + +\ No newline at end of file diff --git a/libs/smarty/demo/plugins/cacheresource.pdo_gzip.php b/libs/smarty/demo/plugins/cacheresource.pdo_gzip.php @@ -0,0 +1,43 @@ +<?php + +/** + * PDO Cache Handler with GZIP support + * Example usage : + * $cnx = new PDO("mysql:host=localhost;dbname=mydb", "username", "password"); + * $smarty->setCachingType('pdo_gzip'); + * $smarty->loadPlugin('Smarty_CacheResource_Pdo_Gzip'); + * $smarty->registerCacheResource('pdo_gzip', new Smarty_CacheResource_Pdo_Gzip($cnx, 'smarty_cache')); + * + * @require Smarty_CacheResource_Pdo class + * @author Beno!t POLASZEK - 2014 + */ +require_once 'cacheresource.pdo.php'; + +class Smarty_CacheResource_Pdo_Gzip extends Smarty_CacheResource_Pdo +{ + + /* + * Encodes the content before saving to database + * + * @param string $content + * @return string $content + * @access protected + */ + protected function inputContent($content) + { + return gzdeflate($content); + } + + /* + * Decodes the content before saving to database + * + * @param string $content + * @return string $content + * @access protected + */ + protected function outputContent($content) + { + return gzinflate($content); + } +} + +\ No newline at end of file diff --git a/libs/smarty/demo/plugins/resource.extendsall.php b/libs/smarty/demo/plugins/resource.extendsall.php @@ -0,0 +1,60 @@ +<?php + +/** + * Extends All Resource + * Resource Implementation modifying the extends-Resource to walk + * through the template_dirs and inherit all templates of the same name + * + * @package Resource-examples + * @author Rodney Rehm + */ +class Smarty_Resource_Extendsall extends Smarty_Internal_Resource_Extends +{ + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * + * @return void + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) + { + $uid = ''; + $sources = array(); + $exists = true; + foreach ($_template->smarty->getTemplateDir() as $key => $directory) { + try { + $s = Smarty_Resource::source(null, $source->smarty, '[' . $key . ']' . $source->name); + if (!$s->exists) { + continue; + } + $sources[$s->uid] = $s; + $uid .= $s->filepath; + } + catch (SmartyException $e) { + } + } + + if (!$sources) { + $source->exists = false; + $source->template = $_template; + + return; + } + + $sources = array_reverse($sources, true); + reset($sources); + $s = current($sources); + + $source->components = $sources; + $source->filepath = $s->filepath; + $source->uid = sha1($uid); + $source->exists = $exists; + if ($_template && $_template->smarty->compile_check) { + $source->timestamp = $s->timestamp; + } + // need the template at getContent() + $source->template = $_template; + } +} diff --git a/libs/smarty/demo/plugins/resource.mysql.php b/libs/smarty/demo/plugins/resource.mysql.php @@ -0,0 +1,81 @@ +<?php + +/** + * MySQL Resource + * Resource Implementation based on the Custom API to use + * MySQL as the storage resource for Smarty's templates and configs. + * Table definition: + * <pre>CREATE TABLE IF NOT EXISTS `templates` ( + * `name` varchar(100) NOT NULL, + * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + * `source` text, + * PRIMARY KEY (`name`) + * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre> + * Demo data: + * <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');</pre> + * + * @package Resource-examples + * @author Rodney Rehm + */ +class Smarty_Resource_Mysql extends Smarty_Resource_Custom +{ + // PDO instance + protected $db; + // prepared fetch() statement + protected $fetch; + // prepared fetchTimestamp() statement + protected $mtime; + + public function __construct() + { + try { + $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty"); + } + catch (PDOException $e) { + throw new SmartyException('Mysql Resource failed: ' . $e->getMessage()); + } + $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name'); + $this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name'); + } + + /** + * Fetch a template and its modification time from database + * + * @param string $name template name + * @param string $source template source + * @param integer $mtime template modification timestamp (epoch) + * + * @return void + */ + protected function fetch($name, &$source, &$mtime) + { + $this->fetch->execute(array('name' => $name)); + $row = $this->fetch->fetch(); + $this->fetch->closeCursor(); + if ($row) { + $source = $row['source']; + $mtime = strtotime($row['modified']); + } else { + $source = null; + $mtime = null; + } + } + + /** + * Fetch a template's modification time from database + * + * @note implementing this method is optional. Only implement it if modification times can be accessed faster than loading the comple template source. + * + * @param string $name template name + * + * @return integer timestamp (epoch) the template was modified + */ + protected function fetchTimestamp($name) + { + $this->mtime->execute(array('name' => $name)); + $mtime = $this->mtime->fetchColumn(); + $this->mtime->closeCursor(); + + return strtotime($mtime); + } +} diff --git a/libs/smarty/demo/plugins/resource.mysqls.php b/libs/smarty/demo/plugins/resource.mysqls.php @@ -0,0 +1,62 @@ +<?php + +/** + * MySQL Resource + * Resource Implementation based on the Custom API to use + * MySQL as the storage resource for Smarty's templates and configs. + * Note that this MySQL implementation fetches the source and timestamps in + * a single database query, instead of two separate like resource.mysql.php does. + * Table definition: + * <pre>CREATE TABLE IF NOT EXISTS `templates` ( + * `name` varchar(100) NOT NULL, + * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + * `source` text, + * PRIMARY KEY (`name`) + * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre> + * Demo data: + * <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');</pre> + * + * @package Resource-examples + * @author Rodney Rehm + */ +class Smarty_Resource_Mysqls extends Smarty_Resource_Custom +{ + // PDO instance + protected $db; + // prepared fetch() statement + protected $fetch; + + public function __construct() + { + try { + $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty"); + } + catch (PDOException $e) { + throw new SmartyException('Mysql Resource failed: ' . $e->getMessage()); + } + $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name'); + } + + /** + * Fetch a template and its modification time from database + * + * @param string $name template name + * @param string $source template source + * @param integer $mtime template modification timestamp (epoch) + * + * @return void + */ + protected function fetch($name, &$source, &$mtime) + { + $this->fetch->execute(array('name' => $name)); + $row = $this->fetch->fetch(); + $this->fetch->closeCursor(); + if ($row) { + $source = $row['source']; + $mtime = strtotime($row['modified']); + } else { + $source = null; + $mtime = null; + } + } +} diff --git a/libs/smarty/demo/templates/footer.tpl b/libs/smarty/demo/templates/footer.tpl @@ -0,0 +1,2 @@ +</BODY> +</HTML> diff --git a/libs/smarty/demo/templates/header.tpl b/libs/smarty/demo/templates/header.tpl @@ -0,0 +1,5 @@ +<HTML> +<HEAD> +<TITLE>{$title} - {$Name}</TITLE> +</HEAD> +<BODY bgcolor="#ffffff"> diff --git a/libs/smarty/demo/templates/index.tpl b/libs/smarty/demo/templates/index.tpl @@ -0,0 +1,87 @@ +{config_load file="test.conf" section="setup"} +{include file="header.tpl" title=foo} + +<PRE> + +{* bold and title are read from the config file *} + {if #bold#}<b>{/if} + {* capitalize the first letters of each word of the title *} + Title: {#title#|capitalize} + {if #bold#}</b>{/if} + + The current date and time is {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"} + + The value of global assigned variable $SCRIPT_NAME is {$SCRIPT_NAME} + + Example of accessing server environment variable SERVER_NAME: {$smarty.server.SERVER_NAME} + + The value of {ldelim}$Name{rdelim} is <b>{$Name}</b> + +variable modifier example of {ldelim}$Name|upper{rdelim} + +<b>{$Name|upper}</b> + + +An example of a section loop: + + {section name=outer + loop=$FirstName} + {if $smarty.section.outer.index is odd by 2} + {$smarty.section.outer.rownum} . {$FirstName[outer]} {$LastName[outer]} + {else} + {$smarty.section.outer.rownum} * {$FirstName[outer]} {$LastName[outer]} + {/if} + {sectionelse} + none + {/section} + + An example of section looped key values: + + {section name=sec1 loop=$contacts} + phone: {$contacts[sec1].phone} + <br> + + fax: {$contacts[sec1].fax} + <br> + + cell: {$contacts[sec1].cell} + <br> + {/section} + <p> + + testing strip tags + {strip} +<table border=0> + <tr> + <td> + <A HREF="{$SCRIPT_NAME}"> + <font color="red">This is a test </font> + </A> + </td> + </tr> +</table> + {/strip} + +</PRE> + +This is an example of the html_select_date function: + +<form> + {html_select_date start_year=1998 end_year=2010} +</form> + +This is an example of the html_select_time function: + +<form> + {html_select_time use_24_hours=false} +</form> + +This is an example of the html_options function: + +<form> + <select name=states> + {html_options values=$option_values selected=$option_selected output=$option_output} + </select> +</form> + +{include file="footer.tpl"} diff --git a/libs/smarty/lexer/smarty_internal_configfilelexer.plex b/libs/smarty/lexer/smarty_internal_configfilelexer.plex @@ -0,0 +1,318 @@ +<?php +/** +* Smarty Internal Plugin Configfilelexer +* +* This is the lexer to break the config file source into tokens +* @package Smarty +* @subpackage Config +* @author Uwe Tews +*/ +/** +* Smarty_Internal_Configfilelexer +* +* This is the config file lexer. +* It is generated from the smarty_internal_configfilelexer.plex file +* +* @package Smarty +* @subpackage Compiler +* @author Uwe Tews +*/ +class Smarty_Internal_Configfilelexer +{ + /** + * Source + * + * @var string + */ + public $data; + /** + * byte counter + * + * @var int + */ + public $counter; + /** + * token number + * + * @var int + */ + public $token; + /** + * token value + * + * @var string + */ + public $value; + /** + * current line + * + * @var int + */ + public $line; + /** + * state number + * + * @var int + */ + public $state = 1; + /** + * Smarty object + * + * @var Smarty + */ + public $smarty = null; + /** + * compiler object + * + * @var Smarty_Internal_Config_File_Compiler + */ + private $compiler = null; + /** + * copy of config_booleanize + * + * @var bool + */ + private $configBooleanize = false; + /** + * trace file + * + * @var resource + */ + public $yyTraceFILE; + /** + * trace prompt + * + * @var string + */ + public $yyTracePrompt; + /** + * state names + * + * @var array + */ + public $state_name = array(1 => 'START', 2 => 'VALUE', 3 => 'NAKED_STRING_VALUE', 4 => 'COMMENT', 5 => 'SECTION', 6 => 'TRIPPLE'); + + /** + * storage for assembled token patterns + * + * @var sring + */ + 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; + + /** + * token names + * + * @var array + */ + public $smarty_token_names = array( // Text for parser error messages + ); + + /** + * constructor + * + * @param string $data template source + * @param Smarty_Internal_Config_File_Compiler $compiler + */ + function __construct($data, Smarty_Internal_Config_File_Compiler $compiler) + { + // set instance object + self::instance($this); + $this->data = $data . "\n"; //now all lines are \n-terminated + $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 static function &instance($new_instance = null) + { + static $instance = null; + if (isset($new_instance) && is_object($new_instance)) { + $instance = $new_instance; + } + return $instance; + } + + public function PrintTrace() + { + $this->yyTraceFILE = fopen('php://output', 'w'); + $this->yyTracePrompt = '<br>'; + } + + +/*!lex2php +%input $this->data +%counter $this->counter +%token $this->token +%value $this->value +%line $this->line +commentstart = /#|;/ +openB = /\[/ +closeB = /\]/ +section = /.*?(?=[\.=\[\]\r\n])/ +equal = /=/ +whitespace = /[ \t\r]+/ +dot = /\./ +id = /[0-9]*[a-zA-Z_]\w*/ +newline = /\n/ +single_quoted_string = /'[^'\\]*(?:\\.[^'\\]*)*'(?=[ \t\r]*[\n#;])/ +double_quoted_string = /"[^"\\]*(?:\\.[^"\\]*)*"(?=[ \t\r]*[\n#;])/ +tripple_quotes = /"""/ +tripple_quotes_end = /"""(?=[ \t\r]*[\n#;])/ +text = /[\S\s]/ +float = /\d+\.\d+(?=[ \t\r]*[\n#;])/ +int = /\d+(?=[ \t\r]*[\n#;])/ +maybe_bool = /[a-zA-Z]+(?=[ \t\r]*[\n#;])/ +naked_string = /[^\n]+?(?=[ \t\r]*\n)/ +*/ + +/*!lex2php +%statename START + +commentstart { + $this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART; + $this->yypushstate(self::COMMENT); +} +openB { + $this->token = Smarty_Internal_Configfileparser::TPC_OPENB; + $this->yypushstate(self::SECTION); +} +closeB { + $this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB; +} +equal { + $this->token = Smarty_Internal_Configfileparser::TPC_EQUAL; + $this->yypushstate(self::VALUE); +} +whitespace { + return false; +} +newline { + $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE; +} +id { + $this->token = Smarty_Internal_Configfileparser::TPC_ID; +} +text { + $this->token = Smarty_Internal_Configfileparser::TPC_OTHER; +} + +*/ + +/*!lex2php +%statename VALUE + +whitespace { + return false; +} +float { + $this->token = Smarty_Internal_Configfileparser::TPC_FLOAT; + $this->yypopstate(); +} +int { + $this->token = Smarty_Internal_Configfileparser::TPC_INT; + $this->yypopstate(); +} +tripple_quotes { + $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES; + $this->yypushstate(self::TRIPPLE); +} +single_quoted_string { + $this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING; + $this->yypopstate(); +} +double_quoted_string { + $this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING; + $this->yypopstate(); +} +maybe_bool { + 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(); + } +} +naked_string { + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + $this->yypopstate(); +} +newline { + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + $this->value = ""; + $this->yypopstate(); +} + +*/ + +/*!lex2php +%statename NAKED_STRING_VALUE + +naked_string { + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + $this->yypopstate(); +} + +*/ + +/*!lex2php +%statename COMMENT + +whitespace { + return false; +} +naked_string { + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; +} +newline { + $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE; + $this->yypopstate(); +} + +*/ + +/*!lex2php +%statename SECTION + +dot { + $this->token = Smarty_Internal_Configfileparser::TPC_DOT; +} +section { + $this->token = Smarty_Internal_Configfileparser::TPC_SECTION; + $this->yypopstate(); +} + +*/ +/*!lex2php +%statename TRIPPLE + +tripple_quotes_end { + $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END; + $this->yypopstate(); + $this->yypushstate(self::START); +} +text { + $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/smarty/lexer/smarty_internal_configfileparser.y b/libs/smarty/lexer/smarty_internal_configfileparser.y @@ -0,0 +1,362 @@ +/** +* Smarty Internal Plugin Configfileparser +* +* This is the config file parser +* +* +* @package Smarty +* @subpackage Config +* @author Uwe Tews +*/ +%name TPC_ +%declare_class { +/** +* 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 +} +%include_class +{ + /** + * result status + * + * @var bool + */ + public $successful = true; + /** + * return value + * + * @var mixed + */ + public $retvalue = 0; + /** + * @var + */ + public $yymajor; + /** + * lexer object + * + * @var Smarty_Internal_Configfilelexer + */ + private $lex; + /** + * internal error flag + * + * @var bool + */ + private $internalError = false; + /** + * compiler object + * + * @var Smarty_Internal_Config_File_Compiler + */ + public $compiler = null; + /** + * smarty object + * + * @var Smarty + */ + public $smarty = null; + /** + * copy of config_overwrite property + * + * @var bool + */ + private $configOverwrite = false; + /** + * copy of config_read_hidden property + * + * @var bool + */ + private $configReadHidden = false; + /** + * helper map + * + * @var array + */ + private static $escapes_single = Array('\\' => '\\', + '\'' => '\''); + + /** + * 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) + { + // set instance object + self::instance($this); + $this->lex = $lex; + $this->smarty = $compiler->smarty; + $this->compiler = $compiler; + $this->configOverwrite = $this->smarty->config_overwrite; + $this->configReadHidden = $this->smarty->config_read_hidden; + } + + /** + * @param null $new_instance + * + * @return null + */ + public static function &instance($new_instance = null) + { + static $instance = null; + if (isset($new_instance) && is_object($new_instance)) { + $instance = $new_instance; + } + return $instance; + } + + /** + * 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; + } + + /** + * 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; + } + + /** + * 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); + } + + /** + * parse triple quoted string + * + * @param string $qstr + * + * @return string + */ + private static function parse_tripple_double_quoted_string($qstr) + { + return stripcslashes($qstr); + } + + /** + * 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; + } + } + + /** + * 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); + } + } + + /** + * 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]); + } + } +} + +%token_prefix TPC_ + +%parse_accept +{ + $this->successful = !$this->internalError; + $this->internalError = false; + $this->retvalue = $this->_retvalue; +} + +%syntax_error +{ + $this->internalError = true; + $this->yymajor = $yymajor; + $this->compiler->trigger_config_file_error(); +} + +%stack_overflow +{ + $this->internalError = true; + $this->compiler->trigger_config_file_error("Stack overflow in configfile parser"); +} + +// Complete config file +start(res) ::= global_vars sections. { + res = null; +} + +// Global vars +global_vars(res) ::= var_list(vl). { + $this->add_global_vars(vl); + res = null; +} + +// Sections +sections(res) ::= sections section. { + res = null; +} + +sections(res) ::= . { + res = null; +} + +section(res) ::= OPENB SECTION(i) CLOSEB newline var_list(vars). { + $this->add_section_vars(i, vars); + res = null; +} + +section(res) ::= OPENB DOT SECTION(i) CLOSEB newline var_list(vars). { + if ($this->configReadHidden) { + $this->add_section_vars(i, vars); + } + res = null; +} + +// Var list +var_list(res) ::= var_list(vl) newline. { + res = vl; +} + +var_list(res) ::= var_list(vl) var(v). { + res = array_merge(vl, Array(v)); +} + +var_list(res) ::= . { + res = Array(); +} + + +// Var +var(res) ::= ID(id) EQUAL value(v). { + res = Array("key" => id, "value" => v); +} + + +value(res) ::= FLOAT(i). { + res = (float) i; +} + +value(res) ::= INT(i). { + res = (int) i; +} + +value(res) ::= BOOL(i). { + res = $this->parse_bool(i); +} + +value(res) ::= SINGLE_QUOTED_STRING(i). { + res = self::parse_single_quoted_string(i); +} + +value(res) ::= DOUBLE_QUOTED_STRING(i). { + res = self::parse_double_quoted_string(i); +} + +value(res) ::= TRIPPLE_QUOTES(i) TRIPPLE_TEXT(c) TRIPPLE_QUOTES_END(ii). { + res = self::parse_tripple_double_quoted_string(c); +} + +value(res) ::= TRIPPLE_QUOTES(i) TRIPPLE_QUOTES_END(ii). { + res = ''; +} + +value(res) ::= NAKED_STRING(i). { + res = i; +} + +// NOTE: this is not a valid rule +// It is added hier to produce a usefull error message on a missing '='; +value(res) ::= OTHER(i). { + res = i; +} + + +// Newline and comments +newline(res) ::= NEWLINE. { + res = null; +} + +newline(res) ::= COMMENTSTART NEWLINE. { + res = null; +} + +newline(res) ::= COMMENTSTART NAKED_STRING NEWLINE. { + res = null; +} diff --git a/libs/smarty/lexer/smarty_internal_templatelexer.plex b/libs/smarty/lexer/smarty_internal_templatelexer.plex @@ -0,0 +1,770 @@ +<?php +/** + * Smarty Internal Plugin Templatelexer + * This is the lexer to break the template source into tokens + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty_Internal_Templatelexer + * This is the template file lexer. + * It is generated from the smarty_internal_templatelexer.plex file + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ +class Smarty_Internal_Templatelexer +{ + /** + * Source + * + * @var string + */ + public $data; + /** + * byte counter + * + * @var int + */ + public $counter; + /** + * token number + * + * @var int + */ + public $token; + /** + * token value + * + * @var string + */ + public $value; + /** + * current line + * + * @var int + */ + public $line; + /** + * tag start line + * + * @var + */ + public $taglineno; + /** + * php code type + * + * @var string + */ + public $phpType = ''; + /** + * escaped left delimiter + * + * @var string + */ + public $ldel = ''; + /** + * escaped left delimiter length + * + * @var int + */ + public $ldel_length = 0; + /** + * escaped right delimiter + * + * @var string + */ + public $rdel = ''; + /** + * escaped right delimiter length + * + * @var int + */ + public $rdel_length = 0; + /** + * state number + * + * @var int + */ + public $state = 1; + /** + * Smarty object + * + * @var Smarty + */ + public $smarty = null; + /** + * compiler object + * + * @var Smarty_Internal_TemplateCompilerBase + */ + public $compiler = null; + /** + * literal tag nesting level + * + * @var int + */ + private $literal_cnt = 0; + + /** + * PHP start tag string + * + * @var string + */ + + /** + * trace file + * + * @var resource + */ + public $yyTraceFILE; + + /** + * trace prompt + * + * @var string + */ + public $yyTracePrompt; + + /** + * XML flag true while processing xml + * + * @var bool + */ + public $is_xml = false; + + /** + * state names + * + * @var array + */ + public $state_name = array(1 => 'TEXT', 2 => 'TAG', 3 => 'TAGBODY', 4 => 'LITERAL', 5 => 'DOUBLEQUOTEDSTRING', + 6 => 'CHILDBODY', 7 => 'CHILDBLOCK', 8 => 'CHILDLITERAL'); + + /** + * 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_global_pattern7 = null; + + private $yy_global_pattern8 = null; + + /** + * token names + * + * @var array + */ + public $smarty_token_names = array( // Text for parser error messages + 'NOT' => '(!,not)', + 'OPENP' => '(', + 'CLOSEP' => ')', + 'OPENB' => '[', + 'CLOSEB' => ']', + 'PTR' => '->', + 'APTR' => '=>', + 'EQUAL' => '=', + 'NUMBER' => 'number', + 'UNIMATH' => '+" , "-', + 'MATH' => '*" , "/" , "%', + 'INCDEC' => '++" , "--', + 'SPACE' => ' ', + 'DOLLAR' => '$', + 'SEMICOLON' => ';', + 'COLON' => ':', + 'DOUBLECOLON' => '::', + 'AT' => '@', + 'HATCH' => '#', + 'QUOTE' => '"', + 'BACKTICK' => '`', + 'VERT' => '"|" modifier', + 'DOT' => '.', + 'COMMA' => '","', + 'QMARK' => '"?"', + 'ID' => 'id, name', + 'TEXT' => 'text', + 'LDELSLASH' => '{/..} closing tag', + 'LDEL' => '{...} Smarty tag', + 'COMMENT' => 'comment', + 'AS' => 'as', + 'TO' => 'to', + 'PHP' => '"<?php", "<%", "{php}" tag', + 'LOGOP' => '"<", "==" ... logical operator', + 'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition', + 'SCOND' => '"is even" ... if condition', + ); + + /** + * constructor + * + * @param string $data template source + * @param Smarty_Internal_TemplateCompilerBase $compiler + */ + function __construct($data, Smarty_Internal_TemplateCompilerBase $compiler) + { + $this->data = $data; + $this->counter = 0; + if (preg_match('~^\xEF\xBB\xBF~i', $this->data, $match)) { + $this->counter += strlen($match[0]); + } + $this->line = 1; + $this->smarty = $compiler->smarty; + $this->compiler = $compiler; + $this->ldel = preg_quote($this->smarty->left_delimiter, '~'); + $this->ldel_length = strlen($this->smarty->left_delimiter); + $this->rdel = preg_quote($this->smarty->right_delimiter, '~'); + $this->rdel_length = strlen($this->smarty->right_delimiter); + $this->smarty_token_names['LDEL'] = $this->smarty->left_delimiter; + $this->smarty_token_names['RDEL'] = $this->smarty->right_delimiter; + } + + public function PrintTrace() + { + $this->yyTraceFILE = fopen('php://output', 'w'); + $this->yyTracePrompt = '<br>'; + } + + /* + * Check if this tag is autoliteral + */ + public function isAutoLiteral () + { + return $this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false; + } + + /*!lex2php + %input $this->data + %counter $this->counter + %token $this->token + %value $this->value + %line $this->line + linebreak = ~[\t ]*[\r\n]+[\t ]*~ + text = ~[\S\s]~ + textdoublequoted = ~([^"\\]*?)((?:\\.[^"\\]*?)*?)(?=(SMARTYldel|\$|`\$|"))~ + namespace = ~([0-9]*[a-zA-Z_]\w*)?(\\[0-9]*[a-zA-Z_]\w*)+~ + all = ~[\S\s]+~ + emptyjava = ~[{][}]~ + phpstart = ~(<[?]((php\s+|=)|\s+))|(<[%])|(<[?]xml\s+)|(<script\s+language\s*=\s*["']?\s*php\s*["']?\s*>)|([?][>])|([%][>])|(SMARTYldel\s*php(.*?)SMARTYrdel)|(SMARTYldel\s*[/]phpSMARTYrdel)~ + slash = ~[/]~ + ldel = ~SMARTYldel\s*~ + rdel = ~\s*SMARTYrdel~ + nocacherdel = ~(\s+nocache)?\s*SMARTYrdel~ + notblockid = ~(?:(?!block)[0-9]*[a-zA-Z_]\w*)~ + smartyblockchildparent = ~[\$]smarty\.block\.(child|parent)~ + integer = ~\d+~ + hex = ~0[xX][0-9a-fA-F]+~ + math = ~\s*([*]{1,2}|[%/^&]|[<>]{2})\s*~ + comment = ~SMARTYldel[*]~ + incdec = ~([+]|[-]){2}~ + unimath = ~\s*([+]|[-])\s*~ + openP = ~\s*[(]\s*~ + closeP = ~\s*[)]~ + openB = ~\[\s*~ + closeB = ~\s*\]~ + dollar = ~[$]~ + dot = ~[.]~ + comma = ~\s*[,]\s*~ + doublecolon = ~[:]{2}~ + colon = ~\s*[:]\s*~ + at = ~[@]~ + hatch = ~[#]~ + semicolon = ~\s*[;]\s*~ + equal = ~\s*[=]\s*~ + space = ~\s+~ + ptr = ~\s*[-][>]\s*~ + aptr = ~\s*[=][>]\s*~ + singlequotestring = ~'[^'\\]*(?:\\.[^'\\]*)*'~ + backtick = ~[`]~ + vert = ~[|]~ + qmark = ~\s*[?]\s*~ + constant = ~([_]+[A-Z0-9][0-9A-Z_]*|[A-Z][0-9A-Z_]*)(?![0-9A-Z_]*[a-z])~ + attr = ~\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\s*[=]\s*~ + id = ~[0-9]*[a-zA-Z_]\w*~ + literal = ~literal~ + strip = ~strip~ + lop = ~\s*(([!=][=]{1,2})|([<][=>]?)|([>][=]?)|[&|]{2})\s*~ + tlop = ~\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor|(is\s+(not\s+)?(odd|even|div)\s+by))\s+~ + scond = ~\s+is\s+(not\s+)?(odd|even)~ + isin = ~\s+is\s+in\s+~ + as = ~\s+as\s+~ + to = ~\s+to\s+~ + step = ~\s+step\s+~ + block = ~block~ + if = ~(if|elseif|else if|while)\s+~ + for = ~for\s+~ + foreach = ~foreach(?![^\s])~ + setfilter = ~setfilter\s+~ + instanceof = ~\s+instanceof\s+~ + not = ~([!]\s*)|(not\s+)~ + typecast = ~[(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\s*~ + double_quote = ~["]~ + single_quote = ~[']~ + */ + /*!lex2php + %statename TEXT + emptyjava { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + comment { + preg_match("~[*]{$this->rdel}~",$this->data,$match,PREG_OFFSET_CAPTURE,$this->counter); + if (isset($match[0][1])) { + $to = $match[0][1] + strlen($match[0][0]); + } else { + $this->compiler->trigger_template_error ("missing or misspelled comment closing tag '*{$this->smarty->right_delimiter}'"); + } + $this->value = substr($this->data,$this->counter,$to-$this->counter); + return false; + } + phpstart { + $obj = new Smarty_Internal_Compile_Private_Php(); + $obj->parsePhp($this); + } + ldel literal rdel { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART; + $this->yypushstate(self::LITERAL); + } + } + ldel { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->yypushstate(self::TAG); + return true; + } + } + rdel { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + text { + $to = strlen($this->data); + preg_match("~($this->ldel)|([<]script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*[>])|([<][?])|([<][%])|([?][>])|([%][>])~i",$this->data,$match,PREG_OFFSET_CAPTURE,$this->counter); + if (isset($match[0][1])) { + $to = $match[0][1]; + } + $this->value = substr($this->data,$this->counter,$to-$this->counter); + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + */ + /*!lex2php + %statename TAG + ldel if { + $this->token = Smarty_Internal_Templateparser::TP_LDELIF; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + ldel for { + $this->token = Smarty_Internal_Templateparser::TP_LDELFOR; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + ldel foreach { + $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + ldel setfilter { + $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + ldel id nocacherdel { + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_SIMPLETAG; + $this->taglineno = $this->line; + } + ldel slash notblockid rdel { + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_CLOSETAG; + $this->taglineno = $this->line; + } + ldel dollar id nocacherdel { + if ($this->_yy_stack[count($this->_yy_stack)-1] == self::TEXT) { + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_SIMPLEOUTPUT; + $this->taglineno = $this->line; + } else { + $this->value = $this->smarty->left_delimiter; + $this->token = Smarty_Internal_Templateparser::TP_LDEL; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + } + ldel slash { + $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + ldel { + $this->token = Smarty_Internal_Templateparser::TP_LDEL; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + */ + /*!lex2php + %statename TAGBODY + rdel { + $this->token = Smarty_Internal_Templateparser::TP_RDEL; + $this->yypopstate(); + } + double_quote { + $this->token = Smarty_Internal_Templateparser::TP_QUOTE; + $this->yypushstate(self::DOUBLEQUOTEDSTRING); + } + singlequotestring { + $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING; + } + smartyblockchildparent { + $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT; + $this->taglineno = $this->line; + } + dollar id { + $this->token = Smarty_Internal_Templateparser::TP_DOLLARID; + } + dollar { + $this->token = Smarty_Internal_Templateparser::TP_DOLLAR; + } + isin { + $this->token = Smarty_Internal_Templateparser::TP_ISIN; + } + as { + $this->token = Smarty_Internal_Templateparser::TP_AS; + } + to { + $this->token = Smarty_Internal_Templateparser::TP_TO; + } + step { + $this->token = Smarty_Internal_Templateparser::TP_STEP; + } + instanceof { + $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF; + } + lop { + $this->token = Smarty_Internal_Templateparser::TP_LOGOP; + } + tlop { + $this->token = Smarty_Internal_Templateparser::TP_TLOGOP; + } + scond { + $this->token = Smarty_Internal_Templateparser::TP_SINGLECOND; + } + not{ + $this->token = Smarty_Internal_Templateparser::TP_NOT; + } + typecast { + $this->token = Smarty_Internal_Templateparser::TP_TYPECAST; + } + openP { + $this->token = Smarty_Internal_Templateparser::TP_OPENP; + } + closeP { + $this->token = Smarty_Internal_Templateparser::TP_CLOSEP; + } + openB { + $this->token = Smarty_Internal_Templateparser::TP_OPENB; + } + closeB { + $this->token = Smarty_Internal_Templateparser::TP_CLOSEB; + } + ptr { + $this->token = Smarty_Internal_Templateparser::TP_PTR; + } + aptr { + $this->token = Smarty_Internal_Templateparser::TP_APTR; + } + equal { + $this->token = Smarty_Internal_Templateparser::TP_EQUAL; + } + incdec { + $this->token = Smarty_Internal_Templateparser::TP_INCDEC; + } + unimath { + $this->token = Smarty_Internal_Templateparser::TP_UNIMATH; + } + math { + $this->token = Smarty_Internal_Templateparser::TP_MATH; + } + at { + $this->token = Smarty_Internal_Templateparser::TP_AT; + } + hatch { + $this->token = Smarty_Internal_Templateparser::TP_HATCH; + } + attr { + // resolve conflicts with shorttag and right_delimiter starting with '=' + if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->rdel_length) == $this->smarty->right_delimiter) { + preg_match("~\s+~",$this->value,$match); + $this->value = $match[0]; + $this->token = Smarty_Internal_Templateparser::TP_SPACE; + } else { + $this->token = Smarty_Internal_Templateparser::TP_ATTR; + } + } + namespace { + $this->token = Smarty_Internal_Templateparser::TP_NAMESPACE; + } + id { + $this->token = Smarty_Internal_Templateparser::TP_ID; + } + integer { + $this->token = Smarty_Internal_Templateparser::TP_INTEGER; + } + backtick { + $this->token = Smarty_Internal_Templateparser::TP_BACKTICK; + $this->yypopstate(); + } + vert { + $this->token = Smarty_Internal_Templateparser::TP_VERT; + } + dot { + $this->token = Smarty_Internal_Templateparser::TP_DOT; + } + comma { + $this->token = Smarty_Internal_Templateparser::TP_COMMA; + } + semicolon { + $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON; + } + doublecolon { + $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON; + } + colon { + $this->token = Smarty_Internal_Templateparser::TP_COLON; + } + qmark { + $this->token = Smarty_Internal_Templateparser::TP_QMARK; + } + hex { + $this->token = Smarty_Internal_Templateparser::TP_HEX; + } + space { + $this->token = Smarty_Internal_Templateparser::TP_SPACE; + } + ldel { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->yypushstate(self::TAG); + return true; + } + } + text { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + */ + + /*!lex2php + %statename LITERAL + ldel literal rdel { + $this->literal_cnt++; + $this->token = Smarty_Internal_Templateparser::TP_LITERAL; + } + ldel slash literal rdel { + if ($this->literal_cnt) { + $this->literal_cnt--; + $this->token = Smarty_Internal_Templateparser::TP_LITERAL; + } else { + $this->token = Smarty_Internal_Templateparser::TP_LITERALEND; + $this->yypopstate(); + } + } + text { + $to = strlen($this->data); + preg_match("~{$this->ldel}[/]?literal{$this->rdel}~i",$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_Templateparser::TP_LITERAL; + } + */ + /*!lex2php + %statename DOUBLEQUOTEDSTRING + ldel literal rdel { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + ldel slash literal rdel { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + ldel slash { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->yypushstate(self::TAG); + return true; + } + } + ldel id { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->yypushstate(self::TAG); + return true; + } + } + ldel { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->token = Smarty_Internal_Templateparser::TP_LDEL; + $this->taglineno = $this->line; + $this->yypushstate(self::TAGBODY); + } + } + double_quote { + $this->token = Smarty_Internal_Templateparser::TP_QUOTE; + $this->yypopstate(); + } + backtick dollar { + $this->token = Smarty_Internal_Templateparser::TP_BACKTICK; + $this->value = substr($this->value,0,-1); + $this->yypushstate(self::TAGBODY); + $this->taglineno = $this->line; + } + dollar id { + $this->token = Smarty_Internal_Templateparser::TP_DOLLARID; + } + dollar { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + textdoublequoted { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + text { + $to = strlen($this->data); + $this->value = substr($this->data,$this->counter,$to-$this->counter); + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + */ + /*!lex2php + %statename CHILDBODY + ldel strip rdel { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + return false; + } else { + $this->token = Smarty_Internal_Templateparser::TP_STRIPON; + } + } + ldel slash strip rdel { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + return false; + } else { + $this->token = Smarty_Internal_Templateparser::TP_STRIPOFF; + } + } + ldel block { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + return false; + } else { + $this->yypopstate(); + return true; + } + } + text { + $to = strlen($this->data); + preg_match("~SMARTYldel\s*(([/])?strip\s*SMARTYrdel|block\s+)~i",$this->data,$match,PREG_OFFSET_CAPTURE,$this->counter); + if (isset($match[0][1])) { + $to = $match[0][1]; + } + $this->value = substr($this->data,$this->counter,$to-$this->counter); + return false; + } + + */ + /*!lex2php + %statename CHILDBLOCK + ldel literal rdel { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + $this->yypushstate(self::CHILDLITERAL); + } + } + ldel block { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->yypopstate(); + return true; + } + } + ldel slash block { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->yypopstate(); + return true; + } + } + ldel smartyblockchildparent { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->yypopstate(); + return true; + } + } + text { + $to = strlen($this->data); + preg_match("~SMARTYldel\s*(literal\s*SMARTYrdel|([/])?block(\s|SMARTYrdel)|[\$]smarty\.block\.(child|parent))~i",$this->data,$match,PREG_OFFSET_CAPTURE,$this->counter); + if (isset($match[0][1])) { + $to = $match[0][1]; + } + $this->value = substr($this->data,$this->counter,$to-$this->counter); + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } + */ + /*!lex2php + %statename CHILDLITERAL + ldel literal rdel { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + $this->yypushstate(self::CHILDLITERAL); + } + } + ldel slash literal rdel { + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + $this->yypopstate(); + } + } + text { + $to = strlen($this->data); + preg_match("~{$this->ldel}[/]?literal\s*{$this->rdel}~i",$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_Templateparser::TP_BLOCKSOURCE; + } + */ + } + + +\ No newline at end of file diff --git a/libs/smarty/lexer/smarty_internal_templateparser.y b/libs/smarty/lexer/smarty_internal_templateparser.y @@ -0,0 +1,1329 @@ +/** +* Smarty Internal Plugin Templateparser +* +* This is the template parser +* +* +* @package Smarty +* @subpackage Compiler +* @author Uwe Tews +*/ +%stack_size 500 +%name TP_ +%declare_class { +/** +* Smarty Internal Plugin Templateparser +* +* This is the template parser. +* It is generated from the smarty_internal_templateparser.y file +* @package Smarty +* @subpackage Compiler +* @author Uwe Tews +*/ +class Smarty_Internal_Templateparser +} +%include_class +{ + const Err1 = "Security error: Call to private object member not allowed"; + const Err2 = "Security error: Call to dynamic object member not allowed"; + const Err3 = "PHP in template not allowed. Use SmartyBC to enable it"; + + /** + * result status + * + * @var bool + */ + public $successful = true; + /** + * return value + * + * @var mixed + */ + public $retvalue = 0; + /** + * counter for prefix code + * + * @var int + */ + public static $prefix_number = 0; + /** + * @var + */ + public $yymajor; + /** + * last index of array variable + * + * @var mixed + */ + public $last_index; + /** + * last variable name + * + * @var string + */ + public $last_variable; + /** + * root parse tree buffer + * + * @var Smarty_Internal_ParseTree + */ + public $root_buffer; + /** + * current parse tree object + * + * @var Smarty_Internal_ParseTree + */ + public $current_buffer; + /** + * lexer object + * + * @var Smarty_Internal_Templatelexer + */ + private $lex; + /** + * internal error flag + * + * @var bool + */ + private $internalError = false; + /** + * {strip} status + * + * @var bool + */ + public $strip = false; + /** + * compiler object + * + * @var Smarty_Internal_TemplateCompilerBase + */ + public $compiler = null; + /** + * smarty object + * + * @var Smarty + */ + public $smarty = null; + /** + * template object + * + * @var Smarty_Internal_Template + */ + public $template = null; + /** + * block nesting level + * + * @var int + */ + public $block_nesting_level = 0; + + /** + * security object + * + * @var Smarty_Security + */ + private $security = null; + + /** + * constructor + * + * @param Smarty_Internal_Templatelexer $lex + * @param Smarty_Internal_TemplateCompilerBase $compiler + */ + function __construct(Smarty_Internal_Templatelexer $lex, Smarty_Internal_TemplateCompilerBase $compiler) + { + $this->lex = $lex; + $this->compiler = $compiler; + $this->template = $this->compiler->template; + $this->smarty = $this->template->smarty; + $this->security = isset($this->smarty->security_policy) ? $this->smarty->security_policy : false; + $this->current_buffer = $this->root_buffer = new Smarty_Internal_ParseTree_Template($this); + } + + /** + * insert PHP code in current buffer + * + * @param string $code + */ + public function insertPhpCode($code) + { + $this->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($this, $code)); + } + + /** + * merge PHP code with prefix code and return parse tree tag object + * + * @param string $code + * + * @return Smarty_Internal_ParseTree_Tag + */ + public function mergePrefixCode($code) + { + $tmp =''; + foreach ($this->compiler->prefix_code as $preCode) { + $tmp = empty($tmp) ? $preCode : $this->compiler->appendCode($tmp, $preCode); + } + $this->compiler->prefix_code=array(); + $tmp = empty($tmp) ? $code : $this->compiler->appendCode($tmp, $code); + return new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode($tmp,true)); + } + +} + +%token_prefix TP_ + +%parse_accept +{ + $this->successful = !$this->internalError; + $this->internalError = false; + $this->retvalue = $this->_retvalue; +} + +%syntax_error +{ + $this->internalError = true; + $this->yymajor = $yymajor; + $this->compiler->trigger_template_error(); +} + +%stack_overflow +{ + $this->internalError = true; + $this->compiler->trigger_template_error("Stack overflow in template parser"); +} + +%left VERT. +%left COLON. + + // + // complete template + // +start(res) ::= template. { + res = $this->root_buffer->to_smarty_php(); +} + + // + // loop over template elements + // + // single template element +template ::= template_element(e). { + if (e != null) { + $this->current_buffer->append_subtree(e); + } +} + + // loop of elements +template ::= template template_element(e). { + if (e != null) { + // because of possible code injection + $this->current_buffer->append_subtree(e); + } +} + + // empty template +template ::= . + +// +// template elements +// + // Smarty tag +template_element(res)::= smartytag(st). { + if ($this->compiler->has_code) { + res = $this->mergePrefixCode(st); + } else { + res = null; + } + $this->compiler->has_variable_string = false; + $this->block_nesting_level = count($this->compiler->_tag_stack); +} + + // Literal +template_element(res) ::= literal(l). { + res = new Smarty_Internal_ParseTree_Text($this, l); +} + // php tags +template_element(res)::= PHP(o). { + $code = $this->compiler->compileTag('private_php',array(array('code' => o), array('type' => $this->lex->phpType )),array()); + if ($this->compiler->has_code && !empty($code)) { + $tmp =''; foreach ($this->compiler->prefix_code as $code) {$tmp.=$code;} $this->compiler->prefix_code=array(); + res = new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode($tmp.$code,true)); + } else { + res = null; + } +} + + // nocache code +template_element(res)::= NOCACHE(c). { + $this->compiler->tag_nocache = true; + $save = $this->template->has_nocache_code; + res = new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode("<?php echo '{c}';?>\n", $this->compiler, true)); + $this->template->has_nocache_code = $save; +} + // template text +template_element(res)::= text_content(t). { + res = $this->compiler->processText(t); +} + +text_content(res) ::= TEXT(o). { + res = o; +} + +text_content(res) ::= text_content(t) TEXT(o). { + res = t . o; +} + + // strip on +template_element ::= STRIPON(d). { + $this->strip = true; +} + // strip off +template_element ::= STRIPOFF(d). { + $this->strip = false; +} + // process source of inheritance child block +template_element ::= BLOCKSOURCE(s). { + if ($this->strip) { + SMARTY_INTERNAL_COMPILE_BLOCK::blockSource($this->compiler, preg_replace('![\t ]*[\r\n]+[\t ]*!', '', s)); + } else { + SMARTY_INTERNAL_COMPILE_BLOCK::blockSource($this->compiler, s); + } +} + + // Litteral +literal(res) ::= LITERALSTART LITERALEND. { + res = ''; +} + +literal(res) ::= LITERALSTART literal_elements(l) LITERALEND. { + res = l; +} + +literal_elements(res) ::= literal_elements(l1) literal_element(l2). { + res = l1.l2; +} + +literal_elements(res) ::= . { + res = ''; +} + +literal_element(res) ::= literal(l). { + res = l; +} + +literal_element(res) ::= LITERAL(l). { + res = l; +} + +smartytag(res) ::= tag(t) RDEL. { + res = t; +} +// +// output tags start here +// +smartytag(res) ::= SIMPLEOUTPUT(i). { + $var = trim(substr(i, $this->lex->ldel_length, -$this->lex->rdel_length), ' $'); + if (preg_match('/^(.*)(\s+nocache)$/', $var, $match)) { + res = $this->compiler->compileTag('private_print_expression',array('nocache'),array('value'=>$this->compiler->compileVariable('\''.$match[1].'\''))); + } else { + res = $this->compiler->compileTag('private_print_expression',array(),array('value'=>$this->compiler->compileVariable('\''.$var.'\''))); + } +} + + // output with optional attributes +tag(res) ::= LDEL variable(e). { + res = $this->compiler->compileTag('private_print_expression',array(),array('value'=>e)); +} + +tag(res) ::= LDEL variable(e) attributes(a). { + res = $this->compiler->compileTag('private_print_expression',a,array('value'=>e)); +} +tag(res) ::= LDEL value(e). { + res = $this->compiler->compileTag('private_print_expression',array(),array('value'=>e)); +} +tag(res) ::= LDEL value(e) attributes(a). { + res = $this->compiler->compileTag('private_print_expression',a,array('value'=>e)); +} + +tag(res) ::= LDEL expr(e). { + res = $this->compiler->compileTag('private_print_expression',array(),array('value'=>e)); +} + +tag(res) ::= LDEL expr(e) attributes(a). { + res = $this->compiler->compileTag('private_print_expression',a,array('value'=>e)); +} + +// +// Smarty tags start here +// + + // assign new style +tag(res) ::= LDEL DOLLARID(i) EQUAL value(e). { + res = $this->compiler->compileTag('assign',array(array('value'=>e),array('var'=>'\''.substr(i,1).'\''))); +} + +tag(res) ::= LDEL DOLLARID(i) EQUAL expr(e). { + res = $this->compiler->compileTag('assign',array(array('value'=>e),array('var'=>'\''.substr(i,1).'\''))); +} + +tag(res) ::= LDEL DOLLARID(i) EQUAL expr(e) attributes(a). { + res = $this->compiler->compileTag('assign',array_merge(array(array('value'=>e),array('var'=>'\''.substr(i,1).'\'')),a)); +} + +tag(res) ::= LDEL varindexed(vi) EQUAL expr(e) attributes(a). { + res = $this->compiler->compileTag('assign',array_merge(array(array('value'=>e),array('var'=>vi['var'])),a),array('smarty_internal_index'=>vi['smarty_internal_index'])); +} + +// simple tag like {name} +smartytag(res)::= SIMPLETAG(t). { + $tag = trim(substr(t, $this->lex->ldel_length, -$this->lex->rdel_length)); + if ($tag == 'strip') { + $this->strip = true; + res = null;; + } else { + if (defined($tag)) { + if ($this->security) { + $this->security->isTrustedConstant($tag, $this->compiler); + } + res = $this->compiler->compileTag('private_print_expression',array(),array('value'=>$tag)); + } else { + if (preg_match('/^(.*)(\s+nocache)$/', $tag, $match)) { + res = $this->compiler->compileTag($match[1],array("'nocache'")); + } else { + res = $this->compiler->compileTag($tag,array()); + } + } + } +} + + // tag with optional Smarty2 style attributes +tag(res) ::= LDEL ID(i) attributes(a). { + if (defined(i)) { + if ($this->security) { + $this->security->isTrustedConstant(i, $this->compiler); + } + res = $this->compiler->compileTag('private_print_expression',a,array('value'=>i)); + } else { + res = $this->compiler->compileTag(i,a); + } +} +tag(res) ::= LDEL ID(i). { + if (defined(i)) { + if ($this->security) { + $this->security->isTrustedConstant(i, $this->compiler); + } + res = $this->compiler->compileTag('private_print_expression',array(),array('value'=>i)); + } else { + res = $this->compiler->compileTag(i,array()); + } +} + + + // tag with modifier and optional Smarty2 style attributes +tag(res) ::= LDEL ID(i) modifierlist(l)attributes(a). { + if (defined(i)) { + if ($this->security) { + $this->security->isTrustedConstant(i, $this->compiler); + } + res = $this->compiler->compileTag('private_print_expression',a,array('value'=>i, 'modifierlist'=>l)); + } else { + res = '<?php ob_start();?>'.$this->compiler->compileTag(i,a).'<?php echo '; + res .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>l,'value'=>'ob_get_clean()')).';?>'; + } +} + + // registered object tag +tag(res) ::= LDEL ID(i) PTR ID(m) attributes(a). { + res = $this->compiler->compileTag(i,a,array('object_method'=>m)); +} + + // registered object tag with modifiers +tag(res) ::= LDEL ID(i) PTR ID(me) modifierlist(l) attributes(a). { + res = '<?php ob_start();?>'.$this->compiler->compileTag(i,a,array('object_method'=>me)).'<?php echo '; + res .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>l,'value'=>'ob_get_clean()')).';?>'; +} + + // {if}, {elseif} and {while} tag +tag(res) ::= LDELIF(i) expr(ie). { + $tag = trim(substr(i,$this->lex->ldel_length)); + res = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array(),array('if condition'=>ie)); +} + +tag(res) ::= LDELIF(i) expr(ie) attributes(a). { + $tag = trim(substr(i,$this->lex->ldel_length)); + res = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,a,array('if condition'=>ie)); +} + +tag(res) ::= LDELIF(i) statement(ie). { + $tag = trim(substr(i,$this->lex->ldel_length)); + res = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array(),array('if condition'=>ie)); +} + +tag(res) ::= LDELIF(i) statement(ie) attributes(a). { + $tag = trim(substr(i,$this->lex->ldel_length)); + res = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,a,array('if condition'=>ie)); +} + + // {for} tag +tag(res) ::= LDELFOR statements(st) SEMICOLON expr(ie) SEMICOLON varindexed(v2) foraction(e2) attributes(a). { + res = $this->compiler->compileTag('for',array_merge(a,array(array('start'=>st),array('ifexp'=>ie),array('var'=>v2),array('step'=>e2))),1); +} + + foraction(res) ::= EQUAL expr(e). { + res = '='.e; +} + + foraction(res) ::= INCDEC(e). { + res = e; +} + +tag(res) ::= LDELFOR statement(st) TO expr(v) attributes(a). { + res = $this->compiler->compileTag('for',array_merge(a,array(array('start'=>st),array('to'=>v))),0); +} + +tag(res) ::= LDELFOR statement(st) TO expr(v) STEP expr(v2) attributes(a). { + res = $this->compiler->compileTag('for',array_merge(a,array(array('start'=>st),array('to'=>v),array('step'=>v2))),0); +} + + // {foreach} tag +tag(res) ::= LDELFOREACH attributes(a). { + res = $this->compiler->compileTag('foreach',a); +} + + // {foreach $array as $var} tag +tag(res) ::= LDELFOREACH SPACE value(v1) AS varvar(v0) attributes(a). { + res = $this->compiler->compileTag('foreach',array_merge(a,array(array('from'=>v1),array('item'=>v0)))); +} + +tag(res) ::= LDELFOREACH SPACE value(v1) AS varvar(v2) APTR varvar(v0) attributes(a). { + res = $this->compiler->compileTag('foreach',array_merge(a,array(array('from'=>v1),array('item'=>v0),array('key'=>v2)))); +} + +tag(res) ::= LDELFOREACH SPACE expr(e) AS varvar(v0) attributes(a). { + res = $this->compiler->compileTag('foreach',array_merge(a,array(array('from'=>e),array('item'=>v0)))); +} + +tag(res) ::= LDELFOREACH SPACE expr(e) AS varvar(v1) APTR varvar(v0) attributes(a). { + res = $this->compiler->compileTag('foreach',array_merge(a,array(array('from'=>e),array('item'=>v0),array('key'=>v1)))); +} + + // {setfilter} +tag(res) ::= LDELSETFILTER ID(m) modparameters(p). { + res = $this->compiler->compileTag('setfilter',array(),array('modifier_list'=>array(array_merge(array(m),p)))); +} + +tag(res) ::= LDELSETFILTER ID(m) modparameters(p) modifierlist(l). { + res = $this->compiler->compileTag('setfilter',array(),array('modifier_list'=>array_merge(array(array_merge(array(m),p)),l))); +} + + // {$smarty.block.child} or {$smarty.block.parent} +tag(res) ::= LDEL SMARTYBLOCKCHILDPARENT(i). { + $j = strrpos(i,'.'); + if (i[$j+1] == 'c') { + // {$smarty.block.child} + res = SMARTY_INTERNAL_COMPILE_BLOCK::compileChildBlock($this->compiler); + } else { + // {$smarty.block.parent} + res = SMARTY_INTERNAL_COMPILE_BLOCK::compileParentBlock($this->compiler); + } +} + + + // end of block tag {/....} +smartytag(res)::= CLOSETAG(t). { + $tag = trim(substr(t, $this->lex->ldel_length, -$this->lex->rdel_length), ' /'); + if ($tag == 'strip') { + $this->strip = false; + res = null; + } else { + res = $this->compiler->compileTag($tag.'close',array()); + } + } +tag(res) ::= LDELSLASH ID(i). { + res = $this->compiler->compileTag(i.'close',array()); +} + +tag(res) ::= LDELSLASH ID(i) modifierlist(l). { + res = $this->compiler->compileTag(i.'close',array(),array('modifier_list'=>l)); +} + + // end of block object tag {/....} +tag(res) ::= LDELSLASH ID(i) PTR ID(m). { + res = $this->compiler->compileTag(i.'close',array(),array('object_method'=>m)); +} + +tag(res) ::= LDELSLASH ID(i) PTR ID(m) modifierlist(l). { + res = $this->compiler->compileTag(i.'close',array(),array('object_method'=>m, 'modifier_list'=>l)); +} + +// +//Attributes of Smarty tags +// + // list of attributes +attributes(res) ::= attributes(a1) attribute(a2). { + res = a1; + res[] = a2; +} + + // single attribute +attributes(res) ::= attribute(a). { + res = array(a); +} + + // no attributes +attributes(res) ::= . { + res = array(); +} + + // attribute +attribute(res) ::= SPACE ID(v) EQUAL ID(id). { + if (defined(id)) { + if ($this->security) { + $this->security->isTrustedConstant(id, $this->compiler); + } + res = array(v=>id); + } else { + res = array(v=>'\''.id.'\''); + } +} + +attribute(res) ::= ATTR(v) expr(e). { + res = array(trim(v," =\n\r\t")=>e); +} + +attribute(res) ::= ATTR(v) value(e). { + res = array(trim(v," =\n\r\t")=>e); +} + +attribute(res) ::= SPACE ID(v). { + res = '\''.v.'\''; +} + +attribute(res) ::= SPACE expr(e). { + res = e; +} + +attribute(res) ::= SPACE value(v). { + res = v; +} + +attribute(res) ::= SPACE INTEGER(i) EQUAL expr(e). { + res = array(i=>e); +} + + + +// +// statement +// +statements(res) ::= statement(s). { + res = array(s); +} + +statements(res) ::= statements(s1) COMMA statement(s). { + s1[]=s; + res = s1; +} + +statement(res) ::= DOLLARID(i) EQUAL INTEGER(e). { + res = array('var' => '\''.substr(i,1).'\'', 'value'=>e); +} +statement(res) ::= DOLLARID(i) EQUAL expr(e). { + res = array('var' => '\''.substr(i,1).'\'', 'value'=>e); +} + +statement(res) ::= varindexed(vi) EQUAL expr(e). { + res = array('var' => vi, 'value'=>e); +} + +statement(res) ::= OPENP statement(st) CLOSEP. { + res = st; +} + + +// +// expressions +// + + // single value +expr(res) ::= value(v). { + res = v; +} + + // ternary +expr(res) ::= ternary(v). { + res = v; +} + + // resources/streams +expr(res) ::= DOLLARID(i) COLON ID(i2). { + res = '$_smarty_tpl->getStreamVariable(\''.substr(i,1).'://' . i2 . '\')'; +} + + // arithmetic expression +expr(res) ::= expr(e) MATH(m) value(v). { + res = e . trim(m) . v; +} + +expr(res) ::= expr(e) UNIMATH(m) value(v). { + res = e . trim(m) . v; +} + + // array +expr(res) ::= array(a). { + res = a; +} + + // modifier +expr(res) ::= expr(e) modifierlist(l). { + res = $this->compiler->compileTag('private_modifier',array(),array('value'=>e,'modifierlist'=>l)); +} + +// if expression + // simple expression +expr(res) ::= expr(e1) lop(c) expr(e2). { + res = (isset(c['pre']) ? c['pre'] : '') . e1.c['op'].e2 . (isset(c['pre']) ? ')' : ''); +} +expr(res) ::= expr(e1) scond(c). { + res = c . e1 . ')'; +} + +expr(res) ::= expr(e1) ISIN array(a). { + res = 'in_array('.e1.','.a.')'; +} + +expr(res) ::= expr(e1) ISIN value(v). { + res = 'in_array('.e1.',(array)'.v.')'; +} + +expr(res) ::= variable(v1) INSTANCEOF(i) ns1(v2). { + res = v1.i.v2; +} + + +// +// ternary +// +ternary(res) ::= OPENP expr(v) CLOSEP QMARK DOLLARID(e1) COLON expr(e2). { + res = v.' ? '. $this->compiler->compileVariable('\''.substr(e1,1).'\'') . ' : '.e2; +} + +ternary(res) ::= OPENP expr(v) CLOSEP QMARK expr(e1) COLON expr(e2). { + res = v.' ? '.e1.' : '.e2; +} + + // value +value(res) ::= variable(v). { + res = v; +} + + // +/- value +value(res) ::= UNIMATH(m) value(v). { + res = m.v; +} + + // logical negation +value(res) ::= NOT value(v). { + res = '!'.v; +} + +value(res) ::= TYPECAST(t) value(v). { + res = t.v; +} + +value(res) ::= variable(v) INCDEC(o). { + res = v.o; +} + + // numeric +value(res) ::= HEX(n). { + res = n; +} + +value(res) ::= INTEGER(n). { + res = n; +} + +value(res) ::= INTEGER(n1) DOT INTEGER(n2). { + res = n1.'.'.n2; +} + +value(res) ::= INTEGER(n1) DOT. { + res = n1.'.'; +} + +value(res) ::= DOT INTEGER(n1). { + res = '.'.n1; +} + + // ID, true, false, null +value(res) ::= ID(id). { + if (defined(id)) { + if ($this->security) { + $this->security->isTrustedConstant(id, $this->compiler); + } + res = id; + } else { + res = '\''.id.'\''; + } +} + + // function call +value(res) ::= function(f). { + res = f; +} + + // expression +value(res) ::= OPENP expr(e) CLOSEP. { + res = "(". e .")"; +} + + // singele quoted string +value(res) ::= SINGLEQUOTESTRING(t). { + res = t; +} + + // double quoted string +value(res) ::= doublequoted_with_quotes(s). { + res = s; +} + + +value(res) ::= varindexed(vi) DOUBLECOLON static_class_access(r). { + self::$prefix_number++; + if (vi['var'] == '\'smarty\'') { + $this->compiler->prefix_code[] = '<?php $_tmp'.self::$prefix_number.' = '. $this->compiler->compileTag('private_special_variable',array(),vi['smarty_internal_index']).';?>'; + } else { + $this->compiler->prefix_code[] = '<?php $_tmp'.self::$prefix_number.' = '. $this->compiler->compileVariable(vi['var']).vi['smarty_internal_index'].';?>'; + } + res = '$_tmp'.self::$prefix_number.'::'.r[0].r[1]; +} + + // Smarty tag +value(res) ::= smartytag(st). { + self::$prefix_number++; + $tmp = $this->compiler->appendCode('<?php ob_start();?>', st); + $this->compiler->prefix_code[] = $this->compiler->appendCode($tmp, '<?php $_tmp'.self::$prefix_number.'=ob_get_clean();?>'); + res = '$_tmp'.self::$prefix_number; +} + +value(res) ::= value(v) modifierlist(l). { + res = $this->compiler->compileTag('private_modifier',array(),array('value'=>v,'modifierlist'=>l)); +} + // name space constant +value(res) ::= NAMESPACE(c). { + res = c; +} + + + // static class access +value(res) ::= ns1(c)DOUBLECOLON static_class_access(s). { + if (!in_array(strtolower(c), array('self', 'parent')) && (!$this->security || $this->security->isTrustedStaticClassAccess(c, s, $this->compiler))) { + if (isset($this->smarty->registered_classes[c])) { + res = $this->smarty->registered_classes[c].'::'.s[0].s[1]; + } else { + res = c.'::'.s[0].s[1]; + } + } else { + $this->compiler->trigger_template_error ("static class '".c."' is undefined or not allowed by security setting"); + } +} +// +// namespace stuff +// + +ns1(res) ::= ID(i). { + res = i; +} + +ns1(res) ::= NAMESPACE(i). { + res = i; +} + +//ns1(res) ::= variable(v). { +// res = v; +//} + + + + +// +// variables +// + // Smarty variable (optional array) +variable(res) ::= DOLLARID(i). { + res = $this->compiler->compileVariable('\''.substr(i,1).'\''); +} +variable(res) ::= varindexed(vi). { + if (vi['var'] == '\'smarty\'') { + $smarty_var = $this->compiler->compileTag('private_special_variable',array(),vi['smarty_internal_index']); + res = $smarty_var; + } else { + // used for array reset,next,prev,end,current + $this->last_variable = vi['var']; + $this->last_index = vi['smarty_internal_index']; + res = $this->compiler->compileVariable(vi['var']).vi['smarty_internal_index']; + } +} + + // variable with property +variable(res) ::= varvar(v) AT ID(p). { + res = '$_smarty_tpl->tpl_vars['. v .']->'.p; +} + + // object +variable(res) ::= object(o). { + res = o; +} + + // config variable +variable(res) ::= HATCH ID(i) HATCH. { + res = '$_smarty_tpl->getConfigVariable( \''. i .'\')'; +} + +variable(res) ::= HATCH ID(i) HATCH arrayindex(a). { + res = '(is_array($tmp = $_smarty_tpl->getConfigVariable( \''. i .'\')) ? $tmp'.a.' :null)'; +} + +variable(res) ::= HATCH variable(v) HATCH. { + res = '$_smarty_tpl->getConfigVariable( '. v .')'; +} + +variable(res) ::= HATCH variable(v) HATCH arrayindex(a). { + res = '(is_array($tmp = $_smarty_tpl->getConfigVariable( '. v .')) ? $tmp'.a.' : null)'; +} + +varindexed(res) ::= DOLLARID(i) arrayindex(a). { + res = array('var'=>'\''.substr(i,1).'\'', 'smarty_internal_index'=>a); +} +varindexed(res) ::= varvar(v) arrayindex(a). { + res = array('var'=>v, 'smarty_internal_index'=>a); +} + +// +// array index +// + // multiple array index +arrayindex(res) ::= arrayindex(a1) indexdef(a2). { + res = a1.a2; +} + + // no array index +arrayindex ::= . { + return; +} + +// single index definition + // Smarty2 style index +indexdef(res) ::= DOT DOLLARID(i). { + res = '['.$this->compiler->compileVariable('\''.substr(i,1).'\'').']'; +} +indexdef(res) ::= DOT varvar(v). { + res = '['.$this->compiler->compileVariable(v).']'; +} + +indexdef(res) ::= DOT varvar(v) AT ID(p). { + res = '['.$this->compiler->compileVariable(v).'->'.p.']'; +} + +indexdef(res) ::= DOT ID(i). { + if (defined(i)) { + if ($this->security) { + $this->security->isTrustedConstant(i, $this->compiler); + } + res = '['. i .']'; + } else { + res = "['". i ."']"; + } +} + +indexdef(res) ::= DOT INTEGER(n). { + res = '['. n .']'; +} + +indexdef(res) ::= DOT LDEL expr(e) RDEL. { + res = '['. e .']'; +} + + // section tag index +indexdef(res) ::= OPENB ID(i)CLOSEB. { + res = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.i.'\'][\'index\']').']'; +} + +indexdef(res) ::= OPENB ID(i) DOT ID(i2) CLOSEB. { + res = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.i.'\'][\''.i2.'\']').']'; +} +indexdef(res) ::= OPENB SINGLEQUOTESTRING(s) CLOSEB. { + res = '['.s.']'; +} +indexdef(res) ::= OPENB INTEGER(n) CLOSEB. { + res = '['.n.']'; +} +indexdef(res) ::= OPENB DOLLARID(i) CLOSEB. { + res = '['.$this->compiler->compileVariable('\''.substr(i,1).'\'').']';; +} +indexdef(res) ::= OPENB variable(v) CLOSEB. { + res = '['.v.']'; +} +indexdef(res) ::= OPENB value(v) CLOSEB. { + res = '['.v.']'; +} + + // PHP style index +indexdef(res) ::= OPENB expr(e) CLOSEB. { + res = '['. e .']'; +} + + // for assign append array +indexdef(res) ::= OPENB CLOSEB. { + res = '[]'; +} + + +// +// variable variable names +// + + // singel identifier element +varvar(res) ::= DOLLARID(i). { + res = '\''.substr(i,1).'\''; +} + // single $ +varvar(res) ::= DOLLAR. { + res = "''"; +} + + // sequence of identifier elements +varvar(res) ::= varvar(v1) varvarele(v2). { + res = v1.'.'.v2; +} + + // fix sections of element +varvarele(res) ::= ID(s). { + res = '\''.s.'\''; +} + + // variable sections of element +varvarele(res) ::= LDEL expr(e) RDEL. { + res = '('.e.')'; +} + +// +// objects +// +object(res) ::= varindexed(vi) objectchain(oc). { + if (vi['var'] == '\'smarty\'') { + res = $this->compiler->compileTag('private_special_variable',array(),vi['smarty_internal_index']).oc; + } else { + res = $this->compiler->compileVariable(vi['var']).vi['smarty_internal_index'].oc; + } +} + + // single element +objectchain(res) ::= objectelement(oe). { + res = oe; +} + + // chain of elements +objectchain(res) ::= objectchain(oc) objectelement(oe). { + res = oc.oe; +} + + // variable +objectelement(res)::= PTR ID(i) arrayindex(a). { + if ($this->security && substr(i,0,1) == '_') { + $this->compiler->trigger_template_error (self::Err1); + } + res = '->'.i.a; +} + +objectelement(res)::= PTR varvar(v) arrayindex(a). { + if ($this->security) { + $this->compiler->trigger_template_error (self::Err2); + } + res = '->{'.$this->compiler->compileVariable(v).a.'}'; +} + +objectelement(res)::= PTR LDEL expr(e) RDEL arrayindex(a). { + if ($this->security) { + $this->compiler->trigger_template_error (self::Err2); + } + res = '->{'.e.a.'}'; +} + +objectelement(res)::= PTR ID(ii) LDEL expr(e) RDEL arrayindex(a). { + if ($this->security) { + $this->compiler->trigger_template_error (self::Err2); + } + res = '->{\''.ii.'\'.'.e.a.'}'; +} + + // method +objectelement(res)::= PTR method(f). { + res = '->'.f; +} + + +// +// function +// +function(res) ::= ns1(f) OPENP params(p) CLOSEP. { + if (!$this->security || $this->security->isTrustedPhpFunction(f, $this->compiler)) { + if (strcasecmp(f,'isset') === 0 || strcasecmp(f,'empty') === 0 || strcasecmp(f,'array') === 0 || is_callable(f)) { + $func_name = strtolower(f); + if ($func_name == 'isset') { + if (count(p) == 0) { + $this->compiler->trigger_template_error ('Illegal number of paramer in "isset()"'); + } + $par = implode(',',p); + if (strncasecmp($par,'$_smarty_tpl->getConfigVariable',strlen('$_smarty_tpl->getConfigVariable')) === 0) { + self::$prefix_number++; + $this->compiler->prefix_code[] = '<?php $_tmp'.self::$prefix_number.'='.str_replace(')',', false)',$par).';?>'; + $isset_par = '$_tmp'.self::$prefix_number; + } else { + $isset_par=str_replace("')->value","',null,true,false)->value",$par); + } + res = f . "(". $isset_par .")"; + } elseif (in_array($func_name,array('empty','reset','current','end','prev','next'))){ + if (count(p) != 1) { + $this->compiler->trigger_template_error ('Illegal number of paramer in "empty()"'); + } + if ($func_name == 'empty') { + res = $func_name.'('.str_replace("')->value","',null,true,false)->value",p[0]).')'; + } else { + res = $func_name.'('.p[0].')'; + } + } else { + res = f . "(". implode(',',p) .")"; + } + } else { + $this->compiler->trigger_template_error ("unknown function \"" . f . "\""); + } + } +} + + +// +// method +// +method(res) ::= ID(f) OPENP params(p) CLOSEP. { + if ($this->security && substr(f,0,1) == '_') { + $this->compiler->trigger_template_error (self::Err1); + } + res = f . "(". implode(',',p) .")"; +} + +method(res) ::= DOLLARID(f) OPENP params(p) CLOSEP. { + if ($this->security) { + $this->compiler->trigger_template_error (self::Err2); + } + self::$prefix_number++; + $this->compiler->prefix_code[] = '<?php $_tmp'.self::$prefix_number.'='.$this->compiler->compileVariable('\''.substr(f,1).'\'').';?>'; + res = '$_tmp'.self::$prefix_number.'('. implode(',',p) .')'; +} + +// function/method parameter + // multiple parameters +params(res) ::= params(p) COMMA expr(e). { + res = array_merge(p,array(e)); +} + + // single parameter +params(res) ::= expr(e). { + res = array(e); +} + + // kein parameter +params(res) ::= . { + res = array(); +} + +// +// modifier +// +modifierlist(res) ::= modifierlist(l) modifier(m) modparameters(p). { + res = array_merge(l,array(array_merge(m,p))); +} + +modifierlist(res) ::= modifier(m) modparameters(p). { + res = array(array_merge(m,p)); +} + +modifier(res) ::= VERT AT ID(m). { + res = array(m); +} + +modifier(res) ::= VERT ID(m). { + res = array(m); +} + +// +// modifier parameter +// + // multiple parameter +modparameters(res) ::= modparameters(mps) modparameter(mp). { + res = array_merge(mps,mp); +} + + // no parameter +modparameters(res) ::= . { + res = array(); +} + + // parameter expression +modparameter(res) ::= COLON value(mp). { + res = array(mp); +} + +modparameter(res) ::= COLON array(mp). { + res = array(mp); +} + + // static class methode call +static_class_access(res) ::= method(m). { + res = array(m, '', 'method'); +} + + // static class methode call with object chainig +static_class_access(res) ::= method(m) objectchain(oc). { + res = array(m, oc, 'method'); +} + + // static class constant +static_class_access(res) ::= ID(v). { + res = array(v, ''); +} + + // static class variables +static_class_access(res) ::= DOLLARID(v) arrayindex(a). { + res = array(v, a, 'property'); +} + + // static class variables with object chain +static_class_access(res) ::= DOLLARID(v) arrayindex(a) objectchain(oc). { + res = array(v, a.oc, 'property'); +} + + +// if conditions and operators +lop(res) ::= LOGOP(o). { + res['op'] = ' '. trim(o) . ' '; +} + +lop(res) ::= TLOGOP(o). { + static $lops = array( + 'eq' => array('op' => ' == ', 'pre' => null), + 'ne' => array('op' => ' != ', 'pre' => null), + 'neq' => array('op' => ' != ', 'pre' => null), + 'gt' => array('op' => ' > ', 'pre' => null), + 'ge' => array('op' => ' >= ', 'pre' => null), + 'gte' => array('op' => ' >= ', 'pre' => null), + 'lt' => array('op' => ' < ', 'pre' => null), + 'le' => array('op' => ' <= ', 'pre' => null), + 'lte' => array('op' => ' <= ', 'pre' => null), + 'mod' => array('op' => ' % ', 'pre' => null), + 'and' => array('op' => ' && ', 'pre' => null), + 'or' => array('op' => ' || ', 'pre' => null), + 'xor' => array('op' => ' xor ', 'pre' => null), + 'isdivby' => array('op' => ' % ', 'pre' => '!('), + 'isnotdivby' => array('op' => ' % ', 'pre' => '('), + 'isevenby' => array('op' => ' / ', 'pre' => '!(1 & '), + 'isnotevenby' => array('op' => ' / ', 'pre' => '(1 & '), + 'isoddby' => array('op' => ' / ', 'pre' => '(1 & '), + 'isnotoddby' => array('op' => ' / ', 'pre' => '!(1 & '), + ); + $op = strtolower(preg_replace('/\s*/', '', o)); + res = $lops[$op]; +} + +scond(res) ::= SINGLECOND(o). { + static $scond = array ( + 'iseven' => '!(1 & ', + 'isnoteven' => '(1 & ', + 'isodd' => '(1 & ', + 'isnotodd' => '!(1 & ', + ); + $op = strtolower(str_replace(' ', '', o)); + res = $scond[$op]; +} + +// +// ARRAY element assignment +// +array(res) ::= OPENB arrayelements(a) CLOSEB. { + res = 'array('.a.')'; +} + +arrayelements(res) ::= arrayelement(a). { + res = a; +} + +arrayelements(res) ::= arrayelements(a1) COMMA arrayelement(a). { + res = a1.','.a; +} + +arrayelements ::= . { + return; +} + +arrayelement(res) ::= value(e1) APTR expr(e2). { + res = e1.'=>'.e2; +} + +arrayelement(res) ::= ID(i) APTR expr(e2). { + res = '\''.i.'\'=>'.e2; +} + +arrayelement(res) ::= expr(e). { + res = e; +} + + +// +// double qouted strings +// +doublequoted_with_quotes(res) ::= QUOTE QUOTE. { + res = "''"; +} + +doublequoted_with_quotes(res) ::= QUOTE doublequoted(s) QUOTE. { + res = s->to_smarty_php(); +} + + +doublequoted(res) ::= doublequoted(o1) doublequotedcontent(o2). { + o1->append_subtree(o2); + res = o1; +} + +doublequoted(res) ::= doublequotedcontent(o). { + res = new Smarty_Internal_ParseTree_Dq($this, o); +} + +doublequotedcontent(res) ::= BACKTICK variable(v) BACKTICK. { + res = new Smarty_Internal_ParseTree_Code($this, '(string)'.v); +} + +doublequotedcontent(res) ::= BACKTICK expr(e) BACKTICK. { + res = new Smarty_Internal_ParseTree_Code($this, '(string)'.e); +} + +doublequotedcontent(res) ::= DOLLARID(i). { + res = new Smarty_Internal_ParseTree_Code($this, '(string)$_smarty_tpl->tpl_vars[\''. substr(i,1) .'\']->value'); +} + +doublequotedcontent(res) ::= LDEL variable(v) RDEL. { + res = new Smarty_Internal_ParseTree_Code($this, '(string)'.v); +} + +doublequotedcontent(res) ::= LDEL expr(e) RDEL. { + res = new Smarty_Internal_ParseTree_Code($this, '(string)('.e.')'); +} + +doublequotedcontent(res) ::= smartytag(st). { + res = new Smarty_Internal_ParseTree_Tag($this, st); +} + +doublequotedcontent(res) ::= TEXT(o). { + res = new Smarty_Internal_ParseTree_DqContent($this, o); +} + diff --git a/libs/smarty/Autoloader.php b/libs/smarty/libs/Autoloader.php diff --git a/libs/smarty/Smarty.class.php b/libs/smarty/libs/Smarty.class.php diff --git a/libs/smarty/SmartyBC.class.php b/libs/smarty/libs/SmartyBC.class.php diff --git a/libs/smarty/debug.tpl b/libs/smarty/libs/debug.tpl diff --git a/libs/smarty/libs/plugins/block.textformat.php b/libs/smarty/libs/plugins/block.textformat.php @@ -0,0 +1,110 @@ +<?php +/** + * Smarty plugin to format text blocks + * + * @package Smarty + * @subpackage PluginsBlock + */ + +/** + * Smarty {textformat}{/textformat} block plugin + * Type: block function<br> + * Name: textformat<br> + * Purpose: format text a certain way with preset styles + * or custom wrap/indent settings<br> + * Params: + * <pre> + * - style - string (email) + * - indent - integer (0) + * - wrap - integer (80) + * - wrap_char - string ("\n") + * - indent_char - string (" ") + * - wrap_boundary - boolean (true) + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat} + * (Smarty online manual) + * + * @param array $params parameters + * @param string $content contents of the block + * @param Smarty_Internal_Template $template template object + * @param boolean &$repeat repeat flag + * + * @return string content re-formatted + * @author Monte Ohrt <monte at ohrt dot com> + */ +function smarty_block_textformat($params, $content, $template, &$repeat) +{ + if (is_null($content)) { + return; + } + + $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) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'); + $_paragraph = smarty_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/libs/smarty/libs/plugins/function.counter.php b/libs/smarty/libs/plugins/function.counter.php @@ -0,0 +1,78 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {counter} function plugin + * Type: function<br> + * Name: counter<br> + * Purpose: print out a counter value + * + * @author Monte Ohrt <monte at ohrt dot com> + * @link http://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/libs/smarty/libs/plugins/function.cycle.php b/libs/smarty/libs/plugins/function.cycle.php @@ -0,0 +1,107 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {cycle} function plugin + * Type: function<br> + * Name: cycle<br> + * Date: May 3, 2002<br> + * Purpose: cycle through given values<br> + * Params: + * <pre> + * - name - name of cycle (optional) + * - values - comma separated list of values to cycle, or an array of values to cycle + * (this can be left out for subsequent calls) + * - reset - boolean - resets given var to true + * - print - boolean - print var or not. default is true + * - advance - boolean - whether or not to advance the cycle + * - delimiter - the value delimiter, default is "," + * - assign - boolean, assigns to template var instead of printed. + * </pre> + * Examples:<br> + * <pre> + * {cycle values="#eeeeee,#d0d0d0d"} + * {cycle name=row values="one,two,three" reset=true} + * {cycle name=row} + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author credit to Mark Priatel <mpriatel@rogers.com> + * @author credit to Gerard <gerard@interfold.com> + * @author credit to Jason Sweat <jsweat_php@yahoo.com> + * @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/libs/smarty/libs/plugins/function.fetch.php b/libs/smarty/libs/plugins/function.fetch.php @@ -0,0 +1,221 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {fetch} plugin + * Type: function<br> + * Name: fetch<br> + * Purpose: fetch file, web or ftp data and display results + * + * @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @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/libs/smarty/libs/plugins/function.html_checkboxes.php b/libs/smarty/libs/plugins/function.html_checkboxes.php @@ -0,0 +1,237 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {html_checkboxes} function plugin + * File: function.html_checkboxes.php<br> + * Type: function<br> + * Name: html_checkboxes<br> + * Date: 24.Feb.2003<br> + * Purpose: Prints out a list of checkbox input types<br> + * Examples: + * <pre> + * {html_checkboxes values=$ids output=$names} + * {html_checkboxes values=$ids name='box' separator='<br>' output=$names} + * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names} + * </pre> + * Params: + * <pre> + * - name (optional) - string default "checkbox" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie <br> or &nbsp; + * - 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 + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} + * (Smarty online manual) + * @author Christopher Kvarme <christopher.kvarme@flashjab.com> + * @author credits to Monte Ohrt <monte at ohrt dot com> + * @version 1.0 + * + * @param array $params parameters + * @param object $template template object + * + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_checkboxes($params, $template) +{ + require_once(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; + + $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 '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! + + 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) { + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); + } + } else { + foreach ($values as $_i => $_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); + } + } + + if (!empty($params['assign'])) { + $template->assign($params['assign'], $_html_result); + } else { + return implode("\n", $_html_result); + } +} + +function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $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 .= '<label for="' . $_id . '">'; + } else { + $_output .= '<label>'; + } + } + + $name = smarty_function_escape_special_chars($name); + $value = smarty_function_escape_special_chars($value); + if ($escape) { + $output = smarty_function_escape_special_chars($output); + } + + $_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"'; + + if ($labels && $label_ids) { + $_output .= ' id="' . $_id . '"'; + } + + if (is_array($selected)) { + if (isset($selected[$value])) { + $_output .= ' checked="checked"'; + } + } elseif ($value === $selected) { + $_output .= ' checked="checked"'; + } + + $_output .= $extra . ' />' . $output; + if ($labels) { + $_output .= '</label>'; + } + + $_output .= $separator; + + return $_output; +} diff --git a/libs/smarty/libs/plugins/function.html_image.php b/libs/smarty/libs/plugins/function.html_image.php @@ -0,0 +1,163 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {html_image} function plugin + * Type: function<br> + * Name: html_image<br> + * Date: Feb 24, 2003<br> + * Purpose: format HTML tags for the image<br> + * Examples: {html_image file="/images/masthead.gif"}<br> + * Output: <img src="/images/masthead.gif" width=400 height=23><br> + * Params: + * <pre> + * - file - (required) - file (and path) of image + * - height - (optional) - image height (default actual height) + * - width - (optional) - image width (default actual width) + * - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT + * - path_prefix - prefix for path output (optional, default empty) + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author credits to Duda <duda@big.hu> + * @version 1.0 + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @throws SmartyException + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_image($params, $template) +{ + require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); + + $alt = ''; + $file = ''; + $height = ''; + $width = ''; + $extra = ''; + $prefix = ''; + $suffix = ''; + $path_prefix = ''; + $basedir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : ''; + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'file': + case 'height': + case 'width': + case 'dpi': + case 'path_prefix': + case 'basedir': + $$_key = $_val; + break; + + case 'alt': + if (!is_array($_val)) { + $$_key = smarty_function_escape_special_chars($_val); + } else { + throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + + case 'link': + case 'href': + $prefix = '<a href="' . $_val . '">'; + $suffix = '</a>'; + break; + + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (empty($file)) { + trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); + + return; + } + + if ($file[0] == '/') { + $_image_path = $basedir . $file; + } else { + $_image_path = $file; + } + + // 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($_image_path)) { + return; + } + } + } + + if (!isset($params['width']) || !isset($params['height'])) { + // FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader! + if (!$_image_data = @getimagesize($_image_path)) { + if (!file_exists($_image_path)) { + trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); + + return; + } elseif (!is_readable($_image_path)) { + trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); + + return; + } else { + trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); + + return; + } + } + + if (!isset($params['width'])) { + $width = $_image_data[0]; + } + if (!isset($params['height'])) { + $height = $_image_data[1]; + } + } + + if (isset($params['dpi'])) { + if (strstr($_SERVER['HTTP_USER_AGENT'], 'Mac')) { + // FIXME: (rodneyrehm) wrong dpi assumption + // don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011. + $dpi_default = 72; + } else { + $dpi_default = 96; + } + $_resize = $dpi_default / $params['dpi']; + $width = round($width * $_resize); + $height = round($height * $_resize); + } + + return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' . $height . '"' . $extra . ' />' . $suffix; +} diff --git a/libs/smarty/libs/plugins/function.html_options.php b/libs/smarty/libs/plugins/function.html_options.php @@ -0,0 +1,196 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {html_options} function plugin + * Type: function<br> + * Name: html_options<br> + * Purpose: Prints the list of <option> tags generated from + * the passed parameters<br> + * Params: + * <pre> + * - name (optional) - string default "select" + * - values (required) - if no options supplied) - array + * - options (required) - if no values supplied) - associative array + * - selected (optional) - string default not set + * - output (required) - if not options supplied) - array + * - id (optional) - string default not set + * - class (optional) - string default not set + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de> + * + * @param array $params parameters + * + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_options($params) +{ + require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); + + $name = null; + $values = null; + $options = null; + $selected = null; + $output = null; + $id = null; + $class = null; + + $extra = ''; + + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'name': + case 'class': + case 'id': + $$_key = (string) $_val; + break; + + case 'options': + $options = (array) $_val; + break; + + case 'values': + case 'output': + $$_key = array_values((array) $_val); + break; + + 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_options: 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_options: 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 '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! + + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) { + /* raise error here? */ + + return ''; + } + + $_html_result = ''; + $_idx = 0; + + if (isset($options)) { + foreach ($options as $_key => $_val) { + $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); + } + } else { + foreach ($values as $_i => $_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); + } + } + + if (!empty($name)) { + $_html_class = !empty($class) ? ' class="' . $class . '"' : ''; + $_html_id = !empty($id) ? ' id="' . $id . '"' : ''; + $_html_result = '<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result . '</select>' . "\n"; + } + + return $_html_result; +} + +function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx) +{ + if (!is_array($value)) { + $_key = smarty_function_escape_special_chars($key); + $_html_result = '<option value="' . $_key . '"'; + if (is_array($selected)) { + if (isset($selected[$_key])) { + $_html_result .= ' selected="selected"'; + } + } elseif ($_key === $selected) { + $_html_result .= ' selected="selected"'; + } + $_html_class = !empty($class) ? ' class="' . $class . ' option"' : ''; + $_html_id = !empty($id) ? ' id="' . $id . '-' . $idx . '"' : ''; + if (is_object($value)) { + if (method_exists($value, "__toString")) { + $value = smarty_function_escape_special_chars((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 = smarty_function_escape_special_chars((string) $value); + } + $_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n"; + $idx ++; + } else { + $_idx = 0; + $_html_result = smarty_function_html_options_optgroup($key, $value, $selected, !empty($id) ? ($id . '-' . $idx) : null, $class, $_idx); + $idx ++; + } + + return $_html_result; +} + +function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx) +{ + $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n"; + foreach ($values as $key => $value) { + $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx); + } + $optgroup_html .= "</optgroup>\n"; + + return $optgroup_html; +} diff --git a/libs/smarty/libs/plugins/function.html_radios.php b/libs/smarty/libs/plugins/function.html_radios.php @@ -0,0 +1,221 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {html_radios} function plugin + * File: function.html_radios.php<br> + * Type: function<br> + * Name: html_radios<br> + * Date: 24.Feb.2003<br> + * Purpose: Prints out a list of radio input types<br> + * Params: + * <pre> + * - name (optional) - string default "radio" + * - values (required) - array + * - options (required) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie <br> or &nbsp; + * - output (optional) - the output next to each radio button + * - assign (optional) - assign the output as an array to this variable + * - escape (optional) - escape the content (not value), defaults to true + * </pre> + * Examples: + * <pre> + * {html_radios values=$ids output=$names} + * {html_radios values=$ids name='box' separator='<br>' output=$names} + * {html_radios values=$ids checked=$checked separator='<br>' output=$names} + * </pre> + * + * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios} + * (Smarty online manual) + * @author Christopher Kvarme <christopher.kvarme@flashjab.com> + * @author credits to Monte Ohrt <monte at ohrt dot com> + * @version 1.0 + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_radios($params, $template) +{ + require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); + + $name = 'radio'; + $values = null; + $options = null; + $selected = null; + $separator = ''; + $escape = true; + $labels = true; + $label_ids = false; + $output = null; + $extra = ''; + + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'name': + case 'separator': + $$_key = (string) $_val; + break; + + case 'checked': + case 'selected': + if (is_array($_val)) { + trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING); + } elseif (is_object($_val)) { + if (method_exists($_val, "__toString")) { + $selected = smarty_function_escape_special_chars((string) $_val->__toString()); + } else { + trigger_error("html_radios: selected attribute is an object of class '" . get_class($_val) . "' without __toString() method", E_USER_NOTICE); + } + } else { + $selected = (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 'radios': + trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING); + $options = (array) $_val; + break; + + case 'assign': + 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! + + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) { + /* raise error here? */ + + return ''; + } + + $_html_result = array(); + + if (isset($options)) { + foreach ($options as $_key => $_val) { + $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); + } + } else { + foreach ($values as $_i => $_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); + } + } + + if (!empty($params['assign'])) { + $template->assign($params['assign'], $_html_result); + } else { + return implode("\n", $_html_result); + } +} + +function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape) +{ + $_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 .= '<label for="' . $_id . '">'; + } else { + $_output .= '<label>'; + } + } + + $name = smarty_function_escape_special_chars($name); + $value = smarty_function_escape_special_chars($value); + if ($escape) { + $output = smarty_function_escape_special_chars($output); + } + + $_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"'; + + if ($labels && $label_ids) { + $_output .= ' id="' . $_id . '"'; + } + + if ($value === $selected) { + $_output .= ' checked="checked"'; + } + + $_output .= $extra . ' />' . $output; + if ($labels) { + $_output .= '</label>'; + } + + $_output .= $separator; + + return $_output; +} diff --git a/libs/smarty/libs/plugins/function.html_select_date.php b/libs/smarty/libs/plugins/function.html_select_date.php @@ -0,0 +1,387 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + +/** + * Smarty {html_select_date} plugin + * Type: function<br> + * Name: html_select_date<br> + * Purpose: Prints the dropdowns for date selection. + * ChangeLog: + * <pre> + * - 1.0 initial release + * - 1.1 added support for +/- N syntax for begin + * and end year values. (Monte) + * - 1.2 added support for yyyy-mm-dd syntax for + * time value. (Jan Rosier) + * - 1.3 added support for choosing format for + * month values (Gary Loescher) + * - 1.3.1 added support for choosing format for + * day values (Marcus Bointon) + * - 1.3.2 support negative timestamps, force year + * dropdown to include given date unless explicitly set (Monte) + * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that + * of 0000-00-00 dates (cybot, boots) + * - 2.0 complete rewrite for performance, + * added attributes month_names, *_id + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date} + * (Smarty online manual) + * @version 2.0 + * @author Andrei Zmievski + * @author Monte Ohrt <monte at ohrt dot com> + * @author Rodney Rehm + * + * @param array $params parameters + * + * @return string + */ +function smarty_function_html_select_date($params) +{ + // generate timestamps used for month names only + static $_month_timestamps = null; + static $_current_year = null; + if ($_month_timestamps === null) { + $_current_year = date('Y'); + $_month_timestamps = array(); + for ($i = 1; $i <= 12; $i ++) { + $_month_timestamps[$i] = mktime(0, 0, 0, $i, 1, 2000); + } + } + + /* Default values. */ + $prefix = "Date_"; + $start_year = null; + $end_year = null; + $display_days = true; + $display_months = true; + $display_years = true; + $month_format = "%B"; + /* Write months as numbers by default GL */ + $month_value_format = "%m"; + $day_format = "%02d"; + /* Write day values using this format MB */ + $day_value_format = "%d"; + $year_as_text = false; + /* Display years in reverse order? Ie. 2000,1999,.... */ + $reverse_years = false; + /* Should the select boxes be part of an array when returned from PHP? + e.g. setting it to "birthday", would create "birthday[Day]", + "birthday[Month]" & "birthday[Year]". Can be combined with prefix */ + $field_array = null; + /* <select size>'s of the different <select> tags. + If not set, uses default dropdown. */ + $day_size = null; + $month_size = null; + $year_size = null; + /* Unparsed attributes common to *ALL* the <select>/<input> tags. + An example might be in the template: all_extra ='class ="foo"'. */ + $all_extra = null; + /* Separate attributes for the tags. */ + $day_extra = null; + $month_extra = null; + $year_extra = null; + /* Order in which to display the fields. + "D" -> day, "M" -> month, "Y" -> year. */ + $field_order = 'MDY'; + /* String printed between the different fields. */ + $field_separator = "\n"; + $option_separator = "\n"; + $time = null; + // $all_empty = null; + // $day_empty = null; + // $month_empty = null; + // $year_empty = null; + $extra_attrs = ''; + $all_id = null; + $day_id = null; + $month_id = null; + $year_id = null; + + foreach ($params as $_key => $_value) { + switch ($_key) { + case 'time': + if (!is_array($_value) && $_value !== null) { + $time = smarty_make_timestamp($_value); + } + break; + + case 'month_names': + if (is_array($_value) && count($_value) == 12) { + $$_key = $_value; + } else { + trigger_error("html_select_date: month_names must be an array of 12 strings", E_USER_NOTICE); + } + break; + + case 'prefix': + case 'field_array': + case 'start_year': + case 'end_year': + case 'day_format': + case 'day_value_format': + case 'month_format': + case 'month_value_format': + case 'day_size': + case 'month_size': + case 'year_size': + case 'all_extra': + case 'day_extra': + case 'month_extra': + case 'year_extra': + case 'field_order': + case 'field_separator': + case 'option_separator': + case 'all_empty': + case 'month_empty': + case 'day_empty': + case 'year_empty': + case 'all_id': + case 'month_id': + case 'day_id': + case 'year_id': + $$_key = (string) $_value; + break; + + case 'display_days': + case 'display_months': + case 'display_years': + case 'year_as_text': + case 'reverse_years': + $$_key = (bool) $_value; + break; + + default: + if (!is_array($_value)) { + $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; + } else { + trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + // Note: date() is faster than strftime() + // Note: explode(date()) is faster than date() date() date() + if (isset($params['time']) && is_array($params['time'])) { + if (isset($params['time'][$prefix . 'Year'])) { + // $_REQUEST[$field_array] given + foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$prefix . $_elementName]) + ? $params['time'][$prefix . $_elementName] + : date($_elementKey); + } + } elseif (isset($params['time'][$field_array][$prefix . 'Year'])) { + // $_REQUEST given + foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) + ? $params['time'][$field_array][$prefix . $_elementName] + : date($_elementKey); + } + } else { + // no date found, use NOW + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } elseif ($time === null) { + if (array_key_exists('time', $params)) { + $_year = $_month = $_day = $time = null; + } else { + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } else { + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time)); + } + + // make syntax "+N" or "-N" work with $start_year and $end_year + // Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr + foreach (array('start', 'end') as $key) { + $key .= '_year'; + $t = $$key; + if ($t === null) { + $$key = (int) $_current_year; + } elseif ($t[0] == '+') { + $$key = (int) ($_current_year + (int)trim(substr($t, 1))); + } elseif ($t[0] == '-') { + $$key = (int) ($_current_year - (int)trim(substr($t, 1))); + } else { + $$key = (int) $$key; + } + } + + // flip for ascending or descending + if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) { + $t = $end_year; + $end_year = $start_year; + $start_year = $t; + } + + // generate year <select> or <input> + if ($display_years) { + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($year_extra) { + $_extra .= ' ' . $year_extra; + } + + if ($year_as_text) { + $_html_years = '<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra . $extra_attrs . ' />'; + } else { + $_html_years = '<select name="' . $_name . '"'; + if ($year_id !== null || $all_id !== null) { + $_html_years .= ' id="' . smarty_function_escape_special_chars( + $year_id !== null ? ($year_id ? $year_id : $_name) : ($all_id ? ($all_id . $_name) : $_name) + ) . '"'; + } + if ($year_size) { + $_html_years .= ' size="' . $year_size . '"'; + } + $_html_years .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($year_empty) || isset($all_empty)) { + $_html_years .= '<option value="">' . (isset($year_empty) ? $year_empty : $all_empty) . '</option>' . $option_separator; + } + + $op = $start_year > $end_year ? - 1 : 1; + for ($i = $start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) { + $_html_years .= '<option value="' . $i . '"' + . ($_year == $i ? ' selected="selected"' : '') + . '>' . $i . '</option>' . $option_separator; + } + + $_html_years .= '</select>'; + } + } + + // generate month <select> or <input> + if ($display_months) { + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($month_extra) { + $_extra .= ' ' . $month_extra; + } + + $_html_months = '<select name="' . $_name . '"'; + if ($month_id !== null || $all_id !== null) { + $_html_months .= ' id="' . smarty_function_escape_special_chars( + $month_id !== null ? ($month_id ? $month_id : $_name) : ($all_id ? ($all_id . $_name) : $_name) + ) . '"'; + } + if ($month_size) { + $_html_months .= ' size="' . $month_size . '"'; + } + $_html_months .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($month_empty) || isset($all_empty)) { + $_html_months .= '<option value="">' . (isset($month_empty) ? $month_empty : $all_empty) . '</option>' . $option_separator; + } + + for ($i = 1; $i <= 12; $i ++) { + $_val = sprintf('%02d', $i); + $_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[$i]) : ($month_format == "%m" ? $_val : strftime($month_format, $_month_timestamps[$i])); + $_value = $month_value_format == "%m" ? $_val : strftime($month_value_format, $_month_timestamps[$i]); + $_html_months .= '<option value="' . $_value . '"' + . ($_val == $_month ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_months .= '</select>'; + } + + // generate day <select> or <input> + if ($display_days) { + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($day_extra) { + $_extra .= ' ' . $day_extra; + } + + $_html_days = '<select name="' . $_name . '"'; + if ($day_id !== null || $all_id !== null) { + $_html_days .= ' id="' . smarty_function_escape_special_chars( + $day_id !== null ? ($day_id ? $day_id : $_name) : ($all_id ? ($all_id . $_name) : $_name) + ) . '"'; + } + if ($day_size) { + $_html_days .= ' size="' . $day_size . '"'; + } + $_html_days .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($day_empty) || isset($all_empty)) { + $_html_days .= '<option value="">' . (isset($day_empty) ? $day_empty : $all_empty) . '</option>' . $option_separator; + } + + for ($i = 1; $i <= 31; $i ++) { + $_val = sprintf('%02d', $i); + $_text = $day_format == '%02d' ? $_val : sprintf($day_format, $i); + $_value = $day_value_format == '%02d' ? $_val : sprintf($day_value_format, $i); + $_html_days .= '<option value="' . $_value . '"' + . ($_val == $_day ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_days .= '</select>'; + } + + // order the fields for output + $_html = ''; + for ($i = 0; $i <= 2; $i ++) { + switch ($field_order[$i]) { + case 'Y': + case 'y': + if (isset($_html_years)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_years; + } + break; + + case 'm': + case 'M': + if (isset($_html_months)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_months; + } + break; + + case 'd': + case 'D': + if (isset($_html_days)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_days; + } + break; + } + } + + return $_html; +} diff --git a/libs/smarty/libs/plugins/function.html_select_time.php b/libs/smarty/libs/plugins/function.html_select_time.php @@ -0,0 +1,364 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + +/** + * Smarty {html_select_time} function plugin + * Type: function<br> + * Name: html_select_time<br> + * Purpose: Prints the dropdowns for time selection + * + * @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time} + * (Smarty online manual) + * @author Roberto Berto <roberto@berto.net> + * @author Monte Ohrt <monte AT ohrt DOT com> + * + * @param array $params parameters + * + * @return string + * @uses smarty_make_timestamp() + */ +function smarty_function_html_select_time($params) +{ + $prefix = "Time_"; + $field_array = null; + $field_separator = "\n"; + $option_separator = "\n"; + $time = null; + + $display_hours = true; + $display_minutes = true; + $display_seconds = true; + $display_meridian = true; + + $hour_format = '%02d'; + $hour_value_format = '%02d'; + $minute_format = '%02d'; + $minute_value_format = '%02d'; + $second_format = '%02d'; + $second_value_format = '%02d'; + + $hour_size = null; + $minute_size = null; + $second_size = null; + $meridian_size = null; + + $all_empty = null; + $hour_empty = null; + $minute_empty = null; + $second_empty = null; + $meridian_empty = null; + + $all_id = null; + $hour_id = null; + $minute_id = null; + $second_id = null; + $meridian_id = null; + + $use_24_hours = true; + $minute_interval = 1; + $second_interval = 1; + + $extra_attrs = ''; + $all_extra = null; + $hour_extra = null; + $minute_extra = null; + $second_extra = null; + $meridian_extra = null; + + foreach ($params as $_key => $_value) { + switch ($_key) { + case 'time': + if (!is_array($_value) && $_value !== null) { + $time = smarty_make_timestamp($_value); + } + break; + + case 'prefix': + case 'field_array': + + case 'field_separator': + case 'option_separator': + + case 'all_extra': + case 'hour_extra': + case 'minute_extra': + case 'second_extra': + case 'meridian_extra': + + case 'all_empty': + case 'hour_empty': + case 'minute_empty': + case 'second_empty': + case 'meridian_empty': + + case 'all_id': + case 'hour_id': + case 'minute_id': + case 'second_id': + case 'meridian_id': + + case 'hour_format': + case 'hour_value_format': + case 'minute_format': + case 'minute_value_format': + case 'second_format': + case 'second_value_format': + $$_key = (string) $_value; + break; + + case 'display_hours': + case 'display_minutes': + case 'display_seconds': + case 'display_meridian': + case 'use_24_hours': + $$_key = (bool) $_value; + break; + + case 'minute_interval': + case 'second_interval': + + case 'hour_size': + case 'minute_size': + case 'second_size': + case 'meridian_size': + $$_key = (int) $_value; + break; + + default: + if (!is_array($_value)) { + $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; + } else { + trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (isset($params['time']) && is_array($params['time'])) { + if (isset($params['time'][$prefix . 'Hour'])) { + // $_REQUEST[$field_array] given + foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$prefix . $_elementName]) + ? $params['time'][$prefix . $_elementName] + : date($_elementKey); + } + $_meridian = isset($params['time'][$prefix . 'Meridian']) + ? (' ' . $params['time'][$prefix . 'Meridian']) + : ''; + $time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian); + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } elseif (isset($params['time'][$field_array][$prefix . 'Hour'])) { + // $_REQUEST given + foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) + ? $params['time'][$field_array][$prefix . $_elementName] + : date($_elementKey); + } + $_meridian = isset($params['time'][$field_array][$prefix . 'Meridian']) + ? (' ' . $params['time'][$field_array][$prefix . 'Meridian']) + : ''; + $time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian); + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } else { + // no date found, use NOW + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } elseif ($time === null) { + if (array_key_exists('time', $params)) { + $_hour = $_minute = $_second = $time = null; + } else { + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s')); + } + } else { + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } + + // generate hour <select> + if ($display_hours) { + $_html_hours = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($hour_extra) { + $_extra .= ' ' . $hour_extra; + } + + $_html_hours = '<select name="' . $_name . '"'; + if ($hour_id !== null || $all_id !== null) { + $_html_hours .= ' id="' . smarty_function_escape_special_chars( + $hour_id !== null ? ($hour_id ? $hour_id : $_name) : ($all_id ? ($all_id . $_name) : $_name) + ) . '"'; + } + if ($hour_size) { + $_html_hours .= ' size="' . $hour_size . '"'; + } + $_html_hours .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($hour_empty) || isset($all_empty)) { + $_html_hours .= '<option value="">' . (isset($hour_empty) ? $hour_empty : $all_empty) . '</option>' . $option_separator; + } + + $start = $use_24_hours ? 0 : 1; + $end = $use_24_hours ? 23 : 12; + for ($i = $start; $i <= $end; $i ++) { + $_val = sprintf('%02d', $i); + $_text = $hour_format == '%02d' ? $_val : sprintf($hour_format, $i); + $_value = $hour_value_format == '%02d' ? $_val : sprintf($hour_value_format, $i); + + if (!$use_24_hours) { + $_hour12 = $_hour == 0 + ? 12 + : ($_hour <= 12 ? $_hour : $_hour - 12); + } + + $selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null; + $_html_hours .= '<option value="' . $_value . '"' + . ($selected ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_hours .= '</select>'; + } + + // generate minute <select> + if ($display_minutes) { + $_html_minutes = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($minute_extra) { + $_extra .= ' ' . $minute_extra; + } + + $_html_minutes = '<select name="' . $_name . '"'; + if ($minute_id !== null || $all_id !== null) { + $_html_minutes .= ' id="' . smarty_function_escape_special_chars( + $minute_id !== null ? ($minute_id ? $minute_id : $_name) : ($all_id ? ($all_id . $_name) : $_name) + ) . '"'; + } + if ($minute_size) { + $_html_minutes .= ' size="' . $minute_size . '"'; + } + $_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($minute_empty) || isset($all_empty)) { + $_html_minutes .= '<option value="">' . (isset($minute_empty) ? $minute_empty : $all_empty) . '</option>' . $option_separator; + } + + $selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null; + for ($i = 0; $i <= 59; $i += $minute_interval) { + $_val = sprintf('%02d', $i); + $_text = $minute_format == '%02d' ? $_val : sprintf($minute_format, $i); + $_value = $minute_value_format == '%02d' ? $_val : sprintf($minute_value_format, $i); + $_html_minutes .= '<option value="' . $_value . '"' + . ($selected === $i ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_minutes .= '</select>'; + } + + // generate second <select> + if ($display_seconds) { + $_html_seconds = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($second_extra) { + $_extra .= ' ' . $second_extra; + } + + $_html_seconds = '<select name="' . $_name . '"'; + if ($second_id !== null || $all_id !== null) { + $_html_seconds .= ' id="' . smarty_function_escape_special_chars( + $second_id !== null ? ($second_id ? $second_id : $_name) : ($all_id ? ($all_id . $_name) : $_name) + ) . '"'; + } + if ($second_size) { + $_html_seconds .= ' size="' . $second_size . '"'; + } + $_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($second_empty) || isset($all_empty)) { + $_html_seconds .= '<option value="">' . (isset($second_empty) ? $second_empty : $all_empty) . '</option>' . $option_separator; + } + + $selected = $_second !== null ? ($_second - $_second % $second_interval) : null; + for ($i = 0; $i <= 59; $i += $second_interval) { + $_val = sprintf('%02d', $i); + $_text = $second_format == '%02d' ? $_val : sprintf($second_format, $i); + $_value = $second_value_format == '%02d' ? $_val : sprintf($second_value_format, $i); + $_html_seconds .= '<option value="' . $_value . '"' + . ($selected === $i ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_seconds .= '</select>'; + } + + // generate meridian <select> + if ($display_meridian && !$use_24_hours) { + $_html_meridian = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($meridian_extra) { + $_extra .= ' ' . $meridian_extra; + } + + $_html_meridian = '<select name="' . $_name . '"'; + if ($meridian_id !== null || $all_id !== null) { + $_html_meridian .= ' id="' . smarty_function_escape_special_chars( + $meridian_id !== null ? ($meridian_id ? $meridian_id : $_name) : ($all_id ? ($all_id . $_name) : $_name) + ) . '"'; + } + if ($meridian_size) { + $_html_meridian .= ' size="' . $meridian_size . '"'; + } + $_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($meridian_empty) || isset($all_empty)) { + $_html_meridian .= '<option value="">' . (isset($meridian_empty) ? $meridian_empty : $all_empty) . '</option>' . $option_separator; + } + + $_html_meridian .= '<option value="am"' . ($_hour > 0 && $_hour < 12 ? ' selected="selected"' : '') . '>AM</option>' . $option_separator + . '<option value="pm"' . ($_hour < 12 ? '' : ' selected="selected"') . '>PM</option>' . $option_separator + . '</select>'; + } + + $_html = ''; + foreach (array('_html_hours', '_html_minutes', '_html_seconds', '_html_meridian') as $k) { + if (isset($$k)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $$k; + } + } + + return $_html; +} diff --git a/libs/smarty/libs/plugins/function.html_table.php b/libs/smarty/libs/plugins/function.html_table.php @@ -0,0 +1,176 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {html_table} function plugin + * Type: function<br> + * Name: html_table<br> + * Date: Feb 17, 2003<br> + * Purpose: make an html table from an array of data<br> + * Params: + * <pre> + * - loop - array to loop through + * - cols - number of columns, comma separated list of column names + * or array of column names + * - rows - number of rows + * - table_attr - table attributes + * - th_attr - table heading attributes (arrays are cycled) + * - tr_attr - table row attributes (arrays are cycled) + * - td_attr - table cell attributes (arrays are cycled) + * - trailpad - value to pad trailing cells with + * - caption - text for caption element + * - vdir - vertical direction (default: "down", means top-to-bottom) + * - hdir - horizontal direction (default: "right", means left-to-right) + * - inner - inner loop (default "cols": print $loop line by line, + * $loop will be printed column by column otherwise) + * </pre> + * Examples: + * <pre> + * {table loop=$data} + * {table loop=$data cols=4 tr_attr='"bgcolor=red"'} + * {table loop=$data cols="first,second,third" tr_attr=$colors} + * </pre> + * + * @author Monte Ohrt <monte at ohrt dot com> + * @author credit to Messju Mohr <messju at lammfellpuschen dot de> + * @author credit to boots <boots dot smarty at yahoo dot com> + * @version 1.1 + * @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table} + * (Smarty online manual) + * + * @param array $params parameters + * + * @return string + */ +function smarty_function_html_table($params) +{ + $table_attr = 'border="1"'; + $tr_attr = ''; + $th_attr = ''; + $td_attr = ''; + $cols = $cols_count = 3; + $rows = 3; + $trailpad = '&nbsp;'; + $vdir = 'down'; + $hdir = 'right'; + $inner = 'cols'; + $caption = ''; + $loop = null; + + if (!isset($params['loop'])) { + trigger_error("html_table: missing 'loop' parameter", E_USER_WARNING); + + return; + } + + foreach ($params as $_key => $_value) { + switch ($_key) { + case 'loop': + $$_key = (array) $_value; + break; + + case 'cols': + if (is_array($_value) && !empty($_value)) { + $cols = $_value; + $cols_count = count($_value); + } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) { + $cols = explode(',', $_value); + $cols_count = count($cols); + } elseif (!empty($_value)) { + $cols_count = (int) $_value; + } else { + $cols_count = $cols; + } + break; + + case 'rows': + $$_key = (int) $_value; + break; + + case 'table_attr': + case 'trailpad': + case 'hdir': + case 'vdir': + case 'inner': + case 'caption': + $$_key = (string) $_value; + break; + + case 'tr_attr': + case 'td_attr': + case 'th_attr': + $$_key = $_value; + break; + } + } + + $loop_count = count($loop); + if (empty($params['rows'])) { + /* no rows specified */ + $rows = ceil($loop_count / $cols_count); + } elseif (empty($params['cols'])) { + if (!empty($params['rows'])) { + /* no cols specified, but rows */ + $cols_count = ceil($loop_count / $rows); + } + } + + $output = "<table $table_attr>\n"; + + if (!empty($caption)) { + $output .= '<caption>' . $caption . "</caption>\n"; + } + + if (is_array($cols)) { + $cols = ($hdir == 'right') ? $cols : array_reverse($cols); + $output .= "<thead><tr>\n"; + + for ($r = 0; $r < $cols_count; $r ++) { + $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>'; + $output .= $cols[$r]; + $output .= "</th>\n"; + } + $output .= "</tr></thead>\n"; + } + + $output .= "<tbody>\n"; + for ($r = 0; $r < $rows; $r ++) { + $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n"; + $rx = ($vdir == 'down') ? $r * $cols_count : ($rows - 1 - $r) * $cols_count; + + for ($c = 0; $c < $cols_count; $c ++) { + $x = ($hdir == 'right') ? $rx + $c : $rx + $cols_count - 1 - $c; + if ($inner != 'cols') { + /* shuffle x to loop over rows*/ + $x = floor($x / $cols_count) + ($x % $cols_count) * $rows; + } + + if ($x < $loop_count) { + $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n"; + } else { + $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n"; + } + } + $output .= "</tr>\n"; + } + $output .= "</tbody>\n"; + $output .= "</table>\n"; + + return $output; +} + +function smarty_function_html_table_cycle($name, $var, $no) +{ + if (!is_array($var)) { + $ret = $var; + } else { + $ret = $var[$no % count($var)]; + } + + return ($ret) ? ' ' . $ret : ''; +} diff --git a/libs/smarty/libs/plugins/function.mailto.php b/libs/smarty/libs/plugins/function.mailto.php @@ -0,0 +1,155 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {mailto} function plugin + * Type: function<br> + * Name: mailto<br> + * Date: May 21, 2002 + * Purpose: automate mailto address link creation, and optionally encode them.<br> + * Params: + * <pre> + * - address - (required) - e-mail address + * - text - (optional) - text to display, default is address + * - encode - (optional) - can be one of: + * * none : no encoding (default) + * * javascript : encode with javascript + * * javascript_charcode : encode with javascript charcode + * * hex : encode with hexidecimal (no javascript) + * - cc - (optional) - address(es) to carbon copy + * - bcc - (optional) - address(es) to blind carbon copy + * - subject - (optional) - e-mail subject + * - newsgroups - (optional) - newsgroup(s) to post to + * - followupto - (optional) - address(es) to follow up to + * - extra - (optional) - extra tags for the href link + * </pre> + * Examples: + * <pre> + * {mailto address="me@domain.com"} + * {mailto address="me@domain.com" encode="javascript"} + * {mailto address="me@domain.com" encode="hex"} + * {mailto address="me@domain.com" subject="Hello to you!"} + * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"} + * {mailto address="me@domain.com" extra='class="mailto"'} + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto} + * (Smarty online manual) + * @version 1.2 + * @author Monte Ohrt <monte at ohrt dot com> + * @author credits to Jason Sweat (added cc, bcc and subject functionality) + * + * @param array $params parameters + * + * @return string + */ +function smarty_function_mailto($params) +{ + static $_allowed_encoding = array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true); + $extra = ''; + + if (empty($params['address'])) { + trigger_error("mailto: missing 'address' parameter", E_USER_WARNING); + + return; + } else { + $address = $params['address']; + } + + $text = $address; + // netscape and mozilla do not decode %40 (@) in BCC field (bug?) + // so, don't encode it. + $search = array('%40', '%2C'); + $replace = array('@', ','); + $mail_parms = array(); + foreach ($params as $var => $value) { + switch ($var) { + case 'cc': + case 'bcc': + case 'followupto': + if (!empty($value)) { + $mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value)); + } + break; + + case 'subject': + case 'newsgroups': + $mail_parms[] = $var . '=' . rawurlencode($value); + break; + + case 'extra': + case 'text': + $$var = $value; + + default: + } + } + + if ($mail_parms) { + $address .= '?' . join('&', $mail_parms); + } + + $encode = (empty($params['encode'])) ? 'none' : $params['encode']; + if (!isset($_allowed_encoding[$encode])) { + trigger_error("mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex", E_USER_WARNING); + + return; + } + // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed! + if ($encode == 'javascript') { + $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');'; + + $js_encode = ''; + for ($x = 0, $_length = strlen($string); $x < $_length; $x ++) { + $js_encode .= '%' . bin2hex($string[$x]); + } + + return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>'; + } elseif ($encode == 'javascript_charcode') { + $string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; + + for ($x = 0, $y = strlen($string); $x < $y; $x ++) { + $ord[] = ord($string[$x]); + } + + $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" + . "{document.write(String.fromCharCode(" + . implode(',', $ord) + . "))" + . "}\n" + . "</script>\n"; + + return $_ret; + } elseif ($encode == 'hex') { + preg_match('!^(.*)(\?.*)$!', $address, $match); + if (!empty($match[2])) { + trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.", E_USER_WARNING); + + return; + } + $address_encode = ''; + for ($x = 0, $_length = strlen($address); $x < $_length; $x ++) { + if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[$x])) { + $address_encode .= '%' . bin2hex($address[$x]); + } else { + $address_encode .= $address[$x]; + } + } + $text_encode = ''; + for ($x = 0, $_length = strlen($text); $x < $_length; $x ++) { + $text_encode .= '&#x' . bin2hex($text[$x]) . ';'; + } + + $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;"; + + return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>'; + } else { + // no encoding + return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; + } +} diff --git a/libs/smarty/libs/plugins/function.math.php b/libs/smarty/libs/plugins/function.math.php @@ -0,0 +1,91 @@ +<?php +/** + * Smarty plugin + * This plugin is only for Smarty2 BC + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {math} function plugin + * Type: function<br> + * Name: math<br> + * Purpose: handle math computations in template + * + * @link http://www.smarty.net/manual/en/language.function.math.php {math} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @return string|null + */ +function smarty_function_math($params, $template) +{ + static $_allowed_funcs = array( + 'int' => true, 'abs' => true, 'ceil' => true, 'cos' => true, 'exp' => true, 'floor' => true, + 'log' => true, 'log10' => true, 'max' => true, 'min' => true, 'pi' => true, 'pow' => true, + 'rand' => true, 'round' => true, 'sin' => true, 'sqrt' => true, 'srand' => true, 'tan' => true + ); + // be sure equation parameter is present + if (empty($params['equation'])) { + trigger_error("math: missing equation parameter", E_USER_WARNING); + + return; + } + + $equation = $params['equation']; + + // make sure parenthesis are balanced + if (substr_count($equation, "(") != substr_count($equation, ")")) { + trigger_error("math: unbalanced parenthesis", E_USER_WARNING); + + return; + } + + // match all vars in equation, make sure all are passed + preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!", $equation, $match); + + foreach ($match[1] as $curr_var) { + if ($curr_var && !isset($params[$curr_var]) && !isset($_allowed_funcs[$curr_var])) { + trigger_error("math: function call $curr_var not allowed", E_USER_WARNING); + + return; + } + } + + foreach ($params as $key => $val) { + if ($key != "equation" && $key != "format" && $key != "assign") { + // make sure value is not empty + if (strlen($val) == 0) { + trigger_error("math: parameter $key is empty", E_USER_WARNING); + + return; + } + if (!is_numeric($val)) { + trigger_error("math: parameter $key: is not numeric", E_USER_WARNING); + + return; + } + $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation); + } + } + $smarty_math_result = null; + eval("\$smarty_math_result = " . $equation . ";"); + + if (empty($params['format'])) { + if (empty($params['assign'])) { + return $smarty_math_result; + } else { + $template->assign($params['assign'], $smarty_math_result); + } + } else { + if (empty($params['assign'])) { + printf($params['format'], $smarty_math_result); + } else { + $template->assign($params['assign'], sprintf($params['format'], $smarty_math_result)); + } + } +} diff --git a/libs/smarty/libs/plugins/modifier.capitalize.php b/libs/smarty/libs/plugins/modifier.capitalize.php @@ -0,0 +1,90 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty capitalize modifier plugin + * Type: modifier<br> + * Name: capitalize<br> + * Purpose: capitalize words in the string + * {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }} + * + * @param string $string string to capitalize + * @param boolean $uc_digits also capitalize "x123" to "X123" + * @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa" + * + * @return string capitalized string + * @author Monte Ohrt <monte at ohrt dot com> + * @author Rodney Rehm + */ +function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false) +{ + if (Smarty::$_MBSTRING) { + if ($lc_rest) { + // uppercase (including hyphenated words) + $upper_string = mb_convert_case($string, MB_CASE_TITLE, Smarty::$_CHARSET); + } else { + // uppercase word breaks + $upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_mbconvert_cb', $string); + } + // check uc_digits case + if (!$uc_digits) { + if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) { + foreach ($matches[1] as $match) { + $upper_string = substr_replace($upper_string, mb_strtolower($match[0], Smarty::$_CHARSET), $match[1], strlen($match[0])); + } + } + } + $upper_string = preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_mbconvert2_cb', $upper_string); + return $upper_string; + } + + // lowercase first + if ($lc_rest) { + $string = strtolower($string); + } + // uppercase (including hyphenated words) + $upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_ucfirst_cb', $string); + // check uc_digits case + if (!$uc_digits) { + if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) { + foreach ($matches[1] as $match) { + $upper_string = substr_replace($upper_string, strtolower($match[0]), $match[1], strlen($match[0])); + } + } + } + $upper_string = preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_ucfirst2_cb', $upper_string); + return $upper_string; +} + +/* + * + * Bug: create_function() use exhausts memory when used in long loops + * Fix: use declared functions for callbacks instead of using create_function() + * Note: This can be fixed using anonymous functions instead, but that requires PHP >= 5.3 + * + * @author Kyle Renfrow + */ +function smarty_mod_cap_mbconvert_cb($matches) +{ + return stripslashes($matches[1]) . mb_convert_case(stripslashes($matches[2]), MB_CASE_UPPER, Smarty::$_CHARSET); +} + +function smarty_mod_cap_mbconvert2_cb($matches) +{ + return stripslashes($matches[1]) . mb_convert_case(stripslashes($matches[3]), MB_CASE_UPPER, Smarty::$_CHARSET); +} + +function smarty_mod_cap_ucfirst_cb($matches) +{ + return stripslashes($matches[1]) . ucfirst(stripslashes($matches[2])); +} + +function smarty_mod_cap_ucfirst2_cb($matches) +{ + return stripslashes($matches[1]) . ucfirst(stripslashes($matches[3])); +} diff --git a/libs/smarty/libs/plugins/modifier.date_format.php b/libs/smarty/libs/plugins/modifier.date_format.php @@ -0,0 +1,65 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty date_format modifier plugin + * Type: modifier<br> + * Name: date_format<br> + * Purpose: format datestamps via strftime<br> + * Input:<br> + * - string: input date string + * - format: strftime format for output + * - default_date: default date if $string is empty + * + * @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string input date string + * @param string $format strftime format for output + * @param string $default_date default date if $string is empty + * @param string $formatter either 'strftime' or 'auto' + * + * @return string |void + * @uses smarty_make_timestamp() + */ +function smarty_modifier_date_format($string, $format = null, $default_date = '', $formatter = 'auto') +{ + if ($format === null) { + $format = Smarty::$_DATE_FORMAT; + } + /** + * require_once the {@link shared.make_timestamp.php} plugin + */ + require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') { + $timestamp = smarty_make_timestamp($string); + } elseif ($default_date != '') { + $timestamp = smarty_make_timestamp($default_date); + } else { + return; + } + if ($formatter == 'strftime' || ($formatter == 'auto' && strpos($format, '%') !== false)) { + if (DS == '\\') { + $_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T'); + $_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S'); + if (strpos($format, '%e') !== false) { + $_win_from[] = '%e'; + $_win_to[] = sprintf('%\' 2d', date('j', $timestamp)); + } + if (strpos($format, '%l') !== false) { + $_win_from[] = '%l'; + $_win_to[] = sprintf('%\' 2d', date('h', $timestamp)); + } + $format = str_replace($_win_from, $_win_to, $format); + } + + return strftime($format, $timestamp); + } else { + return date($format, $timestamp); + } +} diff --git a/libs/smarty/libs/plugins/modifier.debug_print_var.php b/libs/smarty/libs/plugins/modifier.debug_print_var.php @@ -0,0 +1,116 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage Debug + */ + +/** + * Smarty debug_print_var modifier plugin + * Type: modifier<br> + * Name: debug_print_var<br> + * Purpose: formats variable contents for display in the console + * + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param array|object $var variable to be formatted + * @param int $max maximum recursion depth if $var is an array or object + * @param int $length maximum string length if $var is a string + * @param int $depth actual recursion depth + * @param array $objects processed objects in actual depth to prevent recursive object processing + * + * @return string + */ +function smarty_modifier_debug_print_var($var, $max = 10, $length = 40, $depth = 0, $objects = array()) +{ + $_replace = array("\n" => '<i>\n</i>', + "\r" => '<i>\r</i>', + "\t" => '<i>\t</i>' + ); + switch (gettype($var)) { + case 'array' : + $results = '<b>Array (' . count($var) . ')</b>'; + if ($depth == $max) { + break; + } + foreach ($var as $curr_key => $curr_val) { + $results .= '<br>' . str_repeat('&nbsp;', $depth * 2) + . '<b>' . strtr($curr_key, $_replace) . '</b> =&gt; ' + . smarty_modifier_debug_print_var($curr_val, $max, $length, ++ $depth, $objects); + $depth --; + } + break; + + case 'object' : + $object_vars = get_object_vars($var); + $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>'; + if (in_array($var, $objects)) { + $results .= ' called recursive'; + break; + } + if ($depth == $max) { + break; + } + $objects[] = $var; + foreach ($object_vars as $curr_key => $curr_val) { + $results .= '<br>' . str_repeat('&nbsp;', $depth * 2) + . '<b> -&gt;' . strtr($curr_key, $_replace) . '</b> = ' + . smarty_modifier_debug_print_var($curr_val, $max, $length, ++ $depth, $objects); + $depth --; + } + break; + + case 'boolean' : + case 'NULL' : + case 'resource' : + if (true === $var) { + $results = 'true'; + } elseif (false === $var) { + $results = 'false'; + } elseif (null === $var) { + $results = 'null'; + } else { + $results = htmlspecialchars((string) $var); + } + $results = '<i>' . $results . '</i>'; + break; + + case 'integer' : + case 'float' : + $results = htmlspecialchars((string) $var); + break; + + case 'string' : + $results = strtr($var, $_replace); + if (Smarty::$_MBSTRING) { + if (mb_strlen($var, Smarty::$_CHARSET) > $length) { + $results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...'; + } + } else { + if (isset($var[$length])) { + $results = substr($var, 0, $length - 3) . '...'; + } + } + + $results = htmlspecialchars('"' . $results . '"'); + break; + + case 'unknown type' : + default : + $results = strtr((string) $var, $_replace); + if (Smarty::$_MBSTRING) { + if (mb_strlen($results, Smarty::$_CHARSET) > $length) { + $results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...'; + } + } else { + if (strlen($results) > $length) { + $results = substr($results, 0, $length - 3) . '...'; + } + } + + $results = htmlspecialchars($results); + } + + return $results; +} diff --git a/libs/smarty/libs/plugins/modifier.escape.php b/libs/smarty/libs/plugins/modifier.escape.php @@ -0,0 +1,198 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty escape modifier plugin + * Type: modifier<br> + * Name: escape<br> + * Purpose: escape string for output + * + * @link http://www.smarty.net/docs/en/language.modifier.escape + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string input string + * @param string $esc_type escape type + * @param string $char_set character set, used for htmlspecialchars() or htmlentities() + * @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities() + * + * @return string escaped input string + */ +function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true) +{ + static $_double_encode = null; + if ($_double_encode === null) { + $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); + } + + if (!$char_set) { + $char_set = Smarty::$_CHARSET; + } + + switch ($esc_type) { + case 'html': + if ($_double_encode) { + // php >=5.3.2 - go native + return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); + } else { + if ($double_encode) { + // php <5.2.3 - only handle double encoding + return htmlspecialchars($string, ENT_QUOTES, $char_set); + } else { + // php <5.2.3 - prevent double encoding + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string, ENT_QUOTES, $char_set); + $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + + return $string; + } + } + + case 'htmlall': + if (Smarty::$_MBSTRING) { + // mb_convert_encoding ignores htmlspecialchars() + if ($_double_encode) { + // php >=5.3.2 - go native + $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); + } else { + if ($double_encode) { + // php <5.2.3 - only handle double encoding + $string = htmlspecialchars($string, ENT_QUOTES, $char_set); + } else { + // php <5.2.3 - prevent double encoding + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string, ENT_QUOTES, $char_set); + $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + + return $string; + } + } + + // htmlentities() won't convert everything, so use mb_convert_encoding + return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set); + } + + // no MBString fallback + if ($_double_encode) { + return htmlentities($string, ENT_QUOTES, $char_set, $double_encode); + } else { + if ($double_encode) { + return htmlentities($string, ENT_QUOTES, $char_set); + } else { + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlentities($string, ENT_QUOTES, $char_set); + $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + + return $string; + } + } + + case 'url': + return rawurlencode($string); + + case 'urlpathinfo': + return str_replace('%2F', '/', rawurlencode($string)); + + case 'quotes': + // escape unescaped single quotes + return preg_replace("%(?<!\\\\)'%", "\\'", $string); + + case 'hex': + // escape every byte into hex + // Note that the UTF-8 encoded character ä will be represented as %c3%a4 + $return = ''; + $_length = strlen($string); + for ($x = 0; $x < $_length; $x ++) { + $return .= '%' . bin2hex($string[$x]); + } + + return $return; + + case 'hexentity': + $return = ''; + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + $return = ''; + foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { + $return .= '&#x' . strtoupper(dechex($unicode)) . ';'; + } + + return $return; + } + // no MBString fallback + $_length = strlen($string); + for ($x = 0; $x < $_length; $x ++) { + $return .= '&#x' . bin2hex($string[$x]) . ';'; + } + + return $return; + + case 'decentity': + $return = ''; + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + $return = ''; + foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { + $return .= '&#' . $unicode . ';'; + } + + return $return; + } + // no MBString fallback + $_length = strlen($string); + for ($x = 0; $x < $_length; $x ++) { + $return .= '&#' . ord($string[$x]) . ';'; + } + + return $return; + + case 'javascript': + // escape quotes and backslashes, newlines, etc. + return strtr($string, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n', '</' => '<\/')); + + case 'mail': + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); + + return smarty_mb_str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); + } + // no MBString fallback + return str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); + + case 'nonstd': + // escape non-standard chars, such as ms document quotes + $return = ''; + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { + if ($unicode >= 126) { + $return .= '&#' . $unicode . ';'; + } else { + $return .= chr($unicode); + } + } + + return $return; + } + + $_length = strlen($string); + for ($_i = 0; $_i < $_length; $_i ++) { + $_ord = ord(substr($string, $_i, 1)); + // non-standard char, escape it + if ($_ord >= 126) { + $return .= '&#' . $_ord . ';'; + } else { + $return .= substr($string, $_i, 1); + } + } + + return $return; + + default: + return $string; + } +} diff --git a/libs/smarty/libs/plugins/modifier.regex_replace.php b/libs/smarty/libs/plugins/modifier.regex_replace.php @@ -0,0 +1,57 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty regex_replace modifier plugin + * Type: modifier<br> + * Name: regex_replace<br> + * Purpose: regular expression search/replace + * + * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php + * regex_replace (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string input string + * @param string|array $search regular expression(s) to search for + * @param string|array $replace string(s) that should be replaced + * + * @return string + */ +function smarty_modifier_regex_replace($string, $search, $replace) +{ + if (is_array($search)) { + foreach ($search as $idx => $s) { + $search[$idx] = _smarty_regex_replace_check($s); + } + } else { + $search = _smarty_regex_replace_check($search); + } + + return preg_replace($search, $replace, $string); +} + +/** + * @param string $search string(s) that should be replaced + * + * @return string + * @ignore + */ +function _smarty_regex_replace_check($search) +{ + // null-byte injection detection + // anything behind the first null-byte is ignored + if (($pos = strpos($search, "\0")) !== false) { + $search = substr($search, 0, $pos); + } + // remove eval-modifier from $search + if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) { + $search = substr($search, 0, - strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]); + } + + return $search; +} diff --git a/libs/smarty/libs/plugins/modifier.replace.php b/libs/smarty/libs/plugins/modifier.replace.php @@ -0,0 +1,34 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty replace modifier plugin + * Type: modifier<br> + * Name: replace<br> + * Purpose: simple search/replace + * + * @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author Uwe Tews + * + * @param string $string input string + * @param string $search text to search for + * @param string $replace replacement text + * + * @return string + */ +function smarty_modifier_replace($string, $search, $replace) +{ + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); + + return smarty_mb_str_replace($search, $replace, $string); + } + + return str_replace($search, $replace, $string); +} diff --git a/libs/smarty/libs/plugins/modifier.spacify.php b/libs/smarty/libs/plugins/modifier.spacify.php @@ -0,0 +1,27 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty spacify modifier plugin + * Type: modifier<br> + * Name: spacify<br> + * Purpose: add spaces between characters in a string + * + * @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string input string + * @param string $spacify_char string to insert between characters. + * + * @return string + */ +function smarty_modifier_spacify($string, $spacify_char = ' ') +{ + // well… what about charsets besides latin and UTF-8? + return implode($spacify_char, preg_split('//' . Smarty::$_UTF8_MODIFIER, $string, - 1, PREG_SPLIT_NO_EMPTY)); +} diff --git a/libs/smarty/libs/plugins/modifier.truncate.php b/libs/smarty/libs/plugins/modifier.truncate.php @@ -0,0 +1,64 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty truncate modifier plugin + * Type: modifier<br> + * Name: truncate<br> + * Purpose: Truncate a string to a certain length if necessary, + * optionally splitting in the middle of a word, and + * appending the $etc string or inserting $etc into the middle. + * + * @link http://smarty.php.net/manual/en/language.modifier.truncate.php truncate (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string input string + * @param integer $length length of truncated text + * @param string $etc end string + * @param boolean $break_words truncate at word boundary + * @param boolean $middle truncate in the middle of text + * + * @return string truncated string + */ +function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) +{ + if ($length == 0) { + return ''; + } + + if (Smarty::$_MBSTRING) { + if (mb_strlen($string, Smarty::$_CHARSET) > $length) { + $length -= min($length, mb_strlen($etc, Smarty::$_CHARSET)); + if (!$break_words && !$middle) { + $string = preg_replace('/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER, '', mb_substr($string, 0, $length + 1, Smarty::$_CHARSET)); + } + if (!$middle) { + return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc; + } + + return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc . mb_substr($string, - $length / 2, $length, Smarty::$_CHARSET); + } + + return $string; + } + + // no MBString fallback + if (isset($string[$length])) { + $length -= min($length, strlen($etc)); + if (!$break_words && !$middle) { + $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1)); + } + if (!$middle) { + return substr($string, 0, $length) . $etc; + } + + return substr($string, 0, $length / 2) . $etc . substr($string, - $length / 2); + } + + return $string; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.cat.php b/libs/smarty/libs/plugins/modifiercompiler.cat.php @@ -0,0 +1,29 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty cat modifier plugin + * Type: modifier<br> + * Name: cat<br> + * Date: Feb 24, 2003<br> + * Purpose: catenate a value to a variable<br> + * Input: string to catenate<br> + * Example: {$var|cat:"foo"} + * + * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat + * (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_cat($params) +{ + return '(' . implode(').(', $params) . ')'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.count_characters.php b/libs/smarty/libs/plugins/modifiercompiler.count_characters.php @@ -0,0 +1,32 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty count_characters modifier plugin + * Type: modifier<br> + * Name: count_characteres<br> + * Purpose: count the number of characters in a text + * + * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_count_characters($params) +{ + if (!isset($params[1]) || $params[1] != 'true') { + return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[0] . ', $tmp)'; + } + if (Smarty::$_MBSTRING) { + return 'mb_strlen(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')'; + } + // no MBString fallback + return 'strlen(' . $params[0] . ')'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.count_paragraphs.php b/libs/smarty/libs/plugins/modifiercompiler.count_paragraphs.php @@ -0,0 +1,27 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty count_paragraphs modifier plugin + * Type: modifier<br> + * Name: count_paragraphs<br> + * Purpose: count the number of paragraphs in a text + * + * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php + * count_paragraphs (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_count_paragraphs($params) +{ + // count \r or \n characters + return '(preg_match_all(\'#[\r\n]+#\', ' . $params[0] . ', $tmp)+1)'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.count_sentences.php b/libs/smarty/libs/plugins/modifiercompiler.count_sentences.php @@ -0,0 +1,27 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty count_sentences modifier plugin + * Type: modifier<br> + * Name: count_sentences + * Purpose: count the number of sentences in a text + * + * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php + * count_sentences (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_count_sentences($params) +{ + // find periods, question marks, exclamation marks with a word before but not after. + return 'preg_match_all("#\w[\.\?\!](\W|$)#S' . Smarty::$_UTF8_MODIFIER . '", ' . $params[0] . ', $tmp)'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.count_words.php b/libs/smarty/libs/plugins/modifiercompiler.count_words.php @@ -0,0 +1,31 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty count_words modifier plugin + * Type: modifier<br> + * Name: count_words<br> + * Purpose: count the number of words in a text + * + * @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_count_words($params) +{ + if (Smarty::$_MBSTRING) { + // return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)'; + // expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592 + return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)'; + } + // no MBString fallback + return 'str_word_count(' . $params[0] . ')'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.default.php b/libs/smarty/libs/plugins/modifiercompiler.default.php @@ -0,0 +1,35 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty default modifier plugin + * Type: modifier<br> + * Name: default<br> + * Purpose: designate default value for empty variables + * + * @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_default($params) +{ + $output = $params[0]; + if (!isset($params[1])) { + $params[1] = "''"; + } + + array_shift($params); + foreach ($params as $param) { + $output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)'; + } + + return $output; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.escape.php b/libs/smarty/libs/plugins/modifiercompiler.escape.php @@ -0,0 +1,126 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.literal_compiler_param.php'); + +/** + * Smarty escape modifier plugin + * Type: modifier<br> + * Name: escape<br> + * Purpose: escape string for output + * + * @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual) + * @author Rodney Rehm + * + * @param array $params parameters + * @param $compiler + * + * @return string with compiled code + */ +function smarty_modifiercompiler_escape($params, $compiler) +{ + static $_double_encode = null; + if ($_double_encode === null) { + $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); + } + + try { + $esc_type = smarty_literal_compiler_param($params, 1, 'html'); + $char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET); + $double_encode = smarty_literal_compiler_param($params, 3, true); + + if (!$char_set) { + $char_set = Smarty::$_CHARSET; + } + + switch ($esc_type) { + case 'html': + if ($_double_encode) { + return 'htmlspecialchars(' + . $params[0] . ', ENT_QUOTES, ' + . var_export($char_set, true) . ', ' + . var_export($double_encode, true) . ')'; + } elseif ($double_encode) { + return 'htmlspecialchars(' + . $params[0] . ', ENT_QUOTES, ' + . var_export($char_set, true) . ')'; + } else { + // fall back to modifier.escape.php + } + + case 'htmlall': + if (Smarty::$_MBSTRING) { + if ($_double_encode) { + // php >=5.2.3 - go native + return 'mb_convert_encoding(htmlspecialchars(' + . $params[0] . ', ENT_QUOTES, ' + . var_export($char_set, true) . ', ' + . var_export($double_encode, true) + . '), "HTML-ENTITIES", ' + . var_export($char_set, true) . ')'; + } elseif ($double_encode) { + // php <5.2.3 - only handle double encoding + return 'mb_convert_encoding(htmlspecialchars(' + . $params[0] . ', ENT_QUOTES, ' + . var_export($char_set, true) + . '), "HTML-ENTITIES", ' + . var_export($char_set, true) . ')'; + } else { + // fall back to modifier.escape.php + } + } + + // no MBString fallback + if ($_double_encode) { + // php >=5.2.3 - go native + return 'htmlentities(' + . $params[0] . ', ENT_QUOTES, ' + . var_export($char_set, true) . ', ' + . var_export($double_encode, true) . ')'; + } elseif ($double_encode) { + // php <5.2.3 - only handle double encoding + return 'htmlentities(' + . $params[0] . ', ENT_QUOTES, ' + . var_export($char_set, true) . ')'; + } else { + // fall back to modifier.escape.php + } + + case 'url': + return 'rawurlencode(' . $params[0] . ')'; + + case 'urlpathinfo': + return 'str_replace("%2F", "/", rawurlencode(' . $params[0] . '))'; + + case 'quotes': + // escape unescaped single quotes + return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[0] . ')'; + + case 'javascript': + // escape quotes and backslashes, newlines, etc. + return 'strtr(' . $params[0] . ', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))'; + } + } + catch (SmartyException $e) { + // pass through to regular plugin fallback + } + + // could not optimize |escape call, so fallback to regular plugin + if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) { + $compiler->template->required_plugins['nocache']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR . 'modifier.escape.php'; + $compiler->template->required_plugins['nocache']['escape']['modifier']['function'] = 'smarty_modifier_escape'; + } else { + $compiler->template->required_plugins['compiled']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR . 'modifier.escape.php'; + $compiler->template->required_plugins['compiled']['escape']['modifier']['function'] = 'smarty_modifier_escape'; + } + + return 'smarty_modifier_escape(' . join(', ', $params) . ')'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.from_charset.php b/libs/smarty/libs/plugins/modifiercompiler.from_charset.php @@ -0,0 +1,33 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty from_charset modifier plugin + * Type: modifier<br> + * Name: from_charset<br> + * Purpose: convert character encoding from $charset to internal encoding + * + * @author Rodney Rehm + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_from_charset($params) +{ + if (!Smarty::$_MBSTRING) { + // FIXME: (rodneyrehm) shouldn't this throw an error? + return $params[0]; + } + + if (!isset($params[1])) { + $params[1] = '"ISO-8859-1"'; + } + + return 'mb_convert_encoding(' . $params[0] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[1] . ')'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.indent.php b/libs/smarty/libs/plugins/modifiercompiler.indent.php @@ -0,0 +1,33 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty indent modifier plugin + * Type: modifier<br> + * Name: indent<br> + * Purpose: indent lines of text + * + * @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ + +function smarty_modifiercompiler_indent($params) +{ + if (!isset($params[1])) { + $params[1] = 4; + } + if (!isset($params[2])) { + $params[2] = "' '"; + } + + return 'preg_replace(\'!^!m\',str_repeat(' . $params[2] . ',' . $params[1] . '),' . $params[0] . ')'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.lower.php b/libs/smarty/libs/plugins/modifiercompiler.lower.php @@ -0,0 +1,31 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty lower modifier plugin + * Type: modifier<br> + * Name: lower<br> + * Purpose: convert string to lowercase + * + * @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ + +function smarty_modifiercompiler_lower($params) +{ + if (Smarty::$_MBSTRING) { + return 'mb_strtolower(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')'; + } + // no MBString fallback + return 'strtolower(' . $params[0] . ')'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.noprint.php b/libs/smarty/libs/plugins/modifiercompiler.noprint.php @@ -0,0 +1,21 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty noprint modifier plugin + * Type: modifier<br> + * Name: noprint<br> + * Purpose: return an empty string + * + * @author Uwe Tews + * @return string with compiled code + */ +function smarty_modifiercompiler_noprint() +{ + return "''"; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.string_format.php b/libs/smarty/libs/plugins/modifiercompiler.string_format.php @@ -0,0 +1,25 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty string_format modifier plugin + * Type: modifier<br> + * Name: string_format<br> + * Purpose: format strings via sprintf + * + * @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_string_format($params) +{ + return 'sprintf(' . $params[1] . ',' . $params[0] . ')'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.strip.php b/libs/smarty/libs/plugins/modifiercompiler.strip.php @@ -0,0 +1,33 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty strip modifier plugin + * Type: modifier<br> + * Name: strip<br> + * Purpose: Replace all repeated spaces, newlines, tabs + * with a single space or supplied replacement string.<br> + * Example: {$var|strip} {$var|strip:"&nbsp;"}<br> + * Date: September 25th, 2002 + * + * @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ + +function smarty_modifiercompiler_strip($params) +{ + if (!isset($params[1])) { + $params[1] = "' '"; + } + + return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})"; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.strip_tags.php b/libs/smarty/libs/plugins/modifiercompiler.strip_tags.php @@ -0,0 +1,29 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty strip_tags modifier plugin + * Type: modifier<br> + * Name: strip_tags<br> + * Purpose: strip html tags from text + * + * @link http://www.smarty.net/manual/en/language.modifier.strip.tags.php strip_tags (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_strip_tags($params) +{ + if (!isset($params[1]) || $params[1] === true || trim($params[1], '"') == 'true') { + return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})"; + } else { + return 'strip_tags(' . $params[0] . ')'; + } +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.to_charset.php b/libs/smarty/libs/plugins/modifiercompiler.to_charset.php @@ -0,0 +1,33 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty to_charset modifier plugin + * Type: modifier<br> + * Name: to_charset<br> + * Purpose: convert character encoding from internal encoding to $charset + * + * @author Rodney Rehm + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_to_charset($params) +{ + if (!Smarty::$_MBSTRING) { + // FIXME: (rodneyrehm) shouldn't this throw an error? + return $params[0]; + } + + if (!isset($params[1])) { + $params[1] = '"ISO-8859-1"'; + } + + return 'mb_convert_encoding(' . $params[0] . ', ' . $params[1] . ', "' . addslashes(Smarty::$_CHARSET) . '")'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.unescape.php b/libs/smarty/libs/plugins/modifiercompiler.unescape.php @@ -0,0 +1,50 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty unescape modifier plugin + * Type: modifier<br> + * Name: unescape<br> + * Purpose: unescape html entities + * + * @author Rodney Rehm + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_unescape($params) +{ + if (!isset($params[1])) { + $params[1] = 'html'; + } + if (!isset($params[2])) { + $params[2] = '\'' . addslashes(Smarty::$_CHARSET) . '\''; + } else { + $params[2] = "'" . $params[2] . "'"; + } + + switch (trim($params[1], '"\'')) { + case 'entity': + case 'htmlall': + if (Smarty::$_MBSTRING) { + return 'mb_convert_encoding(' . $params[0] . ', ' . $params[2] . ', \'HTML-ENTITIES\')'; + } + + return 'html_entity_decode(' . $params[0] . ', ENT_NOQUOTES, ' . $params[2] . ')'; + + case 'html': + return 'htmlspecialchars_decode(' . $params[0] . ', ENT_QUOTES)'; + + case 'url': + return 'rawurldecode(' . $params[0] . ')'; + + default: + return $params[0]; + } +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.upper.php b/libs/smarty/libs/plugins/modifiercompiler.upper.php @@ -0,0 +1,29 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty upper modifier plugin + * Type: modifier<br> + * Name: lower<br> + * Purpose: convert string to uppercase + * + * @link http://smarty.php.net/manual/en/language.modifier.upper.php lower (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_upper($params) +{ + if (Smarty::$_MBSTRING) { + return 'mb_strtoupper(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')'; + } + // no MBString fallback + return 'strtoupper(' . $params[0] . ')'; +} diff --git a/libs/smarty/libs/plugins/modifiercompiler.wordwrap.php b/libs/smarty/libs/plugins/modifiercompiler.wordwrap.php @@ -0,0 +1,47 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ + +/** + * Smarty wordwrap modifier plugin + * Type: modifier<br> + * Name: wordwrap<br> + * Purpose: wrap a string of text at a given length + * + * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php wordwrap (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * @param $compiler + * + * @return string with compiled code + */ +function smarty_modifiercompiler_wordwrap($params, $compiler) +{ + if (!isset($params[1])) { + $params[1] = 80; + } + if (!isset($params[2])) { + $params[2] = '"\n"'; + } + if (!isset($params[3])) { + $params[3] = 'false'; + } + $function = 'wordwrap'; + if (Smarty::$_MBSTRING) { + if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) { + $compiler->template->required_plugins['nocache']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'; + $compiler->template->required_plugins['nocache']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap'; + } else { + $compiler->template->required_plugins['compiled']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'; + $compiler->template->required_plugins['compiled']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap'; + } + $function = 'smarty_mb_wordwrap'; + } + + return $function . '(' . $params[0] . ',' . $params[1] . ',' . $params[2] . ',' . $params[3] . ')'; +} diff --git a/libs/smarty/libs/plugins/outputfilter.trimwhitespace.php b/libs/smarty/libs/plugins/outputfilter.trimwhitespace.php @@ -0,0 +1,90 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFilter + */ + +/** + * Smarty trimwhitespace outputfilter plugin + * Trim unnecessary whitespace from HTML markup. + * + * @author Rodney Rehm + * + * @param string $source input string + * + * @return string filtered output + * @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail! + */ +function smarty_outputfilter_trimwhitespace($source) +{ + $store = array(); + $_store = 0; + $_offset = 0; + + // Unify Line-Breaks to \n + $source = preg_replace("/\015\012|\015|\012/", "\n", $source); + + // capture Internet Explorer Conditional Comments + if (preg_match_all('#<!--\[[^\]]+\]>.*?<!\[[^\]]+\]-->#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $store[] = $match[0][0]; + $_length = strlen($match[0][0]); + $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; + $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length); + + $_offset += $_length - strlen($replace); + $_store ++; + } + } + + // Strip all HTML-Comments + // yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124 + $source = preg_replace('#<!--.*?-->#ms', '', $source); + + // capture html elements not to be messed with + $_offset = 0; + if (preg_match_all('#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $store[] = $match[0][0]; + $_length = strlen($match[0][0]); + $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; + $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length); + + $_offset += $_length - strlen($replace); + $_store ++; + } + } + + $expressions = array( + // replace multiple spaces between tags by a single space + // can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements + '#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2', + // remove spaces between attributes (but not in attribute values!) + '#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5', + // note: for some very weird reason trim() seems to remove spaces inside attributes. + // maybe a \0 byte or something is interfering? + '#^\s+<#Ss' => '<', + '#>\s+$#Ss' => '>', + ); + + $source = preg_replace(array_keys($expressions), array_values($expressions), $source); + // note: for some very weird reason trim() seems to remove spaces inside attributes. + // maybe a \0 byte or something is interfering? + // $source = trim( $source ); + + $_offset = 0; + if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $_length = strlen($match[0][0]); + $replace = $store[$match[1][0]]; + $source = substr_replace($source, $replace, $match[0][1] + $_offset, $_length); + + $_offset += strlen($replace) - $_length; + $_store ++; + } + } + + return $source; +} diff --git a/libs/smarty/libs/plugins/shared.escape_special_chars.php b/libs/smarty/libs/plugins/shared.escape_special_chars.php @@ -0,0 +1,53 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +if (version_compare(PHP_VERSION, '5.2.3', '>=')) { + /** + * escape_special_chars common function + * Function: smarty_function_escape_special_chars<br> + * Purpose: used by other smarty functions to escape + * special chars except for already escaped ones + * + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string text that should by escaped + * + * @return string + */ + function smarty_function_escape_special_chars($string) + { + if (!is_array($string)) { + $string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false); + } + + return $string; + } +} else { + /** + * escape_special_chars common function + * Function: smarty_function_escape_special_chars<br> + * Purpose: used by other smarty functions to escape + * special chars except for already escaped ones + * + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string text that should by escaped + * + * @return string + */ + function smarty_function_escape_special_chars($string) + { + if (!is_array($string)) { + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string); + $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + } + + return $string; + } +} diff --git a/libs/smarty/libs/plugins/shared.literal_compiler_param.php b/libs/smarty/libs/plugins/shared.literal_compiler_param.php @@ -0,0 +1,35 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +/** + * evaluate compiler parameter + * + * @param array $params parameter array as given to the compiler function + * @param integer $index array index of the parameter to convert + * @param mixed $default value to be returned if the parameter is not present + * + * @return mixed evaluated value of parameter or $default + * @throws SmartyException if parameter is not a literal (but an expression, variable, …) + * @author Rodney Rehm + */ +function smarty_literal_compiler_param($params, $index, $default = null) +{ + // not set, go default + if (!isset($params[$index])) { + return $default; + } + // test if param is a literal + if (!preg_match('/^([\'"]?)[a-zA-Z0-9-]+(\\1)$/', $params[$index])) { + throw new SmartyException('$param[' . $index . '] is not a literal and is thus not evaluatable at compile time'); + } + + $t = null; + eval("\$t = " . $params[$index] . ";"); + + return $t; +} diff --git a/libs/smarty/libs/plugins/shared.make_timestamp.php b/libs/smarty/libs/plugins/shared.make_timestamp.php @@ -0,0 +1,43 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +/** + * Function: smarty_make_timestamp<br> + * Purpose: used by other smarty functions to make a timestamp from a string. + * + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param DateTime|int|string $string date object, timestamp or string that can be converted using strtotime() + * + * @return int + */ +function smarty_make_timestamp($string) +{ + if (empty($string)) { + // use "now": + return time(); + } elseif ($string instanceof DateTime) { + return $string->getTimestamp(); + } elseif (strlen($string) == 14 && ctype_digit($string)) { + // it is mysql timestamp format of YYYYMMDDHHMMSS? + return mktime(substr($string, 8, 2), substr($string, 10, 2), substr($string, 12, 2), + substr($string, 4, 2), substr($string, 6, 2), substr($string, 0, 4)); + } elseif (is_numeric($string)) { + // it is a numeric string, we handle it as timestamp + return (int) $string; + } else { + // strtotime should handle it + $time = strtotime($string); + if ($time == - 1 || $time === false) { + // strtotime() was not able to parse $string, use "now": + return time(); + } + + return $time; + } +} diff --git a/libs/smarty/libs/plugins/shared.mb_str_replace.php b/libs/smarty/libs/plugins/shared.mb_str_replace.php @@ -0,0 +1,55 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ +if (!function_exists('smarty_mb_str_replace')) { + + /** + * Multibyte string replace + * + * @param string $search the string to be searched + * @param string $replace the replacement string + * @param string $subject the source string + * @param int &$count number of matches found + * + * @return string replaced string + * @author Rodney Rehm + */ + function smarty_mb_str_replace($search, $replace, $subject, &$count = 0) + { + if (!is_array($search) && is_array($replace)) { + return false; + } + if (is_array($subject)) { + // call mb_replace for each single string in $subject + foreach ($subject as &$string) { + $string = & smarty_mb_str_replace($search, $replace, $string, $c); + $count += $c; + } + } elseif (is_array($search)) { + if (!is_array($replace)) { + foreach ($search as &$string) { + $subject = smarty_mb_str_replace($string, $replace, $subject, $c); + $count += $c; + } + } else { + $n = max(count($search), count($replace)); + while ($n --) { + $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c); + $count += $c; + next($search); + next($replace); + } + } + } else { + $parts = mb_split(preg_quote($search), $subject); + $count = count($parts) - 1; + $subject = implode($replace, $parts); + } + + return $subject; + } +} diff --git a/libs/smarty/libs/plugins/shared.mb_unicode.php b/libs/smarty/libs/plugins/shared.mb_unicode.php @@ -0,0 +1,54 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +/** + * convert characters to their decimal unicode equivalents + * + * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration + * + * @param string $string characters to calculate unicode of + * @param string $encoding encoding of $string, if null mb_internal_encoding() is used + * + * @return array sequence of unicodes + * @author Rodney Rehm + */ +function smarty_mb_to_unicode($string, $encoding = null) +{ + if ($encoding) { + $expanded = mb_convert_encoding($string, "UTF-32BE", $encoding); + } else { + $expanded = mb_convert_encoding($string, "UTF-32BE"); + } + + return unpack("N*", $expanded); +} + +/** + * convert unicodes to the character of given encoding + * + * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration + * + * @param integer|array $unicode single unicode or list of unicodes to convert + * @param string $encoding encoding of returned string, if null mb_internal_encoding() is used + * + * @return string unicode as character sequence in given $encoding + * @author Rodney Rehm + */ +function smarty_mb_from_unicode($unicode, $encoding = null) +{ + $t = ''; + if (!$encoding) { + $encoding = mb_internal_encoding(); + } + foreach ((array) $unicode as $utf32be) { + $character = pack("N*", $utf32be); + $t .= mb_convert_encoding($character, $encoding, "UTF-32BE"); + } + + return $t; +} diff --git a/libs/smarty/libs/plugins/shared.mb_wordwrap.php b/libs/smarty/libs/plugins/shared.mb_wordwrap.php @@ -0,0 +1,73 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +if (!function_exists('smarty_mb_wordwrap')) { + + /** + * Wrap a string to a given number of characters + * + * @link http://php.net/manual/en/function.wordwrap.php for similarity + * + * @param string $str the string to wrap + * @param int $width the width of the output + * @param string $break the character used to break the line + * @param boolean $cut ignored parameter, just for the sake of + * + * @return string wrapped string + * @author Rodney Rehm + */ + function smarty_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false) + { + // break words into tokens using white space as a delimiter + $tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, - 1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + $length = 0; + $t = ''; + $_previous = false; + $_space = false; + + foreach ($tokens as $_token) { + $token_length = mb_strlen($_token, Smarty::$_CHARSET); + $_tokens = array($_token); + if ($token_length > $width) { + if ($cut) { + $_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, $_token, - 1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + } + } + + foreach ($_tokens as $token) { + $_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token); + $token_length = mb_strlen($token, Smarty::$_CHARSET); + $length += $token_length; + + if ($length > $width) { + // remove space before inserted break + if ($_previous) { + $t = mb_substr($t, 0, - 1, Smarty::$_CHARSET); + } + + if (!$_space) { + // add the break before the token + if (!empty($t)) { + $t .= $break; + } + $length = $token_length; + } + } elseif ($token == "\n") { + // hard break must reset counters + $_previous = 0; + $length = 0; + } + $_previous = $_space; + // add the token + $t .= $token; + } + } + + return $t; + } +} diff --git a/libs/smarty/libs/plugins/variablefilter.htmlspecialchars.php b/libs/smarty/libs/plugins/variablefilter.htmlspecialchars.php @@ -0,0 +1,19 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFilter + */ + +/** + * Smarty htmlspecialchars variablefilter plugin + * + * @param string $source input string + * + * @return string filtered output + */ +function smarty_variablefilter_htmlspecialchars($source) +{ + return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET); +} diff --git a/libs/smarty/sysplugins/smarty_cacheresource.php b/libs/smarty/libs/sysplugins/smarty_cacheresource.php diff --git a/libs/smarty/sysplugins/smarty_cacheresource_custom.php b/libs/smarty/libs/sysplugins/smarty_cacheresource_custom.php diff --git a/libs/smarty/sysplugins/smarty_cacheresource_keyvaluestore.php b/libs/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php diff --git a/libs/smarty/sysplugins/smarty_data.php b/libs/smarty/libs/sysplugins/smarty_data.php diff --git a/libs/smarty/sysplugins/smarty_internal_cacheresource_file.php b/libs/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_append.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_append.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_assign.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_assign.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_block.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_block.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_break.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_break.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_call.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_call.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_capture.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_capture.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_config_load.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_config_load.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_continue.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_continue.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_debug.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_debug.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_eval.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_eval.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_extends.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_extends.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_for.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_for.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_foreach.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_foreach.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_function.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_function.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_if.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_if.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_include.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_include.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_include_php.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_include_php.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_insert.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_insert.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_ldelim.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_nocache.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_nocache.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_private_block_plugin.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_private_function_plugin.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_private_modifier.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_private_object_block_function.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php diff --git a/libs/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php @@ -0,0 +1,84 @@ +<?php +/** + * Smarty Internal Plugin Compile Object Function + * Compiles code for registered objects as function + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Object Function Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); + + /** + * Compiles code for the execution of function plugin + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter + * @param string $tag name of function + * @param string $method name of method to call + * + * @return string compiled code + */ + public function compile($args, $compiler, $parameter, $tag, $method) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + if ($_attr['nocache'] === true) { + $compiler->tag_nocache = true; + } + unset($_attr['nocache']); + $_assign = null; + if (isset($_attr['assign'])) { + $_assign = $_attr['assign']; + unset($_attr['assign']); + } + // method or property ? + if (method_exists($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) . ')'; + $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params},\$_smarty_tpl)"; + } else { + $_params = implode(",", $_attr); + $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params})"; + } + } else { + // object property + $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}"; + } + + if (empty($_assign)) { + // This tag does create output + $compiler->has_output = true; + $output = "<?php echo {$return};?>\n"; + } else { + $output = "<?php \$_smarty_tpl->assign({$_assign},{$return});?>\n"; + } + + return $output; + } +} diff --git a/libs/smarty/sysplugins/smarty_internal_compile_private_php.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_private_php.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_private_print_expression.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_private_registered_block.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_private_registered_function.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_private_special_variable.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_rdelim.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_section.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_section.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_setfilter.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php diff --git a/libs/smarty/sysplugins/smarty_internal_compile_while.php b/libs/smarty/libs/sysplugins/smarty_internal_compile_while.php diff --git a/libs/smarty/sysplugins/smarty_internal_compilebase.php b/libs/smarty/libs/sysplugins/smarty_internal_compilebase.php diff --git a/libs/smarty/sysplugins/smarty_internal_config_file_compiler.php b/libs/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php diff --git a/libs/smarty/sysplugins/smarty_internal_configfilelexer.php b/libs/smarty/libs/sysplugins/smarty_internal_configfilelexer.php diff --git a/libs/smarty/sysplugins/smarty_internal_configfileparser.php b/libs/smarty/libs/sysplugins/smarty_internal_configfileparser.php diff --git a/libs/smarty/sysplugins/smarty_internal_data.php b/libs/smarty/libs/sysplugins/smarty_internal_data.php diff --git a/libs/smarty/sysplugins/smarty_internal_debug.php b/libs/smarty/libs/sysplugins/smarty_internal_debug.php diff --git a/libs/smarty/libs/sysplugins/smarty_internal_extension_codeframe.php b/libs/smarty/libs/sysplugins/smarty_internal_extension_codeframe.php @@ -0,0 +1,127 @@ +<?php +/** + * Smarty Internal Extension + * This file contains the Smarty template extension to create a code frame + * + * @package Smarty + * @subpackage Template + * @author Uwe Tews + */ + +/** + * Class Smarty_Internal_Extension_CodeFrame + * Create code frame for compiled and cached templates + */ +class Smarty_Internal_Extension_CodeFrame +{ + /** + * Create code frame for compiled and cached templates + * + * @param Smarty_Internal_Template $_template + * @param string $content optional template content + * @param bool $cache flag for cache file + * + * @return string + */ + public static function create(Smarty_Internal_Template $_template, $content = '', $cache = false) + { + // build property code + $_template->properties['has_nocache_code'] = $_template->has_nocache_code || !empty($_template->required_plugins['nocache']); + $_template->properties['version'] = Smarty::SMARTY_VERSION; + if (!isset($_template->properties['unifunc'])) { + $_template->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true)); + } + $properties = $_template->properties; + if (!$cache) { + unset($properties['tpl_function']); + if (!empty($_template->compiler->templateProperties)) { + $properties['tpl_function'] = $_template->compiler->templateProperties['tpl_function']; + } + } + $output = "<?php\n"; + $output .= "/*%%SmartyHeaderCode:{$_template->properties['nocache_hash']}%%*/\n"; + if ($_template->smarty->direct_access_security) { + $output .= "if(!defined('SMARTY_DIR')) exit('no direct access allowed');\n"; + } + $output .= "\$_valid = \$_smarty_tpl->decodeProperties(" . var_export($properties, true) . ',' . ($cache ? 'true' : 'false') . ");\n"; + $output .= "/*/%%SmartyHeaderCode%%*/\n"; + $output .= "if (\$_valid && !is_callable('{$_template->properties['unifunc']}')) {\n"; + $output .= "function {$_template->properties['unifunc']} (\$_smarty_tpl) {\n"; + // include code for plugins + if (!$cache) { + if (!empty($_template->required_plugins['compiled'])) { + foreach ($_template->required_plugins['compiled'] as $tmp) { + foreach ($tmp as $data) { + $file = addslashes($data['file']); + if (is_Array($data['function'])) { + $output .= "if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) require_once '{$file}';\n"; + } else { + $output .= "if (!is_callable('{$data['function']}')) require_once '{$file}';\n"; + } + } + } + } + if (!empty($_template->required_plugins['nocache'])) { + $_template->has_nocache_code = true; + $output .= "echo '/*%%SmartyNocache:{$_template->properties['nocache_hash']}%%*/<?php \$_smarty = \$_smarty_tpl->smarty; "; + foreach ($_template->required_plugins['nocache'] as $tmp) { + foreach ($tmp as $data) { + $file = addslashes($data['file']); + if (is_Array($data['function'])) { + $output .= addslashes("if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) require_once '{$file}';\n"); + } else { + $output .= addslashes("if (!is_callable('{$data['function']}')) require_once '{$file}';\n"); + } + } + } + $output .= "?>/*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%*/';\n"; + } + } + $output .= "?>\n"; + $output = self::appendCode($output, $content); + return self::appendCode($output, "<?php }\n}\n?>"); + } + + /** + * Create code frame of compiled template function + * + * @param \Smarty_Internal_Template $_template + * @param string $content + * + * @return string + */ + public static function createFunctionFrame(Smarty_Internal_Template $_template, $content = '') + { + if (!isset($_template->properties['unifunc'])) { + $_template->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true)); + } + $output = "<?php\n"; + $output .= "/*%%SmartyHeaderCode:{$_template->properties['nocache_hash']}%%*/\n"; + $output .= "if (\$_valid && !is_callable('{$_template->properties['unifunc']}')) {\n"; + $output .= "function {$_template->properties['unifunc']} (\$_smarty_tpl) {\n"; + $output .= "?>\n" . $content; + $output .= "<?php\n"; + $output .= "/*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%*/\n"; + $output .= "}\n}\n?>"; + return $output; + } + + /** + * Append code segments and remove unneeded ?> <?php transitions + * + * @param string $left + * @param string $right + * + * @return string + */ + public static function appendCode($left, $right) + { + if (preg_match('/\s*\?>$/', $left) && preg_match('/^<\?php\s+/', $right)) { + $left = preg_replace('/\s*\?>$/', "\n", $left); + $left .= preg_replace('/^<\?php\s+/', '', $right); + } else { + $left .= $right; + } + return $left; + } +} +\ No newline at end of file diff --git a/libs/smarty/sysplugins/smarty_internal_extension_config.php b/libs/smarty/libs/sysplugins/smarty_internal_extension_config.php diff --git a/libs/smarty/libs/sysplugins/smarty_internal_extension_defaulttemplatehandler.php b/libs/smarty/libs/sysplugins/smarty_internal_extension_defaulttemplatehandler.php @@ -0,0 +1,85 @@ +<?php +/** + * Smarty Resource Extension + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + */ + +/** + * Smarty Resource Extension + * Default template and config file handling + * + * @package Smarty + * @subpackage TemplateResources + */ +class Smarty_Internal_Extension_DefaultTemplateHandler +{ + + /** + * get default content from template of config resource handler + * + * @param Smarty_Internal_Template $_template + * @param Smarty_Internal_Template_Source $source + * @param Smarty_Resource $resObj + */ + static function _getDefault(Smarty_Internal_Template $_template, &$source, &$resObj) + { + if ($source->isConfig) { + $default_handler = $_template->smarty->default_config_handler_func; + } else { + $default_handler = $_template->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); + } + $source->filepath = $_return; + } elseif ($_return === true) { + $source->content = $_content; + $source->timestamp = $_timestamp; + $source->exists = true; + $source->recompiled = true; + $source->filepath = false; + } + } + + /** + * register template default handler + * + * @param Smarty $smarty + * @param mixed $callback + * + * @throws SmartyException + */ + static function registerDefaultTemplateHandler(Smarty $smarty, $callback) + { + if (is_callable($callback)) { + $smarty->default_template_handler_func = $callback; + } else { + throw new SmartyException("Default template handler not callable"); + } + } + + /** + * register config default handler + * + * @param Smarty $smarty + * @param mixed $callback + * + * @throws SmartyException + */ + static function registerDefaultConfigHandler(Smarty $smarty, $callback) + { + if (is_callable($callback)) { + $smarty->default_config_handler_func = $callback; + } else { + throw new SmartyException("Default config handler not callable"); + } + } +} +\ No newline at end of file diff --git a/libs/smarty/sysplugins/smarty_internal_filter_handler.php b/libs/smarty/libs/sysplugins/smarty_internal_filter_handler.php diff --git a/libs/smarty/sysplugins/smarty_internal_function_call_handler.php b/libs/smarty/libs/sysplugins/smarty_internal_function_call_handler.php diff --git a/libs/smarty/sysplugins/smarty_internal_get_include_path.php b/libs/smarty/libs/sysplugins/smarty_internal_get_include_path.php diff --git a/libs/smarty/sysplugins/smarty_internal_nocache_insert.php b/libs/smarty/libs/sysplugins/smarty_internal_nocache_insert.php diff --git a/libs/smarty/sysplugins/smarty_internal_parsetree.php b/libs/smarty/libs/sysplugins/smarty_internal_parsetree.php diff --git a/libs/smarty/sysplugins/smarty_internal_parsetree_code.php b/libs/smarty/libs/sysplugins/smarty_internal_parsetree_code.php diff --git a/libs/smarty/sysplugins/smarty_internal_parsetree_dq.php b/libs/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php diff --git a/libs/smarty/sysplugins/smarty_internal_parsetree_dqcontent.php b/libs/smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php diff --git a/libs/smarty/sysplugins/smarty_internal_parsetree_tag.php b/libs/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php diff --git a/libs/smarty/sysplugins/smarty_internal_parsetree_template.php b/libs/smarty/libs/sysplugins/smarty_internal_parsetree_template.php diff --git a/libs/smarty/sysplugins/smarty_internal_parsetree_text.php b/libs/smarty/libs/sysplugins/smarty_internal_parsetree_text.php diff --git a/libs/smarty/sysplugins/smarty_internal_resource_eval.php b/libs/smarty/libs/sysplugins/smarty_internal_resource_eval.php diff --git a/libs/smarty/sysplugins/smarty_internal_resource_extends.php b/libs/smarty/libs/sysplugins/smarty_internal_resource_extends.php diff --git a/libs/smarty/sysplugins/smarty_internal_resource_file.php b/libs/smarty/libs/sysplugins/smarty_internal_resource_file.php diff --git a/libs/smarty/sysplugins/smarty_internal_resource_php.php b/libs/smarty/libs/sysplugins/smarty_internal_resource_php.php diff --git a/libs/smarty/sysplugins/smarty_internal_resource_registered.php b/libs/smarty/libs/sysplugins/smarty_internal_resource_registered.php diff --git a/libs/smarty/sysplugins/smarty_internal_resource_stream.php b/libs/smarty/libs/sysplugins/smarty_internal_resource_stream.php diff --git a/libs/smarty/sysplugins/smarty_internal_resource_string.php b/libs/smarty/libs/sysplugins/smarty_internal_resource_string.php diff --git a/libs/smarty/sysplugins/smarty_internal_smartytemplatecompiler.php b/libs/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php diff --git a/libs/smarty/sysplugins/smarty_internal_template.php b/libs/smarty/libs/sysplugins/smarty_internal_template.php diff --git a/libs/smarty/sysplugins/smarty_internal_templatebase.php b/libs/smarty/libs/sysplugins/smarty_internal_templatebase.php diff --git a/libs/smarty/sysplugins/smarty_internal_templatecompilerbase.php b/libs/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php diff --git a/libs/smarty/libs/sysplugins/smarty_internal_templatelexer.php b/libs/smarty/libs/sysplugins/smarty_internal_templatelexer.php @@ -0,0 +1,1368 @@ +<?php +/** + * Smarty Internal Plugin Templatelexer + * This is the lexer to break the template source into tokens + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty_Internal_Templatelexer + * This is the template file lexer. + * It is generated from the smarty_internal_templatelexer.plex file + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ +class Smarty_Internal_Templatelexer +{ + /** + * Source + * + * @var string + */ + public $data; + + /** + * byte counter + * + * @var int + */ + public $counter; + + /** + * token number + * + * @var int + */ + public $token; + + /** + * token value + * + * @var string + */ + public $value; + + /** + * current line + * + * @var int + */ + public $line; + + /** + * tag start line + * + * @var + */ + public $taglineno; + + /** + * php code type + * + * @var string + */ + public $phpType = ''; + + /** + * escaped left delimiter + * + * @var string + */ + public $ldel = ''; + + /** + * escaped left delimiter length + * + * @var int + */ + public $ldel_length = 0; + + /** + * escaped right delimiter + * + * @var string + */ + public $rdel = ''; + + /** + * escaped right delimiter length + * + * @var int + */ + public $rdel_length = 0; + + /** + * state number + * + * @var int + */ + public $state = 1; + + /** + * Smarty object + * + * @var Smarty + */ + public $smarty = null; + + /** + * compiler object + * + * @var Smarty_Internal_TemplateCompilerBase + */ + public $compiler = null; + + /** + * literal tag nesting level + * + * @var int + */ + private $literal_cnt = 0; + + /** + * PHP start tag string + * + * @var string + */ + + /** + * trace file + * + * @var resource + */ + public $yyTraceFILE; + + /** + * trace prompt + * + * @var string + */ + public $yyTracePrompt; + + /** + * XML flag true while processing xml + * + * @var bool + */ + public $is_xml = false; + + /** + * state names + * + * @var array + */ + public $state_name = array(1 => 'TEXT', 2 => 'TAG', 3 => 'TAGBODY', 4 => 'LITERAL', 5 => 'DOUBLEQUOTEDSTRING', + 6 => 'CHILDBODY', 7 => 'CHILDBLOCK', 8 => 'CHILDLITERAL'); + + /** + * 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_global_pattern7 = null; + + private $yy_global_pattern8 = null; + + /** + * token names + * + * @var array + */ + public $smarty_token_names = array( // Text for parser error messages + 'NOT' => '(!,not)', 'OPENP' => '(', 'CLOSEP' => ')', 'OPENB' => '[', 'CLOSEB' => ']', 'PTR' => '->', + 'APTR' => '=>', 'EQUAL' => '=', 'NUMBER' => 'number', 'UNIMATH' => '+" , "-', 'MATH' => '*" , "/" , "%', + 'INCDEC' => '++" , "--', 'SPACE' => ' ', 'DOLLAR' => '$', 'SEMICOLON' => ';', 'COLON' => ':', + 'DOUBLECOLON' => '::', 'AT' => '@', 'HATCH' => '#', 'QUOTE' => '"', 'BACKTICK' => '`', 'VERT' => '"|" modifier', + 'DOT' => '.', 'COMMA' => '","', 'QMARK' => '"?"', 'ID' => 'id, name', 'TEXT' => 'text', + 'LDELSLASH' => '{/..} closing tag', 'LDEL' => '{...} Smarty tag', 'COMMENT' => 'comment', 'AS' => 'as', + 'TO' => 'to', 'PHP' => '"<?php", "<%", "{php}" tag', 'LOGOP' => '"<", "==" ... logical operator', + 'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition', + 'SCOND' => '"is even" ... if condition',); + + /** + * constructor + * + * @param string $data template source + * @param Smarty_Internal_TemplateCompilerBase $compiler + */ + function __construct($data, Smarty_Internal_TemplateCompilerBase $compiler) + { + $this->data = $data; + $this->counter = 0; + if (preg_match('~^\xEF\xBB\xBF~i', $this->data, $match)) { + $this->counter += strlen($match[0]); + } + $this->line = 1; + $this->smarty = $compiler->smarty; + $this->compiler = $compiler; + $this->ldel = preg_quote($this->smarty->left_delimiter, '~'); + $this->ldel_length = strlen($this->smarty->left_delimiter); + $this->rdel = preg_quote($this->smarty->right_delimiter, '~'); + $this->rdel_length = strlen($this->smarty->right_delimiter); + $this->smarty_token_names['LDEL'] = $this->smarty->left_delimiter; + $this->smarty_token_names['RDEL'] = $this->smarty->right_delimiter; + } + + public function PrintTrace() + { + $this->yyTraceFILE = fopen('php://output', 'w'); + $this->yyTracePrompt = '<br>'; + } + + /* + * Check if this tag is autoliteral + */ + public function isAutoLiteral() + { + return $this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false; + } + + private $_yy_state = 1; + + private $_yy_stack = array(); + + public function yylex() + { + return $this->{'yylex' . $this->_yy_state}(); + } + + 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); + } + } + + 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); + } + } + + 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 = "/\G([{][}])|\G(" . $this->ldel . "[*])|\G((<[?]((php\\s+|=)|\\s+))|(<[%])|(<[?]xml\\s+)|(<script\\s+language\\s*=\\s*[\"']?\\s*php\\s*[\"']?\\s*>)|([?][>])|([%][>])|(" . $this->ldel . "\\s*php(.*?)" . $this->rdel . ")|(" . $this->ldel . "\\s*[\/]php" . $this->rdel . "))|\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*)|\G(\\s*" . $this->rdel . ")|\G([\S\s])/isS"; + } + if ($this->counter >= strlen($this->data)) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, null, $this->counter)) { + $yysubmatches = $yymatches; + if (strlen($yysubmatches[0]) < 200) { + $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); + } else { + $yymatches = array_filter($yymatches, 'strlen'); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state TEXT'); + } + 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; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= strlen($this->data)) { + 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); + } // end function + + const TEXT = 1; + + function yy_r1_1() + { + + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + function yy_r1_2() + { + + preg_match("~[*]{$this->rdel}~", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); + if (isset($match[0][1])) { + $to = $match[0][1] + strlen($match[0][0]); + } else { + $this->compiler->trigger_template_error("missing or misspelled comment closing tag '*{$this->smarty->right_delimiter}'"); + } + $this->value = substr($this->data, $this->counter, $to - $this->counter); + return false; + } + + function yy_r1_3() + { + + $obj = new Smarty_Internal_Compile_Private_Php(); + $obj->parsePhp($this); + } + + function yy_r1_15() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART; + $this->yypushstate(self::LITERAL); + } + } + + function yy_r1_16() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->yypushstate(self::TAG); + return true; + } + } + + function yy_r1_17() + { + + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + function yy_r1_18() + { + + $to = strlen($this->data); + preg_match("~($this->ldel)|([<]script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*[>])|([<][?])|([<][%])|([?][>])|([%][>])~i", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); + if (isset($match[0][1])) { + $to = $match[0][1]; + } + $this->value = substr($this->data, $this->counter, $to - $this->counter); + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yylex2() + { + if (!isset($this->yy_global_pattern2)) { + $this->yy_global_pattern2 = "/\G(" . $this->ldel . "\\s*(if|elseif|else if|while)\\s+)|\G(" . $this->ldel . "\\s*for\\s+)|\G(" . $this->ldel . "\\s*foreach(?![^\s]))|\G(" . $this->ldel . "\\s*setfilter\\s+)|\G(" . $this->ldel . "\\s*[0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/](?:(?!block)[0-9]*[a-zA-Z_]\\w*)\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[$][0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/])|\G(" . $this->ldel . "\\s*)/isS"; + } + if ($this->counter >= strlen($this->data)) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, null, $this->counter)) { + $yysubmatches = $yymatches; + if (strlen($yysubmatches[0]) < 200) { + $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); + } else { + $yymatches = array_filter($yymatches, 'strlen'); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state TAG'); + } + 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; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= strlen($this->data)) { + 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); + } // end function + + const TAG = 2; + + function yy_r2_1() + { + + $this->token = Smarty_Internal_Templateparser::TP_LDELIF; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + function yy_r2_3() + { + + $this->token = Smarty_Internal_Templateparser::TP_LDELFOR; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + function yy_r2_4() + { + + $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + function yy_r2_5() + { + + $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + function yy_r2_6() + { + + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_SIMPLETAG; + $this->taglineno = $this->line; + } + + function yy_r2_8() + { + + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_CLOSETAG; + $this->taglineno = $this->line; + } + + function yy_r2_9() + { + + if ($this->_yy_stack[count($this->_yy_stack) - 1] == self::TEXT) { + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_SIMPLEOUTPUT; + $this->taglineno = $this->line; + } else { + $this->value = $this->smarty->left_delimiter; + $this->token = Smarty_Internal_Templateparser::TP_LDEL; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + } + + function yy_r2_11() + { + + $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + function yy_r2_12() + { + + $this->token = Smarty_Internal_Templateparser::TP_LDEL; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + public function yylex3() + { + if (!isset($this->yy_global_pattern3)) { + $this->yy_global_pattern3 = "/\G(\\s*" . $this->rdel . ")|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$]smarty\\.block\\.(child|parent))|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*(([!=][=]{1,2})|([<][=>]?)|([>][=]?)|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor|(is\\s+(not\\s+)?(odd|even|div)\\s+by))\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G(([!]\\s*)|(not\\s+))|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|])|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G(" . $this->ldel . "\\s*)|\G([\S\s])/isS"; + } + if ($this->counter >= strlen($this->data)) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, null, $this->counter)) { + $yysubmatches = $yymatches; + if (strlen($yysubmatches[0]) < 200) { + $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); + } else { + $yymatches = array_filter($yymatches, 'strlen'); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state TAGBODY '); + } + 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; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= strlen($this->data)) { + 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); + } // end function + + const TAGBODY = 3; + + function yy_r3_1() + { + + $this->token = Smarty_Internal_Templateparser::TP_RDEL; + $this->yypopstate(); + } + + function yy_r3_2() + { + + $this->token = Smarty_Internal_Templateparser::TP_QUOTE; + $this->yypushstate(self::DOUBLEQUOTEDSTRING); + } + + function yy_r3_3() + { + + $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING; + } + + function yy_r3_4() + { + + $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT; + $this->taglineno = $this->line; + } + + function yy_r3_6() + { + + $this->token = Smarty_Internal_Templateparser::TP_DOLLARID; + } + + function yy_r3_7() + { + + $this->token = Smarty_Internal_Templateparser::TP_DOLLAR; + } + + function yy_r3_8() + { + + $this->token = Smarty_Internal_Templateparser::TP_ISIN; + } + + function yy_r3_9() + { + + $this->token = Smarty_Internal_Templateparser::TP_AS; + } + + function yy_r3_10() + { + + $this->token = Smarty_Internal_Templateparser::TP_TO; + } + + function yy_r3_11() + { + + $this->token = Smarty_Internal_Templateparser::TP_STEP; + } + + function yy_r3_12() + { + + $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF; + } + + function yy_r3_13() + { + + $this->token = Smarty_Internal_Templateparser::TP_LOGOP; + } + + function yy_r3_18() + { + + $this->token = Smarty_Internal_Templateparser::TP_TLOGOP; + } + + function yy_r3_23() + { + + $this->token = Smarty_Internal_Templateparser::TP_SINGLECOND; + } + + function yy_r3_26() + { + + $this->token = Smarty_Internal_Templateparser::TP_NOT; + } + + function yy_r3_29() + { + + $this->token = Smarty_Internal_Templateparser::TP_TYPECAST; + } + + function yy_r3_33() + { + + $this->token = Smarty_Internal_Templateparser::TP_OPENP; + } + + function yy_r3_34() + { + + $this->token = Smarty_Internal_Templateparser::TP_CLOSEP; + } + + function yy_r3_35() + { + + $this->token = Smarty_Internal_Templateparser::TP_OPENB; + } + + function yy_r3_36() + { + + $this->token = Smarty_Internal_Templateparser::TP_CLOSEB; + } + + function yy_r3_37() + { + + $this->token = Smarty_Internal_Templateparser::TP_PTR; + } + + function yy_r3_38() + { + + $this->token = Smarty_Internal_Templateparser::TP_APTR; + } + + function yy_r3_39() + { + + $this->token = Smarty_Internal_Templateparser::TP_EQUAL; + } + + function yy_r3_40() + { + + $this->token = Smarty_Internal_Templateparser::TP_INCDEC; + } + + function yy_r3_42() + { + + $this->token = Smarty_Internal_Templateparser::TP_UNIMATH; + } + + function yy_r3_44() + { + + $this->token = Smarty_Internal_Templateparser::TP_MATH; + } + + function yy_r3_46() + { + + $this->token = Smarty_Internal_Templateparser::TP_AT; + } + + function yy_r3_47() + { + + $this->token = Smarty_Internal_Templateparser::TP_HATCH; + } + + function yy_r3_48() + { + + // resolve conflicts with shorttag and right_delimiter starting with '=' + if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->rdel_length) == $this->smarty->right_delimiter) { + preg_match("~\s+~", $this->value, $match); + $this->value = $match[0]; + $this->token = Smarty_Internal_Templateparser::TP_SPACE; + } else { + $this->token = Smarty_Internal_Templateparser::TP_ATTR; + } + } + + function yy_r3_49() + { + + $this->token = Smarty_Internal_Templateparser::TP_NAMESPACE; + } + + function yy_r3_52() + { + + $this->token = Smarty_Internal_Templateparser::TP_ID; + } + + function yy_r3_53() + { + + $this->token = Smarty_Internal_Templateparser::TP_INTEGER; + } + + function yy_r3_54() + { + + $this->token = Smarty_Internal_Templateparser::TP_BACKTICK; + $this->yypopstate(); + } + + function yy_r3_55() + { + + $this->token = Smarty_Internal_Templateparser::TP_VERT; + } + + function yy_r3_56() + { + + $this->token = Smarty_Internal_Templateparser::TP_DOT; + } + + function yy_r3_57() + { + + $this->token = Smarty_Internal_Templateparser::TP_COMMA; + } + + function yy_r3_58() + { + + $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON; + } + + function yy_r3_59() + { + + $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON; + } + + function yy_r3_60() + { + + $this->token = Smarty_Internal_Templateparser::TP_COLON; + } + + function yy_r3_61() + { + + $this->token = Smarty_Internal_Templateparser::TP_QMARK; + } + + function yy_r3_62() + { + + $this->token = Smarty_Internal_Templateparser::TP_HEX; + } + + function yy_r3_63() + { + + $this->token = Smarty_Internal_Templateparser::TP_SPACE; + } + + function yy_r3_64() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->yypushstate(self::TAG); + return true; + } + } + + function yy_r3_65() + { + + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yylex4() + { + if (!isset($this->yy_global_pattern4)) { + $this->yy_global_pattern4 = "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]literal\\s*" . $this->rdel . ")|\G([\S\s])/isS"; + } + if ($this->counter >= strlen($this->data)) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, null, $this->counter)) { + $yysubmatches = $yymatches; + if (strlen($yysubmatches[0]) < 200) { + $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); + } else { + $yymatches = array_filter($yymatches, 'strlen'); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state LITERAL'); + } + 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; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= strlen($this->data)) { + 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); + } // end function + + const LITERAL = 4; + + function yy_r4_1() + { + + $this->literal_cnt ++; + $this->token = Smarty_Internal_Templateparser::TP_LITERAL; + } + + function yy_r4_2() + { + + if ($this->literal_cnt) { + $this->literal_cnt --; + $this->token = Smarty_Internal_Templateparser::TP_LITERAL; + } else { + $this->token = Smarty_Internal_Templateparser::TP_LITERALEND; + $this->yypopstate(); + } + } + + function yy_r4_3() + { + + $to = strlen($this->data); + preg_match("~{$this->ldel}[/]?literal{$this->rdel}~i", $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_Templateparser::TP_LITERAL; + } + + public function yylex5() + { + if (!isset($this->yy_global_pattern5)) { + $this->yy_global_pattern5 = "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/])|\G(" . $this->ldel . "\\s*[0-9]*[a-zA-Z_]\\w*)|\G(" . $this->ldel . "\\s*)|\G([\"])|\G([`][$])|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=(" . $this->ldel . "|\\$|`\\$|\")))|\G([\S\s])/isS"; + } + if ($this->counter >= strlen($this->data)) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, null, $this->counter)) { + $yysubmatches = $yymatches; + if (strlen($yysubmatches[0]) < 200) { + $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); + } else { + $yymatches = array_filter($yymatches, 'strlen'); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state DOUBLEQUOTEDSTRING'); + } + 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; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= strlen($this->data)) { + 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); + } // end function + + const DOUBLEQUOTEDSTRING = 5; + + function yy_r5_1() + { + + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + function yy_r5_2() + { + + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + function yy_r5_3() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->yypushstate(self::TAG); + return true; + } + } + + function yy_r5_4() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->yypushstate(self::TAG); + return true; + } + } + + function yy_r5_5() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } else { + $this->token = Smarty_Internal_Templateparser::TP_LDEL; + $this->taglineno = $this->line; + $this->yypushstate(self::TAGBODY); + } + } + + function yy_r5_6() + { + + $this->token = Smarty_Internal_Templateparser::TP_QUOTE; + $this->yypopstate(); + } + + function yy_r5_7() + { + + $this->token = Smarty_Internal_Templateparser::TP_BACKTICK; + $this->value = substr($this->value, 0, - 1); + $this->yypushstate(self::TAGBODY); + $this->taglineno = $this->line; + } + + function yy_r5_8() + { + + $this->token = Smarty_Internal_Templateparser::TP_DOLLARID; + } + + function yy_r5_9() + { + + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + function yy_r5_10() + { + + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + function yy_r5_14() + { + + $to = strlen($this->data); + $this->value = substr($this->data, $this->counter, $to - $this->counter); + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yylex6() + { + if (!isset($this->yy_global_pattern6)) { + $this->yy_global_pattern6 = "/\G(" . $this->ldel . "\\s*strip\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]strip\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*block)|\G([\S\s])/isS"; + } + if ($this->counter >= strlen($this->data)) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern6, $this->data, $yymatches, null, $this->counter)) { + $yysubmatches = $yymatches; + if (strlen($yysubmatches[0]) < 200) { + $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); + } else { + $yymatches = array_filter($yymatches, 'strlen'); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state CHILDBODY'); + } + 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; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= strlen($this->data)) { + 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); + } // end function + + const CHILDBODY = 6; + + function yy_r6_1() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + return false; + } else { + $this->token = Smarty_Internal_Templateparser::TP_STRIPON; + } + } + + function yy_r6_2() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + return false; + } else { + $this->token = Smarty_Internal_Templateparser::TP_STRIPOFF; + } + } + + function yy_r6_3() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + return false; + } else { + $this->yypopstate(); + return true; + } + } + + function yy_r6_4() + { + + $to = strlen($this->data); + preg_match("~" . $this->ldel . "\s*(([/])?strip\s*" . $this->rdel . "|block\s+)~i", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); + if (isset($match[0][1])) { + $to = $match[0][1]; + } + $this->value = substr($this->data, $this->counter, $to - $this->counter); + return false; + } + + public function yylex7() + { + if (!isset($this->yy_global_pattern7)) { + $this->yy_global_pattern7 = "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*block)|\G(" . $this->ldel . "\\s*[\/]block)|\G(" . $this->ldel . "\\s*[$]smarty\\.block\\.(child|parent))|\G([\S\s])/isS"; + } + if ($this->counter >= strlen($this->data)) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern7, $this->data, $yymatches, null, $this->counter)) { + $yysubmatches = $yymatches; + if (strlen($yysubmatches[0]) < 200) { + $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); + } else { + $yymatches = array_filter($yymatches, 'strlen'); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state CHILDBLOCK'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r7_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= strlen($this->data)) { + 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); + } // end function + + const CHILDBLOCK = 7; + + function yy_r7_1() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + $this->yypushstate(self::CHILDLITERAL); + } + } + + function yy_r7_2() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->yypopstate(); + return true; + } + } + + function yy_r7_3() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->yypopstate(); + return true; + } + } + + function yy_r7_4() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->yypopstate(); + return true; + } + } + + function yy_r7_6() + { + + $to = strlen($this->data); + preg_match("~" . $this->ldel . "\s*(literal\s*" . $this->rdel . "|([/])?block(\s|" . $this->rdel . ")|[\$]smarty\.block\.(child|parent))~i", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); + if (isset($match[0][1])) { + $to = $match[0][1]; + } + $this->value = substr($this->data, $this->counter, $to - $this->counter); + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } + + public function yylex8() + { + if (!isset($this->yy_global_pattern8)) { + $this->yy_global_pattern8 = "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]literal\\s*" . $this->rdel . ")|\G([\S\s])/isS"; + } + if ($this->counter >= strlen($this->data)) { + return false; // end of input + } + + do { + if (preg_match($this->yy_global_pattern8, $this->data, $yymatches, null, $this->counter)) { + $yysubmatches = $yymatches; + if (strlen($yysubmatches[0]) < 200) { + $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); + } else { + $yymatches = array_filter($yymatches, 'strlen'); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state CHILDLITERAL'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r8_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= strlen($this->data)) { + 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); + } // end function + + const CHILDLITERAL = 8; + + function yy_r8_1() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + $this->yypushstate(self::CHILDLITERAL); + } + } + + function yy_r8_2() + { + + if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + } else { + $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; + $this->yypopstate(); + } + } + + function yy_r8_3() + { + + $to = strlen($this->data); + preg_match("~{$this->ldel}[/]?literal\s*{$this->rdel}~i", $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_Templateparser::TP_BLOCKSOURCE; + } + +} + + +\ No newline at end of file diff --git a/libs/smarty/sysplugins/smarty_internal_templateparser.php b/libs/smarty/libs/sysplugins/smarty_internal_templateparser.php diff --git a/libs/smarty/sysplugins/smarty_internal_testinstall.php b/libs/smarty/libs/sysplugins/smarty_internal_testinstall.php diff --git a/libs/smarty/sysplugins/smarty_internal_utility.php b/libs/smarty/libs/sysplugins/smarty_internal_utility.php diff --git a/libs/smarty/sysplugins/smarty_internal_write_file.php b/libs/smarty/libs/sysplugins/smarty_internal_write_file.php diff --git a/libs/smarty/sysplugins/smarty_resource.php b/libs/smarty/libs/sysplugins/smarty_resource.php diff --git a/libs/smarty/sysplugins/smarty_resource_custom.php b/libs/smarty/libs/sysplugins/smarty_resource_custom.php diff --git a/libs/smarty/sysplugins/smarty_resource_recompiled.php b/libs/smarty/libs/sysplugins/smarty_resource_recompiled.php diff --git a/libs/smarty/sysplugins/smarty_resource_uncompiled.php b/libs/smarty/libs/sysplugins/smarty_resource_uncompiled.php diff --git a/libs/smarty/sysplugins/smarty_security.php b/libs/smarty/libs/sysplugins/smarty_security.php diff --git a/libs/smarty/sysplugins/smarty_template_cached.php b/libs/smarty/libs/sysplugins/smarty_template_cached.php diff --git a/libs/smarty/sysplugins/smarty_template_compiled.php b/libs/smarty/libs/sysplugins/smarty_template_compiled.php diff --git a/libs/smarty/sysplugins/smarty_template_config.php b/libs/smarty/libs/sysplugins/smarty_template_config.php diff --git a/libs/smarty/sysplugins/smarty_template_source.php b/libs/smarty/libs/sysplugins/smarty_template_source.php diff --git a/libs/smarty/sysplugins/smarty_undefined_variable.php b/libs/smarty/libs/sysplugins/smarty_undefined_variable.php diff --git a/libs/smarty/sysplugins/smarty_variable.php b/libs/smarty/libs/sysplugins/smarty_variable.php diff --git a/libs/smarty/sysplugins/smartycompilerexception.php b/libs/smarty/libs/sysplugins/smartycompilerexception.php diff --git a/libs/smarty/sysplugins/smartyexception.php b/libs/smarty/libs/sysplugins/smartyexception.php diff --git a/libs/smarty/sysplugins/smarty_internal_extension_codeframe.php b/libs/smarty/sysplugins/smarty_internal_extension_codeframe.php @@ -1,127 +0,0 @@ -<?php -/** - * Smarty Internal Extension - * This file contains the Smarty template extension to create a code frame - * - * @package Smarty - * @subpackage Template - * @author Uwe Tews - */ - -/** - * Class Smarty_Internal_Extension_CodeFrame - * Create code frame for compiled and cached templates - */ -class Smarty_Internal_Extension_CodeFrame -{ - /** - * Create code frame for compiled and cached templates - * - * @param Smarty_Internal_Template $_template - * @param string $content optional template content - * @param bool $cache flag for cache file - * - * @return string - */ - public static function create(Smarty_Internal_Template $_template, $content = '', $cache = false) - { - // build property code - $_template->properties['has_nocache_code'] = $_template->has_nocache_code || !empty($_template->required_plugins['nocache']); - $_template->properties['version'] = Smarty::SMARTY_VERSION; - if (!isset($_template->properties['unifunc'])) { - $_template->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true)); - } - $properties = $_template->properties; - if (!$cache) { - unset($properties['tpl_function']); - if (!empty($_template->compiler->templateProperties)) { - $properties['tpl_function'] = $_template->compiler->templateProperties['tpl_function']; - } - } - $output = "<?php\n"; - $output .= "/*%%SmartyHeaderCode:{$_template->properties['nocache_hash']}%%*/\n"; - if ($_template->smarty->direct_access_security) { - $output .= "if(!defined('SMARTY_DIR')) exit('no direct access allowed');\n"; - } - $output .= "\$_valid = \$_smarty_tpl->decodeProperties(" . var_export($properties, true) . ',' . ($cache ? 'true' : 'false') . ");\n"; - $output .= "/*/%%SmartyHeaderCode%%*/\n"; - $output .= "if (\$_valid && !is_callable('{$_template->properties['unifunc']}')) {\n"; - $output .= "function {$_template->properties['unifunc']} (\$_smarty_tpl) {\n"; - // include code for plugins - if (!$cache) { - if (!empty($_template->required_plugins['compiled'])) { - foreach ($_template->required_plugins['compiled'] as $tmp) { - foreach ($tmp as $data) { - $file = addslashes($data['file']); - if (is_Array($data['function'])) { - $output .= "if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) require_once '{$file}';\n"; - } else { - $output .= "if (!is_callable('{$data['function']}')) require_once '{$file}';\n"; - } - } - } - } - if (!empty($_template->required_plugins['nocache'])) { - $_template->has_nocache_code = true; - $output .= "echo '/*%%SmartyNocache:{$_template->properties['nocache_hash']}%%*/<?php \$_smarty = \$_smarty_tpl->smarty; "; - foreach ($_template->required_plugins['nocache'] as $tmp) { - foreach ($tmp as $data) { - $file = addslashes($data['file']); - if (is_Array($data['function'])) { - $output .= addslashes("if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) require_once '{$file}';\n"); - } else { - $output .= addslashes("if (!is_callable('{$data['function']}')) require_once '{$file}';\n"); - } - } - } - $output .= "?>/*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%*/';\n"; - } - } - $output .= "?>\n"; - $output = self::appendCode($output, $content); - return self::appendCode($output, "<?php }\n}\n?>"); - } - - /** - * Create code frame of compiled template function - * - * @param \Smarty_Internal_Template $_template - * @param string $content - * - * @return string - */ - public static function createFunctionFrame(Smarty_Internal_Template $_template, $content = '') - { - if (!isset($_template->properties['unifunc'])) { - $_template->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true)); - } - $output = "<?php\n"; - $output .= "/*%%SmartyHeaderCode:{$_template->properties['nocache_hash']}%%*/\n"; - $output .= "if (\$_valid && !is_callable('{$_template->properties['unifunc']}')) {\n"; - $output .= "function {$_template->properties['unifunc']} (\$_smarty_tpl) {\n"; - $output .= "?>\n" . $content; - $output .= "<?php\n"; - $output .= "/*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%*/\n"; - $output .= "}\n}\n?>"; - return $output; - } - - /** - * Append code segments and remove unneeded ?> <?php transitions - * - * @param string $left - * @param string $right - * - * @return string - */ - public static function appendCode($left, $right) - { - if (preg_match('/\s*\?>$/', $left) && preg_match('/^<\?php\s+/', $right)) { - $left = preg_replace('/\s*\?>$/', "\n", $left); - $left .= preg_replace('/^<\?php\s+/', '', $right); - } else { - $left .= $right; - } - return $left; - } -} diff --git a/libs/smarty/sysplugins/smarty_internal_extension_defaulttemplatehandler.php b/libs/smarty/sysplugins/smarty_internal_extension_defaulttemplatehandler.php @@ -1,85 +0,0 @@ -<?php -/** - * Smarty Resource Extension - * - * @package Smarty - * @subpackage TemplateResources - * @author Uwe Tews - */ - -/** - * Smarty Resource Extension - * Default template and config file handling - * - * @package Smarty - * @subpackage TemplateResources - */ -class Smarty_Internal_Extension_DefaultTemplateHandler -{ - - /** - * get default content from template of config resource handler - * - * @param Smarty_Internal_Template $_template - * @param Smarty_Internal_Template_Source $source - * @param Smarty_Resource $resObj - */ - static function _getDefault(Smarty_Internal_Template $_template, &$source, &$resObj) - { - if ($source->isConfig) { - $default_handler = $_template->smarty->default_config_handler_func; - } else { - $default_handler = $_template->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); - } - $source->filepath = $_return; - } elseif ($_return === true) { - $source->content = $_content; - $source->timestamp = $_timestamp; - $source->exists = true; - $source->recompiled = true; - $source->filepath = false; - } - } - - /** - * register template default handler - * - * @param Smarty $smarty - * @param mixed $callback - * - * @throws SmartyException - */ - static function registerDefaultTemplateHandler(Smarty $smarty, $callback) - { - if (is_callable($callback)) { - $smarty->default_template_handler_func = $callback; - } else { - throw new SmartyException("Default template handler not callable"); - } - } - - /** - * register config default handler - * - * @param Smarty $smarty - * @param mixed $callback - * - * @throws SmartyException - */ - static function registerDefaultConfigHandler(Smarty $smarty, $callback) - { - if (is_callable($callback)) { - $smarty->default_config_handler_func = $callback; - } else { - throw new SmartyException("Default config handler not callable"); - } - } -} diff --git a/libs/smarty/sysplugins/smarty_internal_templatelexer.php b/libs/smarty/sysplugins/smarty_internal_templatelexer.php @@ -1,1368 +0,0 @@ -<?php -/** - * Smarty Internal Plugin Templatelexer - * This is the lexer to break the template source into tokens - * - * @package Smarty - * @subpackage Compiler - * @author Uwe Tews - */ - -/** - * Smarty_Internal_Templatelexer - * This is the template file lexer. - * It is generated from the smarty_internal_templatelexer.plex file - * - * @package Smarty - * @subpackage Compiler - * @author Uwe Tews - */ -class Smarty_Internal_Templatelexer -{ - /** - * Source - * - * @var string - */ - public $data; - - /** - * byte counter - * - * @var int - */ - public $counter; - - /** - * token number - * - * @var int - */ - public $token; - - /** - * token value - * - * @var string - */ - public $value; - - /** - * current line - * - * @var int - */ - public $line; - - /** - * tag start line - * - * @var - */ - public $taglineno; - - /** - * php code type - * - * @var string - */ - public $phpType = ''; - - /** - * escaped left delimiter - * - * @var string - */ - public $ldel = ''; - - /** - * escaped left delimiter length - * - * @var int - */ - public $ldel_length = 0; - - /** - * escaped right delimiter - * - * @var string - */ - public $rdel = ''; - - /** - * escaped right delimiter length - * - * @var int - */ - public $rdel_length = 0; - - /** - * state number - * - * @var int - */ - public $state = 1; - - /** - * Smarty object - * - * @var Smarty - */ - public $smarty = null; - - /** - * compiler object - * - * @var Smarty_Internal_TemplateCompilerBase - */ - public $compiler = null; - - /** - * literal tag nesting level - * - * @var int - */ - private $literal_cnt = 0; - - /** - * PHP start tag string - * - * @var string - */ - - /** - * trace file - * - * @var resource - */ - public $yyTraceFILE; - - /** - * trace prompt - * - * @var string - */ - public $yyTracePrompt; - - /** - * XML flag true while processing xml - * - * @var bool - */ - public $is_xml = false; - - /** - * state names - * - * @var array - */ - public $state_name = array(1 => 'TEXT', 2 => 'TAG', 3 => 'TAGBODY', 4 => 'LITERAL', 5 => 'DOUBLEQUOTEDSTRING', - 6 => 'CHILDBODY', 7 => 'CHILDBLOCK', 8 => 'CHILDLITERAL'); - - /** - * 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_global_pattern7 = null; - - private $yy_global_pattern8 = null; - - /** - * token names - * - * @var array - */ - public $smarty_token_names = array( // Text for parser error messages - 'NOT' => '(!,not)', 'OPENP' => '(', 'CLOSEP' => ')', 'OPENB' => '[', 'CLOSEB' => ']', 'PTR' => '->', - 'APTR' => '=>', 'EQUAL' => '=', 'NUMBER' => 'number', 'UNIMATH' => '+" , "-', 'MATH' => '*" , "/" , "%', - 'INCDEC' => '++" , "--', 'SPACE' => ' ', 'DOLLAR' => '$', 'SEMICOLON' => ';', 'COLON' => ':', - 'DOUBLECOLON' => '::', 'AT' => '@', 'HATCH' => '#', 'QUOTE' => '"', 'BACKTICK' => '`', 'VERT' => '"|" modifier', - 'DOT' => '.', 'COMMA' => '","', 'QMARK' => '"?"', 'ID' => 'id, name', 'TEXT' => 'text', - 'LDELSLASH' => '{/..} closing tag', 'LDEL' => '{...} Smarty tag', 'COMMENT' => 'comment', 'AS' => 'as', - 'TO' => 'to', 'PHP' => '"<?php", "<%", "{php}" tag', 'LOGOP' => '"<", "==" ... logical operator', - 'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition', - 'SCOND' => '"is even" ... if condition',); - - /** - * constructor - * - * @param string $data template source - * @param Smarty_Internal_TemplateCompilerBase $compiler - */ - function __construct($data, Smarty_Internal_TemplateCompilerBase $compiler) - { - $this->data = $data; - $this->counter = 0; - if (preg_match('~^\xEF\xBB\xBF~i', $this->data, $match)) { - $this->counter += strlen($match[0]); - } - $this->line = 1; - $this->smarty = $compiler->smarty; - $this->compiler = $compiler; - $this->ldel = preg_quote($this->smarty->left_delimiter, '~'); - $this->ldel_length = strlen($this->smarty->left_delimiter); - $this->rdel = preg_quote($this->smarty->right_delimiter, '~'); - $this->rdel_length = strlen($this->smarty->right_delimiter); - $this->smarty_token_names['LDEL'] = $this->smarty->left_delimiter; - $this->smarty_token_names['RDEL'] = $this->smarty->right_delimiter; - } - - public function PrintTrace() - { - $this->yyTraceFILE = fopen('php://output', 'w'); - $this->yyTracePrompt = '<br>'; - } - - /* - * Check if this tag is autoliteral - */ - public function isAutoLiteral() - { - return $this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false; - } - - private $_yy_state = 1; - - private $_yy_stack = array(); - - public function yylex() - { - return $this->{'yylex' . $this->_yy_state}(); - } - - 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); - } - } - - 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); - } - } - - 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 = "/\G([{][}])|\G(" . $this->ldel . "[*])|\G((<[?]((php\\s+|=)|\\s+))|(<[%])|(<[?]xml\\s+)|(<script\\s+language\\s*=\\s*[\"']?\\s*php\\s*[\"']?\\s*>)|([?][>])|([%][>])|(" . $this->ldel . "\\s*php(.*?)" . $this->rdel . ")|(" . $this->ldel . "\\s*[\/]php" . $this->rdel . "))|\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*)|\G(\\s*" . $this->rdel . ")|\G([\S\s])/isS"; - } - if ($this->counter >= strlen($this->data)) { - return false; // end of input - } - - do { - if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, null, $this->counter)) { - $yysubmatches = $yymatches; - if (strlen($yysubmatches[0]) < 200) { - $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); - } else { - $yymatches = array_filter($yymatches, 'strlen'); - } - if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state TEXT'); - } - 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; - } elseif ($r === true) { - // we have changed state - // process this token in the new state - return $this->yylex(); - } elseif ($r === false) { - $this->counter += strlen($this->value); - $this->line += substr_count($this->value, "\n"); - if ($this->counter >= strlen($this->data)) { - 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); - } // end function - - const TEXT = 1; - - function yy_r1_1() - { - - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } - - function yy_r1_2() - { - - preg_match("~[*]{$this->rdel}~", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); - if (isset($match[0][1])) { - $to = $match[0][1] + strlen($match[0][0]); - } else { - $this->compiler->trigger_template_error("missing or misspelled comment closing tag '*{$this->smarty->right_delimiter}'"); - } - $this->value = substr($this->data, $this->counter, $to - $this->counter); - return false; - } - - function yy_r1_3() - { - - $obj = new Smarty_Internal_Compile_Private_Php(); - $obj->parsePhp($this); - } - - function yy_r1_15() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART; - $this->yypushstate(self::LITERAL); - } - } - - function yy_r1_16() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->yypushstate(self::TAG); - return true; - } - } - - function yy_r1_17() - { - - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } - - function yy_r1_18() - { - - $to = strlen($this->data); - preg_match("~($this->ldel)|([<]script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*[>])|([<][?])|([<][%])|([?][>])|([%][>])~i", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); - if (isset($match[0][1])) { - $to = $match[0][1]; - } - $this->value = substr($this->data, $this->counter, $to - $this->counter); - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } - - public function yylex2() - { - if (!isset($this->yy_global_pattern2)) { - $this->yy_global_pattern2 = "/\G(" . $this->ldel . "\\s*(if|elseif|else if|while)\\s+)|\G(" . $this->ldel . "\\s*for\\s+)|\G(" . $this->ldel . "\\s*foreach(?![^\s]))|\G(" . $this->ldel . "\\s*setfilter\\s+)|\G(" . $this->ldel . "\\s*[0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/](?:(?!block)[0-9]*[a-zA-Z_]\\w*)\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[$][0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/])|\G(" . $this->ldel . "\\s*)/isS"; - } - if ($this->counter >= strlen($this->data)) { - return false; // end of input - } - - do { - if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, null, $this->counter)) { - $yysubmatches = $yymatches; - if (strlen($yysubmatches[0]) < 200) { - $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); - } else { - $yymatches = array_filter($yymatches, 'strlen'); - } - if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state TAG'); - } - 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; - } elseif ($r === true) { - // we have changed state - // process this token in the new state - return $this->yylex(); - } elseif ($r === false) { - $this->counter += strlen($this->value); - $this->line += substr_count($this->value, "\n"); - if ($this->counter >= strlen($this->data)) { - 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); - } // end function - - const TAG = 2; - - function yy_r2_1() - { - - $this->token = Smarty_Internal_Templateparser::TP_LDELIF; - $this->yybegin(self::TAGBODY); - $this->taglineno = $this->line; - } - - function yy_r2_3() - { - - $this->token = Smarty_Internal_Templateparser::TP_LDELFOR; - $this->yybegin(self::TAGBODY); - $this->taglineno = $this->line; - } - - function yy_r2_4() - { - - $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH; - $this->yybegin(self::TAGBODY); - $this->taglineno = $this->line; - } - - function yy_r2_5() - { - - $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER; - $this->yybegin(self::TAGBODY); - $this->taglineno = $this->line; - } - - function yy_r2_6() - { - - $this->yypopstate(); - $this->token = Smarty_Internal_Templateparser::TP_SIMPLETAG; - $this->taglineno = $this->line; - } - - function yy_r2_8() - { - - $this->yypopstate(); - $this->token = Smarty_Internal_Templateparser::TP_CLOSETAG; - $this->taglineno = $this->line; - } - - function yy_r2_9() - { - - if ($this->_yy_stack[count($this->_yy_stack) - 1] == self::TEXT) { - $this->yypopstate(); - $this->token = Smarty_Internal_Templateparser::TP_SIMPLEOUTPUT; - $this->taglineno = $this->line; - } else { - $this->value = $this->smarty->left_delimiter; - $this->token = Smarty_Internal_Templateparser::TP_LDEL; - $this->yybegin(self::TAGBODY); - $this->taglineno = $this->line; - } - } - - function yy_r2_11() - { - - $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH; - $this->yybegin(self::TAGBODY); - $this->taglineno = $this->line; - } - - function yy_r2_12() - { - - $this->token = Smarty_Internal_Templateparser::TP_LDEL; - $this->yybegin(self::TAGBODY); - $this->taglineno = $this->line; - } - - public function yylex3() - { - if (!isset($this->yy_global_pattern3)) { - $this->yy_global_pattern3 = "/\G(\\s*" . $this->rdel . ")|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$]smarty\\.block\\.(child|parent))|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*(([!=][=]{1,2})|([<][=>]?)|([>][=]?)|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor|(is\\s+(not\\s+)?(odd|even|div)\\s+by))\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G(([!]\\s*)|(not\\s+))|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|])|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G(" . $this->ldel . "\\s*)|\G([\S\s])/isS"; - } - if ($this->counter >= strlen($this->data)) { - return false; // end of input - } - - do { - if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, null, $this->counter)) { - $yysubmatches = $yymatches; - if (strlen($yysubmatches[0]) < 200) { - $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); - } else { - $yymatches = array_filter($yymatches, 'strlen'); - } - if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state TAGBODY '); - } - 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; - } elseif ($r === true) { - // we have changed state - // process this token in the new state - return $this->yylex(); - } elseif ($r === false) { - $this->counter += strlen($this->value); - $this->line += substr_count($this->value, "\n"); - if ($this->counter >= strlen($this->data)) { - 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); - } // end function - - const TAGBODY = 3; - - function yy_r3_1() - { - - $this->token = Smarty_Internal_Templateparser::TP_RDEL; - $this->yypopstate(); - } - - function yy_r3_2() - { - - $this->token = Smarty_Internal_Templateparser::TP_QUOTE; - $this->yypushstate(self::DOUBLEQUOTEDSTRING); - } - - function yy_r3_3() - { - - $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING; - } - - function yy_r3_4() - { - - $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT; - $this->taglineno = $this->line; - } - - function yy_r3_6() - { - - $this->token = Smarty_Internal_Templateparser::TP_DOLLARID; - } - - function yy_r3_7() - { - - $this->token = Smarty_Internal_Templateparser::TP_DOLLAR; - } - - function yy_r3_8() - { - - $this->token = Smarty_Internal_Templateparser::TP_ISIN; - } - - function yy_r3_9() - { - - $this->token = Smarty_Internal_Templateparser::TP_AS; - } - - function yy_r3_10() - { - - $this->token = Smarty_Internal_Templateparser::TP_TO; - } - - function yy_r3_11() - { - - $this->token = Smarty_Internal_Templateparser::TP_STEP; - } - - function yy_r3_12() - { - - $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF; - } - - function yy_r3_13() - { - - $this->token = Smarty_Internal_Templateparser::TP_LOGOP; - } - - function yy_r3_18() - { - - $this->token = Smarty_Internal_Templateparser::TP_TLOGOP; - } - - function yy_r3_23() - { - - $this->token = Smarty_Internal_Templateparser::TP_SINGLECOND; - } - - function yy_r3_26() - { - - $this->token = Smarty_Internal_Templateparser::TP_NOT; - } - - function yy_r3_29() - { - - $this->token = Smarty_Internal_Templateparser::TP_TYPECAST; - } - - function yy_r3_33() - { - - $this->token = Smarty_Internal_Templateparser::TP_OPENP; - } - - function yy_r3_34() - { - - $this->token = Smarty_Internal_Templateparser::TP_CLOSEP; - } - - function yy_r3_35() - { - - $this->token = Smarty_Internal_Templateparser::TP_OPENB; - } - - function yy_r3_36() - { - - $this->token = Smarty_Internal_Templateparser::TP_CLOSEB; - } - - function yy_r3_37() - { - - $this->token = Smarty_Internal_Templateparser::TP_PTR; - } - - function yy_r3_38() - { - - $this->token = Smarty_Internal_Templateparser::TP_APTR; - } - - function yy_r3_39() - { - - $this->token = Smarty_Internal_Templateparser::TP_EQUAL; - } - - function yy_r3_40() - { - - $this->token = Smarty_Internal_Templateparser::TP_INCDEC; - } - - function yy_r3_42() - { - - $this->token = Smarty_Internal_Templateparser::TP_UNIMATH; - } - - function yy_r3_44() - { - - $this->token = Smarty_Internal_Templateparser::TP_MATH; - } - - function yy_r3_46() - { - - $this->token = Smarty_Internal_Templateparser::TP_AT; - } - - function yy_r3_47() - { - - $this->token = Smarty_Internal_Templateparser::TP_HATCH; - } - - function yy_r3_48() - { - - // resolve conflicts with shorttag and right_delimiter starting with '=' - if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->rdel_length) == $this->smarty->right_delimiter) { - preg_match("~\s+~", $this->value, $match); - $this->value = $match[0]; - $this->token = Smarty_Internal_Templateparser::TP_SPACE; - } else { - $this->token = Smarty_Internal_Templateparser::TP_ATTR; - } - } - - function yy_r3_49() - { - - $this->token = Smarty_Internal_Templateparser::TP_NAMESPACE; - } - - function yy_r3_52() - { - - $this->token = Smarty_Internal_Templateparser::TP_ID; - } - - function yy_r3_53() - { - - $this->token = Smarty_Internal_Templateparser::TP_INTEGER; - } - - function yy_r3_54() - { - - $this->token = Smarty_Internal_Templateparser::TP_BACKTICK; - $this->yypopstate(); - } - - function yy_r3_55() - { - - $this->token = Smarty_Internal_Templateparser::TP_VERT; - } - - function yy_r3_56() - { - - $this->token = Smarty_Internal_Templateparser::TP_DOT; - } - - function yy_r3_57() - { - - $this->token = Smarty_Internal_Templateparser::TP_COMMA; - } - - function yy_r3_58() - { - - $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON; - } - - function yy_r3_59() - { - - $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON; - } - - function yy_r3_60() - { - - $this->token = Smarty_Internal_Templateparser::TP_COLON; - } - - function yy_r3_61() - { - - $this->token = Smarty_Internal_Templateparser::TP_QMARK; - } - - function yy_r3_62() - { - - $this->token = Smarty_Internal_Templateparser::TP_HEX; - } - - function yy_r3_63() - { - - $this->token = Smarty_Internal_Templateparser::TP_SPACE; - } - - function yy_r3_64() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->yypushstate(self::TAG); - return true; - } - } - - function yy_r3_65() - { - - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } - - public function yylex4() - { - if (!isset($this->yy_global_pattern4)) { - $this->yy_global_pattern4 = "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]literal\\s*" . $this->rdel . ")|\G([\S\s])/isS"; - } - if ($this->counter >= strlen($this->data)) { - return false; // end of input - } - - do { - if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, null, $this->counter)) { - $yysubmatches = $yymatches; - if (strlen($yysubmatches[0]) < 200) { - $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); - } else { - $yymatches = array_filter($yymatches, 'strlen'); - } - if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state LITERAL'); - } - 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; - } elseif ($r === true) { - // we have changed state - // process this token in the new state - return $this->yylex(); - } elseif ($r === false) { - $this->counter += strlen($this->value); - $this->line += substr_count($this->value, "\n"); - if ($this->counter >= strlen($this->data)) { - 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); - } // end function - - const LITERAL = 4; - - function yy_r4_1() - { - - $this->literal_cnt ++; - $this->token = Smarty_Internal_Templateparser::TP_LITERAL; - } - - function yy_r4_2() - { - - if ($this->literal_cnt) { - $this->literal_cnt --; - $this->token = Smarty_Internal_Templateparser::TP_LITERAL; - } else { - $this->token = Smarty_Internal_Templateparser::TP_LITERALEND; - $this->yypopstate(); - } - } - - function yy_r4_3() - { - - $to = strlen($this->data); - preg_match("~{$this->ldel}[/]?literal{$this->rdel}~i", $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_Templateparser::TP_LITERAL; - } - - public function yylex5() - { - if (!isset($this->yy_global_pattern5)) { - $this->yy_global_pattern5 = "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/])|\G(" . $this->ldel . "\\s*[0-9]*[a-zA-Z_]\\w*)|\G(" . $this->ldel . "\\s*)|\G([\"])|\G([`][$])|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=(" . $this->ldel . "|\\$|`\\$|\")))|\G([\S\s])/isS"; - } - if ($this->counter >= strlen($this->data)) { - return false; // end of input - } - - do { - if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, null, $this->counter)) { - $yysubmatches = $yymatches; - if (strlen($yysubmatches[0]) < 200) { - $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); - } else { - $yymatches = array_filter($yymatches, 'strlen'); - } - if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state DOUBLEQUOTEDSTRING'); - } - 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; - } elseif ($r === true) { - // we have changed state - // process this token in the new state - return $this->yylex(); - } elseif ($r === false) { - $this->counter += strlen($this->value); - $this->line += substr_count($this->value, "\n"); - if ($this->counter >= strlen($this->data)) { - 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); - } // end function - - const DOUBLEQUOTEDSTRING = 5; - - function yy_r5_1() - { - - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } - - function yy_r5_2() - { - - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } - - function yy_r5_3() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->yypushstate(self::TAG); - return true; - } - } - - function yy_r5_4() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->yypushstate(self::TAG); - return true; - } - } - - function yy_r5_5() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->token = Smarty_Internal_Templateparser::TP_LDEL; - $this->taglineno = $this->line; - $this->yypushstate(self::TAGBODY); - } - } - - function yy_r5_6() - { - - $this->token = Smarty_Internal_Templateparser::TP_QUOTE; - $this->yypopstate(); - } - - function yy_r5_7() - { - - $this->token = Smarty_Internal_Templateparser::TP_BACKTICK; - $this->value = substr($this->value, 0, - 1); - $this->yypushstate(self::TAGBODY); - $this->taglineno = $this->line; - } - - function yy_r5_8() - { - - $this->token = Smarty_Internal_Templateparser::TP_DOLLARID; - } - - function yy_r5_9() - { - - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } - - function yy_r5_10() - { - - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } - - function yy_r5_14() - { - - $to = strlen($this->data); - $this->value = substr($this->data, $this->counter, $to - $this->counter); - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } - - public function yylex6() - { - if (!isset($this->yy_global_pattern6)) { - $this->yy_global_pattern6 = "/\G(" . $this->ldel . "\\s*strip\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]strip\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*block)|\G([\S\s])/isS"; - } - if ($this->counter >= strlen($this->data)) { - return false; // end of input - } - - do { - if (preg_match($this->yy_global_pattern6, $this->data, $yymatches, null, $this->counter)) { - $yysubmatches = $yymatches; - if (strlen($yysubmatches[0]) < 200) { - $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); - } else { - $yymatches = array_filter($yymatches, 'strlen'); - } - if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state CHILDBODY'); - } - 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; - } elseif ($r === true) { - // we have changed state - // process this token in the new state - return $this->yylex(); - } elseif ($r === false) { - $this->counter += strlen($this->value); - $this->line += substr_count($this->value, "\n"); - if ($this->counter >= strlen($this->data)) { - 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); - } // end function - - const CHILDBODY = 6; - - function yy_r6_1() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - return false; - } else { - $this->token = Smarty_Internal_Templateparser::TP_STRIPON; - } - } - - function yy_r6_2() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - return false; - } else { - $this->token = Smarty_Internal_Templateparser::TP_STRIPOFF; - } - } - - function yy_r6_3() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - return false; - } else { - $this->yypopstate(); - return true; - } - } - - function yy_r6_4() - { - - $to = strlen($this->data); - preg_match("~" . $this->ldel . "\s*(([/])?strip\s*" . $this->rdel . "|block\s+)~i", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); - if (isset($match[0][1])) { - $to = $match[0][1]; - } - $this->value = substr($this->data, $this->counter, $to - $this->counter); - return false; - } - - public function yylex7() - { - if (!isset($this->yy_global_pattern7)) { - $this->yy_global_pattern7 = "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*block)|\G(" . $this->ldel . "\\s*[\/]block)|\G(" . $this->ldel . "\\s*[$]smarty\\.block\\.(child|parent))|\G([\S\s])/isS"; - } - if ($this->counter >= strlen($this->data)) { - return false; // end of input - } - - do { - if (preg_match($this->yy_global_pattern7, $this->data, $yymatches, null, $this->counter)) { - $yysubmatches = $yymatches; - if (strlen($yysubmatches[0]) < 200) { - $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); - } else { - $yymatches = array_filter($yymatches, 'strlen'); - } - if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state CHILDBLOCK'); - } - next($yymatches); // skip global match - $this->token = key($yymatches); // token number - $this->value = current($yymatches); // token value - $r = $this->{'yy_r7_' . $this->token}(); - if ($r === null) { - $this->counter += strlen($this->value); - $this->line += substr_count($this->value, "\n"); - // accept this token - return true; - } elseif ($r === true) { - // we have changed state - // process this token in the new state - return $this->yylex(); - } elseif ($r === false) { - $this->counter += strlen($this->value); - $this->line += substr_count($this->value, "\n"); - if ($this->counter >= strlen($this->data)) { - 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); - } // end function - - const CHILDBLOCK = 7; - - function yy_r7_1() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; - } else { - $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; - $this->yypushstate(self::CHILDLITERAL); - } - } - - function yy_r7_2() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; - } else { - $this->yypopstate(); - return true; - } - } - - function yy_r7_3() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; - } else { - $this->yypopstate(); - return true; - } - } - - function yy_r7_4() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; - } else { - $this->yypopstate(); - return true; - } - } - - function yy_r7_6() - { - - $to = strlen($this->data); - preg_match("~" . $this->ldel . "\s*(literal\s*" . $this->rdel . "|([/])?block(\s|" . $this->rdel . ")|[\$]smarty\.block\.(child|parent))~i", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); - if (isset($match[0][1])) { - $to = $match[0][1]; - } - $this->value = substr($this->data, $this->counter, $to - $this->counter); - $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; - } - - public function yylex8() - { - if (!isset($this->yy_global_pattern8)) { - $this->yy_global_pattern8 = "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]literal\\s*" . $this->rdel . ")|\G([\S\s])/isS"; - } - if ($this->counter >= strlen($this->data)) { - return false; // end of input - } - - do { - if (preg_match($this->yy_global_pattern8, $this->data, $yymatches, null, $this->counter)) { - $yysubmatches = $yymatches; - if (strlen($yysubmatches[0]) < 200) { - $yymatches = preg_grep("/(.|\s)+/", $yysubmatches); - } else { - $yymatches = array_filter($yymatches, 'strlen'); - } - if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state CHILDLITERAL'); - } - next($yymatches); // skip global match - $this->token = key($yymatches); // token number - $this->value = current($yymatches); // token value - $r = $this->{'yy_r8_' . $this->token}(); - if ($r === null) { - $this->counter += strlen($this->value); - $this->line += substr_count($this->value, "\n"); - // accept this token - return true; - } elseif ($r === true) { - // we have changed state - // process this token in the new state - return $this->yylex(); - } elseif ($r === false) { - $this->counter += strlen($this->value); - $this->line += substr_count($this->value, "\n"); - if ($this->counter >= strlen($this->data)) { - 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); - } // end function - - const CHILDLITERAL = 8; - - function yy_r8_1() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; - } else { - $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; - $this->yypushstate(self::CHILDLITERAL); - } - } - - function yy_r8_2() - { - - if ($this->smarty->auto_literal && isset($this->value[$this->ldel_length]) ? strpos(" \n\t\r", $this->value[$this->ldel_length]) !== false : false) { - $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; - } else { - $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; - $this->yypopstate(); - } - } - - function yy_r8_3() - { - - $to = strlen($this->data); - preg_match("~{$this->ldel}[/]?literal\s*{$this->rdel}~i", $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_Templateparser::TP_BLOCKSOURCE; - } - -} - - diff --git a/nodes/nodesFFFL.json b/nodes/nodesFFFL.json @@ -0,0 +1 @@ +{"timestamp": "2015-10-31T18:54:14", "version": 1, "nodes": {"c46e1f41e930": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "freifunk-lg2", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fe41:e930", "fe80:0:0:0:c66e:1fff:fe41:e930"], "mesh_interfaces": ["c6:71:20:41:e9:30"], "mac": "c4:6e:1f:41:e9:30"}, "node_id": "c46e1f41e930"}, "statistics": {"uptime": 6570836.37, "traffic": {"mgmt_tx": {"bytes": 3082450600, "packets": 40882056}, "rx": {"bytes": 7569578054, "packets": 30230063}, "tx": {"bytes": 729906101, "packets": 5028984, "dropped": 5574}, "forward": {"bytes": 2802753, "packets": 8298}, "mgmt_rx": {"bytes": 3104566514, "packets": 40513689}}, "memory_usage": 0.5682605682605683, "loadavg": 0, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "c46e1f2ccb84": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "c46e1f2ccb84", "software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "nordrunner@web.de"}, "hostname": "Angeln-0007", "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fe2c:cb84", "fddf:bf7:10:1:c66e:1fff:fe2c:cb84"], "mesh_interfaces": ["c6:71:20:2c:cb:84", "c6:72:1f:2c:cb:84", "c4:6e:1f:2c:cb:85"], "mac": "c4:6e:1f:2c:cb:84"}}, "statistics": {"uptime": 559243.67, "traffic": {"mgmt_tx": {"bytes": 985731001, "packets": 12261146}, "rx": {"bytes": 32546038357, "packets": 29365701}, "tx": {"bytes": 2938943745, "packets": 18380188, "dropped": 7239}, "forward": {"bytes": 44396796244, "packets": 49196299}, "mgmt_rx": {"bytes": 632789021, "packets": 6760316}}, "memory_usage": 0.563963963963964, "loadavg": 0, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.375}, "firstseen": "2015-06-20T13:52:43", "flags": {"gateway": false, "online": true}}, "e8de272ff0e8": {"lastseen": "2015-10-24T19:31:22", "nodeinfo": {"software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Waterkant", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe2f:f0e8", "fe80:0:0:0:eade:27ff:fe2f:f0e8"], "mesh_interfaces": ["ea:e2:27:2f:f0:e8", "ea:e1:28:2f:f0:e8"], "mac": "e8:de:27:2f:f0:e8"}, "node_id": "e8de272ff0e8"}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "14cc20cd4e08": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc20cd4e08", "location": {"latitude": 54.787045, "longitude": 8.826994}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "schmaeschke@service2solution.de"}, "hostname": "niebuell-stb-christiansen", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fecd:4e08", "fddf:bf7:10:1:16cc:20ff:fecd:4e08"], "mesh_interfaces": ["16:d0:20:cd:4e:08", "16:cf:21:cd:4e:08"], "mac": "14:cc:20:cd:4e:08"}}, "statistics": {"uptime": 1853549.07, "traffic": {"mgmt_tx": {"bytes": 1475849467, "packets": 18986496}, "rx": {"bytes": 1737524376, "packets": 9396054}, "tx": {"bytes": 341604518, "packets": 1779028, "dropped": 8171}, "forward": {"bytes": 198738163, "packets": 566021}, "mgmt_rx": {"bytes": 1994125999, "packets": 25113479}}, "memory_usage": 0.29451652865619093, "loadavg": 0.1, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.064189189189189}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "14cc20c2c844": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc20c2c844", "location": {"latitude": 54.740498, "longitude": 9.571426}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "nordrunner@web.de"}, "hostname": "Angeln-0001", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fec2:c844", "fe80:0:0:0:16cc:20ff:fec2:c844"], "mesh_interfaces": ["16:d0:20:c2:c8:44", "16:cf:21:c2:c8:44"], "mac": "14:cc:20:c2:c8:44"}}, "statistics": {"uptime": 657079.69, "traffic": {"mgmt_tx": {"bytes": 763051309, "packets": 9380301}, "rx": {"bytes": 219008151, "packets": 2857935}, "tx": {"bytes": 35842019, "packets": 86355, "dropped": 21}, "forward": {"bytes": 99947, "packets": 313}, "mgmt_rx": {"bytes": 386990845, "packets": 4622109}}, "memory_usage": 0.556063756063756, "loadavg": 0.12, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.36875}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "e8de2730441c": {"lastseen": "2015-09-27T22:01:02", "nodeinfo": {"location": {"latitude": 54.794440358375, "longitude": 9.428822852101}, "node_id": "e8de2730441c", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": false}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "handlepass", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "freifunk@schloss.stras.se"}, "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe30:441c", "fe80:0:0:0:eade:27ff:fe30:441c"], "mesh_interfaces": ["ea:e1:28:30:44:1c"], "mac": "e8:de:27:30:44:1c"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "e894f650538a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "e894f650538a", "location": {"latitude": 54.789306, "longitude": 9.445992}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "mail@codi-it.de"}, "hostname": "freifunk-e894f650538a", "network": {"addresses": ["fddf:bf7:10:1:ea94:f6ff:fe50:538a", "fe80:0:0:0:ea94:f6ff:fe50:538a"], "mesh_interfaces": ["ea:98:f6:50:53:8a", "ea:97:f7:50:53:8a"], "mac": "e8:94:f6:50:53:8a"}}, "statistics": {"uptime": 1202767.2, "traffic": {"mgmt_tx": {"bytes": 1417062579, "packets": 16547061}, "rx": {"bytes": 552555480, "packets": 5309697}, "tx": {"bytes": 56511746, "packets": 340621, "dropped": 315}, "forward": {"bytes": 236668, "packets": 630}, "mgmt_rx": {"bytes": 891242061, "packets": 20225386}}, "memory_usage": 0.5574497574497574, "loadavg": 0.01, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "30b5c2c68106": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c2c68106", "location": {"latitude": 54.871245, "longitude": 8.41733}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "info@it-walther.de"}, "hostname": "freifunk-duerken_whg2", "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:fec6:8106", "fddf:bf7:10:1:32b5:c2ff:fec6:8106"], "mesh_interfaces": ["32:b8:c3:c6:81:06", "32:b9:c2:c6:81:06"], "mac": "30:b5:c2:c6:81:06"}}, "statistics": {"uptime": 2182975.52, "traffic": {"mgmt_tx": {"bytes": 2520666240, "packets": 29730031}, "rx": {"bytes": 1211640857, "packets": 11026858}, "tx": {"bytes": 730161705, "packets": 1069301, "dropped": 426}, "forward": {"bytes": 514430, "packets": 965}, "mgmt_rx": {"bytes": 3845859150, "packets": 64158814}}, "memory_usage": 0.5604989604989605, "loadavg": 0.07, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.40625}, "firstseen": "2015-06-16T09:36:11", "flags": {"gateway": false, "online": true}}, "30b5c2edc3b8": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c2edc3b8", "location": {"latitude": 54.80531, "longitude": 9.39738}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "Tank_d2@hotmail.com"}, "hostname": "freifunk-Musbeckerweg", "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:feed:c3b8", "fddf:bf7:10:1:32b5:c2ff:feed:c3b8"], "mesh_interfaces": ["32:b9:c2:ed:c3:b8", "32:b8:c3:ed:c3:b8"], "mac": "30:b5:c2:ed:c3:b8"}}, "statistics": {"uptime": 3748516.89, "traffic": {"mgmt_tx": {"bytes": 4140687589, "packets": 50160501}, "rx": {"bytes": 57506720512, "packets": 62319763}, "tx": {"bytes": 4764157275, "packets": 33321726, "dropped": 1840}, "forward": {"bytes": 128598, "packets": 454}, "mgmt_rx": {"bytes": 2594429168, "packets": 59833811}}, "memory_usage": 0.5753291753291754, "loadavg": 0.03, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.3625}, "firstseen": "2015-09-12T13:03:40", "flags": {"gateway": false, "online": true}}, "c46e1f82115c": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1f82115c", "location": {"latitude": 54.7831336, "longitude": 8.8514435}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "niebuell-friesencenter1", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fe82:115c", "fe80:0:0:0:c66e:1fff:fe82:115c"], "mesh_interfaces": ["c6:72:1f:82:11:5c", "c6:71:20:82:11:5c"], "mac": "c4:6e:1f:82:11:5c"}}, "statistics": {"uptime": 4957509.34, "traffic": {"mgmt_tx": {"bytes": 5357068251, "packets": 66093988}, "rx": {"bytes": 9251796630, "packets": 29282755}, "tx": {"bytes": 1846003077, "packets": 8201731, "dropped": 20795}, "forward": {"bytes": 3701951, "packets": 9966}, "mgmt_rx": {"bytes": 3352784708, "packets": 77623930}}, "memory_usage": 0.26889222142531133, "loadavg": 0.01, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-06-26T14:04:00", "flags": {"gateway": false, "online": true}}, "e8de2730442e": {"lastseen": "2015-08-30T01:32:02", "nodeinfo": {"location": {"latitude": 54.788124, "longitude": 9.432027}, "node_id": "e8de2730442e", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "FiestaCubanna", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe30:442e", "fe80:0:0:0:eade:27ff:fe30:442e"], "mesh_interfaces": ["ea:e2:27:30:44:2e", "ea:e1:28:30:44:2e"], "mac": "e8:de:27:30:44:2e"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-19T19:13:57", "flags": {"gateway": false, "online": false}}, "c46e1f86c5ca": {"lastseen": "2015-10-25T16:09:19", "nodeinfo": {"system": {"site_code": "fffl"}, "node_id": "c46e1f86c5ca", "software": {"autoupdater": {"enabled": false, "branch": "beta"}, "fastd": {"version": "v17", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}}, "hostname": "Mohrkirch", "hardware": {"model": "TP-Link TL-WR841N/ND v9", "nproc": 1}, "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fe86:c5ca", "fe80:0:0:0:c66e:1fff:fe86:c5ca"], "mesh": {"bat0": {"interfaces": {"tunnel": ["c6:72:1f:86:c5:ca"]}}}, "mac": "c4:6e:1f:86:c5:ca", "mesh_interfaces": ["c6:72:1f:86:c5:ca"]}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "d85d4cd7c5a0": {"lastseen": "2015-09-12T20:09:28", "nodeinfo": {"location": {"latitude": 54.79827, "longitude": 9.414567}, "node_id": "d85d4cd7c5a0", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Area-51", "hardware": {"model": "TP-Link TL-WR1043N/ND v1"}, "owner": {"contact": "tj0@tj0.eu"}, "network": {"addresses": ["fddf:bf7:10:1:da5d:4cff:fed7:c5a0", "fe80:0:0:0:da5d:4cff:fed7:c5a0"], "mesh_interfaces": ["da:61:4c:d7:c5:a0", "da:60:4d:d7:c5:a0"], "mac": "d8:5d:4c:d7:c5:a0"}}, "statistics": {"clients": 0}, "firstseen": "2015-08-29T08:31:49", "flags": {"gateway": false, "online": false}}, "c46e1fb37980": {"lastseen": "2015-10-21T21:15:13", "nodeinfo": {"location": {"latitude": 54.63605, "longitude": 9.48987}, "node_id": "c46e1fb37980", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Stenderup1-Test", "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "network": {"addresses": ["fe80:0:0:0:c66e:1fff:feb3:7980", "fddf:bf7:10:1:c66e:1fff:feb3:7980"], "mesh_interfaces": ["c6:72:1f:b3:79:80", "c6:71:20:b3:79:80"], "mac": "c4:6e:1f:b3:79:80"}}, "statistics": {"clients": 0}, "firstseen": "2015-10-21T20:03:49", "flags": {"gateway": false, "online": false}}, "c46e1f3b59a0": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "c46e1f3b59a0", "software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "nordrunner@web.de"}, "hostname": "Angeln-0006", "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fe3b:59a0", "fddf:bf7:10:1:c66e:1fff:fe3b:59a0"], "mesh_interfaces": ["c6:71:20:3b:59:a0", "c6:72:1f:3b:59:a0"], "mac": "c4:6e:1f:3b:59:a0"}}, "statistics": {"uptime": 4163869.36, "traffic": {"mgmt_tx": {"bytes": 4561819877, "packets": 55279531}, "rx": {"bytes": 31879551593, "packets": 43262992}, "tx": {"bytes": 2984101055, "packets": 17877507, "dropped": 5272}, "forward": {"bytes": 441170913895, "packets": 522346279}, "mgmt_rx": {"bytes": 5007204355, "packets": 94425198}}, "memory_usage": 0.5717255717255717, "loadavg": 0.37, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "30b5c27e2ad4": {"lastseen": "2015-09-11T08:33:01", "nodeinfo": {"location": {"latitude": 54.49506, "longitude": 9.32194}, "node_id": "30b5c27e2ad4", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk-Gluecksburg", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "kilgore72@gmx.de"}, "network": {"addresses": ["fddf:bf7:10:1:32b5:c2ff:fe7e:2ad4", "fe80:0:0:0:32b5:c2ff:fe7e:2ad4"], "mesh_interfaces": ["32:b9:c2:7e:2a:d4", "32:b8:c3:7e:2a:d4"], "mac": "30:b5:c2:7e:2a:d4"}}, "statistics": {"clients": 0}, "firstseen": "2015-09-08T11:36:59", "flags": {"gateway": false, "online": false}}, "e8de272fe162": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "e8de272fe162", "software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "Info@Freifnunk-Flensburg.de"}, "hostname": "frohelund.homwer.com", "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe2f:e162", "fe80:0:0:0:eade:27ff:fe2f:e162"], "mesh_interfaces": ["ea:e2:27:2f:e1:62", "ea:e1:28:2f:e1:62"], "mac": "e8:de:27:2f:e1:62"}}, "statistics": {"uptime": 277810.74, "traffic": {"mgmt_tx": {"bytes": 331767523, "packets": 3835701}, "rx": {"bytes": 245468676, "packets": 1457828}, "tx": {"bytes": 49822155, "packets": 153755, "dropped": 205}, "forward": {"bytes": 11812, "packets": 133}, "mgmt_rx": {"bytes": 207590379, "packets": 4715583}}, "memory_usage": 0.5541233541233541, "loadavg": 0.04, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "90f652b52c8a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "90f652b52c8a", "software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v7"}, "owner": {"contact": "Freifunk@Fam-Thiessen.de"}, "hostname": "Sylt_2", "network": {"addresses": ["fddf:bf7:10:1:92f6:52ff:feb5:2c8a", "fe80:0:0:0:92f6:52ff:feb5:2c8a"], "mesh_interfaces": ["92:fa:52:b5:2c:8a", "92:f9:53:b5:2c:8a"], "mac": "90:f6:52:b5:2c:8a"}}, "statistics": {"uptime": 1921776.87, "traffic": {"mgmt_tx": {"bytes": 2029689935, "packets": 25230613}, "rx": {"bytes": 2878493362, "packets": 9964216}, "tx": {"bytes": 220713223, "packets": 1436134, "dropped": 3321}, "forward": {"bytes": 36670791, "packets": 47540}, "mgmt_rx": {"bytes": 3200708027, "packets": 40839022}}, "memory_usage": 0.5531531531531532, "loadavg": 0, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.39583333333333}, "firstseen": "2015-10-09T13:05:40", "flags": {"gateway": false, "online": true}}, "30b5c2dfaa50": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "FLan", "network": {"addresses": ["fddf:bf7:10:1:32b5:c2ff:fedf:aa50", "fe80:0:0:0:32b5:c2ff:fedf:aa50"], "mesh_interfaces": ["32:b9:c2:df:aa:50", "32:b8:c3:df:aa:50"], "mac": "30:b5:c2:df:aa:50"}, "node_id": "30b5c2dfaa50"}, "statistics": {"uptime": 177706.99, "traffic": {"mgmt_tx": {"bytes": 212285432, "packets": 2451539}, "rx": {"bytes": 83149588, "packets": 788539}, "tx": {"bytes": 9098419, "packets": 54787, "dropped": 158}, "forward": {"bytes": 247799, "packets": 799}, "mgmt_rx": {"bytes": 133090093, "packets": 3028594}}, "memory_usage": 0.5516285516285516, "loadavg": 0, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-10-29T17:36:24", "flags": {"gateway": false, "online": true}}, "f81a673e50c4": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "f81a673e50c4", "location": {"latitude": 54.797102, "longitude": 9.425523}, "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "owner": {"contact": "freifunk@waytoo.sexy"}, "hostname": "moin-moin", "network": {"addresses": ["fe80:0:0:0:fa1a:67ff:fe3e:50c4", "fddf:bf7:10:1:fa1a:67ff:fe3e:50c4"], "mesh_interfaces": ["fa:1d:68:3e:50:c4", "fa:1e:67:3e:50:c4", "f8:1a:67:3e:50:c3"], "mac": "f8:1a:67:3e:50:c4"}}, "statistics": {"uptime": 88685.53, "traffic": {"mgmt_tx": {"bytes": 160963766, "packets": 1889311}, "rx": {"bytes": 2188839310, "packets": 1925613}, "tx": {"bytes": 74665848, "packets": 663481, "dropped": 219}, "forward": {"bytes": 312630420, "packets": 660057}, "mgmt_rx": {"bytes": 91172687, "packets": 1833163}}, "memory_usage": 0.5552321552321553, "loadavg": 0.13, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "0023cd1419c0": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "0023cd1419c0", "location": {"latitude": 54.79119, "longitude": 9.46779}, "hardware": {"model": "TP-Link TL-WR1043N/ND v1"}, "hostname": "freifunk-Nase-Engelsby01", "network": {"addresses": ["fddf:bf7:10:1:223:cdff:fe14:19c0", "fe80:0:0:0:223:cdff:fe14:19c0"], "mesh_interfaces": ["02:27:cd:14:19:c0", "02:26:ce:14:19:c0"], "mac": "00:23:cd:14:19:c0"}}, "statistics": {"uptime": 1746528.33, "traffic": {"mgmt_tx": {"bytes": 2031427405, "packets": 24230607}, "rx": {"bytes": 11877344813, "packets": 18815632}, "tx": {"bytes": 1988262344, "packets": 8184444, "dropped": 5010}, "forward": {"bytes": 42829222460, "packets": 51563216}, "mgmt_rx": {"bytes": 2272562534, "packets": 41345491}}, "memory_usage": 0.5713097713097712, "loadavg": 0.05, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.065068493150685}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "30b5c2edf866": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c2edf866", "location": {"latitude": 54.475147, "longitude": 9.047702}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "freifunk@spam.ruup.de"}, "hostname": "husum-speicher-unten", "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:feed:f866", "fddf:bf7:10:1:32b5:c2ff:feed:f866"], "mesh_interfaces": ["32:b9:c2:ed:f8:66", "32:b8:c3:ed:f8:66"], "mac": "30:b5:c2:ed:f8:66"}}, "statistics": {"uptime": 1829955.62, "traffic": {"mgmt_tx": {"bytes": 2139128839, "packets": 26351659}, "rx": {"bytes": 5916578492, "packets": 12248512}, "tx": {"bytes": 757904909, "packets": 3032838, "dropped": 4179}, "forward": {"bytes": 32843082, "packets": 38294}, "mgmt_rx": {"bytes": 2463842624, "packets": 31238615}}, "memory_usage": 0.5595287595287595, "loadavg": 0.07, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.3625}, "firstseen": "2015-10-10T14:35:53", "flags": {"gateway": false, "online": true}}, "14cc20873b00": {"lastseen": "2015-10-20T07:27:12", "nodeinfo": {"location": {"latitude": 54.77927519, "longitude": 9.44361001}, "node_id": "14cc20873b00", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Ministry_of_silly_walks", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fe87:3b00", "fe80:0:0:0:16cc:20ff:fe87:3b00"], "mesh_interfaces": ["16:d0:20:87:3b:00", "16:cf:21:87:3b:00"], "mac": "14:cc:20:87:3b:00"}}, "statistics": {"clients": 0}, "firstseen": "2015-08-30T08:07:18", "flags": {"gateway": false, "online": false}}, "14cc20875060": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "freifunk-14cc20875060", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fe87:5060", "fe80:0:0:0:16cc:20ff:fe87:5060"], "mesh_interfaces": ["16:d0:20:87:50:60", "16:cf:21:87:50:60"], "mac": "14:cc:20:87:50:60"}, "node_id": "14cc20875060"}, "statistics": {"uptime": 4712794.29, "traffic": {"mgmt_tx": {"bytes": 5018902261, "packets": 64691227}, "rx": {"bytes": 52799849591, "packets": 64482702}, "tx": {"bytes": 8401411070, "packets": 39199464, "dropped": 100912}, "forward": {"bytes": 155540809, "packets": 150675}, "mgmt_rx": {"bytes": 2614539595, "packets": 33406810}}, "memory_usage": 0.5542619542619542, "loadavg": 0, "gateway": "snowden", "clients": 5, "rootfs_usage": 0.3625}, "firstseen": "2015-07-01T09:58:44", "flags": {"gateway": false, "online": true}}, "c46e1f42039e": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "freifunk-lg1", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fe42:39e", "fe80:0:0:0:c66e:1fff:fe42:39e"], "mesh_interfaces": ["c6:72:1f:42:03:9e", "c6:71:20:42:03:9e"], "mac": "c4:6e:1f:42:03:9e"}, "node_id": "c46e1f42039e"}, "statistics": {"uptime": 12270843.48, "traffic": {"mgmt_tx": {"bytes": 11670331309, "packets": 155825235}, "rx": {"bytes": 43240955356, "packets": 79509607}, "tx": {"bytes": 3623974454, "packets": 29403107, "dropped": 35585}, "forward": {"bytes": 8635793001, "packets": 15130455}, "mgmt_rx": {"bytes": 12138803740, "packets": 236431160}}, "memory_usage": 0.5761607761607761, "loadavg": 0.21, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "c46e1f8218c4": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1f8218c4", "location": {"latitude": 54.7837924, "longitude": 8.8407256}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "niebuell-vossphysio", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fe82:18c4", "fe80:0:0:0:c66e:1fff:fe82:18c4"], "mesh_interfaces": ["c6:72:1f:82:18:c4", "c6:71:20:82:18:c4"], "mac": "c4:6e:1f:82:18:c4"}}, "statistics": {"uptime": 10399515.21, "traffic": {"mgmt_tx": {"bytes": 10157949377, "packets": 131758761}, "rx": {"bytes": 24382375628, "packets": 58239069}, "tx": {"bytes": 2077927414, "packets": 16057880, "dropped": 31738}, "forward": {"bytes": 715210, "packets": 3344}, "mgmt_rx": {"bytes": 6311885234, "packets": 146691239}}, "memory_usage": 0.26393688465801657, "loadavg": 0.1, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.061655405405405}, "firstseen": "2015-07-03T10:38:51", "flags": {"gateway": false, "online": true}}, "gw02": {"nodeinfo": {"hostname": "gw02", "node_id": "gw02", "network": {"mesh_interfaces": ["fe:ed:de:ad:be:02"]}}, "statistics": {"clients": 0}, "flags": {"gateway": false, "online": false}}, "e894f6cd5a1a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "node_id": "e894f6cd5a1a", "software": {"fastd": {"version": "v17", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}, "autoupdater": {"enabled": true, "branch": "beta"}}, "hostname": "beta-2015.1.2-0_test2", "hardware": {"nproc": 1, "model": "TP-Link TL-WDR4300 v1"}, "network": {"addresses": ["fe80:0:0:0:ea94:f6ff:fecd:5a1a", "fddf:bf7:10:1:ea94:f6ff:fecd:5a1a"], "mesh_interfaces": ["ea:98:f6:cd:5a:1a", "ea:97:f7:cd:5a:1a", "ea:97:f8:cd:5a:1a"], "mac": "e8:94:f6:cd:5a:1a", "mesh": {"bat0": {"interfaces": {"wireless": ["ea:97:f7:cd:5a:1a", "ea:97:f8:cd:5a:1a"], "tunnel": ["ea:98:f6:cd:5a:1a"]}}}}}, "statistics": {"uptime": 270125.73, "traffic": {"mgmt_tx": {"bytes": 479687012, "packets": 5962467}, "rx": {"bytes": 278525683, "packets": 1344550}, "tx": {"bytes": 55106569, "packets": 149988, "dropped": 526}, "forward": {"bytes": 950599476, "packets": 880522}, "mgmt_rx": {"bytes": 467102379, "packets": 5902042}}, "memory_usage": 0.19885374117349042, "loadavg": 0.03, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.0625}, "firstseen": "2015-08-07T10:43:25", "flags": {"gateway": false, "online": true}}, "14cc20c81032": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc20c81032", "location": {"latitude": 54.9021106, "longitude": 8.3102222}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "Freifunk@Fam-Thiessen.de"}, "hostname": "Piratenpartei-1V", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fec8:1032", "fddf:bf7:10:1:16cc:20ff:fec8:1032"], "mesh_interfaces": ["16:d0:20:c8:10:32", "16:cf:21:c8:10:32"], "mac": "14:cc:20:c8:10:32"}}, "statistics": {"uptime": 1921760.11, "traffic": {"mgmt_tx": {"bytes": 2237132337, "packets": 26308301}, "rx": {"bytes": 5072063311, "packets": 11712675}, "tx": {"bytes": 300575423, "packets": 2878104, "dropped": 1603}, "forward": {"bytes": 9297399738, "packets": 12693832}, "mgmt_rx": {"bytes": 4700696441, "packets": 74860175}}, "memory_usage": 0.5545391545391545, "loadavg": 0.04, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.3625}, "firstseen": "2015-09-03T09:39:25", "flags": {"gateway": false, "online": true}}, "30b5c2c88e7a": {"lastseen": "2015-10-29T07:12:37", "nodeinfo": {"location": {"latitude": 54.788436, "longitude": 8.827186}, "node_id": "30b5c2c88e7a", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk-knudtsen", "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "network": {"addresses": ["fddf:bf7:10:1:32b5:c2ff:fec8:8e7a", "fe80:0:0:0:32b5:c2ff:fec8:8e7a"], "mesh_interfaces": ["32:b9:c2:c8:8e:7a", "32:b8:c3:c8:8e:7a"], "mac": "30:b5:c2:c8:8e:7a"}}, "statistics": {"clients": 0}, "firstseen": "2015-10-21T09:42:27", "flags": {"gateway": false, "online": false}}, "14cc20487dc8": {"lastseen": "2015-07-27T22:27:35", "nodeinfo": {"location": {"latitude": 54.79166, "longitude": 9.442253}, "node_id": "14cc20487dc8", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": false}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "ok_backbone_5Ghz", "hardware": {"model": "TP-Link CPE510 v1.0"}, "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fe48:7dc8", "fddf:bf7:10:1:16cc:20ff:fe48:7dc8"], "mesh_interfaces": ["16:cf:21:48:7d:c8", "16:cd:20:48:7d:c8"], "mac": "14:cc:20:48:7d:c8"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-22T19:15:56", "flags": {"gateway": false, "online": false}}, "c04a0061eb46": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c04a0061eb46", "location": {"latitude": 54.7914, "longitude": 9.4314}, "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "hostname": "freifunk-infoladen-subtilus", "network": {"addresses": ["fe80:0:0:0:c24a:ff:fe61:eb46", "fddf:bf7:10:1:c24a:ff:fe61:eb46"], "mesh_interfaces": ["c2:4e:00:61:eb:46", "c2:4d:01:61:eb:46"], "mac": "c0:4a:00:61:eb:46"}}, "statistics": {"uptime": 273327.35, "traffic": {"mgmt_tx": {"bytes": 324533941, "packets": 3764620}, "rx": {"bytes": 4779879509, "packets": 5184339}, "tx": {"bytes": 416862649, "packets": 2911263, "dropped": 4455}, "forward": {"bytes": 645896, "packets": 3576}, "mgmt_rx": {"bytes": 202909384, "packets": 4607826}}, "memory_usage": 0.5728343728343728, "loadavg": 0.03, "gateway": "snowden", "clients": 5, "rootfs_usage": 0.36875}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "14cc20c2c8e2": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc20c2c8e2", "location": {"latitude": 54.649382, "longitude": 9.516344}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "nordrunner@web.de"}, "hostname": "Angeln-0002", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fec2:c8e2", "fe80:0:0:0:16cc:20ff:fec2:c8e2"], "mesh_interfaces": ["16:d0:20:c2:c8:e2", "16:cf:21:c2:c8:e2", "14:cc:20:c2:c8:e3"], "mac": "14:cc:20:c2:c8:e2"}}, "statistics": {"uptime": 10809480.03, "traffic": {"mgmt_tx": {"bytes": 15763524640, "packets": 204875755}, "rx": {"bytes": 39652718750, "packets": 71355400}, "tx": {"bytes": 3074381923, "packets": 24532422, "dropped": 13400}, "forward": {"bytes": 301814, "packets": 2350}, "mgmt_rx": {"bytes": 6530987870, "packets": 151783583}}, "memory_usage": 0.6145530145530145, "loadavg": 0.02, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.3625}, "firstseen": "2015-06-21T08:24:29", "flags": {"gateway": false, "online": true}}, "c46e1f2c93a6": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1f2c93a6", "location": {"latitude": 54.795236, "longitude": 9.473102}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "0461-65913"}, "hostname": "Bier_und_Spieldorf_Engelsby", "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fe2c:93a6", "fddf:bf7:10:1:c66e:1fff:fe2c:93a6"], "mesh_interfaces": ["c6:72:1f:2c:93:a6", "c6:71:20:2c:93:a6"], "mac": "c4:6e:1f:2c:93:a6"}}, "statistics": {"uptime": 995653.68, "traffic": {"mgmt_tx": {"bytes": 1169354427, "packets": 13676228}, "rx": {"bytes": 14256818125, "packets": 17506529}, "tx": {"bytes": 1297717959, "packets": 9770532, "dropped": 11580}, "forward": {"bytes": 114130, "packets": 435}, "mgmt_rx": {"bytes": 734543706, "packets": 16671575}}, "memory_usage": 0.6072072072072072, "loadavg": 0.04, "gateway": "snowden", "clients": 4, "rootfs_usage": 0.375}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "c46e1fc71daa": {"lastseen": "2015-09-23T19:31:32", "nodeinfo": {"location": {"latitude": 54.19392, "longitude": 9.108908}, "node_id": "c46e1fc71daa", "software": {"autoupdater": {"enabled": false, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Heide-Kolberger-Str", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "@syst3m86"}, "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fec7:1daa", "fe80:0:0:0:c66e:1fff:fec7:1daa"], "mesh_interfaces": ["c6:72:1f:c7:1d:aa", "c6:71:20:c7:1d:aa"], "mac": "c4:6e:1f:c7:1d:aa"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "10feedc257e4": {"lastseen": "2015-09-16T10:02:13", "nodeinfo": {"location": {"latitude": 54.304461, "longitude": 8.630838}, "node_id": "10feedc257e4", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk", "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "network": {"addresses": ["fddf:bf7:10:1:12fe:edff:fec2:57e4", "fe80:0:0:0:12fe:edff:fec2:57e4"], "mesh_interfaces": ["12:02:ed:c2:57:e4", "12:01:ee:c2:57:e4"], "mac": "10:fe:ed:c2:57:e4"}}, "statistics": {"clients": 0}, "firstseen": "2015-08-20T14:38:49", "flags": {"gateway": false, "online": false}}, "14cc2097d40a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc2097d40a", "location": {"latitude": 54.745878, "longitude": 9.898881}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "Tank_d2@hotmail.com"}, "hostname": "Baumarkt-Bushaltestelle-Gelting", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fe97:d40a", "fe80:0:0:0:16cc:20ff:fe97:d40a"], "mesh_interfaces": ["16:d0:20:97:d4:0a", "16:cf:21:97:d4:0a"], "mac": "14:cc:20:97:d4:0a"}}, "statistics": {"uptime": 3383594.06, "traffic": {"mgmt_tx": {"bytes": 3800200699, "packets": 45889678}, "rx": {"bytes": 4946143789, "packets": 18773879}, "tx": {"bytes": 602679581, "packets": 3142727, "dropped": 1777}, "forward": {"bytes": 9982, "packets": 112}, "mgmt_rx": {"bytes": 2380029567, "packets": 54800929}}, "memory_usage": 0.27639042837582317, "loadavg": 0.18, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.064189189189189}, "firstseen": "2015-09-12T23:43:22", "flags": {"gateway": false, "online": true}}, "c04a0049e86e": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "hostname": "PeteImKopf", "network": {"addresses": ["fddf:bf7:10:1:c24a:ff:fe49:e86e", "fe80:0:0:0:c24a:ff:fe49:e86e"], "mesh_interfaces": ["c2:4e:00:49:e8:6e", "c2:4d:01:49:e8:6e"], "mac": "c0:4a:00:49:e8:6e"}, "node_id": "c04a0049e86e"}, "statistics": {"uptime": 194648.78, "traffic": {"mgmt_tx": {"bytes": 232828127, "packets": 2747578}, "rx": {"bytes": 7277238977, "packets": 7309188}, "tx": {"bytes": 875731404, "packets": 4584829, "dropped": 1346}, "forward": {"bytes": 16941715, "packets": 44805}, "mgmt_rx": {"bytes": 327725690, "packets": 5570629}}, "memory_usage": 0.5829521829521829, "loadavg": 0.13, "gateway": "snowden", "clients": 7, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "b0487af65b70": {"lastseen": "2015-09-07T01:55:45", "nodeinfo": {"location": {"latitude": 54.778391380146, "longitude": 9.4416278600693}, "node_id": "b0487af65b70", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Pondroad2", "hardware": {"model": "TP-Link TL-WR1043N/ND v1"}, "owner": {"contact": "freifunk@anspunktf.de"}, "network": {"addresses": ["fe80:0:0:0:b248:7aff:fef6:5b70", "fddf:bf7:10:1:b248:7aff:fef6:5b70"], "mesh_interfaces": ["b2:4c:7a:f6:5b:70", "b2:4b:7b:f6:5b:70"], "mac": "b0:48:7a:f6:5b:70"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "30b5c2274cfe": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "software": {"firmware": {"base": "gluon-v2015.1.1", "release": "2015.1.0-beta-2015-07-25_12_08"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "autoupdater": {"enabled": true, "branch": "beta"}, "fastd": {"version": "v17", "enabled": true}}, "node_id": "30b5c2274cfe", "location": {"latitude": 54.740532, "longitude": 9.571341}, "hostname": "Angeln-0005", "owner": {"contact": "nordrunner(a)web.de"}, "hardware": {"nproc": 1, "model": "TP-Link Archer C5 v1"}, "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:fe27:4cfe", "fddf:bf7:10:1:32b5:c2ff:fe27:4cfe"], "mesh": {"bat0": {"interfaces": {"wireless": ["32:b8:c3:27:4c:fe"], "tunnel": ["32:b9:c2:27:4c:fe"]}}}, "mac": "30:b5:c2:27:4c:fe", "mesh_interfaces": ["32:b9:c2:27:4c:fe", "32:b8:c3:27:4c:fe"]}}, "statistics": {"uptime": 6230904.75, "traffic": {"mgmt_tx": {"bytes": 6576846923, "packets": 86458284}, "rx": {"bytes": 13206105272, "packets": 39935522}, "tx": {"bytes": 6794448867, "packets": 14411639, "dropped": 11666}, "forward": {"bytes": 3730512, "packets": 4870}, "mgmt_rx": {"bytes": 3350298946, "packets": 43055278}}, "memory_usage": 0.23175558018046538, "loadavg": 0.12, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.039340101522843}, "firstseen": "2015-07-13T17:29:54", "flags": {"gateway": false, "online": true}}, "a0f3c1ac32b6": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "a0f3c1ac32b6", "software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "owner": {"contact": "Freifunk@Fam-Thiessen.de"}, "hostname": "Sylt_1", "network": {"addresses": ["fddf:bf7:10:1:a2f3:c1ff:feac:32b6", "fe80:0:0:0:a2f3:c1ff:feac:32b6"], "mesh_interfaces": ["a2:f7:c1:ac:32:b6", "a2:f6:c2:ac:32:b6"], "mac": "a0:f3:c1:ac:32:b6"}}, "statistics": {"uptime": 1058677.88, "traffic": {"mgmt_tx": {"bytes": 1240732521, "packets": 15248377}, "rx": {"bytes": 400446960, "packets": 4598062}, "tx": {"bytes": 37711558, "packets": 179823, "dropped": 342}, "forward": {"bytes": 12415558, "packets": 17967}, "mgmt_rx": {"bytes": 1916405127, "packets": 24411232}}, "memory_usage": 0.5538461538461539, "loadavg": 0.08, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.3625}, "firstseen": "2015-10-09T12:56:37", "flags": {"gateway": false, "online": true}}, "c46e1f2c5d48": {"lastseen": "2015-10-07T06:40:55", "nodeinfo": {"location": {"latitude": 54.80377, "longitude": 9.564058}, "node_id": "c46e1f2c5d48", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Munkbrarup", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fe2c:5d48", "fddf:bf7:10:1:c66e:1fff:fe2c:5d48"], "mesh_interfaces": ["c6:72:1f:2c:5d:48", "c6:71:20:2c:5d:48"], "mac": "c4:6e:1f:2c:5d:48"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "14cc20e3dd96": {"lastseen": "2015-10-06T12:27:42", "nodeinfo": {"location": {"latitude": 54.871233, "longitude": 8.417463}, "node_id": "14cc20e3dd96", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk-duerken_3", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fee3:dd96", "fe80:0:0:0:16cc:20ff:fee3:dd96"], "mesh_interfaces": ["16:d0:20:e3:dd:96", "16:cf:21:e3:dd:96"], "mac": "14:cc:20:e3:dd:96"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T09:36:11", "flags": {"gateway": false, "online": false}}, "c46e1fc70c0a": {"lastseen": "2015-10-31T15:57:00", "nodeinfo": {"location": {"latitude": 54.80163, "longitude": 9.463808}, "node_id": "c46e1fc70c0a", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "elbestrasse_uplink", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fec7:c0a", "fddf:bf7:10:1:c66e:1fff:fec7:c0a"], "mesh_interfaces": ["c6:72:1f:c7:0c:0a", "c6:71:20:c7:0c:0a"], "mac": "c4:6e:1f:c7:0c:0a"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "14cc20e3c60e": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc20e3c60e", "location": {"latitude": 54.871356, "longitude": 8.41731}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "info@it-walther.de"}, "hostname": "freifunk-duerken_2", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fee3:c60e", "fe80:0:0:0:16cc:20ff:fee3:c60e"], "mesh_interfaces": ["16:d0:20:e3:c6:0e", "16:cf:21:e3:c6:0e"], "mac": "14:cc:20:e3:c6:0e"}}, "statistics": {"uptime": 2184276.33, "traffic": {"mgmt_tx": {"bytes": 2522311491, "packets": 29786061}, "rx": {"bytes": 1503148328, "packets": 11113792}, "tx": {"bytes": 835863864, "packets": 1324426, "dropped": 12826}, "forward": {"bytes": 88846392, "packets": 132571}, "mgmt_rx": {"bytes": 4121830202, "packets": 67430227}}, "memory_usage": 0.5537075537075538, "loadavg": 0.04, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.36875}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "30b5c280dab0": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c280dab0", "location": {"latitude": 54.793282, "longitude": 9.418966}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "Bushaltestelle_Norderallee", "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:fe80:dab0", "fddf:bf7:10:1:32b5:c2ff:fe80:dab0"], "mesh_interfaces": ["32:b9:c2:80:da:b0", "32:b8:c3:80:da:b0"], "mac": "30:b5:c2:80:da:b0"}}, "statistics": {"uptime": 696505.87, "traffic": {"mgmt_tx": {"bytes": 822085165, "packets": 9589553}, "rx": {"bytes": 2258288489, "packets": 4669858}, "tx": {"bytes": 141424491, "packets": 1259564, "dropped": 1038}, "forward": {"bytes": 740827, "packets": 2402}, "mgmt_rx": {"bytes": 515027920, "packets": 11674138}}, "memory_usage": 0.5652113652113653, "loadavg": 0.15, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.45}, "firstseen": "2015-07-22T19:35:04", "flags": {"gateway": false, "online": true}}, "c46e1f41e97a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "c46e1f41e97a", "software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "chrvr@web.de"}, "hostname": "freifunk-tarp-italia2", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fe41:e97a", "fe80:0:0:0:c66e:1fff:fe41:e97a"], "mesh_interfaces": ["c6:71:20:41:e9:7a"], "mac": "c4:6e:1f:41:e9:7a"}}, "statistics": {"uptime": 882296.39, "traffic": {"mgmt_tx": {"bytes": 481412694, "packets": 5945463}, "rx": {"bytes": 1903437710, "packets": 5143610}, "tx": {"bytes": 444624355, "packets": 1562911, "dropped": 8448}, "forward": {"bytes": 7248989, "packets": 10729}, "mgmt_rx": {"bytes": 484689964, "packets": 5876259}}, "memory_usage": 0.5451143451143451, "loadavg": 0.27, "gateway": "snowden", "clients": 6, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "30b5c2c88ea0": {"lastseen": "2015-09-20T15:09:53", "nodeinfo": {"location": {"latitude": 54.786685, "longitude": 8.832621}, "node_id": "30b5c2c88ea0", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": false}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "niebuell-friesenhof", "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:fec8:8ea0", "fddf:bf7:10:1:32b5:c2ff:fec8:8ea0"], "mesh_interfaces": ["32:b8:c3:c8:8e:a0"], "mac": "30:b5:c2:c8:8e:a0"}}, "statistics": {"clients": 0}, "firstseen": "2015-09-17T13:08:43", "flags": {"gateway": false, "online": false}}, "32d1de1e99f1": {"lastseen": "2015-10-24T10:52:07", "nodeinfo": {"system": {"site_code": "fffl"}, "node_id": "32d1de1e99f1", "software": {"autoupdater": {"enabled": true, "branch": "beta"}, "fastd": {"version": "v17", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}}, "hostname": "T60-gluon-x86", "hardware": {"model": "Common KVM processor", "nproc": 1}, "network": {"addresses": ["fddf:bf7:10:1:30d1:deff:fe1e:99f1", "fe80:0:0:0:30d1:deff:fe1e:99f1"], "mesh": {"bat0": {"interfaces": {"tunnel": ["32:d5:de:1e:99:f1"], "other": ["32:d2:df:1e:99:f1"]}}}, "mac": "32:d1:de:1e:99:f1", "mesh_interfaces": ["32:d5:de:1e:99:f1", "32:d2:df:1e:99:f1"]}}, "statistics": {"clients": 0}, "firstseen": "2015-10-07T12:40:33", "flags": {"gateway": false, "online": false}}, "c46e1f3b3bd8": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1f3b3bd8", "location": {"latitude": 54.662856621119, "longitude": 9.3994756042957}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "chrvr@web.de"}, "hostname": "freifunk-tarp-bistro2", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fe3b:3bd8", "fe80:0:0:0:c66e:1fff:fe3b:3bd8"], "mesh_interfaces": ["c6:71:20:3b:3b:d8"], "mac": "c4:6e:1f:3b:3b:d8"}}, "statistics": {"uptime": 3179156.09, "traffic": {"mgmt_tx": {"bytes": 1689145875, "packets": 21366641}, "rx": {"bytes": 15861379632, "packets": 26878596}, "tx": {"bytes": 1550063334, "packets": 10543683, "dropped": 13356}, "forward": {"bytes": 15093537, "packets": 25221}, "mgmt_rx": {"bytes": 1705709937, "packets": 21204691}}, "memory_usage": 0.5448371448371448, "loadavg": 0.04, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "30b5c29ec6fe": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c29ec6fe", "location": {"latitude": 54.632072, "longitude": 9.600151}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "nordrunner@web.de"}, "hostname": "Angeln-0010", "network": {"addresses": ["fddf:bf7:10:1:32b5:c2ff:fe9e:c6fe", "fe80:0:0:0:32b5:c2ff:fe9e:c6fe"], "mesh_interfaces": ["32:b9:c2:9e:c6:fe", "32:b8:c3:9e:c6:fe"], "mac": "30:b5:c2:9e:c6:fe"}}, "statistics": {"uptime": 552710.34, "traffic": {"mgmt_tx": {"bytes": 655714289, "packets": 7610053}, "rx": {"bytes": 197463947, "packets": 2478701}, "tx": {"bytes": 14046896, "packets": 67639, "dropped": 47}, "forward": {"bytes": 140389837, "packets": 295012}, "mgmt_rx": {"bytes": 677803993, "packets": 12688475}}, "memory_usage": 0.5783783783783784, "loadavg": 0.16, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.3625}, "firstseen": "2015-10-24T02:08:13", "flags": {"gateway": false, "online": true}}, "c46e1f2c5cbc": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1f2c5cbc", "location": {"latitude": 54.815653, "longitude": 9.482711}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "Freifunk-Osterkoppel", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fe2c:5cbc", "fe80:0:0:0:c66e:1fff:fe2c:5cbc"], "mesh_interfaces": ["c6:72:1f:2c:5c:bc", "c6:71:20:2c:5c:bc"], "mac": "c4:6e:1f:2c:5c:bc"}}, "statistics": {"uptime": 132006.59, "traffic": {"mgmt_tx": {"bytes": 159219820, "packets": 1831093}, "rx": {"bytes": 370877285, "packets": 858221}, "tx": {"bytes": 28156465, "packets": 218536, "dropped": 1355}, "forward": {"bytes": 88, "packets": 1}, "mgmt_rx": {"bytes": 100073393, "packets": 2272950}}, "memory_usage": 0.5876645876645876, "loadavg": 0.14, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.375}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "50e549236600": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "node_id": "50e549236600", "software": {"batman-adv": {"version": "2013.4.0", "compat": 14}, "autoupdater": {"enabled": true, "branch": "stable"}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}, "fastd": {"version": "v17", "enabled": true}}, "hostname": "VPN-Offloader-OKFL", "hardware": {"model": "Pentium(R) Dual-Core CPU E6700 @ 3.20GHz", "nproc": 1}, "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "network": {"addresses": ["fddf:bf7:10:1:52e5:49ff:fe23:6600", "fe80:0:0:0:52e5:49ff:fe23:6600"], "mesh_interfaces": ["52:e9:49:23:66:00", "52:e6:4a:23:66:00"], "mac": "50:e5:49:23:66:00", "mesh": {"bat0": {"interfaces": {"tunnel": ["52:e9:49:23:66:00"], "other": ["52:e6:4a:23:66:00"]}}}}}, "statistics": {"uptime": 777051.95, "traffic": {"mgmt_tx": {"bytes": 918466397, "packets": 11006951}, "rx": {"bytes": 268470637, "packets": 3577233}, "tx": {"bytes": 19210091, "packets": 63340, "dropped": 19}, "forward": {"bytes": 56644305222, "packets": 61385811}, "mgmt_rx": {"bytes": 1074058043, "packets": 18892159}}, "memory_usage": 0.018270056767360043, "loadavg": 0, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.19144889182931}, "firstseen": "2015-10-22T19:05:30", "flags": {"gateway": false, "online": true}}, "f81a67d8df94": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "software": {"batman-adv": {"version": "2013.4.0", "compat": 14}, "autoupdater": {"enabled": true, "branch": "stable"}, "firmware": {"base": "gluon-v2015.1.2-1-g2a5b705", "release": "2015.1.2-beta-08-31_19_12"}, "fastd": {"version": "v17", "enabled": true}}, "node_id": "f81a67d8df94", "location": {"latitude": 54.771627, "longitude": 9.432521}, "hostname": "WDR3600-100Mbit", "hardware": {"nproc": 1, "model": "TP-Link TL-WDR3600 v1"}, "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "network": {"addresses": ["fddf:bf7:10:1:fa1a:67ff:fed8:df94", "fe80:0:0:0:fa1a:67ff:fed8:df94"], "mesh": {"bat0": {"interfaces": {"wireless": ["fa:1d:68:d8:df:94", "fa:1d:69:d8:df:94"], "tunnel": ["fa:1e:67:d8:df:94"]}}}, "mac": "f8:1a:67:d8:df:94", "mesh_interfaces": ["fa:1e:67:d8:df:94", "fa:1d:69:d8:df:94", "fa:1d:68:d8:df:94"]}}, "statistics": {"uptime": 264732.04, "traffic": {"mgmt_tx": {"bytes": 475484318, "packets": 5498698}, "rx": {"bytes": 5533574045, "packets": 5190961}, "tx": {"bytes": 240878783, "packets": 2662991, "dropped": 2103}, "forward": {"bytes": 155743816, "packets": 167524}, "mgmt_rx": {"bytes": 215296612, "packets": 4717131}}, "memory_usage": 0.18143820651657638, "loadavg": 0.07, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.061643835616438}, "firstseen": "2015-09-05T05:59:56", "flags": {"gateway": false, "online": true}}, "14cc203b2aba": {"lastseen": "2015-08-16T13:11:57", "nodeinfo": {"system": {"site_code": "fffl"}, "node_id": "14cc203b2aba", "software": {"autoupdater": {"enabled": true, "branch": "beta"}, "fastd": {"version": "v17", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2015.1-4-gbdd0dbd", "release": "2015.1.0-beta-2015-06-14_17.27"}}, "hostname": "freifunk-Test001", "hardware": {"model": "TP-Link TL-WR841N/ND v9", "nproc": 1}, "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fe3b:2aba", "fe80:0:0:0:16cc:20ff:fe3b:2aba"], "mesh": {"bat0": {"interfaces": {"wireless": ["16:cf:21:3b:2a:ba"], "tunnel": ["16:d0:20:3b:2a:ba"]}}}, "mac": "14:cc:20:3b:2a:ba", "mesh_interfaces": ["16:d0:20:3b:2a:ba", "16:cf:21:3b:2a:ba"]}}, "statistics": {"clients": 0}, "firstseen": "2015-06-18T23:31:27", "flags": {"gateway": false, "online": false}}, "c46e1fe86772": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1fe86772", "location": {"latitude": 54.871399, "longitude": 8.417271}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "info@it-walther.de"}, "hostname": "freifunk-duerken_whg3", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fee8:6772", "fe80:0:0:0:c66e:1fff:fee8:6772"], "mesh_interfaces": ["c6:72:1f:e8:67:72", "c6:71:20:e8:67:72"], "mac": "c4:6e:1f:e8:67:72"}}, "statistics": {"uptime": 2182208.28, "traffic": {"mgmt_tx": {"bytes": 2518557688, "packets": 29733601}, "rx": {"bytes": 1643571651, "packets": 11285634}, "tx": {"bytes": 595153607, "packets": 1368824, "dropped": 5866}, "forward": {"bytes": 439554, "packets": 1925}, "mgmt_rx": {"bytes": 3844579239, "packets": 64125702}}, "memory_usage": 0.5571725571725572, "loadavg": 0.02, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.36875}, "firstseen": "2015-09-22T08:25:55", "flags": {"gateway": false, "online": true}}, "c46e1f86f176": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1f86f176", "location": {"latitude": 54.7843853, "longitude": 9.4544572}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "freifunk-adelby-test", "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fe86:f176"], "mesh_interfaces": ["c6:72:1f:86:f1:76", "c6:71:20:86:f1:76"], "mac": "c4:6e:1f:86:f1:76"}}, "statistics": {"uptime": 1674897.62, "traffic": {"mgmt_tx": {"bytes": 1952099783, "packets": 22889551}, "rx": {"bytes": 2097800191, "packets": 9107880}, "tx": {"bytes": 185597404, "packets": 1191421, "dropped": 635}, "forward": {"bytes": 1056, "packets": 12}, "mgmt_rx": {"bytes": 1227323453, "packets": 27947333}}, "memory_usage": 0.6902286902286903, "loadavg": 0.03, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.4}, "firstseen": "2015-08-11T11:03:32", "flags": {"gateway": false, "online": true}}, "14cc20872780": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": false, "branch": "stable"}}, "node_id": "14cc20872780", "location": {"latitude": 54.793042481946, "longitude": 9.430865007171}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "knusper", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fe87:2780", "fddf:bf7:10:1:16cc:20ff:fe87:2780"], "mesh_interfaces": ["16:d0:20:87:27:80", "16:cf:21:87:27:80"], "mac": "14:cc:20:87:27:80"}}, "statistics": {"uptime": 4941347.83, "traffic": {"mgmt_tx": {"bytes": 5349320009, "packets": 65768719}, "rx": {"bytes": 131379479227, "packets": 126491757}, "tx": {"bytes": 9528965843, "packets": 66956976, "dropped": 53615}, "forward": {"bytes": 1061448, "packets": 3451}, "mgmt_rx": {"bytes": 3350241664, "packets": 77559412}}, "memory_usage": 0.5837837837837838, "loadavg": 0.07, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "30b5c26eb4fc": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c26eb4fc", "location": {"latitude": 54.785378, "longitude": 9.448778}, "hardware": {"model": "TP-Link TL-WDR4300 v1"}, "owner": {"contact": "david@baumgarten.rocks"}, "hostname": "wheeeeeee", "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:fe6e:b4fc", "fddf:bf7:10:1:32b5:c2ff:fe6e:b4fc"], "mesh_interfaces": ["32:b8:c3:6e:b4:fc", "32:b8:c4:6e:b4:fc"], "mac": "30:b5:c2:6e:b4:fc"}}, "statistics": {"uptime": 36037.61, "traffic": {"mgmt_tx": {"bytes": 43523886, "packets": 540590}, "rx": {"bytes": 2249285539, "packets": 1843184}, "tx": {"bytes": 80445874, "packets": 889522, "dropped": 167}, "forward": {"bytes": 389962, "packets": 582}, "mgmt_rx": {"bytes": 44256221, "packets": 534305}}, "memory_usage": 0.14226908584275355, "loadavg": 0.04, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.0625}, "firstseen": "2015-09-22T18:48:52", "flags": {"gateway": false, "online": true}}, "e8de273042e6": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "e8de273042e6", "location": {"latitude": 54.778385192392, "longitude": 9.4417780637741}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "freifunk@anspunktf.de"}, "hostname": "Pondroad", "network": {"addresses": ["fe80:0:0:0:eade:27ff:fe30:42e6", "fddf:bf7:10:1:eade:27ff:fe30:42e6"], "mesh_interfaces": ["ea:e2:27:30:42:e6", "ea:e1:28:30:42:e6"], "mac": "e8:de:27:30:42:e6"}}, "statistics": {"uptime": 340248.3, "traffic": {"mgmt_tx": {"bytes": 393750413, "packets": 4557059}, "rx": {"bytes": 2580854269, "packets": 3551651}, "tx": {"bytes": 230531721, "packets": 1693591, "dropped": 6231}, "forward": {"bytes": 6203, "packets": 28}, "mgmt_rx": {"bytes": 246333101, "packets": 5592093}}, "memory_usage": 0.571032571032571, "loadavg": 0.08, "gateway": "snowden", "clients": 5, "rootfs_usage": 0.39375}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "f8d11172b0ae": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "f8d11172b0ae", "location": {"latitude": 54.778527, "longitude": 9.447886}, "hardware": {"model": "TP-Link TL-WR841N/ND v7"}, "owner": {"contact": "spam2gyrdon@gmail.com"}, "hostname": "Lambda2-by-Gyrdon", "network": {"addresses": ["fe80:0:0:0:fad1:11ff:fe72:b0ae", "fddf:bf7:10:1:fad1:11ff:fe72:b0ae"], "mesh_interfaces": ["fa:d5:11:72:b0:ae", "fa:d4:12:72:b0:ae"], "mac": "f8:d1:11:72:b0:ae"}}, "statistics": {"uptime": 1249650.84, "traffic": {"mgmt_tx": {"bytes": 1468526209, "packets": 17119970}, "rx": {"bytes": 2554091072, "packets": 7003416}, "tx": {"bytes": 137051769, "packets": 1153452, "dropped": 907}, "forward": {"bytes": 57471, "packets": 190}, "mgmt_rx": {"bytes": 923885960, "packets": 20976025}}, "memory_usage": 0.5578655578655578, "loadavg": 0, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.40277777777778}, "firstseen": "2015-07-18T17:03:39", "flags": {"gateway": false, "online": true}}, "f81a677f628c": {"lastseen": "2015-10-15T23:21:32", "nodeinfo": {"location": {"latitude": 54.77759, "longitude": 9.42495}, "node_id": "f81a677f628c", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "dieexxe", "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "owner": {"contact": "dieexxe.de"}, "network": {"addresses": ["fddf:bf7:10:1:fa1a:67ff:fe7f:628c", "fe80:0:0:0:fa1a:67ff:fe7f:628c"], "mesh_interfaces": ["fa:1e:67:7f:62:8c", "fa:1d:68:7f:62:8c"], "mac": "f8:1a:67:7f:62:8c"}}, "statistics": {"clients": 0}, "firstseen": "2015-09-21T20:08:29", "flags": {"gateway": false, "online": false}}, "647002746094": {"lastseen": "2015-06-29T19:08:40", "nodeinfo": {"node_id": "647002746094", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "bigfoot", "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "owner": {"contact": "robert@sysop.dk"}, "network": {"addresses": ["fe80:0:0:0:6670:2ff:fe74:6094", "fddf:bf7:10:1:6670:2ff:fe74:6094"], "mesh_interfaces": ["66:73:03:74:60:94", "66:74:02:74:60:94", "64:70:02:74:60:93"], "mac": "64:70:02:74:60:94"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-17T17:59:38", "flags": {"gateway": false, "online": false}}, "e894f6d42738": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "e894f6d42738", "software": {"firmware": {"base": "gluon-v2014.4", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WDR3600 v1"}, "owner": {"contact": "freifunk@schloss.stras.se"}, "hostname": "sonnendeck", "network": {"addresses": ["fddf:bf7:10:1:ea94:f6ff:fed4:2738", "fe80:0:0:0:ea94:f6ff:fed4:2738"], "mesh_interfaces": ["ea:97:f8:d4:27:38", "ea:95:f6:d4:27:38"], "mac": "e8:94:f6:d4:27:38"}}, "statistics": {"uptime": 1558877.18, "traffic": {"mgmt_tx": {"bytes": 1424936704, "packets": 17949169}, "rx": {"bytes": 245670073566, "packets": 208968579}, "tx": {"bytes": 28904518224, "packets": 140890436, "dropped": 178951}, "forward": {"bytes": 95332782, "packets": 274123}, "mgmt_rx": {"bytes": 1509851969, "packets": 18449280}}, "memory_usage": 0.14483391912859, "loadavg": 0, "gateway": "snowden", "clients": 6, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "14cc2098051c": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc2098051c", "location": {"latitude": 54.78669, "longitude": 8.827284}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "niebuell-nospa", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fe98:51c", "fddf:bf7:10:1:16cc:20ff:fe98:51c"], "mesh_interfaces": ["16:cf:21:98:05:1c"], "mac": "14:cc:20:98:05:1c"}}, "statistics": {"uptime": 2790373.39, "traffic": {"mgmt_tx": {"bytes": 1171261898, "packets": 14906181}, "rx": {"bytes": 1974207760, "packets": 13710578}, "tx": {"bytes": 352859053, "packets": 1873538, "dropped": 4421}, "forward": {"bytes": 1537533001, "packets": 3024561}, "mgmt_rx": {"bytes": 2395778331, "packets": 31176282}}, "memory_usage": 0.2973854078372563, "loadavg": 0.11, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-06-25T11:10:42", "flags": {"gateway": false, "online": true}}, "c46e1fa113a0": {"lastseen": "2015-08-09T11:27:04", "nodeinfo": {"location": {"latitude": 54.869371, "longitude": 8.735852}, "node_id": "c46e1fa113a0", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk-it-walther", "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@it-walther.de"}, "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fea1:13a0", "fddf:bf7:10:1:c66e:1fff:fea1:13a0"], "mesh_interfaces": ["c6:72:1f:a1:13:a0", "c6:71:20:a1:13:a0"], "mac": "c4:6e:1f:a1:13:a0"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-22T22:50:42", "flags": {"gateway": false, "online": false}}, "e8de27304206": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "e8de27304206", "location": {"latitude": 54.786725, "longitude": 9.432426}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "hester.sara@gmail.com"}, "hostname": "Fluttershy", "network": {"addresses": ["fe80:0:0:0:eade:27ff:fe30:4206", "fddf:bf7:10:1:eade:27ff:fe30:4206"], "mesh_interfaces": ["ea:e2:27:30:42:06", "ea:e1:28:30:42:06"], "mac": "e8:de:27:30:42:06"}}, "statistics": {"uptime": 270039.14, "traffic": {"mgmt_tx": {"bytes": 326762593, "packets": 4037199}, "rx": {"bytes": 707207929, "packets": 1739804}, "tx": {"bytes": 117564001, "packets": 495647, "dropped": 1324}, "forward": {"bytes": 29277780, "packets": 68156}, "mgmt_rx": {"bytes": 466426491, "packets": 5905182}}, "memory_usage": 0.5466389466389466, "loadavg": 0.29, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "e894f6d13654": {"lastseen": "2015-08-09T13:52:11", "nodeinfo": {"location": {"latitude": 54.869391, "longitude": 8.735884}, "node_id": "e894f6d13654", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "IT-Walther-Outdoor", "hardware": {"model": "TP-Link TL-WR842N/ND v2"}, "owner": {"contact": "info@it-walther.de"}, "network": {"addresses": ["fddf:bf7:10:1:ea94:f6ff:fed1:3654", "fe80:0:0:0:ea94:f6ff:fed1:3654"], "mesh_interfaces": ["ea:98:f6:d1:36:54", "ea:97:f7:d1:36:54"], "mac": "e8:94:f6:d1:36:54"}}, "statistics": {"clients": 0}, "firstseen": "2015-08-03T18:13:39", "flags": {"gateway": false, "online": false}}, "14cc2097f124": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc2097f124", "location": {"latitude": 54.7925514, "longitude": 8.8168154}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "niebuell-frieswohnpark", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fe97:f124", "fddf:bf7:10:1:16cc:20ff:fe97:f124"], "mesh_interfaces": ["16:d0:20:97:f1:24", "16:cf:21:97:f1:24"], "mac": "14:cc:20:97:f1:24"}}, "statistics": {"uptime": 4601270.32, "traffic": {"mgmt_tx": {"bytes": 4870142789, "packets": 59738820}, "rx": {"bytes": 4713370036, "packets": 22399629}, "tx": {"bytes": 575485458, "packets": 3362111, "dropped": 22226}, "forward": {"bytes": 1423640, "packets": 4490}, "mgmt_rx": {"bytes": 3047615350, "packets": 70453392}}, "memory_usage": 0.2971898024385473, "loadavg": 0.16, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-07-02T15:02:01", "flags": {"gateway": false, "online": true}}, "e894f60ca9f0": {"lastseen": "2015-10-21T09:46:59", "nodeinfo": {"location": {"latitude": 54.762918, "longitude": 8.288243}, "node_id": "e894f60ca9f0", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "sylt-hoernum-am-renning", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "markus@lindenberg.io"}, "network": {"addresses": ["fe80:0:0:0:ea94:f6ff:fe0c:a9f0", "fddf:bf7:10:1:ea94:f6ff:fe0c:a9f0"], "mesh_interfaces": ["ea:98:f6:0c:a9:f0", "ea:97:f7:0c:a9:f0"], "mac": "e8:94:f6:0c:a9:f0"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "30b5c2c88e06": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c2c88e06", "location": {"latitude": 54.782896, "longitude": 8.830166}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "freifunk-bauexpert", "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:fec8:8e06"], "mesh_interfaces": ["32:b9:c2:c8:8e:06", "32:b8:c3:c8:8e:06"], "mac": "30:b5:c2:c8:8e:06"}}, "statistics": {"uptime": 2529714.47, "traffic": {"mgmt_tx": {"bytes": 2901430367, "packets": 34600301}, "rx": {"bytes": 7045404748, "packets": 17796787}, "tx": {"bytes": 1014205575, "packets": 5560351, "dropped": 8873}, "forward": {"bytes": 675346, "packets": 2435}, "mgmt_rx": {"bytes": 1819979891, "packets": 41791321}}, "memory_usage": 0.26771858903305734, "loadavg": 0.28, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-10-02T11:09:32", "flags": {"gateway": false, "online": true}}, "e8de2755a0d4": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "e8de2755a0d4", "location": {"latitude": 54.66430634, "longitude": 9.40115534}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "chrvr@web.de"}, "hostname": "freifunk-tarp-italia", "network": {"addresses": ["fe80:0:0:0:eade:27ff:fe55:a0d4", "fddf:bf7:10:1:eade:27ff:fe55:a0d4"], "mesh_interfaces": ["ea:e2:27:55:a0:d4", "ea:e1:28:55:a0:d4"], "mac": "e8:de:27:55:a0:d4"}}, "statistics": {"uptime": 882452.05, "traffic": {"mgmt_tx": {"bytes": 972827323, "packets": 11613391}, "rx": {"bytes": 895640747, "packets": 4165272}, "tx": {"bytes": 84705122, "packets": 623103, "dropped": 1641}, "forward": {"bytes": 2134633311, "packets": 3200499}, "mgmt_rx": {"bytes": 1071983462, "packets": 19574885}}, "memory_usage": 0.548995148995149, "loadavg": 0.05, "gateway": "snowden", "clients": 4, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "14cc205a8898": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc205a8898", "location": {"latitude": 54.899096, "longitude": 8.312868}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "freifunk-sylt-vital", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fe5a:8898", "fe80:0:0:0:16cc:20ff:fe5a:8898"], "mesh_interfaces": ["16:cf:21:5a:88:98", "16:d0:20:5a:88:98"], "mac": "14:cc:20:5a:88:98"}}, "statistics": {"uptime": 117516.43, "traffic": {"mgmt_tx": {"bytes": 141562117, "packets": 1627339}, "rx": {"bytes": 263092047, "packets": 819158}, "tx": {"bytes": 80799467, "packets": 333850, "dropped": 1007}, "forward": {"bytes": 1073836343, "packets": 1302676}, "mgmt_rx": {"bytes": 226342479, "packets": 3747261}}, "memory_usage": 0.5585585585585586, "loadavg": 0.18, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.36875}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "e8de2730446e": {"lastseen": "2015-08-18T09:15:53", "nodeinfo": {"node_id": "e8de2730446e", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "SSW-Flensburg", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "kontakt@freifunk-flensburg.de"}, "network": {"addresses": ["fe80:0:0:0:eade:27ff:fe30:446e", "fddf:bf7:10:1:eade:27ff:fe30:446e"], "mesh_interfaces": ["ea:e2:27:30:44:6e", "ea:e1:28:30:44:6e"], "mac": "e8:de:27:30:44:6e"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-17T08:17:53", "flags": {"gateway": false, "online": false}}, "10feed656544": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "hardware": {"nproc": 1, "model": "TP-Link TL-WR1043N/ND v1"}, "node_id": "10feed656544", "software": {"batman-adv": {"version": "2013.4.0", "compat": 14}, "autoupdater": {"enabled": true, "branch": "stable"}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}, "fastd": {"version": "v17", "enabled": false}}, "hostname": "1043NDv1-Testnode", "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "network": {"addresses": ["fddf:bf7:10:1:12fe:edff:fe65:6544", "fe80:0:0:0:12fe:edff:fe65:6544"], "mesh_interfaces": ["12:01:ee:65:65:44", "12:ff:ed:65:65:44"], "mac": "10:fe:ed:65:65:44", "mesh": {"bat0": {"interfaces": {"wireless": ["12:01:ee:65:65:44"], "other": ["12:ff:ed:65:65:44"]}}}}}, "statistics": {"uptime": 28072.37, "traffic": {"mgmt_tx": {"bytes": 33887117, "packets": 415535}, "rx": {"bytes": 150988827, "packets": 262331}, "tx": {"bytes": 9948516, "packets": 43738, "dropped": 34}, "forward": {"bytes": 28033, "packets": 69}, "mgmt_rx": {"bytes": 17194301, "packets": 205239}}, "memory_usage": 0.5616077616077616, "loadavg": 0, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.066780821917808}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "7e9f2af622b3": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "node_id": "7e9f2af622b3", "software": {"firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v17", "enabled": true}}, "hardware": {"nproc": 1, "model": "Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz"}, "hostname": "Sp33dyT3ra8yt3s", "network": {"addresses": ["fddf:bf7:10:1:7c9f:2aff:fef6:22b3", "fe80:0:0:0:7c9f:2aff:fef6:22b3"], "mesh": {"bat0": {"interfaces": {"tunnel": ["7e:a3:2a:f6:22:b3"]}}}, "mac": "7e:9f:2a:f6:22:b3", "mesh_interfaces": ["7e:a3:2a:f6:22:b3"]}}, "statistics": {"uptime": 1370400.76, "traffic": {"mgmt_tx": {"bytes": 806495736, "packets": 9494239}, "rx": {"bytes": 1608405790116, "packets": 1204048523}, "tx": {"bytes": 212174777562, "packets": 760511729, "dropped": 1501}, "forward": {"bytes": 0, "packets": 0}, "mgmt_rx": {"bytes": 1013180306, "packets": 23028931}}, "memory_usage": 0.09687650168188366, "loadavg": 0.08, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.17027786966589}, "firstseen": "2015-10-08T22:15:04", "flags": {"gateway": false, "online": true}}, "24a43cfac530": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": false, "branch": "stable"}}, "node_id": "24a43cfac530", "location": {"latitude": 54.7942611509, "longitude": 9.42980966938}, "hardware": {"model": "Ubiquiti Nanostation M"}, "owner": {"contact": "freifunk@schloss.stras.se"}, "hostname": "sstr_backbone_5Ghz", "network": {"addresses": ["fddf:bf7:10:1:26a4:3cff:fefa:c530", "fe80:0:0:0:26a4:3cff:fefa:c530"], "mesh_interfaces": ["26:a7:3d:fa:c5:30", "24:a4:3c:fb:c5:30"], "mac": "24:a4:3c:fa:c5:30"}}, "statistics": {"uptime": 3267450.22, "traffic": {"mgmt_tx": {"bytes": 2950868203, "packets": 37936676}, "rx": {"bytes": 785112514, "packets": 12520119}, "tx": {"bytes": 61199067, "packets": 243227, "dropped": 3960}, "forward": {"bytes": 21120, "packets": 240}, "mgmt_rx": {"bytes": 1613247770, "packets": 19293315}}, "memory_usage": 0.5663201663201662, "loadavg": 0.79, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.071828358208955}, "firstseen": "2015-06-22T19:43:37", "flags": {"gateway": false, "online": true}}, "30b5c2864914": {"lastseen": "2015-06-23T00:20:29", "nodeinfo": {"location": {"latitude": 54.791735, "longitude": 9.442417}, "node_id": "30b5c2864914", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "ok_backbone_2.4Ghz", "hardware": {"model": "TP-Link CPE210 v1.0"}, "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:fe86:4914", "fddf:bf7:10:1:32b5:c2ff:fe86:4914"], "mesh_interfaces": ["32:b9:c2:86:49:14", "32:b8:c3:86:49:14"], "mac": "30:b5:c2:86:49:14"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-23T00:05:02", "flags": {"gateway": false, "online": false}}, "e8de272ff110": {"lastseen": "2015-08-28T13:41:37", "nodeinfo": {"location": {"latitude": 54.81418, "longitude": 9.41617}, "node_id": "e8de272ff110", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "DerRouter", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "jan.koppatscheck@gmail.com"}, "network": {"addresses": ["fe80:0:0:0:eade:27ff:fe2f:f110", "fddf:bf7:10:1:eade:27ff:fe2f:f110"], "mesh_interfaces": ["ea:e2:27:2f:f1:10"], "mac": "e8:de:27:2f:f1:10"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "c46e1fd03c32": {"lastseen": "2015-10-21T19:57:03", "nodeinfo": {"location": {"latitude": 54.786801725653, "longitude": 9.4185876846313}, "node_id": "c46e1fd03c32", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "FF-Flensburg-Continale-Albrecht-28", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "Telefon: 02306-996641"}, "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fed0:3c32", "fe80:0:0:0:c66e:1fff:fed0:3c32"], "mesh_interfaces": ["c6:72:1f:d0:3c:32", "c6:71:20:d0:3c:32"], "mac": "c4:6e:1f:d0:3c:32"}}, "statistics": {"clients": 0}, "firstseen": "2015-09-07T17:00:40", "flags": {"gateway": false, "online": false}}, "e894f6cd586c": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "hardware": {"nproc": 1, "model": "TP-Link TL-WDR4300 v1"}, "node_id": "e894f6cd586c", "software": {"firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "autoupdater": {"enabled": true, "branch": "beta"}, "fastd": {"version": "v17", "enabled": false}}, "hostname": "AP-OKFL", "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "network": {"addresses": ["fe80:0:0:0:ea94:f6ff:fecd:586c", "fddf:bf7:10:1:ea94:f6ff:fecd:586c"], "mesh": {"bat0": {"interfaces": {"wireless": ["ea:97:f7:cd:58:6c", "ea:97:f8:cd:58:6c"], "other": ["ea:95:f6:cd:58:6c"]}}}, "mac": "e8:94:f6:cd:58:6c", "mesh_interfaces": ["ea:97:f7:cd:58:6c", "ea:97:f8:cd:58:6c", "ea:95:f6:cd:58:6c"]}}, "statistics": {"uptime": 440768.48, "traffic": {"mgmt_tx": {"bytes": 799320728, "packets": 9881386}, "rx": {"bytes": 37171829693, "packets": 29662693}, "tx": {"bytes": 1978505837, "packets": 16294518, "dropped": 3163}, "forward": {"bytes": 225392841, "packets": 247317}, "mgmt_rx": {"bytes": 284921561, "packets": 3239622}}, "memory_usage": 0.1891010417656186, "loadavg": 0.15, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.063356164383562}, "firstseen": "2015-09-07T17:54:08", "flags": {"gateway": false, "online": true}}, "e8de2755a0e8": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "e8de2755a0e8", "location": {"latitude": 54.66281939, "longitude": 9.39951047}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "chrvr@web.de"}, "hostname": "freifunk-tarp-bistro", "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe55:a0e8", "fe80:0:0:0:eade:27ff:fe55:a0e8"], "mesh_interfaces": ["ea:e1:28:55:a0:e8", "ea:e2:27:55:a0:e8"], "mac": "e8:de:27:55:a0:e8"}}, "statistics": {"uptime": 3179089.18, "traffic": {"mgmt_tx": {"bytes": 3595380007, "packets": 44051827}, "rx": {"bytes": 2597050442, "packets": 16291749}, "tx": {"bytes": 246302070, "packets": 1558743, "dropped": 2111}, "forward": {"bytes": 17387613395, "packets": 23772989}, "mgmt_rx": {"bytes": 3903017129, "packets": 72940303}}, "memory_usage": 0.5851697851697852, "loadavg": 0.01, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "e8de27300398": {"lastseen": "2015-08-31T08:01:17", "nodeinfo": {"location": {"latitude": 54.788069, "longitude": 9.432108}, "node_id": "e8de27300398", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "CafeMin", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "network": {"addresses": ["fe80:0:0:0:eade:27ff:fe30:398", "fddf:bf7:10:1:eade:27ff:fe30:398"], "mesh_interfaces": ["ea:e2:27:30:03:98", "ea:e1:28:30:03:98"], "mac": "e8:de:27:30:03:98"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "14cc204d2868": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc204d2868", "location": {"latitude": 54.7931264, "longitude": 8.816633}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "niebuell-frieswohnpark2", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fe4d:2868", "fddf:bf7:10:1:16cc:20ff:fe4d:2868"], "mesh_interfaces": ["16:d0:20:4d:28:68", "16:cf:21:4d:28:68"], "mac": "14:cc:20:4d:28:68"}}, "statistics": {"uptime": 4599630.19, "traffic": {"mgmt_tx": {"bytes": 4883530205, "packets": 59907493}, "rx": {"bytes": 10253321750, "packets": 26418051}, "tx": {"bytes": 981521031, "packets": 7403106, "dropped": 9817}, "forward": {"bytes": 1120451, "packets": 3764}, "mgmt_rx": {"bytes": 3056122356, "packets": 70654958}}, "memory_usage": 0.3105561713503293, "loadavg": 0.1, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.0625}, "firstseen": "2015-09-08T07:12:49", "flags": {"gateway": false, "online": true}}, "6466b3c13896": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "hostname": "moinsen", "network": {"addresses": ["fddf:bf7:10:1:6666:b3ff:fec1:3896", "fe80:0:0:0:6666:b3ff:fec1:3896"], "mesh_interfaces": ["66:69:b4:c1:38:96", "66:6a:b3:c1:38:96"], "mac": "64:66:b3:c1:38:96"}, "node_id": "6466b3c13896"}, "statistics": {"uptime": 1972270.23, "traffic": {"mgmt_tx": {"bytes": 2294766057, "packets": 27091990}, "rx": {"bytes": 5175501907, "packets": 12992632}, "tx": {"bytes": 537088408, "packets": 3302514, "dropped": 1982}, "forward": {"bytes": 18486436765, "packets": 22783851}, "mgmt_rx": {"bytes": 2594857318, "packets": 47538507}}, "memory_usage": 0.5884961884961886, "loadavg": 0.04, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.3625}, "firstseen": "2015-10-08T21:44:26", "flags": {"gateway": false, "online": true}}, "14cc20cd1efc": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "hardware": {"nproc": 1, "model": "TP-Link TL-WR1043N/ND v2"}, "node_id": "14cc20cd1efc", "location": {"latitude": 54.663291, "longitude": 9.704916}, "hostname": "Stoltoft", "software": {"batman-adv": {"version": "2013.4.0", "compat": 14}, "autoupdater": {"enabled": false, "branch": "beta"}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}, "fastd": {"version": "v17", "enabled": true}}, "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fecd:1efc", "fddf:bf7:10:1:16cc:20ff:fecd:1efc"], "mesh_interfaces": ["16:d0:20:cd:1e:fc"], "mac": "14:cc:20:cd:1e:fc", "mesh": {"bat0": {"interfaces": {"tunnel": ["16:d0:20:cd:1e:fc"]}}}}}, "statistics": {"uptime": 137676.1, "traffic": {"mgmt_tx": {"bytes": 83147246, "packets": 962484}, "rx": {"bytes": 1471858489, "packets": 1758086}, "tx": {"bytes": 88253029, "packets": 760892, "dropped": 1413}, "forward": {"bytes": 352, "packets": 4}, "mgmt_rx": {"bytes": 104335838, "packets": 2369728}}, "memory_usage": 0.2613288126752298, "loadavg": 0.01, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.063356164383562}, "firstseen": "2015-08-11T15:32:59", "flags": {"gateway": false, "online": true}}, "14cc20cd4e5a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc20cd4e5a", "location": {"latitude": 54.78596004804, "longitude": 8.8270090520382}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "schmaeschke@service2solution.de"}, "hostname": "niebuell-stadtbuecherei2", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fecd:4e5a", "fe80:0:0:0:16cc:20ff:fecd:4e5a"], "mesh_interfaces": ["16:cf:21:cd:4e:5a"], "mac": "14:cc:20:cd:4e:5a"}}, "statistics": {"uptime": 11328253.84, "traffic": {"mgmt_tx": {"bytes": 5192139342, "packets": 69485118}, "rx": {"bytes": 163757271706, "packets": 175456225}, "tx": {"bytes": 13229586737, "packets": 93637729, "dropped": 1045116}, "forward": {"bytes": 51175101331, "packets": 68683901}, "mgmt_rx": {"bytes": 13612745964, "packets": 187999112}}, "memory_usage": 0.2719567060050857, "loadavg": 0.05, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-06-19T17:19:12", "flags": {"gateway": false, "online": true}}, "e8de27303f86": {"lastseen": "2015-10-09T11:28:23", "nodeinfo": {"location": {"latitude": 54.787839, "longitude": 9.432325}, "node_id": "e8de27303f86", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Friends", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe30:3f86", "fe80:0:0:0:eade:27ff:fe30:3f86"], "mesh_interfaces": ["ea:e2:27:30:3f:86", "ea:e1:28:30:3f:86"], "mac": "e8:de:27:30:3f:86"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "30b5c2ed13c2": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c2ed13c2", "location": {"latitude": 54.48406, "longitude": 9.3058}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "free_honeypot", "network": {"addresses": ["fddf:bf7:10:1:32b5:c2ff:feed:13c2", "fe80:0:0:0:32b5:c2ff:feed:13c2"], "mesh_interfaces": ["32:b9:c2:ed:13:c2", "32:b8:c3:ed:13:c2"], "mac": "30:b5:c2:ed:13:c2"}}, "statistics": {"uptime": 2685226.44, "traffic": {"mgmt_tx": {"bytes": 3051521653, "packets": 36388031}, "rx": {"bytes": 880016273, "packets": 12271060}, "tx": {"bytes": 65934211, "packets": 330992, "dropped": 849}, "forward": {"bytes": 1056, "packets": 12}, "mgmt_rx": {"bytes": 1913800449, "packets": 43988809}}, "memory_usage": 0.5880803880803881, "loadavg": 0, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.40625}, "firstseen": "2015-09-30T16:04:07", "flags": {"gateway": false, "online": true}}, "a0f3c1896254": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "a0f3c1896254", "location": {"latitude": 54.780156, "longitude": 9.422663}, "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "hostname": "Giros-Knoten", "network": {"addresses": ["fddf:bf7:10:1:a2f3:c1ff:fe89:6254", "fe80:0:0:0:a2f3:c1ff:fe89:6254"], "mesh_interfaces": ["a2:f7:c1:89:62:54", "a2:f6:c2:89:62:54"], "mac": "a0:f3:c1:89:62:54"}}, "statistics": {"uptime": 530420.08, "traffic": {"mgmt_tx": {"bytes": 631189113, "packets": 7343093}, "rx": {"bytes": 5366449923, "packets": 6551993}, "tx": {"bytes": 402511258, "packets": 2890395, "dropped": 5903}, "forward": {"bytes": 222221, "packets": 569}, "mgmt_rx": {"bytes": 395208007, "packets": 8954715}}, "memory_usage": 0.5746361746361746, "loadavg": 0.2, "gateway": "snowden", "clients": 5, "rootfs_usage": 0.3625}, "firstseen": "2015-08-01T16:39:57", "flags": {"gateway": false, "online": true}}, "14cc2098044a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc2098044a", "location": {"latitude": 54.79001, "longitude": 8.833678}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "niebuell-neg", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fe98:44a"], "mesh_interfaces": ["16:d0:20:98:04:4a", "16:cf:21:98:04:4a"], "mac": "14:cc:20:98:04:4a"}}, "statistics": {"uptime": 1344712.74, "traffic": {"mgmt_tx": {"bytes": 1569195445, "packets": 18437964}, "rx": {"bytes": 19418043202, "packets": 23132939}, "tx": {"bytes": 1471212676, "packets": 13969185, "dropped": 18719}, "forward": {"bytes": 2615869, "packets": 8167}, "mgmt_rx": {"bytes": 985880187, "packets": 22400471}}, "memory_usage": 0.2748255851861512, "loadavg": 0.09, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.064189189189189}, "firstseen": "2015-06-25T11:10:42", "flags": {"gateway": false, "online": true}}, "54e6fcd52e6c": {"lastseen": "2015-08-07T16:06:14", "nodeinfo": {"location": {"latitude": 54.65447, "longitude": 9.41008}, "node_id": "54e6fcd52e6c", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk-tarp1", "hardware": {"model": "TP-Link TL-WR1043N/ND v1"}, "owner": {"contact": "dasnordlicht@bloglich.de"}, "network": {"addresses": ["fe80:0:0:0:56e6:fcff:fed5:2e6c", "fddf:bf7:10:1:56e6:fcff:fed5:2e6c"], "mesh_interfaces": ["56:ea:fc:d5:2e:6c", "56:e9:fd:d5:2e:6c"], "mac": "54:e6:fc:d5:2e:6c"}}, "statistics": {"clients": 0}, "firstseen": "2015-08-01T15:07:19", "flags": {"gateway": false, "online": false}}, "c46e1fb919e0": {"lastseen": "2015-10-22T20:38:41", "nodeinfo": {"system": {"site_code": "fffl"}, "location": {"latitude": 54.791629975001, "longitude": 9.4424057006836}, "node_id": "c46e1fb919e0", "software": {"autoupdater": {"enabled": true, "branch": "beta"}, "fastd": {"version": "v17", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}}, "hostname": "NordLab-e.V.-GatewayRouter", "hardware": {"model": "TP-Link TL-WR1043N/ND v2", "nproc": 1}, "owner": {"contact": "Nordlab e.V."}, "network": {"addresses": ["fe80:0:0:0:c66e:1fff:feb9:19e0", "fddf:bf7:10:1:c66e:1fff:feb9:19e0"], "mesh": {"bat0": {"interfaces": {"tunnel": ["c6:72:1f:b9:19:e0"], "other": ["c6:6f:20:b9:19:e0"]}}}, "mac": "c4:6e:1f:b9:19:e0", "mesh_interfaces": ["c6:6f:20:b9:19:e0", "c6:72:1f:b9:19:e0"]}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "10feed7f38f4": {"lastseen": "2015-10-29T23:40:03", "nodeinfo": {"system": {"site_code": "fffl"}, "location": {"latitude": 54.779551, "altitude": 10, "longitude": 9.43433}, "node_id": "10feed7f38f4", "software": {"autoupdater": {"enabled": true, "branch": "beta"}, "fastd": {"version": "v17", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}}, "hostname": "HusumerStr", "hardware": {"model": "TP-Link TL-WR1043N/ND v1", "nproc": 1}, "network": {"addresses": ["fddf:bf7:10:1:12fe:edff:fe7f:38f4", "fe80:0:0:0:12fe:edff:fe7f:38f4"], "mesh": {"bat0": {"interfaces": {"wireless": ["12:01:ee:7f:38:f4"], "tunnel": ["12:02:ed:7f:38:f4"]}}}, "mac": "10:fe:ed:7f:38:f4", "mesh_interfaces": ["12:02:ed:7f:38:f4", "12:01:ee:7f:38:f4"]}}, "statistics": {"clients": 0}, "firstseen": "2015-10-29T22:55:40", "flags": {"gateway": false, "online": false}}, "e894f6aad5e8": {"lastseen": "2015-10-09T10:52:07", "nodeinfo": {"location": {"latitude": 54.79119, "longitude": 9.43141}, "node_id": "e894f6aad5e8", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Hurrdurr_Norderstr", "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "network": {"addresses": ["fddf:bf7:10:1:ea94:f6ff:feaa:d5e8", "fe80:0:0:0:ea94:f6ff:feaa:d5e8"], "mesh_interfaces": ["ea:98:f6:aa:d5:e8", "ea:97:f7:aa:d5:e8"], "mac": "e8:94:f6:aa:d5:e8"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T09:00:13", "flags": {"gateway": false, "online": false}}, "e8de272ff0f0": {"lastseen": "2015-08-18T09:15:53", "nodeinfo": {"location": {"latitude": 54.793116, "longitude": 9.431336}, "node_id": "e8de272ff0f0", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "SYDSLESVIGSK-FORENING", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "Info@Freifnunk-Flensburg.de"}, "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe2f:f0f0", "fe80:0:0:0:eade:27ff:fe2f:f0f0"], "mesh_interfaces": ["ea:e2:27:2f:f0:f0", "ea:e1:28:2f:f0:f0"], "mac": "e8:de:27:2f:f0:f0"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-17T08:16:49", "flags": {"gateway": false, "online": false}}, "30b5c2ee63e6": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c2ee63e6", "location": {"latitude": 54.47525, "longitude": 9.047619}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "freifunk@spam.ruup.de"}, "hostname": "husum-speicher-hinten", "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:feee:63e6", "fddf:bf7:10:1:32b5:c2ff:feee:63e6"], "mesh_interfaces": ["32:b9:c2:ee:63:e6", "32:b8:c3:ee:63:e6"], "mac": "30:b5:c2:ee:63:e6"}}, "statistics": {"uptime": 1829493.84, "traffic": {"mgmt_tx": {"bytes": 2098737947, "packets": 25878773}, "rx": {"bytes": 1130981663, "packets": 8471107}, "tx": {"bytes": 116212678, "packets": 601572, "dropped": 578}, "forward": {"bytes": 36920014302, "packets": 39473022}, "mgmt_rx": {"bytes": 2995116269, "packets": 37745843}}, "memory_usage": 0.5614691614691615, "loadavg": 0.12, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-10-10T14:41:34", "flags": {"gateway": false, "online": true}}, "e8de273041f6": {"lastseen": "2015-09-21T19:26:59", "nodeinfo": {"location": {"latitude": 54.796825, "longitude": 9.425364}, "node_id": "e8de273041f6", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "artcore.homwer.com", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "Info@Freifnunk-Flensburg.de"}, "network": {"addresses": ["fe80:0:0:0:eade:27ff:fe30:41f6", "fddf:bf7:10:1:eade:27ff:fe30:41f6"], "mesh_interfaces": ["ea:e2:27:30:41:f6", "ea:e1:28:30:41:f6"], "mac": "e8:de:27:30:41:f6"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "10feed9c2174": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "10feed9c2174", "location": {"latitude": 54.78191, "longitude": 9.436922}, "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "owner": {"contact": "@roikiermedia"}, "hostname": "lili.roikier.media", "network": {"addresses": ["fddf:bf7:10:1:12fe:edff:fe9c:2174", "fe80:0:0:0:12fe:edff:fe9c:2174"], "mesh_interfaces": ["12:02:ed:9c:21:74", "12:01:ee:9c:21:74"], "mac": "10:fe:ed:9c:21:74"}}, "statistics": {"uptime": 228763.31, "traffic": {"mgmt_tx": {"bytes": 273638665, "packets": 3174022}, "rx": {"bytes": 10023174185, "packets": 9516823}, "tx": {"bytes": 1182910906, "packets": 5899740, "dropped": 10099}, "forward": {"bytes": 427658, "packets": 1139}, "mgmt_rx": {"bytes": 171138713, "packets": 3891116}}, "memory_usage": 0.576992376992377, "loadavg": 0.14, "gateway": "snowden", "clients": 4, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "e8de27303f52": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-unknown", "release": "S-1.1"}, "batman-adv": {"version": "2013.4.0"}, "fastd": {"version": "v14", "enabled": true}, "autoupdater": {"enabled": false, "branch": "stable"}}, "node_id": "e8de27303f52", "location": {"latitude": 54.78194, "longitude": 9.431328}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "@dumdidu"}, "hostname": "FriesischerBerg", "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe30:3f52", "fe80::eade:27ff:fe30:3f52"], "mesh_interfaces": ["ea:de:27:30:3f:52", "ea:de:27:31:3f:52"], "mac": "e8:de:27:30:3f:52"}}, "statistics": {"uptime": 390819.04, "traffic": {"mgmt_tx": {"bytes": 455449881, "packets": 5290396}, "rx": {"bytes": 2874975977, "packets": 4597148}, "tx": {"bytes": 873599706, "packets": 2674701, "dropped": 3254}, "forward": {"bytes": 151670, "packets": 543}, "mgmt_rx": {"bytes": 285035923, "packets": 6461703}}, "memory_usage": 0.5914007941941668, "loadavg": 0, "gateway": "snowden", "clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "e8de27bc83a4": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "e8de27bc83a4", "location": {"latitude": 54.511837, "longitude": 8.667333}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "freifunk@golfballmonster.de"}, "hostname": "freifunk-McCloud1", "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:febc:83a4", "fe80:0:0:0:eade:27ff:febc:83a4"], "mesh_interfaces": ["ea:e2:27:bc:83:a4", "ea:e1:28:bc:83:a4"], "mac": "e8:de:27:bc:83:a4"}}, "statistics": {"uptime": 777429.92, "traffic": {"mgmt_tx": {"bytes": 867741107, "packets": 10181496}, "rx": {"bytes": 6594762217, "packets": 8494361}, "tx": {"bytes": 945266287, "packets": 4394744, "dropped": 11129}, "forward": {"bytes": 1268, "packets": 14}, "mgmt_rx": {"bytes": 542873047, "packets": 12303171}}, "memory_usage": 0.26517571884984026, "loadavg": 0.14, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-08-07T08:31:22", "flags": {"gateway": false, "online": true}}, "7eb6b736d810": {"lastseen": "2015-10-08T21:12:51", "nodeinfo": {"system": {"site_code": "fffl"}, "node_id": "7eb6b736d810", "software": {"autoupdater": {"enabled": true, "branch": "beta"}, "fastd": {"version": "v17", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}}, "hostname": "Gluon-x86-Crypto01", "hardware": {"model": "Common KVM processor", "nproc": 1}, "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "network": {"addresses": ["fddf:bf7:10:1:7cb6:b7ff:fe36:d810", "fe80:0:0:0:7cb6:b7ff:fe36:d810"], "mesh": {"bat0": {"interfaces": {"tunnel": ["7e:ba:b7:36:d8:10"]}}}, "mac": "7e:b6:b7:36:d8:10", "mesh_interfaces": ["7e:ba:b7:36:d8:10"]}}, "statistics": {"clients": 0}, "firstseen": "2015-10-08T18:02:21", "flags": {"gateway": false, "online": false}}, "10feed931bc0": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "beta"}}, "node_id": "10feed931bc0", "location": {"latitude": 54.807997, "longitude": 9.422842}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "spam2gyrdon@gmail.com"}, "hostname": "Lambda1-by-Gyrdon", "network": {"addresses": ["fddf:bf7:10:1:12fe:edff:fe93:1bc0", "fe80:0:0:0:12fe:edff:fe93:1bc0"], "mesh_interfaces": ["12:02:ed:93:1b:c0", "12:01:ee:93:1b:c0"], "mac": "10:fe:ed:93:1b:c0"}}, "statistics": {"uptime": 242480.45, "traffic": {"mgmt_tx": {"bytes": 289851979, "packets": 3364762}, "rx": {"bytes": 5656957681, "packets": 6149103}, "tx": {"bytes": 481439840, "packets": 3530549, "dropped": 2407}, "forward": {"bytes": 151445, "packets": 575}, "mgmt_rx": {"bytes": 181221680, "packets": 4117756}}, "memory_usage": 0.27671643737367146, "loadavg": 0.25, "gateway": "snowden", "clients": 15, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-07-11T12:27:14", "flags": {"gateway": false, "online": true}}, "30b5c2ed32c0": {"lastseen": "2015-10-30T11:14:20", "nodeinfo": {"location": {"latitude": 54.632286, "longitude": 9.600732}, "node_id": "30b5c2ed32c0", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Angeln-0011", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "nordrunner@web.de"}, "network": {"addresses": ["fddf:bf7:10:1:32b5:c2ff:feed:32c0", "fe80:0:0:0:32b5:c2ff:feed:32c0"], "mesh_interfaces": ["32:b9:c2:ed:32:c0", "32:b8:c3:ed:32:c0"], "mac": "30:b5:c2:ed:32:c0"}}, "statistics": {"clients": 0}, "firstseen": "2015-10-24T02:33:08", "flags": {"gateway": false, "online": false}}, "c46e1fc9e162": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1fc9e162", "location": {"latitude": 54.79131, "longitude": 9.46765}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "freifunk-Nase-Engelsby02", "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fec9:e162", "fddf:bf7:10:1:c66e:1fff:fec9:e162"], "mesh_interfaces": ["c6:71:20:c9:e1:62"], "mac": "c4:6e:1f:c9:e1:62"}}, "statistics": {"uptime": 4785220.76, "traffic": {"mgmt_tx": {"bytes": 2586905017, "packets": 32968918}, "rx": {"bytes": 90435165423, "packets": 95213071}, "tx": {"bytes": 9657647758, "packets": 49091424, "dropped": 11706}, "forward": {"bytes": 57385591, "packets": 70555}, "mgmt_rx": {"bytes": 2612906635, "packets": 33132521}}, "memory_usage": 0.59002079002079, "loadavg": 0, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.375}, "firstseen": "2015-07-07T20:20:11", "flags": {"gateway": false, "online": true}}, "e894f63f56ce": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "e894f63f56ce", "location": {"latitude": 54.789812, "longitude": 9.433329}, "hardware": {"model": "TP-Link TL-WDR4300 v1"}, "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "hostname": "Wlanfr3ak-WDR4300-studylounge", "network": {"addresses": ["fe80:0:0:0:ea94:f6ff:fe3f:56ce", "fddf:bf7:10:1:ea94:f6ff:fe3f:56ce"], "mesh_interfaces": ["ea:98:f6:3f:56:ce", "ea:97:f7:3f:56:ce", "ea:97:f8:3f:56:ce"], "mac": "e8:94:f6:3f:56:ce"}}, "statistics": {"uptime": 123773.95, "traffic": {"mgmt_tx": {"bytes": 224073716, "packets": 2583961}, "rx": {"bytes": 1671379427, "packets": 2586111}, "tx": {"bytes": 1500050301, "packets": 1941076, "dropped": 2370}, "forward": {"bytes": 60131, "packets": 209}, "mgmt_rx": {"bytes": 93882297, "packets": 2133340}}, "memory_usage": 0.182673126246794, "loadavg": 0.19, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "14cc203b2e30": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "14cc203b2e30", "software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "cobra07@t-online.de"}, "hostname": "freifunk-cobra", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fe3b:2e30", "fddf:bf7:10:1:16cc:20ff:fe3b:2e30"], "mesh_interfaces": ["16:d0:20:3b:2e:30", "16:cf:21:3b:2e:30"], "mac": "14:cc:20:3b:2e:30"}}, "statistics": {"uptime": 3459657.98, "traffic": {"mgmt_tx": {"bytes": 3851189473, "packets": 46253699}, "rx": {"bytes": 1889723894, "packets": 15790342}, "tx": {"bytes": 100546796, "packets": 620519, "dropped": 628}, "forward": {"bytes": 88, "packets": 1}, "mgmt_rx": {"bytes": 2414901674, "packets": 55612850}}, "memory_usage": 0.6213444213444214, "loadavg": 0, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.3625}, "firstseen": "2015-09-19T12:43:42", "flags": {"gateway": false, "online": true}}, "14cc208a0aa7": {"lastseen": "2015-10-28T19:04:14", "nodeinfo": {"node_id": "14cc208a0aa7", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "schwerelosigkite", "hardware": {"model": "TP-Link TL-WDR4300 v1"}, "owner": {"contact": "freifunk@schloss.stras.se"}, "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fe8a:aa7", "fddf:bf7:10:1:16cc:20ff:fe8a:aa7"], "mesh_interfaces": ["16:d0:20:8a:0a:a7", "16:cf:22:8a:0a:a7"], "mac": "14:cc:20:8a:0a:a7"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "14cc20b4f333": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "14cc20b4f333", "software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WDR4300 v1"}, "owner": {"contact": "freifunk@schloss.stras.se"}, "hostname": "musikatelier", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:feb4:f333", "fe80:0:0:0:16cc:20ff:feb4:f333"], "mesh_interfaces": ["16:cf:21:b4:f3:33", "16:cf:22:b4:f3:33", "16:d0:20:b4:f3:33"], "mac": "14:cc:20:b4:f3:33"}}, "statistics": {"uptime": 7213920.91, "traffic": {"mgmt_tx": {"bytes": 11155189952, "packets": 144496363}, "rx": {"bytes": 1807108980, "packets": 28805335}, "tx": {"bytes": 145024192, "packets": 590687, "dropped": 7}, "forward": {"bytes": 1031115883964, "packets": 1248978303}, "mgmt_rx": {"bytes": 14347892681, "packets": 241240937}}, "memory_usage": 0.14689211867895258, "loadavg": 0.27, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.076013513513513}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "e8de27300ed6": {"lastseen": "2015-08-20T20:25:49", "nodeinfo": {"location": {"latitude": 54.773398, "longitude": 9.427454}, "node_id": "e8de27300ed6", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "FEWO-Lundweg", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe30:ed6", "fe80:0:0:0:eade:27ff:fe30:ed6"], "mesh_interfaces": ["ea:e2:27:30:0e:d6", "ea:e1:28:30:0e:d6"], "mac": "e8:de:27:30:0e:d6"}}, "statistics": {"clients": 0}, "firstseen": "2015-08-17T16:26:57", "flags": {"gateway": false, "online": false}}, "30b5c29b4a3a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "software": {"fastd": {"version": "v17", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2015.1.1", "release": "2015.1.0-beta-2015-07-25_12_08"}, "autoupdater": {"enabled": true, "branch": "beta"}}, "node_id": "30b5c29b4a3a", "location": {"latitude": 54.740544, "longitude": 9.571557}, "hostname": "Angeln-0004", "hardware": {"nproc": 1, "model": "TP-Link Archer C5 v1"}, "owner": {"contact": "nordrunner(at)web.de"}, "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:fe9b:4a3a", "fddf:bf7:10:1:32b5:c2ff:fe9b:4a3a"], "mesh_interfaces": ["32:b8:c4:9b:4a:3a", "32:b8:c3:9b:4a:3a", "32:b9:c2:9b:4a:3a"], "mac": "30:b5:c2:9b:4a:3a", "mesh": {"bat0": {"interfaces": {"wireless": ["32:b8:c3:9b:4a:3a", "32:b8:c4:9b:4a:3a"], "tunnel": ["32:b9:c2:9b:4a:3a"]}}}}}, "statistics": {"uptime": 665245.16, "traffic": {"mgmt_tx": {"bytes": 1177017632, "packets": 13655941}, "rx": {"bytes": 2538432707, "packets": 4699803}, "tx": {"bytes": 145151225, "packets": 1618966, "dropped": 1248}, "forward": {"bytes": 3238977644, "packets": 4488652}, "mgmt_rx": {"bytes": 1271122433, "packets": 21001032}}, "memory_usage": 0.250530315022954, "loadavg": 0.05, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.039022842639594}, "firstseen": "2015-07-07T02:22:16", "flags": {"gateway": false, "online": true}}, "647002f733ee": {"lastseen": "2015-07-30T04:30:22", "nodeinfo": {"location": {"latitude": 54.787798765637, "longitude": 9.4342786073685}, "node_id": "647002f733ee", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk-647002f733ee", "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "network": {"addresses": ["fe80:0:0:0:6670:2ff:fef7:33ee", "fddf:bf7:10:1:6670:2ff:fef7:33ee"], "mesh_interfaces": ["66:74:02:f7:33:ee", "66:73:03:f7:33:ee"], "mac": "64:70:02:f7:33:ee"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "30b5c2ee643a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c2ee643a", "location": {"latitude": 54.475147, "longitude": 9.047702}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "freifunk@spam.ruup.de"}, "hostname": "husum-speicher-oben", "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:feee:643a", "fddf:bf7:10:1:32b5:c2ff:feee:643a"], "mesh_interfaces": ["32:b8:c3:ee:64:3a", "32:b9:c2:ee:64:3a"], "mac": "30:b5:c2:ee:64:3a"}}, "statistics": {"uptime": 1830614.82, "traffic": {"mgmt_tx": {"bytes": 2131963181, "packets": 25069911}, "rx": {"bytes": 7300278424, "packets": 14083537}, "tx": {"bytes": 1621694858, "packets": 4652797, "dropped": 3610}, "forward": {"bytes": 33926071629, "packets": 42577772}, "mgmt_rx": {"bytes": 4132935522, "packets": 66402752}}, "memory_usage": 0.5823977823977824, "loadavg": 0.25, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-10-10T14:24:29", "flags": {"gateway": false, "online": true}}, "e8de27303fc6": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "e8de27303fc6", "location": {"latitude": 54.783064, "longitude": 9.44334}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "@roikiermedia"}, "hostname": "DieGanzeBaeckerei.roikier.media", "network": {"addresses": ["fe80:0:0:0:eade:27ff:fe30:3fc6", "fddf:bf7:10:1:eade:27ff:fe30:3fc6"], "mesh_interfaces": ["ea:e2:27:30:3f:c6", "ea:e1:28:30:3f:c6"], "mac": "e8:de:27:30:3f:c6"}}, "statistics": {"uptime": 111829.74, "traffic": {"mgmt_tx": {"bytes": 134742471, "packets": 1546837}, "rx": {"bytes": 4305255996, "packets": 4247754}, "tx": {"bytes": 321991159, "packets": 2483154, "dropped": 4304}, "forward": {"bytes": 433419, "packets": 1290}, "mgmt_rx": {"bytes": 84794254, "packets": 1927753}}, "memory_usage": 0.5815661815661816, "loadavg": 0.16, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "e8de2730407e": {"lastseen": "2015-07-31T18:36:41", "nodeinfo": {"location": {"latitude": 54.801779, "longitude": 9.46393}, "node_id": "e8de2730407e", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Pruessi", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "thorsten.pruessmeier@t-online.de"}, "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe30:407e", "fe80:0:0:0:eade:27ff:fe30:407e"], "mesh_interfaces": ["ea:e2:27:30:40:7e", "ea:e1:28:30:40:7e"], "mac": "e8:de:27:30:40:7e"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "6466b3c134ee": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "6466b3c134ee", "location": {"latitude": 54.4735, "longitude": 9.251}, "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "hostname": "wasgeht", "network": {"addresses": ["fddf:bf7:10:1:6666:b3ff:fec1:34ee", "fe80:0:0:0:6666:b3ff:fec1:34ee"], "mesh_interfaces": ["66:6a:b3:c1:34:ee", "66:69:b4:c1:34:ee"], "mac": "64:66:b3:c1:34:ee"}}, "statistics": {"uptime": 1974680.68, "traffic": {"mgmt_tx": {"bytes": 2289554031, "packets": 28306074}, "rx": {"bytes": 17016774255, "packets": 21734209}, "tx": {"bytes": 1095365792, "packets": 9282481, "dropped": 2161}, "forward": {"bytes": 11399310, "packets": 16890}, "mgmt_rx": {"bytes": 1164602166, "packets": 14147668}}, "memory_usage": 0.5959805959805959, "loadavg": 0.11, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-10-08T21:44:26", "flags": {"gateway": false, "online": true}}, "14cc20cd2ea2": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "software": {"fastd": {"version": "v17", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "autoupdater": {"enabled": true, "branch": "beta"}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}}, "node_id": "14cc20cd2ea2", "location": {"latitude": 54.786309, "longitude": 8.827017}, "hostname": "niebuell-rathausplatz", "hardware": {"nproc": 1, "model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "schmaeschke@service2solution.de"}, "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fecd:2ea2", "fddf:bf7:10:1:16cc:20ff:fecd:2ea2"], "mesh_interfaces": ["16:cf:21:cd:2e:a2", "16:d0:20:cd:2e:a2"], "mac": "14:cc:20:cd:2e:a2", "mesh": {"bat0": {"interfaces": {"wireless": ["16:cf:21:cd:2e:a2"], "tunnel": ["16:d0:20:cd:2e:a2"]}}}}}, "statistics": {"uptime": 2803589.32, "traffic": {"mgmt_tx": {"bytes": 3208850561, "packets": 39603746}, "rx": {"bytes": 51568633429, "packets": 56458427}, "tx": {"bytes": 5619500458, "packets": 31449067, "dropped": 24346}, "forward": {"bytes": 86131778761, "packets": 109233741}, "mgmt_rx": {"bytes": 4982437860, "packets": 84634848}}, "memory_usage": 0.28897437569276907, "loadavg": 0.13, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.065924657534247}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "10feedb7483c": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "node_id": "10feedb7483c", "software": {"firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "autoupdater": {"enabled": true, "branch": "beta"}, "fastd": {"version": "v17", "enabled": true}}, "hardware": {"nproc": 1, "model": "TP-Link TL-WR841N/ND v8"}, "hostname": "beta-2015.1.2-0_test1", "network": {"addresses": ["fe80:0:0:0:12fe:edff:feb7:483c", "fddf:bf7:10:1:12fe:edff:feb7:483c"], "mesh": {"bat0": {"interfaces": {"wireless": ["12:01:ee:b7:48:3c"], "tunnel": ["12:02:ed:b7:48:3c"]}}}, "mac": "10:fe:ed:b7:48:3c", "mesh_interfaces": ["12:02:ed:b7:48:3c", "12:01:ee:b7:48:3c"]}}, "statistics": {"uptime": 270147.57, "traffic": {"mgmt_tx": {"bytes": 326026077, "packets": 3854383}, "rx": {"bytes": 4727742244, "packets": 4681417}, "tx": {"bytes": 238986282, "packets": 2221527, "dropped": 2115}, "forward": {"bytes": 3111365100, "packets": 3782528}, "mgmt_rx": {"bytes": 663244087, "packets": 10515333}}, "memory_usage": 0.568953568953569, "loadavg": 0.05, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.39583333333333}, "firstseen": "2015-08-24T19:21:57", "flags": {"gateway": false, "online": true}}, "6466b3faa9e0": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "6466b3faa9e0", "location": {"latitude": 54.785445, "longitude": 9.44864}, "hardware": {"model": "TP-Link TL-WDR4300 v1"}, "owner": {"contact": "david@baumgarten.rocks"}, "hostname": "probablynotbatman", "network": {"addresses": ["fddf:bf7:10:1:6666:b3ff:fefa:a9e0", "fe80:0:0:0:6666:b3ff:fefa:a9e0"], "mesh_interfaces": ["66:69:b5:fa:a9:e0", "66:69:b4:fa:a9:e0", "66:6a:b3:fa:a9:e0"], "mac": "64:66:b3:fa:a9:e0"}}, "statistics": {"uptime": 512401.66, "traffic": {"mgmt_tx": {"bytes": 919814855, "packets": 10920643}, "rx": {"bytes": 8304493245, "packets": 8719144}, "tx": {"bytes": 408003097, "packets": 4192262, "dropped": 1432}, "forward": {"bytes": 28463253579, "packets": 31302351}, "mgmt_rx": {"bytes": 997294114, "packets": 16423399}}, "memory_usage": 0.14777872771603184, "loadavg": 0.16, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.064189189189189}, "firstseen": "2015-07-22T17:39:06", "flags": {"gateway": false, "online": true}}, "c46e1fe8677a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1fe8677a", "location": {"latitude": 54.907436, "longitude": 8.306254}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "info@it-walther.de"}, "hostname": "niebuell-HBJensen_01", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fee8:677a", "fe80:0:0:0:c66e:1fff:fee8:677a"], "mesh_interfaces": ["c6:72:1f:e8:67:7a", "c6:71:20:e8:67:7a"], "mac": "c4:6e:1f:e8:67:7a"}}, "statistics": {"uptime": 11088006.01, "traffic": {"mgmt_tx": {"bytes": 10709126017, "packets": 138993965}, "rx": {"bytes": 26215882287, "packets": 62060750}, "tx": {"bytes": 6784313929, "packets": 20307673, "dropped": 12652}, "forward": {"bytes": 3730819, "packets": 11491}, "mgmt_rx": {"bytes": 6659841621, "packets": 154721824}}, "memory_usage": 0.6005544005544006, "loadavg": 0, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.38125}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "e8de27304248": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "e8de27304248", "software": {"firmware": {"base": "gluon-v2014.4", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "fabian.horst@freifunk-flensburg.de"}, "hostname": "Freienwill01", "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe30:4248", "fe80:0:0:0:eade:27ff:fe30:4248"], "mesh_interfaces": ["ea:e2:27:30:42:48", "ea:e1:28:30:42:48"], "mac": "e8:de:27:30:42:48"}}, "statistics": {"uptime": 2589390.11, "traffic": {"mgmt_tx": {"bytes": 2961478251, "packets": 35180521}, "rx": {"bytes": 69878102409, "packets": 76862929}, "tx": {"bytes": 5620989788, "packets": 50960160, "dropped": 14319}, "forward": {"bytes": 3473512, "packets": 8355}, "mgmt_rx": {"bytes": 1859046916, "packets": 42705988}}, "memory_usage": 0.5627165627165627, "loadavg": 0, "gateway": "snowden", "clients": 5, "rootfs_usage": 0.36875}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "14cc20b103aa": {"lastseen": "2015-09-21T16:34:34", "nodeinfo": {"location": {"latitude": 54.804665, "longitude": 9.537471}, "node_id": "14cc20b103aa", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4", "release": "stable-2014.4.0"}}, "hostname": "freifunk-Oxbuell-Nord", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "Walter@brogmus.de"}, "network": {"addresses": ["fe80:0:0:0:16cc:20ff:feb1:3aa", "fddf:bf7:10:1:16cc:20ff:feb1:3aa"], "mesh_interfaces": ["16:d0:20:b1:03:aa", "16:cf:21:b1:03:aa"], "mac": "14:cc:20:b1:03:aa"}}, "statistics": {"clients": 0}, "firstseen": "2015-07-27T16:26:31", "flags": {"gateway": false, "online": false}}, "6466b3b022ea": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "6466b3b022ea", "location": {"latitude": 54.79705, "longitude": 9.42562}, "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "owner": {"contact": "freifunk@micheler.net"}, "hostname": "tschuess", "network": {"addresses": ["fe80:0:0:0:6666:b3ff:feb0:22ea", "fddf:bf7:10:1:6666:b3ff:feb0:22ea"], "mesh_interfaces": ["66:69:b4:b0:22:ea"], "mac": "64:66:b3:b0:22:ea"}}, "statistics": {"uptime": 263120.65, "traffic": {"mgmt_tx": {"bytes": 91817048, "packets": 1156407}, "rx": {"bytes": 975241736, "packets": 2098126}, "tx": {"bytes": 494273337, "packets": 1040997, "dropped": 3306}, "forward": {"bytes": 3311600, "packets": 6226}, "mgmt_rx": {"bytes": 90995321, "packets": 1090714}}, "memory_usage": 0.5736659736659737, "loadavg": 0.01, "gateway": "snowden", "clients": 4, "rootfs_usage": 0.36875}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "14cc20cd4ea6": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc20cd4ea6", "location": {"latitude": 54.78619545, "longitude": 8.82637203}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "schmaeschke@service2solution.de"}, "hostname": "niebuell-kaffemaus", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fecd:4ea6", "fddf:bf7:10:1:16cc:20ff:fecd:4ea6"], "mesh_interfaces": ["16:d0:20:cd:4e:a6", "16:cf:21:cd:4e:a6"], "mac": "14:cc:20:cd:4e:a6"}}, "statistics": {"uptime": 1340187.25, "traffic": {"mgmt_tx": {"bytes": 1588073985, "packets": 18822147}, "rx": {"bytes": 2749680075, "packets": 7828090}, "tx": {"bytes": 311179357, "packets": 1881329, "dropped": 7199}, "forward": {"bytes": 2538114, "packets": 9388}, "mgmt_rx": {"bytes": 1422213972, "packets": 28028951}}, "memory_usage": 0.2690878268240203, "loadavg": 0.19, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.0625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "f8d11180091e": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "f8d11180091e", "location": {"latitude": 54.47555, "longitude": 9.04744}, "hardware": {"model": "TP-Link TL-WR741N/ND v4"}, "owner": {"contact": "freifunk@spam.ruup.de"}, "hostname": "husum-trulala", "network": {"addresses": ["fe80:0:0:0:fad1:11ff:fe80:91e", "fddf:bf7:10:1:fad1:11ff:fe80:91e"], "mesh_interfaces": ["fa:d5:11:80:09:1e", "fa:d4:12:80:09:1e"], "mac": "f8:d1:11:80:09:1e"}}, "statistics": {"uptime": 2069227.65, "traffic": {"mgmt_tx": {"bytes": 2275663609, "packets": 27739050}, "rx": {"bytes": 28057193907, "packets": 34049438}, "tx": {"bytes": 11907296680, "packets": 20023209, "dropped": 7631}, "forward": {"bytes": 20305940, "packets": 26311}, "mgmt_rx": {"bytes": 1795891325, "packets": 24753626}}, "memory_usage": 0.5696465696465696, "loadavg": 0.01, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.36875}, "firstseen": "2015-08-31T21:21:11", "flags": {"gateway": false, "online": true}}, "14cc20875ace": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "freifunk-14cc20875ace", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fe87:5ace", "fe80:0:0:0:16cc:20ff:fe87:5ace"], "mesh_interfaces": ["16:d0:20:87:5a:ce", "16:cf:21:87:5a:ce"], "mac": "14:cc:20:87:5a:ce"}, "node_id": "14cc20875ace"}, "statistics": {"uptime": 3161658.72, "traffic": {"mgmt_tx": {"bytes": 3321654907, "packets": 42021171}, "rx": {"bytes": 25026102086, "packets": 37785716}, "tx": {"bytes": 6919771725, "packets": 22323142, "dropped": 63847}, "forward": {"bytes": 30147164, "packets": 32018}, "mgmt_rx": {"bytes": 1740394093, "packets": 21763624}}, "memory_usage": 0.5782397782397782, "loadavg": 0, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-07-01T10:22:50", "flags": {"gateway": false, "online": true}}, "e894f678ad38": {"lastseen": "2015-08-06T12:13:56", "nodeinfo": {"node_id": "e894f678ad38", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "oktarp-RPIMarcel1", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "info@nordgedanken.de"}, "network": {"addresses": ["fddf:bf7:10:1:ea94:f6ff:fe78:ad38", "fe80:0:0:0:ea94:f6ff:fe78:ad38"], "mesh_interfaces": ["ea:98:f6:78:ad:38", "ea:97:f7:78:ad:38"], "mac": "e8:94:f6:78:ad:38"}}, "statistics": {"clients": 0}, "firstseen": "2015-08-01T15:07:19", "flags": {"gateway": false, "online": false}}, "60e3277626b0": {"lastseen": "2015-10-30T13:09:26", "nodeinfo": {"location": {"latitude": 54.907771, "longitude": 8.302442}, "node_id": "60e3277626b0", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk-Gaestehaus-Cafe-Orth", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "freifunk@von-sylt.de"}, "network": {"addresses": ["fe80:0:0:0:62e3:27ff:fe76:26b0", "fddf:bf7:10:1:62e3:27ff:fe76:26b0"], "mesh_interfaces": ["62:e7:27:76:26:b0", "62:e6:28:76:26:b0"], "mac": "60:e3:27:76:26:b0"}}, "statistics": {"clients": 0}, "firstseen": "2015-10-26T12:18:51", "flags": {"gateway": false, "online": false}}, "c46e1fdea5d2": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1fdea5d2", "location": {"latitude": 54.90755, "longitude": 8.307402}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "hostname": "freifunk-Wilhelm", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fede:a5d2", "fe80:0:0:0:c66e:1fff:fede:a5d2"], "mesh_interfaces": ["c6:72:1f:de:a5:d2", "c6:71:20:de:a5:d2"], "mac": "c4:6e:1f:de:a5:d2"}}, "statistics": {"uptime": 1154347.67, "traffic": {"mgmt_tx": {"bytes": 1359214425, "packets": 15854409}, "rx": {"bytes": 114601718722, "packets": 98707045}, "tx": {"bytes": 7366466700, "packets": 54021395, "dropped": 28049}, "forward": {"bytes": 235219, "packets": 907}, "mgmt_rx": {"bytes": 854845414, "packets": 19399152}}, "memory_usage": 0.5688149688149688, "loadavg": 0.15, "gateway": "snowden", "clients": 5, "rootfs_usage": 0.36875}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "30b5c2c69c9e": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c2c69c9e", "location": {"latitude": 54.632142, "longitude": 9.593767}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "nordrunner@web.de"}, "hostname": "Angeln-0008", "network": {"addresses": ["fe80:0:0:0:32b5:c2ff:fec6:9c9e", "fddf:bf7:10:1:32b5:c2ff:fec6:9c9e"], "mesh_interfaces": ["32:b9:c2:c6:9c:9e", "32:b8:c3:c6:9c:9e"], "mac": "30:b5:c2:c6:9c:9e"}}, "statistics": {"uptime": 96373.2, "traffic": {"mgmt_tx": {"bytes": 116231194, "packets": 1336900}, "rx": {"bytes": 83772191, "packets": 451489}, "tx": {"bytes": 7354314, "packets": 41781, "dropped": 21}, "forward": {"bytes": 264, "packets": 3}, "mgmt_rx": {"bytes": 73142810, "packets": 1662621}}, "memory_usage": 0.6914760914760915, "loadavg": 0, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-07-20T07:26:16", "flags": {"gateway": false, "online": true}}, "14cc204d30be": {"lastseen": "2015-09-18T09:11:33", "nodeinfo": {"location": {"latitude": 54.787809488559, "longitude": 8.8228395581245}, "node_id": "14cc204d30be", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "niebuell-marktplatz", "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fe4d:30be", "fddf:bf7:10:1:16cc:20ff:fe4d:30be"], "mesh_interfaces": ["16:d0:20:4d:30:be", "16:cf:21:4d:30:be"], "mac": "14:cc:20:4d:30:be"}}, "statistics": {"clients": 0}, "firstseen": "2015-07-29T16:47:36", "flags": {"gateway": false, "online": false}}, "c46e1f86cb5c": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "c46e1f86cb5c", "software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "reiherfunk@gmx.net"}, "hostname": "Marsh", "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fe86:cb5c", "fddf:bf7:10:1:c66e:1fff:fe86:cb5c"], "mesh_interfaces": ["c6:72:1f:86:cb:5c", "c6:71:20:86:cb:5c"], "mac": "c4:6e:1f:86:cb:5c"}}, "statistics": {"uptime": 5624165.28, "traffic": {"mgmt_tx": {"bytes": 5976026309, "packets": 74304055}, "rx": {"bytes": 1918807637, "packets": 23978203}, "tx": {"bytes": 401470683, "packets": 1156754, "dropped": 10549}, "forward": {"bytes": 112632, "packets": 513}, "mgmt_rx": {"bytes": 3735006353, "packets": 86606305}}, "memory_usage": 0.5704781704781705, "loadavg": 0, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "14cc20bbd1ae": {"lastseen": "2015-10-31T08:02:08", "nodeinfo": {"location": {"latitude": 54.907764, "longitude": 8.303785}, "node_id": "14cc20bbd1ae", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk-DIAVOLO", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "freifunk@von-sylt.de"}, "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:febb:d1ae", "fe80:0:0:0:16cc:20ff:febb:d1ae"], "mesh_interfaces": ["16:d0:20:bb:d1:ae", "16:cf:21:bb:d1:ae"], "mac": "14:cc:20:bb:d1:ae"}}, "statistics": {"clients": 0}, "firstseen": "2015-10-26T15:07:02", "flags": {"gateway": false, "online": false}}, "e8de27305d08": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": false, "branch": "stable"}}, "node_id": "e8de27305d08", "location": {"latitude": 54.79434071681, "longitude": 9.429967031039}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "freifunk@schloss.stras.se"}, "hostname": "odesza", "network": {"addresses": ["fddf:bf7:10:1:eade:27ff:fe30:5d08", "fe80:0:0:0:eade:27ff:fe30:5d08"], "mesh_interfaces": ["ea:e1:28:30:5d:08"], "mac": "e8:de:27:30:5d:08"}}, "statistics": {"uptime": 24594.78, "traffic": {"mgmt_tx": {"bytes": 14426642, "packets": 175735}, "rx": {"bytes": 8532146, "packets": 125711}, "tx": {"bytes": 464701, "packets": 1879, "dropped": 3}, "forward": {"bytes": 0, "packets": 0}, "mgmt_rx": {"bytes": 27873938, "packets": 337252}}, "memory_usage": 0.5252945252945254, "loadavg": 0, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.36875}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "snowden": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"hostname": "snowden", "node_id": "snowden", "network": {"mesh_interfaces": ["9e:99:81:75:b5:61"]}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": true, "online": true}}, "c46e1f82126c": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1f82126c", "location": {"latitude": 54.784683, "longitude": 8.82612}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "niebuell-cafekoe", "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fe82:126c", "fddf:bf7:10:1:c66e:1fff:fe82:126c"], "mesh_interfaces": ["c6:72:1f:82:12:6c", "c6:71:20:82:12:6c"], "mac": "c4:6e:1f:82:12:6c"}}, "statistics": {"uptime": 43645.86, "traffic": {"mgmt_tx": {"bytes": 52548453, "packets": 610676}, "rx": {"bytes": 4262782710, "packets": 3499864}, "tx": {"bytes": 309343890, "packets": 2140028, "dropped": 1353}, "forward": {"bytes": 451615, "packets": 1374}, "mgmt_rx": {"bytes": 32896439, "packets": 755193}}, "memory_usage": 0.2710438808111104, "loadavg": 0.37, "gateway": "snowden", "clients": 12, "rootfs_usage": 0.064189189189189}, "firstseen": "2015-08-05T15:17:04", "flags": {"gateway": false, "online": true}}, "14cc20873e02": {"lastseen": "2015-08-26T14:09:12", "nodeinfo": {"location": {"latitude": 54.793593632188, "longitude": 9.431258479494}, "node_id": "14cc20873e02", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4", "release": "stable-2014.4.0-0"}}, "hostname": "bitsundbytes", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "freifunk@schloss.stras.se"}, "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fe87:3e02", "fe80:0:0:0:16cc:20ff:fe87:3e02"], "mesh_interfaces": ["16:d0:20:87:3e:02", "16:cf:21:87:3e:02"], "mac": "14:cc:20:87:3e:02"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "c46e1fe86634": {"lastseen": "2015-07-31T18:36:41", "nodeinfo": {"location": {"latitude": 54.801755, "longitude": 9.463928}, "node_id": "c46e1fe86634", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "elbestrasse_wohnungz", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fee8:6634", "fddf:bf7:10:1:c66e:1fff:fee8:6634"], "mesh_interfaces": ["c6:72:1f:e8:66:34", "c6:71:20:e8:66:34"], "mac": "c4:6e:1f:e8:66:34"}}, "statistics": {"clients": 0}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": false}}, "30b5c26f38c8": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "30b5c26f38c8", "location": {"latitude": 54.63356, "longitude": 9.618799}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "freifunk@oktarp.de"}, "hostname": "Angeln-0009", "network": {"addresses": ["fddf:bf7:10:1:32b5:c2ff:fe6f:38c8", "fe80:0:0:0:32b5:c2ff:fe6f:38c8"], "mesh_interfaces": ["32:b9:c2:6f:38:c8", "32:b8:c3:6f:38:c8", "30:b5:c2:6f:38:c9"], "mac": "30:b5:c2:6f:38:c8"}}, "statistics": {"uptime": 283327.03, "traffic": {"mgmt_tx": {"bytes": 435845078, "packets": 4126629}, "rx": {"bytes": 14615513292, "packets": 12773557}, "tx": {"bytes": 888775592, "packets": 7300800, "dropped": 3987}, "forward": {"bytes": 1584, "packets": 18}, "mgmt_rx": {"bytes": 166075380, "packets": 1939035}}, "memory_usage": 0.26758818543391794, "loadavg": 0.17, "gateway": "snowden", "clients": 5, "rootfs_usage": 0.064189189189189}, "firstseen": "2015-09-30T14:57:41", "flags": {"gateway": false, "online": true}}, "c46e1f977e04": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1f977e04", "location": {"latitude": 54.796025, "longitude": 9.480284}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "presse@freifunk-flensburg.de"}, "hostname": "codewerft", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fe97:7e04", "fe80:0:0:0:c66e:1fff:fe97:7e04"], "mesh_interfaces": ["c6:72:1f:97:7e:04", "c6:71:20:97:7e:04"], "mac": "c4:6e:1f:97:7e:04"}}, "statistics": {"uptime": 171162.32, "traffic": {"mgmt_tx": {"bytes": 205532267, "packets": 2386050}, "rx": {"bytes": 95558513, "packets": 758397}, "tx": {"bytes": 9897647, "packets": 61269, "dropped": 172}, "forward": {"bytes": 212, "packets": 2}, "mgmt_rx": {"bytes": 128730789, "packets": 2928886}}, "memory_usage": 0.2628936558649019, "loadavg": 0.02, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.0625}, "firstseen": "2015-07-20T17:37:08", "flags": {"gateway": false, "online": true}}, "14cc20cd4e8a": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc20cd4e8a", "location": {"latitude": 54.785910555243, "longitude": 8.8269554078579}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "schmaeschke@service2solution.de"}, "hostname": "niebuell-stadtbuecherei1", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fecd:4e8a", "fddf:bf7:10:1:16cc:20ff:fecd:4e8a"], "mesh_interfaces": ["16:d0:20:cd:4e:8a", "16:cf:21:cd:4e:8a"], "mac": "14:cc:20:cd:4e:8a"}}, "statistics": {"uptime": 11096721.34, "traffic": {"mgmt_tx": {"bytes": 9499853031, "packets": 128934474}, "rx": {"bytes": 46810644178, "packets": 79571735}, "tx": {"bytes": 4152742787, "packets": 28379353, "dropped": 265225}, "forward": {"bytes": 294547962, "packets": 406575}, "mgmt_rx": {"bytes": 9920601845, "packets": 136409144}}, "memory_usage": 0.2750863923844298, "loadavg": 0.2, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-06-19T16:30:22", "flags": {"gateway": false, "online": true}}, "c46e1f2c9888": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "c46e1f2c9888", "location": {"latitude": 54.796449, "longitude": 9.428294}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "0461-44123"}, "hostname": "Bier_und_Spielpalast_Neustadt", "network": {"addresses": ["fe80:0:0:0:c66e:1fff:fe2c:9888", "fddf:bf7:10:1:c66e:1fff:fe2c:9888"], "mesh_interfaces": ["c6:72:1f:2c:98:88", "c6:71:20:2c:98:88"], "mac": "c4:6e:1f:2c:98:88"}}, "statistics": {"uptime": 845630.84, "traffic": {"mgmt_tx": {"bytes": 994207133, "packets": 11600343}, "rx": {"bytes": 29959468762, "packets": 27964308}, "tx": {"bytes": 1751956004, "packets": 14799822, "dropped": 9439}, "forward": {"bytes": 1661045, "packets": 5148}, "mgmt_rx": {"bytes": 623595463, "packets": 14133270}}, "memory_usage": 0.5743589743589743, "loadavg": 0.01, "gateway": "snowden", "clients": 6, "rootfs_usage": 0.36875}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "080027110bb1": {"lastseen": "2015-10-09T01:17:31", "nodeinfo": {"system": {"site_code": "fffl"}, "node_id": "080027110bb1", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v17", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}}, "hostname": "Test-VM", "hardware": {"model": "Intel(R) Core(TM) i5-4430 CPU @ 3.00GHz", "nproc": 1}, "network": {"addresses": ["fe80:0:0:0:a00:27ff:fe11:bb1", "fddf:bf7:10:1:a00:27ff:fe11:bb1"], "mesh": {"bat0": {"interfaces": {"tunnel": ["0a:04:27:11:0b:b1"]}}}, "mac": "08:00:27:11:0b:b1", "mesh_interfaces": ["0a:04:27:11:0b:b1"]}}, "statistics": {"clients": 0}, "firstseen": "2015-10-09T00:36:57", "flags": {"gateway": false, "online": false}}, "14cc204d3100": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc204d3100", "location": {"latitude": 54.79226, "longitude": 8.84056}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "niebuell-arche", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fe4d:3100", "fe80:0:0:0:16cc:20ff:fe4d:3100"], "mesh_interfaces": ["16:d0:20:4d:31:00", "16:cf:21:4d:31:00"], "mac": "14:cc:20:4d:31:00"}}, "statistics": {"uptime": 5566854.35, "traffic": {"mgmt_tx": {"bytes": 5924612387, "packets": 73768724}, "rx": {"bytes": 156238224399, "packets": 165375207}, "tx": {"bytes": 19001143056, "packets": 102631874, "dropped": 23510}, "forward": {"bytes": 1429960, "packets": 4772}, "mgmt_rx": {"bytes": 3701762624, "packets": 85825152}}, "memory_usage": 0.2881919540979331, "loadavg": 0.23, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-08-28T06:54:17", "flags": {"gateway": false, "online": true}}, "c46e1fc73572": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "beta"}}, "node_id": "c46e1fc73572", "location": {"latitude": 54.193869, "longitude": 9.108806}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "o@init2.net"}, "hostname": "Heide-Kolberger-Str", "network": {"addresses": ["fddf:bf7:10:1:c66e:1fff:fec7:3572", "fe80:0:0:0:c66e:1fff:fec7:3572"], "mesh_interfaces": ["c6:72:1f:c7:35:72", "c6:71:20:c7:35:72"], "mac": "c4:6e:1f:c7:35:72"}}, "statistics": {"uptime": 2762981.57, "traffic": {"mgmt_tx": {"bytes": 3106251913, "packets": 36931630}, "rx": {"bytes": 30236048900, "packets": 38233847}, "tx": {"bytes": 4667360075, "packets": 20271312, "dropped": 468544}, "forward": {"bytes": 4384, "packets": 49}, "mgmt_rx": {"bytes": 1949299948, "packets": 44816558}}, "memory_usage": 0.6008316008316008, "loadavg": 0.08, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.36875}, "firstseen": "2015-09-29T19:17:51", "flags": {"gateway": false, "online": true}}, "6466b36f8812": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"system": {"site_code": "fffl"}, "software": {"firmware": {"base": "gluon-v2015.1.2-2-g8db1e73", "release": "beta-2015.1.2-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v17", "enabled": true}, "autoupdater": {"enabled": true, "branch": "beta"}}, "node_id": "6466b36f8812", "location": {"latitude": 54.76115687822, "longitude": 9.3776249885559}, "hostname": "freifunk-Zitronenfalterhof", "hardware": {"nproc": 1, "model": "TP-Link TL-WDR4300 v1"}, "owner": {"contact": "sven(at)freifunk-flensburg"}, "network": {"addresses": ["fddf:bf7:10:1:6666:b3ff:fe6f:8812", "fe80:0:0:0:6666:b3ff:fe6f:8812"], "mesh_interfaces": ["66:6a:b3:6f:88:12", "66:69:b4:6f:88:12", "66:69:b5:6f:88:12"], "mac": "64:66:b3:6f:88:12", "mesh": {"bat0": {"interfaces": {"wireless": ["66:69:b4:6f:88:12", "66:69:b5:6f:88:12"], "tunnel": ["66:6a:b3:6f:88:12"]}}}}}, "statistics": {"uptime": 2170724.65, "traffic": {"mgmt_tx": {"bytes": 3767825222, "packets": 44715807}, "rx": {"bytes": 10453444949, "packets": 17766890}, "tx": {"bytes": 1245929643, "packets": 5259542, "dropped": 5352}, "forward": {"bytes": 2904, "packets": 33}, "mgmt_rx": {"bytes": 1577302258, "packets": 36106294}}, "memory_usage": 0.20350843861815648, "loadavg": 0.11, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.063356164383562}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "14cc20c80fd8": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc20c80fd8", "location": {"latitude": 54.90774, "longitude": 8.30469}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "Freifunk@Fam-Thiessen.de"}, "hostname": "Connys_Bar", "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fec8:fd8", "fddf:bf7:10:1:16cc:20ff:fec8:fd8"], "mesh_interfaces": ["16:d0:20:c8:0f:d8", "16:cf:21:c8:0f:d8"], "mac": "14:cc:20:c8:0f:d8"}}, "statistics": {"uptime": 5009926.68, "traffic": {"mgmt_tx": {"bytes": 5415807999, "packets": 66681377}, "rx": {"bytes": 8806085290, "packets": 27881150}, "tx": {"bytes": 887594203, "packets": 4657183, "dropped": 3147}, "forward": {"bytes": 811263, "packets": 2363}, "mgmt_rx": {"bytes": 3391357562, "packets": 78526120}}, "memory_usage": 0.6044352044352044, "loadavg": 0.02, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.375}, "firstseen": "2015-09-03T10:25:00", "flags": {"gateway": false, "online": true}}, "14cc20874ff4": {"lastseen": "2015-10-22T15:18:14", "nodeinfo": {"node_id": "14cc20874ff4", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "Angeln-0003", "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "nordrunner(at)web.de"}, "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fe87:4ff4", "fddf:bf7:10:1:16cc:20ff:fe87:4ff4"], "mesh_interfaces": ["16:d0:20:87:4f:f4", "16:cf:21:87:4f:f4"], "mac": "14:cc:20:87:4f:f4"}}, "statistics": {"clients": 0}, "firstseen": "2015-07-05T19:11:42", "flags": {"gateway": false, "online": false}}, "14cc204d30c0": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc204d30c0", "location": {"latitude": 54.7893801, "longitude": 8.830586}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "niebuell-casapiccoli", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fe4d:30c0", "fe80:0:0:0:16cc:20ff:fe4d:30c0"], "mesh_interfaces": ["16:d0:20:4d:30:c0", "16:cf:21:4d:30:c0"], "mac": "14:cc:20:4d:30:c0"}}, "statistics": {"uptime": 7636220.86, "traffic": {"mgmt_tx": {"bytes": 7795364874, "packets": 99150300}, "rx": {"bytes": 13909557527, "packets": 42554128}, "tx": {"bytes": 3016938363, "packets": 11142608, "dropped": 14881}, "forward": {"bytes": 13822297, "packets": 43078}, "mgmt_rx": {"bytes": 4857431827, "packets": 112886050}}, "memory_usage": 0.2863011019104127, "loadavg": 0.23, "gateway": "snowden", "clients": 2, "rootfs_usage": 0.0625}, "firstseen": "2015-08-04T09:44:23", "flags": {"gateway": false, "online": true}}, "14cc204d3096": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "14cc204d3096", "location": {"latitude": 54.787496459967, "longitude": 8.8271659612656}, "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "info@service2solution.de"}, "hostname": "niebuell-wattwurm", "network": {"addresses": ["fddf:bf7:10:1:16cc:20ff:fe4d:3096", "fe80:0:0:0:16cc:20ff:fe4d:3096"], "mesh_interfaces": ["16:cf:21:4d:30:96", "16:d0:20:4d:30:96"], "mac": "14:cc:20:4d:30:96"}}, "statistics": {"uptime": 6438621.3, "traffic": {"mgmt_tx": {"bytes": 6711627079, "packets": 84427586}, "rx": {"bytes": 29213860000, "packets": 50007230}, "tx": {"bytes": 4116444284, "packets": 18747616, "dropped": 23353}, "forward": {"bytes": 1031949800, "packets": 3115734}, "mgmt_rx": {"bytes": 4738207117, "packets": 104806704}}, "memory_usage": 0.2881267522983635, "loadavg": 0.29, "gateway": "snowden", "clients": 3, "rootfs_usage": 0.063344594594595}, "firstseen": "2015-07-20T17:02:21", "flags": {"gateway": false, "online": true}}, "14cc20e15654": {"lastseen": "2015-10-31T17:21:37", "nodeinfo": {"location": {"latitude": 54.907703, "longitude": 8.302446}, "node_id": "14cc20e15654", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk-Orth", "hardware": {"model": "TP-Link TL-WR1043N/ND v2"}, "owner": {"contact": "freifunk@von-sylt.de"}, "network": {"addresses": ["fe80:0:0:0:16cc:20ff:fee1:5654", "fddf:bf7:10:1:16cc:20ff:fee1:5654"], "mesh_interfaces": ["16:d0:20:e1:56:54", "16:cf:21:e1:56:54", "14:cc:20:e1:56:55"], "mac": "14:cc:20:e1:56:54"}}, "statistics": {"clients": 0}, "firstseen": "2015-09-30T15:23:33", "flags": {"gateway": false, "online": false}}, "6466b3f41d5e": {"lastseen": "2015-09-08T19:14:36", "nodeinfo": {"location": {"latitude": 54.805088, "longitude": 9.52485}, "node_id": "6466b3f41d5e", "software": {"autoupdater": {"enabled": true, "branch": "stable"}, "fastd": {"version": "v16", "enabled": true}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}}, "hostname": "freifunk-wees01", "hardware": {"model": "TP-Link TL-WDR4300 v1"}, "owner": {"contact": "dede@dahlgrimm.de"}, "network": {"addresses": ["fe80:0:0:0:6666:b3ff:fef4:1d5e", "fddf:bf7:10:1:6666:b3ff:fef4:1d5e"], "mesh_interfaces": ["66:6a:b3:f4:1d:5e", "66:69:b4:f4:1d:5e", "66:69:b5:f4:1d:5e"], "mac": "64:66:b3:f4:1d:5e"}}, "statistics": {"clients": 0}, "firstseen": "2015-08-27T08:23:25", "flags": {"gateway": false, "online": false}}, "e894f6a195c0": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": false}, "autoupdater": {"enabled": true, "branch": "stable"}}, "node_id": "e894f6a195c0", "location": {"latitude": 54.78705, "longitude": 9.43278}, "hardware": {"model": "TP-Link TL-WR841N/ND v8"}, "owner": {"contact": "kramer.kay@gmail.com"}, "hostname": "trace_Burgwall2", "network": {"addresses": ["fe80:0:0:0:ea94:f6ff:fea1:95c0", "fddf:bf7:10:1:ea94:f6ff:fea1:95c0"], "mesh_interfaces": ["ea:97:f7:a1:95:c0"], "mac": "e8:94:f6:a1:95:c0"}}, "statistics": {"uptime": 7210374.56, "traffic": {"mgmt_tx": {"bytes": 2894402969, "packets": 38473913}, "rx": {"bytes": 46756908041, "packets": 59940019}, "tx": {"bytes": 2391998030, "packets": 23551008, "dropped": 44468}, "forward": {"bytes": 20051398, "packets": 26407}, "mgmt_rx": {"bytes": 6123165752, "packets": 81258565}}, "memory_usage": 0.5604989604989605, "loadavg": 0.08, "gateway": "snowden", "clients": 1, "rootfs_usage": 0.3625}, "firstseen": "2015-06-16T02:05:43", "flags": {"gateway": false, "online": true}}, "e894f6513c7c": {"lastseen": "2015-10-31T18:54:14", "nodeinfo": {"node_id": "e894f6513c7c", "software": {"firmware": {"base": "gluon-v2014.4-4-gc7687a2", "release": "stable-2014.4.0-0"}, "batman-adv": {"version": "2013.4.0", "compat": 14}, "fastd": {"version": "v16", "enabled": true}, "autoupdater": {"enabled": true, "branch": "stable"}}, "hardware": {"model": "TP-Link TL-WR841N/ND v9"}, "owner": {"contact": "Freifunk@Fam-Thiessen.de"}, "hostname": "Sylt_3", "network": {"addresses": ["fe80:0:0:0:ea94:f6ff:fe51:3c7c", "fddf:bf7:10:1:ea94:f6ff:fe51:3c7c"], "mesh_interfaces": ["ea:98:f6:51:3c:7c", "ea:97:f7:51:3c:7c"], "mac": "e8:94:f6:51:3c:7c"}}, "statistics": {"uptime": 1921064.32, "traffic": {"mgmt_tx": {"bytes": 2223536157, "packets": 27409683}, "rx": {"bytes": 2199145012, "packets": 9857054}, "tx": {"bytes": 541941306, "packets": 1753621, "dropped": 16069}, "forward": {"bytes": 109392889, "packets": 234313}, "mgmt_rx": {"bytes": 3443559075, "packets": 44027070}}, "memory_usage": 0.5656271656271656, "loadavg": 0.02, "gateway": "snowden", "clients": 0, "rootfs_usage": 0.3625}, "firstseen": "2015-10-09T13:13:37", "flags": {"gateway": false, "online": true}}}} +\ No newline at end of file diff --git a/v3.1.27.zip b/v3.1.27.zip Binary files differ.