aboutsummaryrefslogtreecommitdiffstats
path: root/library/Smarty
diff options
context:
space:
mode:
Diffstat (limited to 'library/Smarty')
-rw-r--r--library/Smarty/COMPOSER_RELEASE_NOTES.txt29
-rw-r--r--library/Smarty/INHERITANCE_RELEASE_NOTES.txt35
-rw-r--r--library/Smarty/NEW_FEATURES.txt86
-rw-r--r--library/Smarty/README2
-rw-r--r--library/Smarty/README.md52
-rw-r--r--library/Smarty/change_log.txt244
-rw-r--r--library/Smarty/demo/plugins/cacheresource.pdo.php322
-rw-r--r--library/Smarty/demo/plugins/cacheresource.pdo_gzip.php43
-rw-r--r--library/Smarty/demo/templates/header.tpl2
-rw-r--r--library/Smarty/lexer/smarty_internal_configfilelexer.plex318
-rw-r--r--library/Smarty/lexer/smarty_internal_configfileparser.y362
-rw-r--r--library/Smarty/lexer/smarty_internal_templatelexer.plex770
-rw-r--r--library/Smarty/lexer/smarty_internal_templateparser.y1329
-rw-r--r--library/Smarty/libs/Autoloader.php158
-rw-r--r--library/Smarty/libs/Smarty.class.php840
-rw-r--r--library/Smarty/libs/SmartyBC.class.php27
-rw-r--r--library/Smarty/libs/debug.tpl57
-rw-r--r--library/Smarty/libs/plugins/modifier.date_format.php2
-rw-r--r--library/Smarty/libs/plugins/modifier.debug_print_var.php26
-rw-r--r--library/Smarty/libs/plugins/outputfilter.trimwhitespace.php4
-rw-r--r--library/Smarty/libs/sysplugins/smarty_cacheresource.php225
-rw-r--r--library/Smarty/libs/sysplugins/smarty_cacheresource_custom.php52
-rw-r--r--library/Smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php35
-rw-r--r--library/Smarty/libs/sysplugins/smarty_config_source.php94
-rw-r--r--library/Smarty/libs/sysplugins/smarty_data.php66
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_cacheresource_file.php49
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_assign.php6
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_block.php23
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_call.php52
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_config_load.php3
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_for.php45
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_foreach.php151
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_function.php200
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_if.php29
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_include.php217
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_insert.php20
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_nocache.php13
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_private_php.php197
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php132
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_while.php9
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_config.php306
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_config_file_compiler.php75
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_configfilelexer.php399
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_configfileparser.php710
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_data.php242
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_debug.php314
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_extension_codeframe.php127
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_extension_config.php160
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_extension_defaulttemplatehandler.php85
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_function_call_handler.php65
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_parsetree.php318
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_parsetree_code.php42
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_parsetree_dq.php86
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php42
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_parsetree_tag.php66
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_parsetree_template.php98
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_parsetree_text.php40
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_resource_eval.php6
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_resource_extends.php2
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_resource_file.php149
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_resource_php.php59
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_resource_registered.php2
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_resource_stream.php4
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_resource_string.php6
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php16
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_template.php736
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_templatebase.php1417
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php331
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_templatelexer.php1206
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_templateparser.php5033
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_testinstall.php571
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_utility.php540
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_write_file.php12
-rw-r--r--library/Smarty/libs/sysplugins/smarty_resource.php732
-rw-r--r--library/Smarty/libs/sysplugins/smarty_resource_custom.php2
-rw-r--r--library/Smarty/libs/sysplugins/smarty_resource_recompiled.php7
-rw-r--r--library/Smarty/libs/sysplugins/smarty_resource_uncompiled.php31
-rw-r--r--library/Smarty/libs/sysplugins/smarty_security.php170
-rw-r--r--library/Smarty/libs/sysplugins/smarty_template_cached.php403
-rw-r--r--library/Smarty/libs/sysplugins/smarty_template_compiled.php288
-rw-r--r--library/Smarty/libs/sysplugins/smarty_template_config.php118
-rw-r--r--library/Smarty/libs/sysplugins/smarty_template_source.php285
-rw-r--r--library/Smarty/libs/sysplugins/smarty_undefined_variable.php37
-rw-r--r--library/Smarty/libs/sysplugins/smarty_variable.php55
-rw-r--r--library/Smarty/libs/sysplugins/smartycompilerexception.php39
-rw-r--r--library/Smarty/libs/sysplugins/smartyexception.php15
86 files changed, 12370 insertions, 9403 deletions
diff --git a/library/Smarty/COMPOSER_RELEASE_NOTES.txt b/library/Smarty/COMPOSER_RELEASE_NOTES.txt
new file mode 100644
index 000000000..c943d9f2e
--- /dev/null
+++ b/library/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/library/Smarty/INHERITANCE_RELEASE_NOTES.txt b/library/Smarty/INHERITANCE_RELEASE_NOTES.txt
new file mode 100644
index 000000000..a7d285f0a
--- /dev/null
+++ b/library/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/library/Smarty/NEW_FEATURES.txt b/library/Smarty/NEW_FEATURES.txt
new file mode 100644
index 000000000..b2c18c99b
--- /dev/null
+++ b/library/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/library/Smarty/README b/library/Smarty/README
index 6367f030e..9304219b4 100644
--- a/library/Smarty/README
+++ b/library/Smarty/README
@@ -1,4 +1,4 @@
-Smarty 3.1.21
+Smarty 3.x
Author: Monte Ohrt <monte at ohrt dot com >
Author: Uwe Tews
diff --git a/library/Smarty/README.md b/library/Smarty/README.md
new file mode 100644
index 000000000..f5f93fa95
--- /dev/null
+++ b/library/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/library/Smarty/change_log.txt b/library/Smarty/change_log.txt
index a0161659d..5606b1d83 100644
--- a/library/Smarty/change_log.txt
+++ b/library/Smarty/change_log.txt
@@ -1,8 +1,242 @@
- ===== 3.1.22-dev ===== (xx.xx.2014)
+ ===== 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
- - add COMPOSER_RELEASE_NOTES
+ - composer moved to github
17.10.2014
- bugfix on $php_handling security and optimization of smarty_internal_parsetree (Thue Kristensen)
@@ -43,7 +277,7 @@
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 ===== (06.30.2014)
+ ===== 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)
@@ -732,7 +966,7 @@
15/07/2011
- bugfix individual cache_lifetime of {include} did not work correctly inside {block} tags
-- added caches for Smarty_Template_Source and Smarty_Template_Compiled to reduce I/O for multiple cache_id rendering
+- 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
diff --git a/library/Smarty/demo/plugins/cacheresource.pdo.php b/library/Smarty/demo/plugins/cacheresource.pdo.php
new file mode 100644
index 000000000..569193aa4
--- /dev/null
+++ b/library/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/library/Smarty/demo/plugins/cacheresource.pdo_gzip.php b/library/Smarty/demo/plugins/cacheresource.pdo_gzip.php
new file mode 100644
index 000000000..8a9e0a5dd
--- /dev/null
+++ b/library/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/library/Smarty/demo/templates/header.tpl b/library/Smarty/demo/templates/header.tpl
index 13fa6cb5a..783210a18 100644
--- a/library/Smarty/demo/templates/header.tpl
+++ b/library/Smarty/demo/templates/header.tpl
@@ -1,5 +1,5 @@
<HTML>
<HEAD>
- <TITLE>{$title} - {$Name}</TITLE>
+<TITLE>{$title} - {$Name}</TITLE>
</HEAD>
<BODY bgcolor="#ffffff">
diff --git a/library/Smarty/lexer/smarty_internal_configfilelexer.plex b/library/Smarty/lexer/smarty_internal_configfilelexer.plex
new file mode 100644
index 000000000..94196be5f
--- /dev/null
+++ b/library/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/library/Smarty/lexer/smarty_internal_configfileparser.y b/library/Smarty/lexer/smarty_internal_configfileparser.y
new file mode 100644
index 000000000..ac961772d
--- /dev/null
+++ b/library/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/library/Smarty/lexer/smarty_internal_templatelexer.plex b/library/Smarty/lexer/smarty_internal_templatelexer.plex
new file mode 100644
index 000000000..e36df5970
--- /dev/null
+++ b/library/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/library/Smarty/lexer/smarty_internal_templateparser.y b/library/Smarty/lexer/smarty_internal_templateparser.y
new file mode 100644
index 000000000..225f71b24
--- /dev/null
+++ b/library/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/library/Smarty/libs/Autoloader.php b/library/Smarty/libs/Autoloader.php
new file mode 100644
index 000000000..a24cad6f7
--- /dev/null
+++ b/library/Smarty/libs/Autoloader.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ * Smarty Autoloader
+ *
+ * @package Smarty
+ */
+
+/**
+ * Smarty Autoloader
+ *
+ * @package Smarty
+ * @author Uwe Tews
+ * Usage:
+ * require_once '...path/Autoloader.php';
+ * Smarty_Autoloader::register();
+ * $smarty = new Smarty();
+ * Note: This autoloader is not needed if you use Composer.
+ * Composer will automatically add the classes of the Smarty package to it common autoloader.
+ */
+class Smarty_Autoloader
+{
+ /**
+ * Filepath to Smarty root
+ *
+ * @var string
+ */
+ public static $SMARTY_DIR = '';
+ /**
+ * Filepath to Smarty internal plugins
+ *
+ * @var string
+ */
+ public static $SMARTY_SYSPLUGINS_DIR = '';
+ /**
+ * Array of not existing classes to avoid is_file calls for already tested classes
+ *
+ * @var array
+ */
+ public static $unknown = array();
+ /**
+ * Array with Smarty core classes and their filename
+ *
+ * @var array
+ */
+ public static $rootClasses = array('Smarty' => 'Smarty.class.php',
+ 'SmartyBC' => 'SmartyBC.class.php',
+ );
+
+ private static $syspluginsClasses = array(
+ 'smarty_config_source' => true,
+ 'smarty_security' => true,
+ 'smarty_cacheresource' => true,
+ 'smarty_compiledresource' => true,
+ 'smarty_cacheresource_custom' => true,
+ 'smarty_cacheresource_keyvaluestore' => true,
+ 'smarty_resource' => true,
+ 'smarty_resource_custom' => true,
+ 'smarty_resource_uncompiled' => true,
+ 'smarty_resource_recompiled' => true,
+ 'smarty_template_source' => true,
+ 'smarty_template_compiled' => true,
+ 'smarty_template_cached' => true,
+ 'smarty_template_config' => true,
+ 'smarty_data' => true,
+ 'smarty_variable' => true,
+ 'smarty_undefined_variable' => true,
+ 'smartyexception' => true,
+ 'smartycompilerexception' => true,
+ 'smarty_internal_data' => true,
+ 'smarty_internal_template' => true,
+ 'smarty_internal_templatebase' => true,
+ 'smarty_internal_resource_file' => true,
+ 'smarty_internal_resource_extends' => true,
+ 'smarty_internal_resource_eval' => true,
+ 'smarty_internal_resource_string' => true,
+ 'smarty_internal_resource_registered' => true,
+ 'smarty_internal_extension_codeframe' => true,
+ 'smarty_internal_extension_config' => true,
+ 'smarty_internal_filter_handler' => true,
+ 'smarty_internal_function_call_handler' => true,
+ 'smarty_internal_cacheresource_file' => true,
+ 'smarty_internal_write_file' => true,
+ );
+
+ /**
+ * Registers Smarty_Autoloader backward compatible to older installations.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not.
+ */
+ public static function registerBC($prepend = false)
+ {
+ /**
+ * register the class autoloader
+ */
+ if (!defined('SMARTY_SPL_AUTOLOAD')) {
+ define('SMARTY_SPL_AUTOLOAD', 0);
+ }
+ if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false) {
+ $registeredAutoLoadFunctions = spl_autoload_functions();
+ if (!isset($registeredAutoLoadFunctions['spl_autoload'])) {
+ spl_autoload_register();
+ }
+ } else {
+ self::register($prepend);
+ }
+ }
+
+ /**
+ * Registers Smarty_Autoloader as an SPL autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not.
+ */
+ public static function register($prepend = false)
+ {
+ self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : dirname(__FILE__) . '/';
+ self::$SMARTY_SYSPLUGINS_DIR = defined('SMARTY_SYSPLUGINS_DIR') ? SMARTY_SYSPLUGINS_DIR : self::$SMARTY_DIR . 'sysplugins/';
+ if (version_compare(phpversion(), '5.3.0', '>=')) {
+ spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend);
+ } else {
+ spl_autoload_register(array(__CLASS__, 'autoload'));
+ }
+ }
+
+ /**
+ * Handles autoloading of classes.
+ *
+ * @param string $class A class name.
+ */
+ public static function autoload($class)
+ {
+ // Request for Smarty or already unknown class
+ if (isset(self::$unknown[$class])) {
+ return;
+ }
+ $_class = strtolower($class);
+ if (isset(self::$syspluginsClasses[$_class])) {
+ $_class = (self::$syspluginsClasses[$_class] === true) ? $_class : self::$syspluginsClasses[$_class];
+ $file = self::$SMARTY_SYSPLUGINS_DIR . $_class . '.php';
+ require_once $file;
+ return;
+ } elseif (0 !== strpos($_class, 'smarty_internal_')) {
+ if (isset(self::$rootClasses[$class])) {
+ $file = self::$SMARTY_DIR . self::$rootClasses[$class];
+ require_once $file;
+ return;
+ }
+ self::$unknown[$class] = true;
+ return;
+ }
+ $file = self::$SMARTY_SYSPLUGINS_DIR . $_class . '.php';
+ if (is_file($file)) {
+ require_once $file;
+ return;
+ }
+ self::$unknown[$class] = true;
+ return;
+ }
+}
diff --git a/library/Smarty/libs/Smarty.class.php b/library/Smarty/libs/Smarty.class.php
index 832b0d309..1f0f2634a 100644
--- a/library/Smarty/libs/Smarty.class.php
+++ b/library/Smarty/libs/Smarty.class.php
@@ -2,15 +2,17 @@
/**
* Project: Smarty: the PHP compiling template engine
* File: Smarty.class.php
- * SVN: $Id: Smarty.class.php 4897 2014-10-14 22:29:58Z Uwe.Tews@googlemail.com $
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@@ -19,12 +21,13 @@
* smarty-discussion-subscribe@googlegroups.com
*
* @link http://www.smarty.net/
- * @copyright 2008 New Digital Group, Inc.
+ * @copyright 2015 New Digital Group, Inc.
+ * @copyright 2015 Uwe Tews
* @author Monte Ohrt <monte at ohrt dot com>
* @author Uwe Tews
* @author Rodney Rehm
* @package Smarty
- * @version 3.1.21
+ * @version 3.1.27
*/
/**
@@ -53,7 +56,7 @@ if (!defined('SMARTY_PLUGINS_DIR')) {
define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DS);
}
if (!defined('SMARTY_MBSTRING')) {
- define('SMARTY_MBSTRING', function_exists('mb_split'));
+ define('SMARTY_MBSTRING', function_exists('mb_get_info'));
}
if (!defined('SMARTY_RESOURCE_CHAR_SET')) {
// UTF-8 can only be done properly when mbstring is available!
@@ -70,31 +73,29 @@ if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) {
}
/**
- * register the class autoloader
+ * Try loading the Smarty_Internal_Data class
+ * If we fail we must load Smarty's autoloader.
+ * Otherwise we may have a global autoloader like Composer
*/
-if (!defined('SMARTY_SPL_AUTOLOAD')) {
- define('SMARTY_SPL_AUTOLOAD', 0);
-}
-
-if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false) {
- $registeredAutoLoadFunctions = spl_autoload_functions();
- if (!isset($registeredAutoLoadFunctions['spl_autoload'])) {
- spl_autoload_register();
+if (!class_exists('Smarty_Autoloader', false)) {
+ if (!class_exists('Smarty_Internal_Data', true)) {
+ require_once 'Autoloader.php';
+ Smarty_Autoloader::registerBC();
}
-} else {
- spl_autoload_register('smartyAutoload');
}
/**
* Load always needed external class files
*/
-include_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_data.php';
-include_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_templatebase.php';
-include_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_template.php';
-include_once SMARTY_SYSPLUGINS_DIR . 'smarty_resource.php';
-include_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_resource_file.php';
-include_once SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php';
-include_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_cacheresource_file.php';
+
+if (!class_exists('Smarty_Internal_Data', false)) {
+ require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_data.php';
+}
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_templatebase.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_template.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_resource.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_variable.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_source.php';
/**
* This is the main Smarty class
@@ -110,21 +111,28 @@ class Smarty extends Smarty_Internal_TemplateBase
/**
* smarty version
*/
- const SMARTY_VERSION = 'Smarty-3.1.21-dev';
+ const SMARTY_VERSION = '3.1.27';
/**
* define variable scopes
*/
const SCOPE_LOCAL = 0;
+
const SCOPE_PARENT = 1;
+
const SCOPE_ROOT = 2;
+
const SCOPE_GLOBAL = 3;
+
/**
* define caching modes
*/
const CACHING_OFF = 0;
+
const CACHING_LIFETIME_CURRENT = 1;
+
const CACHING_LIFETIME_SAVED = 2;
+
/**
* define constant for clearing cache files be saved expiration datees
*/
@@ -134,29 +142,53 @@ class Smarty extends Smarty_Internal_TemplateBase
* define compile check modes
*/
const COMPILECHECK_OFF = 0;
+
const COMPILECHECK_ON = 1;
+
const COMPILECHECK_CACHEMISS = 2;
+
+ /**
+ * define debug modes
+ */
+ const DEBUG_OFF = 0;
+
+ const DEBUG_ON = 1;
+
+ const DEBUG_INDIVIDUAL = 2;
+
/**
* modes for handling of "<?php ... ?>" tags in templates.
*/
const PHP_PASSTHRU = 0; //-> print tags as plain text
+
const PHP_QUOTE = 1; //-> escape tags as entities
+
const PHP_REMOVE = 2; //-> escape tags as entities
+
const PHP_ALLOW = 3; //-> escape tags as entities
+
/**
* filter types
*/
const FILTER_POST = 'post';
+
const FILTER_PRE = 'pre';
+
const FILTER_OUTPUT = 'output';
+
const FILTER_VARIABLE = 'variable';
+
/**
* plugin types
*/
const PLUGIN_FUNCTION = 'function';
+
const PLUGIN_BLOCK = 'block';
+
const PLUGIN_COMPILER = 'compiler';
+
const PLUGIN_MODIFIER = 'modifier';
+
const PLUGIN_MODIFIERCOMPILER = 'modifiercompiler';
/**#@-*/
@@ -170,23 +202,28 @@ class Smarty extends Smarty_Internal_TemplateBase
* error handler returned by set_error_hanlder() in Smarty::muteExpectedErrors()
*/
public static $_previous_error_handler = null;
+
/**
* contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors()
*/
- public static $_muted_directories = array();
+ public static $_muted_directories = array('./templates_c/' => null, './cache/' => null);
+
/**
* Flag denoting if Multibyte String functions are available
*/
public static $_MBSTRING = SMARTY_MBSTRING;
+
/**
* The character set to adhere to (e.g. "UTF-8")
*/
public static $_CHARSET = SMARTY_RESOURCE_CHAR_SET;
+
/**
* The date format to be used internally
* (accepts date() and strftime())
*/
public static $_DATE_FORMAT = SMARTY_RESOURCE_DATE_FORMAT;
+
/**
* Flag denoting if PCRE should run in UTF-8 mode
*/
@@ -207,158 +244,154 @@ class Smarty extends Smarty_Internal_TemplateBase
* @var boolean
*/
public $auto_literal = true;
+
/**
* display error on not assigned variables
*
* @var boolean
*/
public $error_unassigned = false;
+
/**
* look up relative filepaths in include_path
*
* @var boolean
*/
public $use_include_path = false;
+
/**
* template directory
*
* @var array
*/
- private $template_dir = array();
+ private $template_dir = array('./templates/');
+
/**
* joined template directory string used in cache keys
*
* @var string
*/
- public $joined_template_dir = null;
+ public $joined_template_dir = './templates/';
+
/**
* joined config directory string used in cache keys
*
* @var string
*/
- public $joined_config_dir = null;
+ public $joined_config_dir = './configs/';
+
/**
* default template handler
*
* @var callable
*/
public $default_template_handler_func = null;
+
/**
* default config handler
*
* @var callable
*/
public $default_config_handler_func = null;
+
/**
* default plugin handler
*
* @var callable
*/
public $default_plugin_handler_func = null;
+
/**
* compile directory
*
* @var string
*/
- private $compile_dir = null;
+ private $compile_dir = './templates_c/';
+
/**
* plugins directory
*
* @var array
*/
- private $plugins_dir = array();
+ private $plugins_dir = null;
+
/**
* cache directory
*
* @var string
*/
- private $cache_dir = null;
+ private $cache_dir = './cache/';
+
/**
* config directory
*
* @var array
*/
- private $config_dir = array();
+ private $config_dir = array('./configs/');
+
/**
* force template compiling?
*
* @var boolean
*/
public $force_compile = false;
+
/**
* check template for modifications?
*
* @var boolean
*/
public $compile_check = true;
+
/**
* use sub dirs for compiled/cached files?
*
* @var boolean
*/
public $use_sub_dirs = false;
+
/**
* allow ambiguous resources (that are made unique by the resource handler)
*
* @var boolean
*/
public $allow_ambiguous_resources = false;
- /**
- * caching enabled
- *
- * @var boolean
- */
- public $caching = false;
+
/**
* merge compiled includes
*
* @var boolean
*/
public $merge_compiled_includes = false;
+
/**
* template inheritance merge compiled includes
*
* @var boolean
*/
public $inheritance_merge_compiled_includes = true;
- /**
- * cache lifetime in seconds
- *
- * @var integer
- */
- public $cache_lifetime = 3600;
+
/**
* force cache file creation
*
* @var boolean
*/
public $force_cache = false;
- /**
- * Set this if you want different sets of cache files for the same
- * templates.
- *
- * @var string
- */
- public $cache_id = null;
- /**
- * Set this if you want different sets of compiled files for the same
- * templates.
- *
- * @var string
- */
- public $compile_id = null;
+
/**
* template left-delimiter
*
* @var string
*/
public $left_delimiter = "{";
+
/**
* template right-delimiter
*
* @var string
*/
public $right_delimiter = "}";
+
/**#@+
* security
*/
@@ -370,24 +403,28 @@ class Smarty extends Smarty_Internal_TemplateBase
* @see Smarty_Security
*/
public $security_class = 'Smarty_Security';
+
/**
* implementation of security class
*
* @var Smarty_Security
*/
public $security_policy = null;
+
/**
* controls handling of PHP-blocks
*
* @var integer
*/
public $php_handling = self::PHP_PASSTHRU;
+
/**
* controls if the php template file resource is allowed
*
* @var bool
*/
public $allow_php_templates = false;
+
/**
* Should compiled-templates be prevented from being called directly?
* {@internal
@@ -397,6 +434,7 @@ class Smarty extends Smarty_Internal_TemplateBase
* @var boolean
*/
public $direct_access_security = true;
+
/**#@-*/
/**
* debug mode
@@ -405,6 +443,7 @@ class Smarty extends Smarty_Internal_TemplateBase
* @var boolean
*/
public $debugging = false;
+
/**
* This determines if debugging is enable-able from the browser.
* <ul>
@@ -415,26 +454,30 @@ class Smarty extends Smarty_Internal_TemplateBase
* @var string
*/
public $debugging_ctrl = 'NONE';
+
/**
* Name of debugging URL-param.
* Only used when $debugging_ctrl is set to 'URL'.
* The name of the URL-parameter that activates debugging.
*
- * @var type
+ * @var string
*/
public $smarty_debug_id = 'SMARTY_DEBUG';
+
/**
* Path of debug template.
*
* @var string
*/
public $debug_tpl = null;
+
/**
* When set, smarty uses this value as error_reporting-level.
*
* @var int
*/
public $error_reporting = null;
+
/**
* Internal flag for getTags()
*
@@ -452,12 +495,14 @@ class Smarty extends Smarty_Internal_TemplateBase
* @var boolean
*/
public $config_overwrite = true;
+
/**
* Controls whether config values of on/true/yes and off/false/no get converted to boolean.
*
* @var boolean
*/
public $config_booleanize = true;
+
/**
* Controls whether hidden config sections/vars are read from the file.
*
@@ -477,12 +522,14 @@ class Smarty extends Smarty_Internal_TemplateBase
* @var boolean
*/
public $compile_locking = true;
+
/**
* Controls whether cache resources should emply locking mechanism
*
* @var boolean
*/
public $cache_locking = false;
+
/**
* seconds to wait for acquiring a lock before ignoring the write lock
*
@@ -493,18 +540,13 @@ class Smarty extends Smarty_Internal_TemplateBase
/**#@-*/
/**
- * global template functions
- *
- * @var array
- */
- public $template_functions = array();
- /**
* resource type used if none given
* Must be an valid key of $registered_resources.
*
* @var string
*/
public $default_resource_type = 'file';
+
/**
* caching type
* Must be an element of $cache_resource_types.
@@ -512,256 +554,284 @@ class Smarty extends Smarty_Internal_TemplateBase
* @var string
*/
public $caching_type = 'file';
+
/**
* internal config properties
*
* @var array
*/
public $properties = array();
+
/**
* config type
*
* @var string
*/
public $default_config_type = 'file';
+
+ /**
+ * cached template objects
+ *
+ * @var array
+ */
+ public $source_objects = array();
+
/**
* cached template objects
*
* @var array
*/
public $template_objects = array();
+
+ /**
+ * enable resource caching
+ *
+ * @var bool
+ */
+ public $resource_caching = false;
+
+ /**
+ * enable template resource caching
+ *
+ * @var bool
+ */
+ public $template_resource_caching = true;
+
/**
* check If-Modified-Since headers
*
* @var boolean
*/
public $cache_modified_check = false;
+
/**
* registered plugins
*
* @var array
*/
public $registered_plugins = array();
+
/**
* plugin search order
*
* @var array
*/
public $plugin_search_order = array('function', 'block', 'compiler', 'class');
+
/**
* registered objects
*
* @var array
*/
public $registered_objects = array();
+
/**
* registered classes
*
* @var array
*/
public $registered_classes = array();
+
/**
* registered filters
*
* @var array
*/
public $registered_filters = array();
+
/**
* registered resources
*
* @var array
*/
public $registered_resources = array();
+
/**
* resource handler cache
*
* @var array
*/
public $_resource_handlers = array();
+
/**
* registered cache resources
*
* @var array
*/
public $registered_cache_resources = array();
+
/**
* cache resource handler cache
*
* @var array
*/
public $_cacheresource_handlers = array();
+
/**
* autoload filter
*
* @var array
*/
public $autoload_filters = array();
+
/**
* default modifier
*
* @var array
*/
public $default_modifiers = array();
+
/**
* autoescape variable output
*
* @var boolean
*/
public $escape_html = false;
+
/**
* global internal smarty vars
*
* @var array
*/
public static $_smarty_vars = array();
+
/**
* start time for execution time calculation
*
* @var int
*/
public $start_time = 0;
+
/**
* default file permissions
*
* @var int
*/
public $_file_perms = 0644;
+
/**
* default dir permissions
*
* @var int
*/
public $_dir_perms = 0771;
+
/**
* block tag hierarchy
*
* @var array
*/
public $_tag_stack = array();
- /**
- * self pointer to Smarty object
- *
- * @var Smarty
- */
- public $smarty;
+
/**
* required by the compiler for BC
*
* @var string
*/
public $_current_file = null;
+
/**
* internal flag to enable parser debugging
*
* @var bool
*/
public $_parserdebug = false;
- /**
- * Saved parameter of merged templates during compilation
- *
- * @var array
- */
- public $merged_templates_func = array();
/**
* Cache of is_file results of loadPlugin()
- *
+ *
* @var array
*/
- public static $_is_file_cache= array();
+ public $_is_file_cache = array();
/**#@-*/
/**
* Initialize new Smarty object
-
*/
public function __construct()
{
- // selfpointer needed by some other class methods
- $this->smarty = $this;
if (is_callable('mb_internal_encoding')) {
mb_internal_encoding(Smarty::$_CHARSET);
}
$this->start_time = microtime(true);
- // set default dirs
- $this->setTemplateDir('.' . DS . 'templates' . DS)
- ->setCompileDir('.' . DS . 'templates_c' . DS)
- ->setPluginsDir(SMARTY_PLUGINS_DIR)
- ->setCacheDir('.' . DS . 'cache' . DS)
- ->setConfigDir('.' . DS . 'configs' . DS);
-
- $this->debug_tpl = 'file:' . dirname(__FILE__) . '/debug.tpl';
+ // check default dirs for overloading
+ if ($this->template_dir[0] !== './templates/' || isset($this->template_dir[1])) {
+ $this->setTemplateDir($this->template_dir);
+ }
+ if ($this->config_dir[0] !== './configs/' || isset($this->config_dir[1])) {
+ $this->setConfigDir($this->config_dir);
+ }
+ if ($this->compile_dir !== './templates_c/') {
+ unset(self::$_muted_directories['./templates_c/']);
+ $this->setCompileDir($this->compile_dir);
+ }
+ if ($this->cache_dir !== './cache/') {
+ unset(self::$_muted_directories['./cache/']);
+ $this->setCacheDir($this->cache_dir);
+ }
+ if (isset($this->plugins_dir)) {
+ $this->setPluginsDir($this->plugins_dir);
+ } else {
+ $this->setPluginsDir(SMARTY_PLUGINS_DIR);
+ }
if (isset($_SERVER['SCRIPT_NAME'])) {
- $this->assignGlobal('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
+ Smarty::$global_tpl_vars['SCRIPT_NAME'] = new Smarty_Variable($_SERVER['SCRIPT_NAME']);
}
- }
- /**
- * Class destructor
- */
- public function __destruct()
- {
- // intentionally left blank
- }
+ // Check if we're running on windows
+ Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
- /**
- * <<magic>> set selfpointer on cloned object
- */
- public function __clone()
- {
- $this->smarty = $this;
+ // let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8
+ if (Smarty::$_CHARSET !== 'UTF-8') {
+ Smarty::$_UTF8_MODIFIER = '';
+ }
}
/**
- * <<magic>> Generic getter.
- * Calls the appropriate getter function.
- * Issues an E_USER_NOTICE if no valid getter is found.
+ * fetches a rendered Smarty template
*
- * @param string $name property name
+ * @param string $template the resource handle of the template file or template object
+ * @param mixed $cache_id cache id to be used with this template
+ * @param mixed $compile_id compile id to be used with this template
+ * @param object $parent next higher level of Smarty variables
+ * @param bool $display true: display, false: fetch
+ * @param bool $merge_tpl_vars not used - left for BC
+ * @param bool $no_output_filter not used - left for BC
*
- * @return mixed
+ * @throws Exception
+ * @throws SmartyException
+ * @return string rendered template output
*/
- public function __get($name)
+ public function fetch($template = null, $cache_id = null, $compile_id = null, $parent = null, $display = false, $merge_tpl_vars = true, $no_output_filter = false)
{
- $allowed = array(
- 'template_dir' => 'getTemplateDir',
- 'config_dir' => 'getConfigDir',
- 'plugins_dir' => 'getPluginsDir',
- 'compile_dir' => 'getCompileDir',
- 'cache_dir' => 'getCacheDir',
- );
-
- if (isset($allowed[$name])) {
- return $this->{$allowed[$name]}();
- } else {
- trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
+ if ($cache_id !== null && is_object($cache_id)) {
+ $parent = $cache_id;
+ $cache_id = null;
}
+ if ($parent === null) {
+ $parent = $this;
+ }
+ // get template object
+ $_template = is_object($template) ? $template : $this->createTemplate($template, $cache_id, $compile_id, $parent, false);
+ // set caching in template object
+ $_template->caching = $this->caching;
+ // fetch template content
+ return $_template->render(true, false, $display);
}
/**
- * <<magic>> Generic setter.
- * Calls the appropriate setter function.
- * Issues an E_USER_NOTICE if no valid setter is found.
+ * displays a Smarty template
*
- * @param string $name property name
- * @param mixed $value parameter passed to setter
+ * @param string $template the resource handle of the template file or template object
+ * @param mixed $cache_id cache id to be used with this template
+ * @param mixed $compile_id compile id to be used with this template
+ * @param object $parent next higher level of Smarty variables
*/
- public function __set($name, $value)
+ public function display($template = null, $cache_id = null, $compile_id = null, $parent = null)
{
- $allowed = array(
- 'template_dir' => 'setTemplateDir',
- 'config_dir' => 'setConfigDir',
- 'plugins_dir' => 'setPluginsDir',
- 'compile_dir' => 'setCompileDir',
- 'cache_dir' => 'setCacheDir',
- );
-
- if (isset($allowed[$name])) {
- $this->{$allowed[$name]}($value);
- } else {
- trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
- }
+ // display template
+ $this->fetch($template, $cache_id, $compile_id, $parent, true);
}
/**
@@ -899,11 +969,9 @@ class Smarty extends Smarty_Internal_TemplateBase
{
$this->template_dir = array();
foreach ((array) $template_dir as $k => $v) {
- $this->template_dir[$k] = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($v, '/\\')) . DS;
+ $this->template_dir[$k] = rtrim($v, '/\\') . DS;
}
-
- $this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir);
-
+ $this->joined_template_dir = join(' # ', $this->template_dir);
return $this;
}
@@ -918,32 +986,8 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function addTemplateDir($template_dir, $key = null)
{
- // make sure we're dealing with an array
- $this->template_dir = (array) $this->template_dir;
-
- if (is_array($template_dir)) {
- foreach ($template_dir as $k => $v) {
- $v = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($v, '/\\')) . DS;
- if (is_int($k)) {
- // indexes are not merged but appended
- $this->template_dir[] = $v;
- } else {
- // string indexes are overridden
- $this->template_dir[$k] = $v;
- }
- }
- } else {
- $v = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($template_dir, '/\\')) . DS;
- if ($key !== null) {
- // override directory at specified index
- $this->template_dir[$key] = $v;
- } else {
- // append new directory
- $this->template_dir[] = $v;
- }
- }
- $this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir);
-
+ $this->_addDir('template_dir', $template_dir, $key);
+ $this->joined_template_dir = join(' # ', $this->template_dir);
return $this;
}
@@ -959,7 +1003,6 @@ class Smarty extends Smarty_Internal_TemplateBase
if ($index !== null) {
return isset($this->template_dir[$index]) ? $this->template_dir[$index] : null;
}
-
return (array) $this->template_dir;
}
@@ -974,51 +1017,24 @@ class Smarty extends Smarty_Internal_TemplateBase
{
$this->config_dir = array();
foreach ((array) $config_dir as $k => $v) {
- $this->config_dir[$k] = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($v, '/\\')) . DS;
+ $this->config_dir[$k] = rtrim($v, '/\\') . DS;
}
-
- $this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir);
-
+ $this->joined_config_dir = join(' # ', $this->config_dir);
return $this;
}
/**
* Add config directory(s)
*
- * @param string|array $config_dir directory(s) of config sources
- * @param mixed $key key of the array element to assign the config dir to
+ * @param string|array $config_dir directory(s) of config sources
+ * @param mixed $key key of the array element to assign the config dir to
*
* @return Smarty current Smarty instance for chaining
*/
public function addConfigDir($config_dir, $key = null)
{
- // make sure we're dealing with an array
- $this->config_dir = (array) $this->config_dir;
-
- if (is_array($config_dir)) {
- foreach ($config_dir as $k => $v) {
- $v = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($v, '/\\')) . DS;
- if (is_int($k)) {
- // indexes are not merged but appended
- $this->config_dir[] = $v;
- } else {
- // string indexes are overridden
- $this->config_dir[$k] = $v;
- }
- }
- } else {
- $v = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($config_dir, '/\\')) . DS;
- if ($key !== null) {
- // override directory at specified index
- $this->config_dir[$key] = rtrim($v, '/\\') . DS;
- } else {
- // append new directory
- $this->config_dir[] = rtrim($v, '/\\') . DS;
- }
- }
-
- $this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir);
-
+ $this->_addDir('config_dir', $config_dir, $key);
+ $this->joined_config_dir = join(' # ', $this->config_dir);
return $this;
}
@@ -1034,7 +1050,6 @@ class Smarty extends Smarty_Internal_TemplateBase
if ($index !== null) {
return isset($this->config_dir[$index]) ? $this->config_dir[$index] : null;
}
-
return (array) $this->config_dir;
}
@@ -1048,10 +1063,7 @@ class Smarty extends Smarty_Internal_TemplateBase
public function setPluginsDir($plugins_dir)
{
$this->plugins_dir = array();
- foreach ((array) $plugins_dir as $k => $v) {
- $this->plugins_dir[$k] = rtrim($v, '/\\') . DS;
- }
-
+ $this->addPluginsDir($plugins_dir);
return $this;
}
@@ -1066,24 +1078,11 @@ class Smarty extends Smarty_Internal_TemplateBase
{
// make sure we're dealing with an array
$this->plugins_dir = (array) $this->plugins_dir;
-
- if (is_array($plugins_dir)) {
- foreach ($plugins_dir as $k => $v) {
- if (is_int($k)) {
- // indexes are not merged but appended
- $this->plugins_dir[] = rtrim($v, '/\\') . DS;
- } else {
- // string indexes are overridden
- $this->plugins_dir[$k] = rtrim($v, '/\\') . DS;
- }
- }
- } else {
- // append new directory
- $this->plugins_dir[] = rtrim($plugins_dir, '/\\') . DS;
+ foreach ((array) $plugins_dir as $v) {
+ $this->plugins_dir[] = rtrim($v, '/\\') . DS;
}
-
$this->plugins_dir = array_unique($this->plugins_dir);
-
+ $this->_is_file_cache = array();
return $this;
}
@@ -1137,7 +1136,6 @@ class Smarty extends Smarty_Internal_TemplateBase
if (!isset(Smarty::$_muted_directories[$this->cache_dir])) {
Smarty::$_muted_directories[$this->cache_dir] = null;
}
-
return $this;
}
@@ -1152,6 +1150,39 @@ class Smarty extends Smarty_Internal_TemplateBase
}
/**
+ * add directories to given property name
+ *
+ * @param string $dirName directory property name
+ * @param string|array $dir directory string or array of strings
+ * @param mixed $key optional key
+ */
+ private function _addDir($dirName, $dir, $key = null)
+ {
+ // make sure we're dealing with an array
+ $this->$dirName = (array) $this->$dirName;
+
+ if (is_array($dir)) {
+ foreach ($dir as $k => $v) {
+ if (is_int($k)) {
+ // indexes are not merged but appended
+ $this->{$dirName}[] = rtrim($v, '/\\') . DS;
+ } else {
+ // string indexes are overridden
+ $this->{$dirName}[$k] = rtrim($v, '/\\') . DS;
+ }
+ }
+ } else {
+ if ($key !== null) {
+ // override directory at specified index
+ $this->{$dirName}[$key] = rtrim($dir, '/\\') . DS;
+ } else {
+ // append new directory
+ $this->{$dirName}[] = rtrim($dir, '/\\') . DS;
+ }
+ }
+ }
+
+ /**
* Set default modifiers
*
* @param array|string $modifiers modifier or list of modifiers to set
@@ -1197,7 +1228,8 @@ class Smarty extends Smarty_Internal_TemplateBase
* Set autoload filters
*
* @param array $filters filters to load automatically
- * @param string $type "pre", "output", … specify the filter type to set. Defaults to none treating $filters' keys as the appropriate types
+ * @param string $type "pre", "output", … specify the filter type to set. Defaults to none treating $filters'
+ * keys as the appropriate types
*
* @return Smarty current Smarty instance for chaining
*/
@@ -1216,7 +1248,8 @@ class Smarty extends Smarty_Internal_TemplateBase
* Add autoload filters
*
* @param array $filters filters to load automatically
- * @param string $type "pre", "output", … specify the filter type to set. Defaults to none treating $filters' keys as the appropriate types
+ * @param string $type "pre", "output", … specify the filter type to set. Defaults to none treating $filters'
+ * keys as the appropriate types
*
* @return Smarty current Smarty instance for chaining
*/
@@ -1246,7 +1279,8 @@ class Smarty extends Smarty_Internal_TemplateBase
*
* @param string $type type of filter to get autoloads for. Defaults to all autoload filters
*
- * @return array array( 'type1' => array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type was specified
+ * @return array array( 'type1' => array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type
+ * was specified
*/
public function getAutoloadFilters($type = null)
{
@@ -1308,48 +1342,34 @@ class Smarty extends Smarty_Internal_TemplateBase
} else {
$data = null;
}
- // default to cache_id and compile_id of Smarty object
- $cache_id = $cache_id === null ? $this->cache_id : $cache_id;
- $compile_id = $compile_id === null ? $this->compile_id : $compile_id;
- // already in template cache?
- if ($this->allow_ambiguous_resources) {
- $_templateId = Smarty_Resource::getUniqueTemplateName($this, $template) . $cache_id . $compile_id;
- } else {
- $_templateId = $this->joined_template_dir . '#' . $template . $cache_id . $compile_id;
- }
- if (isset($_templateId[150])) {
- $_templateId = sha1($_templateId);
- }
- if ($do_clone) {
- if (isset($this->template_objects[$_templateId])) {
- // return cached template object
+ $_templateId = $this->getTemplateId($template, $cache_id, $compile_id);
+ if (isset($this->template_objects[$_templateId])) {
+ if ($do_clone) {
$tpl = clone $this->template_objects[$_templateId];
$tpl->smarty = clone $tpl->smarty;
- $tpl->parent = $parent;
- $tpl->tpl_vars = array();
- $tpl->config_vars = array();
} else {
- $tpl = new $this->template_class($template, clone $this, $parent, $cache_id, $compile_id);
+ $tpl = $this->template_objects[$_templateId];
}
+ $tpl->parent = $parent;
+ $tpl->tpl_vars = array();
+ $tpl->config_vars = array();
} else {
- if (isset($this->template_objects[$_templateId])) {
- // return cached template object
- $tpl = $this->template_objects[$_templateId];
- $tpl->parent = $parent;
- $tpl->tpl_vars = array();
- $tpl->config_vars = array();
- } else {
- $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id);
+ $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id);
+ if ($do_clone) {
+ $tpl->smarty = clone $tpl->smarty;
}
+ $tpl->templateId = $_templateId;
}
// fill data if present
if (!empty($data) && is_array($data)) {
// set up variable values
foreach ($data as $_key => $_val) {
- $tpl->tpl_vars[$_key] = new Smarty_variable($_val);
+ $tpl->tpl_vars[$_key] = new Smarty_Variable($_val);
}
}
-
+ if ($this->debugging) {
+ Smarty_Internal_Debug::register_template($tpl);
+ }
return $tpl;
}
@@ -1380,7 +1400,7 @@ class Smarty extends Smarty_Internal_TemplateBase
// if type is "internal", get plugin from sysplugins
if (strtolower($_name_parts[1]) == 'internal') {
$file = SMARTY_SYSPLUGINS_DIR . strtolower($plugin_name) . '.php';
- if (isset(self::$_is_file_cache[$file]) ? self::$_is_file_cache[$file] : self::$_is_file_cache[$file] = is_file($file)) {
+ if (isset($this->_is_file_cache[$file]) ? $this->_is_file_cache[$file] : $this->_is_file_cache[$file] = is_file($file)) {
require_once($file);
return $file;
} else {
@@ -1394,12 +1414,9 @@ class Smarty extends Smarty_Internal_TemplateBase
// loop through plugin dirs and find the plugin
foreach ($this->getPluginsDir() as $_plugin_dir) {
- $names = array(
- $_plugin_dir . $_plugin_filename,
- $_plugin_dir . strtolower($_plugin_filename),
- );
+ $names = array($_plugin_dir . $_plugin_filename, $_plugin_dir . strtolower($_plugin_filename),);
foreach ($names as $file) {
- if (isset(self::$_is_file_cache[$file]) ? self::$_is_file_cache[$file] : self::$_is_file_cache[$file] = is_file($file)) {
+ if (isset($this->_is_file_cache[$file]) ? $this->_is_file_cache[$file] : $this->_is_file_cache[$file] = is_file($file)) {
require_once($file);
return $file;
}
@@ -1488,7 +1505,202 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function testInstall(&$errors = null)
{
- return Smarty_Internal_Utility::testInstall($this, $errors);
+ return Smarty_Internal_TestInstall::testInstall($this, $errors);
+ }
+
+ /**
+ * @param boolean $compile_check
+ */
+ public function setCompileCheck($compile_check)
+ {
+ $this->compile_check = $compile_check;
+ }
+
+ /**
+ * @param boolean $use_sub_dirs
+ */
+ public function setUseSubDirs($use_sub_dirs)
+ {
+ $this->use_sub_dirs = $use_sub_dirs;
+ }
+
+ /**
+ * @param boolean $caching
+ */
+ public function setCaching($caching)
+ {
+ $this->caching = $caching;
+ }
+
+ /**
+ * @param int $cache_lifetime
+ */
+ public function setCacheLifetime($cache_lifetime)
+ {
+ $this->cache_lifetime = $cache_lifetime;
+ }
+
+ /**
+ * @param string $compile_id
+ */
+ public function setCompileId($compile_id)
+ {
+ $this->compile_id = $compile_id;
+ }
+
+ /**
+ * @param string $cache_id
+ */
+ public function setCacheId($cache_id)
+ {
+ $this->cache_id = $cache_id;
+ }
+
+ /**
+ * @param int $error_reporting
+ */
+ public function setErrorReporting($error_reporting)
+ {
+ $this->error_reporting = $error_reporting;
+ }
+
+ /**
+ * @param boolean $escape_html
+ */
+ public function setEscapeHtml($escape_html)
+ {
+ $this->escape_html = $escape_html;
+ }
+
+ /**
+ * @param boolean $auto_literal
+ */
+ public function setAutoLiteral($auto_literal)
+ {
+ $this->auto_literal = $auto_literal;
+ }
+
+ /**
+ * @param boolean $force_compile
+ */
+ public function setForceCompile($force_compile)
+ {
+ $this->force_compile = $force_compile;
+ }
+
+ /**
+ * @param boolean $merge_compiled_includes
+ */
+ public function setMergeCompiledIncludes($merge_compiled_includes)
+ {
+ $this->merge_compiled_includes = $merge_compiled_includes;
+ }
+
+ /**
+ * @param string $left_delimiter
+ */
+ public function setLeftDelimiter($left_delimiter)
+ {
+ $this->left_delimiter = $left_delimiter;
+ }
+
+ /**
+ * @param string $right_delimiter
+ */
+ public function setRightDelimiter($right_delimiter)
+ {
+ $this->right_delimiter = $right_delimiter;
+ }
+
+ /**
+ * @param boolean $debugging
+ */
+ public function setDebugging($debugging)
+ {
+ $this->debugging = $debugging;
+ }
+
+ /**
+ * @param boolean $config_overwrite
+ */
+ public function setConfigOverwrite($config_overwrite)
+ {
+ $this->config_overwrite = $config_overwrite;
+ }
+
+ /**
+ * @param boolean $config_booleanize
+ */
+ public function setConfigBooleanize($config_booleanize)
+ {
+ $this->config_booleanize = $config_booleanize;
+ }
+
+ /**
+ * @param boolean $config_read_hidden
+ */
+ public function setConfigReadHidden($config_read_hidden)
+ {
+ $this->config_read_hidden = $config_read_hidden;
+ }
+
+ /**
+ * @param boolean $compile_locking
+ */
+ public function setCompileLocking($compile_locking)
+ {
+ $this->compile_locking = $compile_locking;
+ }
+
+ /**
+ * Class destructor
+ */
+ public function __destruct()
+ {
+ // intentionally left blank
+ }
+
+ /**
+ * <<magic>> Generic getter.
+ * Calls the appropriate getter function.
+ * Issues an E_USER_NOTICE if no valid getter is found.
+ *
+ * @param string $name property name
+ *
+ * @return mixed
+ */
+ public function __get($name)
+ {
+ $allowed = array('template_dir' => 'getTemplateDir', 'config_dir' => 'getConfigDir',
+ 'plugins_dir' => 'getPluginsDir', 'compile_dir' => 'getCompileDir',
+ 'cache_dir' => 'getCacheDir',);
+
+ if (isset($allowed[$name])) {
+ return $this->{$allowed[$name]}();
+ } else {
+ trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
+ }
+ }
+
+ /**
+ * <<magic>> Generic setter.
+ * Calls the appropriate setter function.
+ * Issues an E_USER_NOTICE if no valid setter is found.
+ *
+ * @param string $name property name
+ * @param mixed $value parameter passed to setter
+ */
+ public function __set($name, $value)
+ {
+ $allowed = array('template_dir' => 'setTemplateDir', 'config_dir' => 'setConfigDir',
+ 'plugins_dir' => 'setPluginsDir', 'compile_dir' => 'setCompileDir',
+ 'cache_dir' => 'setCacheDir',);
+
+ if (isset($allowed[$name])) {
+ $this->{$allowed[$name]}($value);
+ } else {
+ trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
+ }
}
/**
@@ -1512,10 +1724,8 @@ class Smarty extends Smarty_Internal_TemplateBase
if (!isset(Smarty::$_muted_directories[SMARTY_DIR])) {
$smarty_dir = realpath(SMARTY_DIR);
if ($smarty_dir !== false) {
- Smarty::$_muted_directories[SMARTY_DIR] = array(
- 'file' => $smarty_dir,
- 'length' => strlen($smarty_dir),
- );
+ Smarty::$_muted_directories[SMARTY_DIR] = array('file' => $smarty_dir,
+ 'length' => strlen($smarty_dir),);
}
}
@@ -1529,10 +1739,7 @@ class Smarty extends Smarty_Internal_TemplateBase
unset(Smarty::$_muted_directories[$key]);
continue;
}
- $dir = array(
- 'file' => $file,
- 'length' => strlen($file),
- );
+ $dir = array('file' => $file, 'length' => strlen($file),);
}
if (!strncmp($errfile, $dir['file'], $dir['length'])) {
$_is_muted_directory = true;
@@ -1593,88 +1800,3 @@ class Smarty extends Smarty_Internal_TemplateBase
restore_error_handler();
}
}
-
-// Check if we're running on windows
-Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
-
-// let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8
-if (Smarty::$_CHARSET !== 'UTF-8') {
- Smarty::$_UTF8_MODIFIER = '';
-}
-
-/**
- * Smarty exception class
- *
- * @package Smarty
- */
-class SmartyException extends Exception
-{
- public static $escape = false;
-
- public function __toString()
- {
- return ' --> Smarty: ' . (self::$escape ? htmlentities($this->message) : $this->message) . ' <-- ';
- }
-}
-
-/**
- * Smarty compiler exception class
- *
- * @package Smarty
- */
-class SmartyCompilerException extends SmartyException
-{
- public function __toString()
- {
- return ' --> Smarty Compiler: ' . $this->message . ' <-- ';
- }
-
- /**
- * The line number of the template error
- *
- * @type int|null
- */
- public $line = null;
- /**
- * The template source snippet relating to the error
- *
- * @type string|null
- */
- public $source = null;
- /**
- * The raw text of the error message
- *
- * @type string|null
- */
- public $desc = null;
- /**
- * The resource identifier or template name
- *
- * @type string|null
- */
- public $template = null;
-}
-
-/**
- * Autoloader
- */
-function smartyAutoload($class)
-{
- $_class = strtolower($class);
- static $_classes = array(
- 'smarty_config_source' => true,
- 'smarty_config_compiled' => true,
- 'smarty_security' => true,
- 'smarty_cacheresource' => true,
- 'smarty_cacheresource_custom' => true,
- 'smarty_cacheresource_keyvaluestore' => true,
- 'smarty_resource' => true,
- 'smarty_resource_custom' => true,
- 'smarty_resource_uncompiled' => true,
- 'smarty_resource_recompiled' => true,
- );
-
- if (!strncmp($_class, 'smarty_internal_', 16) || isset($_classes[$_class])) {
- include SMARTY_SYSPLUGINS_DIR . $_class . '.php';
- }
-}
diff --git a/library/Smarty/libs/SmartyBC.class.php b/library/Smarty/libs/SmartyBC.class.php
index cec946746..76dd8bd0f 100644
--- a/library/Smarty/libs/SmartyBC.class.php
+++ b/library/Smarty/libs/SmartyBC.class.php
@@ -52,8 +52,6 @@ class SmartyBC extends Smarty
public function __construct(array $options = array())
{
parent::__construct($options);
- // register {php} tag
- $this->registerPlugin('block', 'php', 'smarty_php_tag');
}
/**
@@ -115,10 +113,10 @@ class SmartyBC extends Smarty
/**
* Registers object to be used in templates
*
- * @param string $object name of template object
- * @param object $object_impl the referenced PHP object to register
- * @param array $allowed list of allowed methods (empty = all)
- * @param boolean $smarty_args smarty argument format, else traditional
+ * @param string $object name of template object
+ * @param object $object_impl the referenced PHP object to register
+ * @param array $allowed list of allowed methods (empty = all)
+ * @param boolean $smarty_args smarty argument format, else traditional
* @param array $block_methods list of methods that are block format
*
* @throws SmartyException
@@ -448,20 +446,3 @@ class SmartyBC extends Smarty
trigger_error("Smarty error: $error_msg", $error_type);
}
}
-
-/**
- * Smarty {php}{/php} block function
- *
- * @param array $params parameter list
- * @param string $content contents of the block
- * @param object $template template object
- * @param boolean &$repeat repeat flag
- *
- * @return string content re-formatted
- */
-function smarty_php_tag($params, $content, $template, &$repeat)
-{
- eval($content);
-
- return '';
-}
diff --git a/library/Smarty/libs/debug.tpl b/library/Smarty/libs/debug.tpl
index 61b8876a4..5b09c5bd2 100644
--- a/library/Smarty/libs/debug.tpl
+++ b/library/Smarty/libs/debug.tpl
@@ -5,7 +5,7 @@
<title>Smarty Debug Console</title>
<style type="text/css">
{literal}
- body, h1, h2, td, th, p {
+ body, h1, h2, h3, td, th, p {
font-family: sans-serif;
font-weight: normal;
font-size: 0.9em;
@@ -31,6 +31,13 @@
padding: 2px;
border-top: 1px solid black;
}
+ h3 {
+ text-align: left;
+ font-weight: bold;
+ color: black;
+ font-size: 0.7em;
+ padding: 2px;
+ }
body {
background: black;
@@ -54,7 +61,6 @@
font-family: monospace;
vertical-align: top;
text-align: left;
- width: 50%;
}
td {
@@ -74,8 +80,20 @@
font-style: italic;
}
+ #bold div {
+ color: black;
+ font-weight: bold;
+ }
+ #blue h3 {
+ color: blue;
+ }
+ #normal div {
+ color: black;
+ font-weight: normal;
+ }
#table_assigned_vars th {
color: blue;
+ font-weight: bold;
}
#table_config_vars th {
@@ -87,18 +105,17 @@
</head>
<body>
- <h1>Smarty Debug Console
- - {if isset($template_name)}{$template_name|debug_print_var nofilter}{else}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1>
+ <h1>Smarty {Smarty::SMARTY_VERSION} Debug Console
+ - {if isset($template_name)}{$template_name|debug_print_var nofilter} {/if}{if !empty($template_data)}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1>
{if !empty($template_data)}
<h2>included templates &amp; config files (load time in seconds)</h2>
<div>
{foreach $template_data as $template}
<font color=brown>{$template.name}</font>
- <span class="exectime">
- (compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"}
- )
- </span>
+ <br>&nbsp;&nbsp;<span class="exectime">
+ (compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"})
+ </span>
<br>
{/foreach}
</div>
@@ -109,19 +126,24 @@
<table id="table_assigned_vars">
{foreach $assigned_vars as $vars}
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
- <th>${$vars@key|escape:'html'}</th>
- <td>{$vars|debug_print_var nofilter}</td>
- </tr>
- {/foreach}
+ <td><h3><font color=blue>${$vars@key}</font></h3>
+ {if isset($vars['nocache'])}<b>Nocache</b></br>{/if}
+ {if isset($vars['scope'])}<b>Origin:</b> {$vars['scope']|debug_print_var:10:80 nofilter}{/if}
+ </td>
+ <td><h3>Value</h3>{$vars['value']|debug_print_var:10:80 nofilter}</td>
+ <td>{if isset($vars['attributes'])}<h3>Attributes</h3>{$vars['attributes']|debug_print_var nofilter} {/if}</td>
+ {/foreach}
</table>
- <h2>assigned config file variables (outer template scope)</h2>
+ <h2>assigned config file variables</h2>
<table id="table_config_vars">
{foreach $config_vars as $vars}
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
- <th>{$vars@key|escape:'html'}</th>
- <td>{$vars|debug_print_var nofilter}</td>
+ <td><h3><font color=blue>#{$vars@key}#</font></h3>
+ {if isset($vars['scope'])}<b>Origin:</b> {$vars['scope']|debug_print_var:10:80 nofilter}{/if}
+ </td>
+ <td>{$vars['value']|debug_print_var:10:80 nofilter}</td>
</tr>
{/foreach}
@@ -130,8 +152,9 @@
</html>
{/capture}
<script type="text/javascript">
- {$id = $template_name|default:''|md5}
- _smarty_console = window.open("", "console{$id}", "width=680,height=600,resizable,scrollbars=yes");
+ {$id = ''}
+ {if $display_mode}{$id = "$offset$template_name"|md5}{/if}
+ _smarty_console = window.open("", "console{$id}", "width=680,height=600,left={$offset},top={$offset},resizable,scrollbars=yes");
_smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}");
_smarty_console.document.close();
</script>
diff --git a/library/Smarty/libs/plugins/modifier.date_format.php b/library/Smarty/libs/plugins/modifier.date_format.php
index 5ad7540b1..28d6ff021 100644
--- a/library/Smarty/libs/plugins/modifier.date_format.php
+++ b/library/Smarty/libs/plugins/modifier.date_format.php
@@ -33,7 +33,7 @@ function smarty_modifier_date_format($string, $format = null, $default_date = ''
$format = Smarty::$_DATE_FORMAT;
}
/**
- * Include the {@link shared.make_timestamp.php} plugin
+ * 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') {
diff --git a/library/Smarty/libs/plugins/modifier.debug_print_var.php b/library/Smarty/libs/plugins/modifier.debug_print_var.php
index 66363d253..e3971a046 100644
--- a/library/Smarty/libs/plugins/modifier.debug_print_var.php
+++ b/library/Smarty/libs/plugins/modifier.debug_print_var.php
@@ -14,26 +14,30 @@
*
* @author Monte Ohrt <monte at ohrt dot com>
*
- * @param array|object $var variable to be formatted
- * @param integer $depth maximum recursion depth if $var is an array
- * @param integer $length maximum string length if $var is a string
+ * @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, $depth = 0, $length = 40)
+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, ++$depth, $length);
+ . smarty_modifier_debug_print_var($curr_val, $max, $length, ++ $depth, $objects);
$depth --;
}
break;
@@ -41,10 +45,18 @@ function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
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, ++$depth, $length);
+ . smarty_modifier_debug_print_var($curr_val, $max, $length, ++ $depth, $objects);
$depth --;
}
break;
diff --git a/library/Smarty/libs/plugins/outputfilter.trimwhitespace.php b/library/Smarty/libs/plugins/outputfilter.trimwhitespace.php
index 62ab4e776..ad35d11a2 100644
--- a/library/Smarty/libs/plugins/outputfilter.trimwhitespace.php
+++ b/library/Smarty/libs/plugins/outputfilter.trimwhitespace.php
@@ -45,7 +45,7 @@ function smarty_outputfilter_trimwhitespace($source)
// capture html elements not to be messed with
$_offset = 0;
- if (preg_match_all('#<(script|pre|textarea)[^>]*>.*?</\\1>#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
+ 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]);
@@ -62,7 +62,7 @@ function smarty_outputfilter_trimwhitespace($source)
// 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*(["\'])[^\3]*?\3)|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \4',
+ '#(([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' => '<',
diff --git a/library/Smarty/libs/sysplugins/smarty_cacheresource.php b/library/Smarty/libs/sysplugins/smarty_cacheresource.php
index 667bee44f..622ab6fbc 100644
--- a/library/Smarty/libs/sysplugins/smarty_cacheresource.php
+++ b/library/Smarty/libs/sysplugins/smarty_cacheresource.php
@@ -16,19 +16,12 @@
abstract class Smarty_CacheResource
{
/**
- * cache for Smarty_CacheResource instances
- *
- * @var array
- */
- public static $resources = array();
-
- /**
* resource types provided by the core
*
* @var array
*/
protected static $sysplugins = array(
- 'file' => true,
+ 'file' => 'smarty_internal_cacheresource_file.php',
);
/**
@@ -204,21 +197,16 @@ abstract class Smarty_CacheResource
}
// try sysplugins dir
if (isset(self::$sysplugins[$type])) {
- if (!isset(self::$resources[$type])) {
- $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
- self::$resources[$type] = new $cache_resource_class();
+ $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
+ if (!class_exists($cache_resource_class, false)) {
+ require SMARTY_SYSPLUGINS_DIR . self::$sysplugins[$type];
}
-
- return $smarty->_cacheresource_handlers[$type] = self::$resources[$type];
+ return $smarty->_cacheresource_handlers[$type] = new $cache_resource_class();
}
// try plugins dir
$cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);
if ($smarty->loadPlugin($cache_resource_class)) {
- if (!isset(self::$resources[$type])) {
- self::$resources[$type] = new $cache_resource_class();
- }
-
- return $smarty->_cacheresource_handlers[$type] = self::$resources[$type];
+ return $smarty->_cacheresource_handlers[$type] = new $cache_resource_class();
}
// give up
throw new SmartyException("Unable to load cache resource '{$type}'");
@@ -239,204 +227,3 @@ abstract class Smarty_CacheResource
}
}
}
-
-/**
- * Smarty Resource Data Object
- * Cache Data Container for Template Files
- *
- * @package Smarty
- * @subpackage TemplateResources
- * @author Rodney Rehm
- */
-class Smarty_Template_Cached
-{
- /**
- * Source Filepath
- *
- * @var string
- */
- public $filepath = false;
-
- /**
- * Source Content
- *
- * @var string
- */
- public $content = null;
-
- /**
- * Source Timestamp
- *
- * @var integer
- */
- public $timestamp = false;
-
- /**
- * Source Existence
- *
- * @var boolean
- */
- public $exists = false;
-
- /**
- * Cache Is Valid
- *
- * @var boolean
- */
- public $valid = false;
-
- /**
- * Cache was processed
- *
- * @var boolean
- */
- public $processed = false;
-
- /**
- * CacheResource Handler
- *
- * @var Smarty_CacheResource
- */
- public $handler = null;
-
- /**
- * Template Compile Id (Smarty_Internal_Template::$compile_id)
- *
- * @var string
- */
- public $compile_id = null;
-
- /**
- * Template Cache Id (Smarty_Internal_Template::$cache_id)
- *
- * @var string
- */
- public $cache_id = null;
-
- /**
- * Id for cache locking
- *
- * @var string
- */
- public $lock_id = null;
-
- /**
- * flag that cache is locked by this instance
- *
- * @var bool
- */
- public $is_locked = false;
-
- /**
- * Source Object
- *
- * @var Smarty_Template_Source
- */
- public $source = null;
-
- /**
- * create Cached Object container
- *
- * @param Smarty_Internal_Template $_template template object
- */
- public function __construct(Smarty_Internal_Template $_template)
- {
- $this->compile_id = $_template->compile_id;
- $this->cache_id = $_template->cache_id;
- $this->source = $_template->source;
- $_template->cached = $this;
- $smarty = $_template->smarty;
-
- //
- // load resource handler
- //
- $this->handler = $handler = Smarty_CacheResource::load($smarty); // Note: prone to circular references
-
- //
- // check if cache is valid
- //
- if (!($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED) || $_template->source->recompiled) {
- $handler->populate($this, $_template);
-
- return;
- }
- while (true) {
- while (true) {
- $handler->populate($this, $_template);
- if ($this->timestamp === false || $smarty->force_compile || $smarty->force_cache) {
- $this->valid = false;
- } else {
- $this->valid = true;
- }
- if ($this->valid && $_template->caching == Smarty::CACHING_LIFETIME_CURRENT && $_template->cache_lifetime >= 0 && time() > ($this->timestamp + $_template->cache_lifetime)) {
- // lifetime expired
- $this->valid = false;
- }
- if ($this->valid || !$_template->smarty->cache_locking) {
- break;
- }
- if (!$this->handler->locked($_template->smarty, $this)) {
- $this->handler->acquireLock($_template->smarty, $this);
- break 2;
- }
- }
- if ($this->valid) {
- if (!$_template->smarty->cache_locking || $this->handler->locked($_template->smarty, $this) === null) {
- // load cache file for the following checks
- if ($smarty->debugging) {
- Smarty_Internal_Debug::start_cache($_template);
- }
- if ($handler->process($_template, $this) === false) {
- $this->valid = false;
- } else {
- $this->processed = true;
- }
- if ($smarty->debugging) {
- Smarty_Internal_Debug::end_cache($_template);
- }
- } else {
- continue;
- }
- } else {
- return;
- }
- if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_SAVED && $_template->properties['cache_lifetime'] >= 0 && (time() > ($_template->cached->timestamp + $_template->properties['cache_lifetime']))) {
- $this->valid = false;
- }
- if (!$this->valid && $_template->smarty->cache_locking) {
- $this->handler->acquireLock($_template->smarty, $this);
-
- return;
- } else {
- return;
- }
- }
- }
-
- /**
- * Write this cache object to handler
- *
- * @param Smarty_Internal_Template $_template template object
- * @param string $content content to cache
- *
- * @return boolean success
- */
- public function write(Smarty_Internal_Template $_template, $content)
- {
- if (!$_template->source->recompiled) {
- if ($this->handler->writeCachedContent($_template, $content)) {
- $this->content = null;
- $this->timestamp = time();
- $this->exists = true;
- $this->valid = true;
- if ($_template->smarty->cache_locking) {
- $this->handler->releaseLock($_template->smarty, $this);
- }
-
- return true;
- }
- }
-
- return false;
- }
-}
diff --git a/library/Smarty/libs/sysplugins/smarty_cacheresource_custom.php b/library/Smarty/libs/sysplugins/smarty_cacheresource_custom.php
index a258b2de7..f496c1523 100644
--- a/library/Smarty/libs/sysplugins/smarty_cacheresource_custom.php
+++ b/library/Smarty/libs/sysplugins/smarty_cacheresource_custom.php
@@ -84,8 +84,11 @@ abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource
{
$_cache_id = isset($cached->cache_id) ? preg_replace('![^\w\|]+!', '_', $cached->cache_id) : null;
$_compile_id = isset($cached->compile_id) ? preg_replace('![^\w\|]+!', '_', $cached->compile_id) : null;
-
- $cached->filepath = sha1($cached->source->filepath . $_cache_id . $_compile_id);
+ $path = $cached->source->filepath . $_cache_id . $_compile_id;
+ $cached->filepath = sha1($path);
+ if ($_template->smarty->cache_locking) {
+ $cached->lock_id = sha1('lock.' . $path);
+ }
$this->populateTimestamp($cached);
}
@@ -170,6 +173,34 @@ abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource
}
/**
+ * Read cached template from cache
+ *
+ * @param Smarty_Internal_Template $_template template object
+ *
+ * @return string content
+ */
+ public function readCachedContent(Smarty_Internal_Template $_template)
+ {
+ $content = $_template->cached->content ? $_template->cached->content : null;
+ $timestamp = null;
+ if ($content === null) {
+ $timestamp = null;
+ $this->fetch(
+ $_template->cached->filepath,
+ $_template->source->name,
+ $_template->cache_id,
+ $_template->compile_id,
+ $content,
+ $timestamp
+ );
+ }
+ if (isset($content)) {
+ return $content;
+ }
+ return false;
+ }
+
+ /**
* Empty cache
*
* @param Smarty $smarty Smarty object
@@ -238,15 +269,14 @@ abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource
*/
public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
{
- $id = $cached->filepath;
+ $id = $cached->lock_id;
$name = $cached->source->name . '.lock';
- $mtime = $this->fetchTimestamp($id, $name, null, null);
+ $mtime = $this->fetchTimestamp($id, $name, $cached->cache_id, $cached->compile_id);
if ($mtime === null) {
- $this->fetch($id, $name, null, null, $content, $mtime);
+ $this->fetch($id, $name, $cached->cache_id, $cached->compile_id, $content, $mtime);
}
-
- return $mtime && time() - $mtime < $smarty->locking_timeout;
+ return $mtime && ($t = time()) - $mtime < $smarty->locking_timeout;
}
/**
@@ -260,10 +290,9 @@ abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource
public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
{
$cached->is_locked = true;
-
- $id = $cached->filepath;
+ $id = $cached->lock_id;
$name = $cached->source->name . '.lock';
- $this->save($id, $name, null, null, $smarty->locking_timeout, '');
+ $this->save($id, $name, $cached->cache_id, $cached->compile_id, $smarty->locking_timeout, '');
}
/**
@@ -277,8 +306,7 @@ abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource
public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
{
$cached->is_locked = false;
-
$name = $cached->source->name . '.lock';
- $this->delete($name, null, null, null);
+ $this->delete($name, $cached->cache_id, $cached->compile_id, null);
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php b/library/Smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php
index a4b365a82..2fdc7e42f 100644
--- a/library/Smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php
+++ b/library/Smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php
@@ -36,6 +36,7 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource
* @var array
*/
protected $contents = array();
+
/**
* cache for timestamps
*
@@ -53,10 +54,7 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource
*/
public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
{
- $cached->filepath = $_template->source->uid
- . '#' . $this->sanitize($cached->source->resource)
- . '#' . $this->sanitize($cached->cache_id)
- . '#' . $this->sanitize($cached->compile_id);
+ $cached->filepath = $_template->source->uid . '#' . $this->sanitize($cached->source->resource) . '#' . $this->sanitize($cached->cache_id) . '#' . $this->sanitize($cached->compile_id);
$this->populateTimestamp($cached);
}
@@ -127,6 +125,28 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource
}
/**
+ * Read cached template from cache
+ *
+ * @param Smarty_Internal_Template $_template template object
+ *
+ * @return string content
+ */
+ public function readCachedContent(Smarty_Internal_Template $_template)
+ {
+ $content = $_template->cached->content ? $_template->cached->content : null;
+ $timestamp = null;
+ if ($content === null) {
+ if (!$this->fetch($_template->cached->filepath, $_template->source->name, $_template->cache_id, $_template->compile_id, $content, $timestamp, $_template->source->uid)) {
+ return false;
+ }
+ }
+ if (isset($content)) {
+ return $content;
+ }
+ return false;
+ }
+
+ /**
* Empty cache
* {@internal the $exp_time argument is ignored altogether }}
*
@@ -275,11 +295,8 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource
*/
protected function getMetaTimestamp(&$content)
{
- $s = unpack("N", substr($content, 0, 4));
- $m = unpack("N", substr($content, 4, 4));
- $content = substr($content, 8);
-
- return $s[1] + ($m[1] / 100000000);
+ extract(unpack('N1s/N1m/a*content', $content));
+ return $s + ($m / 100000000);
}
/**
diff --git a/library/Smarty/libs/sysplugins/smarty_config_source.php b/library/Smarty/libs/sysplugins/smarty_config_source.php
deleted file mode 100644
index fd37e61f7..000000000
--- a/library/Smarty/libs/sysplugins/smarty_config_source.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-/**
- * Smarty Internal Plugin
- *
- * @package Smarty
- * @subpackage TemplateResources
- */
-
-/**
- * Smarty Resource Data Object
- * Meta Data Container for Config Files
- *
- * @package Smarty
- * @subpackage TemplateResources
- * @author Rodney Rehm
- * @property string $content
- * @property int $timestamp
- * @property bool $exists
- */
-class Smarty_Config_Source extends Smarty_Template_Source
-{
- /**
- * create Config Object container
- *
- * @param Smarty_Resource $handler Resource Handler this source object communicates with
- * @param Smarty $smarty Smarty instance this source object belongs to
- * @param string $resource full config_resource
- * @param string $type type of resource
- * @param string $name resource name
- * @param string $unique_resource unqiue resource name
- */
- public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name, $unique_resource)
- {
- $this->handler = $handler; // Note: prone to circular references
-
- // Note: these may be ->config_compiler_class etc in the future
- //$this->config_compiler_class = $handler->config_compiler_class;
- //$this->config_lexer_class = $handler->config_lexer_class;
- //$this->config_parser_class = $handler->config_parser_class;
-
- $this->smarty = $smarty;
- $this->resource = $resource;
- $this->type = $type;
- $this->name = $name;
- $this->unique_resource = $unique_resource;
- }
-
- /**
- * <<magic>> Generic setter.
- *
- * @param string $property_name valid: content, timestamp, exists
- * @param mixed $value newly assigned value (not check for correct type)
- *
- * @throws SmartyException when the given property name is not valid
- */
- public function __set($property_name, $value)
- {
- switch ($property_name) {
- case 'content':
- case 'timestamp':
- case 'exists':
- $this->$property_name = $value;
- break;
-
- default:
- throw new SmartyException("invalid config property '$property_name'.");
- }
- }
-
- /**
- * <<magic>> Generic getter.
- *
- * @param string $property_name valid: content, timestamp, exists
- *
- * @return mixed|void
- * @throws SmartyException when the given property name is not valid
- */
- public function __get($property_name)
- {
- switch ($property_name) {
- case 'timestamp':
- case 'exists':
- $this->handler->populateTimestamp($this);
-
- return $this->$property_name;
-
- case 'content':
- return $this->content = $this->handler->getContent($this);
-
- default:
- throw new SmartyException("config property '$property_name' does not exist.");
- }
- }
-}
diff --git a/library/Smarty/libs/sysplugins/smarty_data.php b/library/Smarty/libs/sysplugins/smarty_data.php
new file mode 100644
index 000000000..8074513d8
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_data.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Smarty Plugin Data
+ * This file contains the data object
+ *
+ * @package Smarty
+ * @subpackage Template
+ * @author Uwe Tews
+ */
+
+/**
+ * class for the Smarty data object
+ * The Smarty data object will hold Smarty variables in the current scope
+ *
+ * @package Smarty
+ * @subpackage Template
+ */
+class Smarty_Data extends Smarty_Internal_Data
+{
+ /**
+ * Counter
+ *
+ * @var int
+ */
+ static $count = 0;
+
+ /**
+ * Data block name
+ *
+ * @var string
+ */
+ public $dataObjectName = '';
+ /**
+ * Smarty object
+ *
+ * @var Smarty
+ */
+ public $smarty = null;
+
+ /**
+ * create Smarty data object
+ *
+ * @param Smarty|array $_parent parent template
+ * @param Smarty|Smarty_Internal_Template $smarty global smarty instance
+ * @param string $name optional data block name
+ *
+ * @throws SmartyException
+ */
+ public function __construct($_parent = null, $smarty = null, $name = null)
+ {
+ self::$count ++;
+ $this->dataObjectName = 'Data_object ' . (isset($name) ? "'{$name}'" : self::$count);
+ $this->smarty = $smarty;
+ if (is_object($_parent)) {
+ // when object set up back pointer
+ $this->parent = $_parent;
+ } elseif (is_array($_parent)) {
+ // set up variable values
+ foreach ($_parent as $_key => $_val) {
+ $this->tpl_vars[$_key] = new Smarty_Variable($_val);
+ }
+ } elseif ($_parent != null) {
+ throw new SmartyException("Wrong type for template variables");
+ }
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_cacheresource_file.php b/library/Smarty/libs/sysplugins/smarty_internal_cacheresource_file.php
index b8e99cc69..de794517a 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_cacheresource_file.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_cacheresource_file.php
@@ -61,8 +61,10 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource
$cached->lock_id = $_lock_dir . sha1($_cache_id . $_compile_id . $_template->source->uid) . '.lock';
}
$cached->filepath = $_cache_dir . $_cache_id . $_compile_id . $_filepath . '.' . basename($_source_file_path) . '.php';
- $cached->timestamp = @filemtime($cached->filepath);
- $cached->exists = !!$cached->timestamp;
+ $cached->timestamp = $cached->exists = is_file($cached->filepath);
+ if ($cached->exists) {
+ $cached->timestamp = filemtime($cached->filepath);
+ }
}
/**
@@ -74,8 +76,10 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource
*/
public function populateTimestamp(Smarty_Template_Cached $cached)
{
- $cached->timestamp = @filemtime($cached->filepath);
- $cached->exists = !!$cached->timestamp;
+ $cached->timestamp = $cached->exists = is_file($cached->filepath);
+ if ($cached->exists) {
+ $cached->timestamp = filemtime($cached->filepath);
+ }
}
/**
@@ -106,14 +110,30 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource
*/
public function writeCachedContent(Smarty_Internal_Template $_template, $content)
{
- if (Smarty_Internal_Write_File::writeFile($_template->cached->filepath, $content, $_template->smarty) === true) {
- $_template->cached->timestamp = @filemtime($_template->cached->filepath);
- $_template->cached->exists = !!$_template->cached->timestamp;
- if ($_template->cached->exists) {
+ $obj = new Smarty_Internal_Write_File();
+ if ($obj->writeFile($_template->cached->filepath, $content, $_template->smarty) === true) {
+ $cached = $_template->cached;
+ $cached->timestamp = $cached->exists = is_file($cached->filepath);
+ if ($cached->exists) {
+ $cached->timestamp = filemtime($cached->filepath);
return true;
}
}
+ return false;
+ }
+ /**
+ * Read cached template from cache
+ *
+ * @param Smarty_Internal_Template $_template template object
+ *
+ * @return string content
+ */
+ public function readCachedContent(Smarty_Internal_Template $_template)
+ {
+ if (is_file($_template->cached->filepath)) {
+ return file_get_contents($_template->cached->filepath);
+ }
return false;
}
@@ -147,10 +167,10 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource
$_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
$_dir_sep = $smarty->use_sub_dirs ? '/' : '^';
$_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0;
- if (($_dir = realpath($smarty->getCacheDir())) === false) {
+ $_dir = realpath($smarty->getCacheDir()) . '/';
+ if ($_dir == '/') { //We should never want to delete this!
return 0;
}
- $_dir .= '/';
$_dir_length = strlen($_dir);
if (isset($_cache_id)) {
$_cache_id_parts = explode('|', $_cache_id);
@@ -262,9 +282,12 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource
} else {
clearstatcache();
}
- $t = @filemtime($cached->lock_id);
-
- return $t && (time() - $t < $smarty->locking_timeout);
+ if (is_file($cached->lock_id)) {
+ $t = @filemtime($cached->lock_id);
+ return $t && (time() - $t < $smarty->locking_timeout);
+ } else {
+ return false;
+ }
}
/**
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_assign.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_assign.php
index caa34861f..bdce0c3f0 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_assign.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_assign.php
@@ -42,7 +42,7 @@ class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase
if (isset($compiler->template->tpl_vars[trim($_attr['var'], "'")])) {
$compiler->template->tpl_vars[trim($_attr['var'], "'")]->nocache = true;
} else {
- $compiler->template->tpl_vars[trim($_attr['var'], "'")] = new Smarty_variable(null, true);
+ $compiler->template->tpl_vars[trim($_attr['var'], "'")] = new Smarty_Variable(null, true);
}
}
// scope setup
@@ -66,9 +66,9 @@ class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase
if ($compiler->template->smarty instanceof SmartyBC) {
$output = "<?php if (isset(\$_smarty_tpl->tpl_vars[$_attr[var]])) {\$_smarty_tpl->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];";
$output .= "\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value = $_attr[value]; \$_smarty_tpl->tpl_vars[$_attr[var]]->nocache = $_nocache; \$_smarty_tpl->tpl_vars[$_attr[var]]->scope = $_scope;";
- $output .= "\n} else \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);";
+ $output .= "\n} else \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_Variable($_attr[value], $_nocache, $_scope);";
} else {
- $output = "<?php \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);";
+ $output = "<?php \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_Variable($_attr[value], $_nocache, $_scope);";
}
}
if ($_scope == Smarty::SCOPE_PARENT) {
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_block.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_block.php
index 8c2fb975f..93c90a91e 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_block.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_block.php
@@ -113,7 +113,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase
$compiler->inheritance = true;
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
- $compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser);
+ $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template($compiler->parser);
$compiler->has_code = false;
return true;
@@ -143,7 +143,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase
// if called by {$smarty.block.child} we must search the name of enclosing {block}
if ($_name == null) {
$stack_count = count($compiler->_tag_stack);
- while (--$stack_count >= 0) {
+ while (-- $stack_count >= 0) {
if ($compiler->_tag_stack[$stack_count][0] == 'block') {
$_name = trim($compiler->_tag_stack[$stack_count][1][0]['name'], "\"'");
break;
@@ -173,20 +173,18 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase
$_tpl->compiler->suppressHeader = true;
$_tpl->compiler->suppressFilter = true;
$_tpl->compiler->suppressTemplatePropertyHeader = true;
- $_tpl->compiler->suppressMergedTemplates = true;
$nocache = $compiler->nocache || $compiler->tag_nocache;
if (strpos($compiler->template->block_data[$_name]['source'], self::parent) !== false) {
- $_output = str_replace(self::parent, $compiler->parser->current_buffer->to_smarty_php(), $_tpl->compiler->compileTemplate($_tpl, $nocache));
+ $_output = str_replace(self::parent, $compiler->parser->current_buffer->to_smarty_php(), $_tpl->compiler->compileTemplate($_tpl, $nocache, $compiler->parent_compiler));
} elseif ($compiler->template->block_data[$_name]['mode'] == 'prepend') {
- $_output = $_tpl->compiler->compileTemplate($_tpl, $nocache) . $compiler->parser->current_buffer->to_smarty_php();
+ $_output = $_tpl->compiler->compileTemplate($_tpl, $nocache, $compiler->parent_compiler) . $compiler->parser->current_buffer->to_smarty_php();
} elseif ($compiler->template->block_data[$_name]['mode'] == 'append') {
- $_output = $compiler->parser->current_buffer->to_smarty_php() . $_tpl->compiler->compileTemplate($_tpl, $nocache);
+ $_output = $compiler->parser->current_buffer->to_smarty_php() . $_tpl->compiler->compileTemplate($_tpl, $nocache, $compiler->parent_compiler);
} elseif (!empty($compiler->template->block_data[$_name])) {
- $_output = $_tpl->compiler->compileTemplate($_tpl, $nocache);
+ $_output = $_tpl->compiler->compileTemplate($_tpl, $nocache, $compiler->parent_compiler);
}
$compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $_tpl->properties['file_dependency']);
- $compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $_tpl->properties['function']);
- $compiler->merged_templates = array_merge($compiler->merged_templates, $_tpl->compiler->merged_templates);
+ $compiler->template->properties['tpl_function'] = array_merge($compiler->template->properties['tpl_function'], $_tpl->properties['tpl_function']);
$compiler->template->variable_filters = $_tpl->variable_filters;
if ($_tpl->has_nocache_code) {
$compiler->template->has_nocache_code = true;
@@ -221,7 +219,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase
// if called by {$smarty.block.parent} we must search the name of enclosing {block}
if ($_name == null) {
$stack_count = count($compiler->_tag_stack);
- while (--$stack_count >= 0) {
+ while (-- $stack_count >= 0) {
if ($compiler->_tag_stack[$stack_count][0] == 'block') {
$_name = trim($compiler->_tag_stack[$stack_count][1][0]['name'], "\"'");
break;
@@ -245,7 +243,6 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase
*
* @param $compiler
* @param string $source source text
- *
*/
static function blockSource($compiler, $source)
{
@@ -337,7 +334,9 @@ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_CompileBase
$_output = $compiler->parser->current_buffer->to_smarty_php();
}
}
- unset($compiler->template->block_data[$_name]['compiled']);
+ if (isset($compiler->template->block_data[$_name]['compiled'])) {
+ unset($compiler->template->block_data[$_name]['compiled']);
+ }
// reset flags
$compiler->parser->current_buffer = $saved_data[2];
if ($compiler->nocache) {
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_call.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_call.php
index bfbd1f547..05420fa5f 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_call.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_call.php
@@ -55,13 +55,11 @@ class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase
// output will be stored in a smarty variable instead of being displayed
$_assign = $_attr['assign'];
}
+ //$_name = trim($_attr['name'], "'\"");
$_name = $_attr['name'];
- if ($compiler->compiles_template_function) {
- $compiler->called_functions[] = trim($_name, "'\"");
- }
unset($_attr['name'], $_attr['assign'], $_attr['nocache']);
// set flag (compiled code of {function} must be included in cache file
- if ($compiler->nocache || $compiler->tag_nocache) {
+ if (!$compiler->template->caching || $compiler->nocache || $compiler->tag_nocache) {
$_nocache = 'true';
} else {
$_nocache = 'false';
@@ -74,54 +72,14 @@ class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase
$_paramsArray[] = "'$_key'=>$_value";
}
}
- if (isset($compiler->template->properties['function'][$_name]['parameter'])) {
- foreach ($compiler->template->properties['function'][$_name]['parameter'] as $_key => $_value) {
- if (!isset($_attr[$_key])) {
- if (is_int($_key)) {
- $_paramsArray[] = "$_key=>$_value";
- } else {
- $_paramsArray[] = "'$_key'=>$_value";
- }
- }
- }
- } elseif (isset($compiler->smarty->template_functions[$_name]['parameter'])) {
- foreach ($compiler->smarty->template_functions[$_name]['parameter'] as $_key => $_value) {
- if (!isset($_attr[$_key])) {
- if (is_int($_key)) {
- $_paramsArray[] = "$_key=>$_value";
- } else {
- $_paramsArray[] = "'$_key'=>$_value";
- }
- }
- }
- }
- //variable name?
- if (!(strpos($_name, '$') === false)) {
- $call_cache = $_name;
- $call_function = '$tmp = "smarty_template_function_".' . $_name . '; $tmp';
- } else {
- $_name = trim($_name, "'\"");
- $call_cache = "'{$_name}'";
- $call_function = 'smarty_template_function_' . $_name;
- }
-
$_params = 'array(' . implode(",", $_paramsArray) . ')';
- $_hash = str_replace('-', '_', $compiler->template->properties['nocache_hash']);
+ //$compiler->suppressNocacheProcessing = true;
// was there an assign attribute
if (isset($_assign)) {
- if ($compiler->template->caching) {
- $_output = "<?php ob_start(); Smarty_Internal_Function_Call_Handler::call ({$call_cache},\$_smarty_tpl,{$_params},'{$_hash}',{$_nocache}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
- } else {
- $_output = "<?php ob_start(); {$call_function}(\$_smarty_tpl,{$_params}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
- }
+ $_output = "<?php ob_start();\$_smarty_tpl->callTemplateFunction ({$_name}, \$_smarty_tpl, {$_params}, {$_nocache}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
} else {
- if ($compiler->template->caching) {
- $_output = "<?php Smarty_Internal_Function_Call_Handler::call ({$call_cache},\$_smarty_tpl,{$_params},'{$_hash}',{$_nocache});?>\n";
- } else {
- $_output = "<?php {$call_function}(\$_smarty_tpl,{$_params});?>\n";
- }
+ $_output = "<?php \$_smarty_tpl->callTemplateFunction ({$_name}, \$_smarty_tpl, {$_params}, {$_nocache});?>\n";
}
-
return $_output;
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_config_load.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_config_load.php
index 8813664d4..5b291bed1 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_config_load.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_config_load.php
@@ -74,8 +74,7 @@ class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase
}
}
// create config object
- $_output = "<?php \$_config = new Smarty_Internal_Config($conf_file, \$_smarty_tpl->smarty, \$_smarty_tpl);";
- $_output .= "\$_config->loadConfigVars($section, '$scope'); ?>";
+ $_output = "<?php Smarty_Internal_Extension_Config::configLoad(\$_smarty_tpl, $conf_file, $section, '$scope');?>";
return $_output;
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_for.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_for.php
index a624b922c..5bac55011 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_for.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_for.php
@@ -47,27 +47,48 @@ class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase
$output = "<?php ";
if ($parameter == 1) {
foreach ($_attr['start'] as $_statement) {
- $output .= " \$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;";
- $output .= " \$_smarty_tpl->tpl_vars[$_statement[var]]->value = $_statement[value];\n";
+ if (is_array($_statement['var'])) {
+ $var = $_statement['var']['var'];
+ $index = $_statement['var']['smarty_internal_index'];
+ } else {
+ $var = $_statement['var'];
+ $index = '';
+ }
+ $output .= " \$_smarty_tpl->tpl_vars[$var] = new Smarty_Variable;";
+ $output .= " \$_smarty_tpl->tpl_vars[$var]->value{$index} = $_statement[value];\n";
}
- $output .= " if ($_attr[ifexp]) { for (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$_attr[var]]->value$_attr[step]) {\n";
+ if (is_array($_attr['var'])) {
+ $var = $_attr['var']['var'];
+ $index = $_attr['var']['smarty_internal_index'];
+ } else {
+ $var = $_attr['var'];
+ $index = '';
+ }
+ $output .= " if ($_attr[ifexp]) { for (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$var]->value{$index}$_attr[step]) {\n";
} else {
$_statement = $_attr['start'];
- $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;";
+ if (is_array($_statement['var'])) {
+ $var = $_statement['var']['var'];
+ $index = $_statement['var']['smarty_internal_index'];
+ } else {
+ $var = $_statement['var'];
+ $index = '';
+ }
+ $output .= "\$_smarty_tpl->tpl_vars[$var] = new Smarty_Variable;";
if (isset($_attr['step'])) {
- $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = $_attr[step];";
+ $output .= "\$_smarty_tpl->tpl_vars[$var]->step = $_attr[step];";
} else {
- $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = 1;";
+ $output .= "\$_smarty_tpl->tpl_vars[$var]->step = 1;";
}
if (isset($_attr['max'])) {
- $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int) min(ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step)),$_attr[max]);\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$var]->total = (int) min(ceil((\$_smarty_tpl->tpl_vars[$var]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$var]->step)),$_attr[max]);\n";
} else {
- $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int) ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step));\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$var]->total = (int) ceil((\$_smarty_tpl->tpl_vars[$var]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$var]->step));\n";
}
- $output .= "if (\$_smarty_tpl->tpl_vars[$_statement[var]]->total > 0) {\n";
- $output .= "for (\$_smarty_tpl->tpl_vars[$_statement[var]]->value = $_statement[value], \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration = 1;\$_smarty_tpl->tpl_vars[$_statement[var]]->iteration <= \$_smarty_tpl->tpl_vars[$_statement[var]]->total;\$_smarty_tpl->tpl_vars[$_statement[var]]->value += \$_smarty_tpl->tpl_vars[$_statement[var]]->step, \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration++) {\n";
- $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->first = \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration == 1;";
- $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->last = \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration == \$_smarty_tpl->tpl_vars[$_statement[var]]->total;";
+ $output .= "if (\$_smarty_tpl->tpl_vars[$var]->total > 0) {\n";
+ $output .= "for (\$_smarty_tpl->tpl_vars[$var]->value{$index} = $_statement[value], \$_smarty_tpl->tpl_vars[$var]->iteration = 1;\$_smarty_tpl->tpl_vars[$var]->iteration <= \$_smarty_tpl->tpl_vars[$var]->total;\$_smarty_tpl->tpl_vars[$var]->value{$index} += \$_smarty_tpl->tpl_vars[$var]->step, \$_smarty_tpl->tpl_vars[$var]->iteration++) {\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$var]->first = \$_smarty_tpl->tpl_vars[$var]->iteration == 1;";
+ $output .= "\$_smarty_tpl->tpl_vars[$var]->last = \$_smarty_tpl->tpl_vars[$var]->iteration == \$_smarty_tpl->tpl_vars[$var]->total;";
}
$output .= "?>";
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_foreach.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_foreach.php
index fc77f5749..82ea49637 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_foreach.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_foreach.php
@@ -64,103 +64,152 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase
$key = null;
}
- $this->openTag($compiler, 'foreach', array('foreach', $compiler->nocache, $item, $key));
+ $this->openTag($compiler, 'foreach', array('foreach', $compiler->nocache, $item, $key, true));
// maybe nocache because of nocache variables
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
if (isset($_attr['name'])) {
- $name = $_attr['name'];
+ $name = trim($_attr['name'], '\'"');
$has_name = true;
- $SmartyVarName = '$smarty.foreach.' . trim($name, '\'"') . '.';
+ $SmartyVarName = "\$smarty.foreach.{$name}.";
} else {
- $name = null;
$has_name = false;
}
$ItemVarName = '$' . trim($item, '\'"') . '@';
// evaluates which Smarty variables and properties have to be computed
+
if ($has_name) {
- $usesSmartyFirst = strpos($compiler->lex->data, $SmartyVarName . 'first') !== false;
- $usesSmartyLast = strpos($compiler->lex->data, $SmartyVarName . 'last') !== false;
- $usesSmartyIndex = strpos($compiler->lex->data, $SmartyVarName . 'index') !== false;
- $usesSmartyIteration = strpos($compiler->lex->data, $SmartyVarName . 'iteration') !== false;
- $usesSmartyShow = strpos($compiler->lex->data, $SmartyVarName . 'show') !== false;
- $usesSmartyTotal = strpos($compiler->lex->data, $SmartyVarName . 'total') !== false;
+ $useSmartyForeach = $usesSmartyFirst = strpos($compiler->lex->data, $SmartyVarName . 'first') !== false;
+ $useSmartyForeach = ($usesSmartyLast = strpos($compiler->lex->data, $SmartyVarName . 'last') !== false) || $useSmartyForeach;
+ $useSmartyForeach = ($usesSmartyIndex = strpos($compiler->lex->data, $SmartyVarName . 'index') !== false) || $useSmartyForeach;
+ $useSmartyForeach = ($usesSmartyIteration = (!$usesSmartyIndex && ($usesSmartyFirst || $usesSmartyLast)) || strpos($compiler->lex->data, $SmartyVarName . 'iteration') !== false) || $useSmartyForeach;
+ $useSmartyForeach = ($usesSmartyShow = strpos($compiler->lex->data, $SmartyVarName . 'show') !== false) || $useSmartyForeach;
+ $useSmartyForeach = ($usesSmartyTotal = $usesSmartyLast ||strpos($compiler->lex->data, $SmartyVarName . 'total') !== false) || $useSmartyForeach;
} else {
$usesSmartyFirst = false;
$usesSmartyLast = false;
$usesSmartyTotal = false;
$usesSmartyShow = false;
+ $useSmartyForeach = false;
}
- $usesPropFirst = $usesSmartyFirst || strpos($compiler->lex->data, $ItemVarName . 'first') !== false;
- $usesPropLast = $usesSmartyLast || strpos($compiler->lex->data, $ItemVarName . 'last') !== false;
- $usesPropIndex = $usesPropFirst || strpos($compiler->lex->data, $ItemVarName . 'index') !== false;
- $usesPropIteration = $usesPropLast || strpos($compiler->lex->data, $ItemVarName . 'iteration') !== false;
+ $usesPropKey = strpos($compiler->lex->data, $ItemVarName . 'key') !== false;
+ $usesPropFirst = strpos($compiler->lex->data, $ItemVarName . 'first') !== false;
+ $usesPropLast = strpos($compiler->lex->data, $ItemVarName . 'last') !== false;
+ $usesPropIndex = strpos($compiler->lex->data, $ItemVarName . 'index') !== false;
+ $usesPropIteration = (!$usesPropIndex && ($usesPropFirst || $usesPropLast)) || strpos($compiler->lex->data, $ItemVarName . 'iteration') !== false;
$usesPropShow = strpos($compiler->lex->data, $ItemVarName . 'show') !== false;
- $usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($compiler->lex->data, $ItemVarName . 'total') !== false;
+ $usesPropTotal = $usesPropLast || strpos($compiler->lex->data, $ItemVarName . 'total') !== false;
+
+ $keyTerm = '';
+ if ($usesPropKey) {
+ $keyTerm = "\$_smarty_tpl->tpl_vars[$item]->key => ";
+ } elseif ($key != null) {
+ $keyTerm = "\$_smarty_tpl->tpl_vars[$key]->value => ";
+ }
// generate output code
- $output = "<?php ";
- $output .= " \$_smarty_tpl->tpl_vars[$item] = new Smarty_Variable; \$_smarty_tpl->tpl_vars[$item]->_loop = false;\n";
+ $output = "<?php\n";
+ $output .= "\$_from = $from;\n";
+ $output .= "if (!is_array(\$_from) && !is_object(\$_from)) {\n";
+ $output .= "settype(\$_from, 'array');\n";
+ $output .= "}\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$item] = new Smarty_Variable;\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->_loop = false;\n";
if ($key != null) {
- $output .= " \$_smarty_tpl->tpl_vars[$key] = new Smarty_Variable;\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$key] = new Smarty_Variable;\n";
}
- $output .= " \$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array');}\n";
if ($usesPropTotal) {
- $output .= " \$_smarty_tpl->tpl_vars[$item]->total= \$_smarty_tpl->_count(\$_from);\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->total= \$_smarty_tpl->_count(\$_from);\n";
}
if ($usesPropIteration) {
- $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration=0;\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->iteration=0;\n";
}
if ($usesPropIndex) {
- $output .= " \$_smarty_tpl->tpl_vars[$item]->index=-1;\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->index=-1;\n";
}
if ($usesPropShow) {
- $output .= " \$_smarty_tpl->tpl_vars[$item]->show = (\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
+ if ($usesPropTotal) {
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->show = (\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
+ } else {
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->show = (\$_smarty_tpl->_count(\$_from) > 0);\n";
+ }
}
if ($has_name) {
+ $prop = array();
if ($usesSmartyTotal) {
- $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['total'] = \$_smarty_tpl->tpl_vars[$item]->total;\n";
+ $prop['total'] = "'total' => ";
+ $prop['total'] .= $usesSmartyShow ? '$total = ' : '';
+ $prop['total'] .= '$_smarty_tpl->_count($_from)';
}
if ($usesSmartyIteration) {
- $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']=0;\n";
+ $prop['iteration'] = "'iteration' => 0";
}
if ($usesSmartyIndex) {
- $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']=-1;\n";
+ $prop['index'] = "'index' => -1";
}
if ($usesSmartyShow) {
- $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['show']=(\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
+ $prop['show'] = "'show' => ";
+ if ($usesSmartyTotal) {
+ $prop['show'] .= "(\$total > 0)";
+ } else {
+ $prop['show'] .= "(\$_smarty_tpl->_count(\$_from) > 0)";
+ }
+ }
+ if ($useSmartyForeach) {
+ $_vars = 'array(' . join(', ', $prop) . ')';
+ $foreachVar = "'__foreach_{$name}'";
+ $output .= "\$_smarty_tpl->tpl_vars[$foreachVar] = new Smarty_Variable({$_vars});\n";
}
}
- $output .= "foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value) {\n\$_smarty_tpl->tpl_vars[$item]->_loop = true;\n";
- if ($key != null) {
- $output .= " \$_smarty_tpl->tpl_vars[$key]->value = \$_smarty_tpl->tpl_vars[$item]->key;\n";
+ $output .= "foreach (\$_from as {$keyTerm}\$_smarty_tpl->tpl_vars[$item]->value) {\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->_loop = true;\n";
+ if ($key != null && $usesPropKey) {
+ $output .= "\$_smarty_tpl->tpl_vars[$key]->value = \$_smarty_tpl->tpl_vars[$item]->key;\n";
}
if ($usesPropIteration) {
- $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration++;\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->iteration++;\n";
}
if ($usesPropIndex) {
- $output .= " \$_smarty_tpl->tpl_vars[$item]->index++;\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->index++;\n";
}
if ($usesPropFirst) {
- $output .= " \$_smarty_tpl->tpl_vars[$item]->first = \$_smarty_tpl->tpl_vars[$item]->index === 0;\n";
+ if ($usesPropIndex) {
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->first = \$_smarty_tpl->tpl_vars[$item]->index == 0;\n";
+ } else {
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->first = \$_smarty_tpl->tpl_vars[$item]->iteration == 1;\n";
+ }
}
if ($usesPropLast) {
- $output .= " \$_smarty_tpl->tpl_vars[$item]->last = \$_smarty_tpl->tpl_vars[$item]->iteration === \$_smarty_tpl->tpl_vars[$item]->total;\n";
+ if ($usesPropIndex) {
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->last = \$_smarty_tpl->tpl_vars[$item]->index + 1 == \$_smarty_tpl->tpl_vars[$item]->total;\n";
+ } else {
+ $output .= "\$_smarty_tpl->tpl_vars[$item]->last = \$_smarty_tpl->tpl_vars[$item]->iteration == \$_smarty_tpl->tpl_vars[$item]->total;\n";
+ }
}
if ($has_name) {
- if ($usesSmartyFirst) {
- $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['first'] = \$_smarty_tpl->tpl_vars[$item]->first;\n";
- }
if ($usesSmartyIteration) {
- $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']++;\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$foreachVar]->value['iteration']++;\n";
}
if ($usesSmartyIndex) {
- $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']++;\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$foreachVar]->value['index']++;\n";
+ }
+ if ($usesSmartyFirst) {
+ if ($usesSmartyIndex) {
+ $output .= "\$_smarty_tpl->tpl_vars[$foreachVar]->value['first'] = \$_smarty_tpl->tpl_vars[$foreachVar]->value['index'] == 0;\n";
+ } else {
+ $output .= "\$_smarty_tpl->tpl_vars[$foreachVar]->value['first'] = \$_smarty_tpl->tpl_vars[$foreachVar]->value['iteration'] == 1;\n";
+ }
}
if ($usesSmartyLast) {
- $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['last'] = \$_smarty_tpl->tpl_vars[$item]->last;\n";
+ if ($usesSmartyIndex) {
+ $output .= "\$_smarty_tpl->tpl_vars[$foreachVar]->value['last'] = \$_smarty_tpl->tpl_vars[$foreachVar]->value['index'] + 1 == \$_smarty_tpl->tpl_vars[$foreachVar]->value['total'];\n";
+ } else {
+ $output .= "\$_smarty_tpl->tpl_vars[$foreachVar]->value['last'] = \$_smarty_tpl->tpl_vars[$foreachVar]->value['iteration'] == \$_smarty_tpl->tpl_vars[$foreachVar]->value['total'];\n";
+ }
}
}
+ $itemName = trim($item,"'\"");
+ $output .= "\$foreach_{$itemName}_Sav = \$_smarty_tpl->tpl_vars[$item];\n";
$output .= "?>";
return $output;
@@ -189,10 +238,14 @@ class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
- list($openTag, $nocache, $item, $key) = $this->closeTag($compiler, array('foreach'));
- $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $item, $key));
-
- return "<?php }\nif (!\$_smarty_tpl->tpl_vars[$item]->_loop) {\n?>";
+ list($openTag, $nocache, $item, $key, $foo) = $this->closeTag($compiler, array('foreach'));
+ $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $item, $key, false));
+ $itemName = trim($item,"'\"");
+ $output = "<?php\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$item] = \$foreach_{$itemName}_Sav;\n";
+ $output .= "}\n";
+ $output .= "if (!\$_smarty_tpl->tpl_vars[$item]->_loop) {\n?>";
+ return $output;
}
}
@@ -222,8 +275,14 @@ class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase
$compiler->tag_nocache = true;
}
- list($openTag, $compiler->nocache, $item, $key) = $this->closeTag($compiler, array('foreach', 'foreachelse'));
+ list($openTag, $compiler->nocache, $item, $key, $restore) = $this->closeTag($compiler, array('foreach', 'foreachelse'));
+ $itemName = trim($item,"'\"");
+ $output = "<?php\n";
+ if ($restore) {
+ $output .= "\$_smarty_tpl->tpl_vars[$item] = \$foreach_{$itemName}_Sav;\n";
+ }
+ $output .= "}\n?>";
- return "<?php } ?>";
+ return $output;
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_function.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_function.php
index 298eb16f2..35408bcbe 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_function.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_function.php
@@ -16,6 +16,7 @@
*/
class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase
{
+
/**
* Attribute definition: Overwrites base class.
*
@@ -23,6 +24,7 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase
*/
public $required_attributes = array('name');
+
/**
* Attribute definition: Overwrites base class.
*
@@ -30,6 +32,7 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase
*/
public $shorttag_order = array('name');
+
/**
* Attribute definition: Overwrites base class.
*
@@ -56,39 +59,17 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase
$compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
}
unset($_attr['nocache']);
- $save = array($_attr, $compiler->parser->current_buffer,
- $compiler->template->has_nocache_code, $compiler->template->required_plugins);
- $this->openTag($compiler, 'function', $save);
$_name = trim($_attr['name'], "'\"");
- unset($_attr['name']);
+ $compiler->parent_compiler->templateProperties['tpl_function'][$_name] = array();
+ $save = array($_attr, $compiler->parser->current_buffer, $compiler->template->has_nocache_code, $compiler->template->required_plugins, $compiler->template->caching);
+ $this->openTag($compiler, 'function', $save);
// set flag that we are compiling a template function
$compiler->compiles_template_function = true;
- $compiler->template->properties['function'][$_name]['parameter'] = array();
- /** @var Smarty_Internal_Template $_smarty_tpl
- * used in evaluated code
- */
- $_smarty_tpl = $compiler->template;
- foreach ($_attr as $_key => $_data) {
- eval ('$tmp=' . $_data . ';');
- $compiler->template->properties['function'][$_name]['parameter'][$_key] = $tmp;
- }
- $compiler->smarty->template_functions[$_name]['parameter'] = $compiler->template->properties['function'][$_name]['parameter'];
- if ($compiler->template->caching) {
- $output = '';
- } else {
- $output = "<?php if (!function_exists('smarty_template_function_{$_name}')) {
- function smarty_template_function_{$_name}(\$_smarty_tpl,\$params) {
- \$saved_tpl_vars = \$_smarty_tpl->tpl_vars;
- foreach (\$_smarty_tpl->smarty->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);};
- foreach (\$params as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}?>";
- }
// Init temporary context
$compiler->template->required_plugins = array('compiled' => array(), 'nocache' => array());
- $compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser);
- $compiler->parser->current_buffer->append_subtree(new _smarty_tag($compiler->parser, $output));
+ $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template($compiler->parser);
$compiler->template->has_nocache_code = false;
- $compiler->has_code = false;
- $compiler->template->properties['function'][$_name]['compiled'] = '';
+ $compiler->template->caching = true;
return true;
}
}
@@ -101,62 +82,149 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase
*/
class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase
{
+
+ /**
+ * Compiler object
+ *
+ * @var object
+ */
+ private $compiler = null;
+
/**
* Compiles code for the {/function} tag
*
- * @param array $args array with attributes from parser
- * @param object $compiler compiler object
- * @param array $parameter array with compilation parameter
+ * @param array $args array with attributes from parser
+ * @param object|\Smarty_Internal_TemplateCompilerBase $compiler compiler object
+ * @param array $parameter array with compilation parameter
*
- * @return boolean true
+ * @return bool true
*/
- public function compile($args, $compiler, $parameter)
+ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
{
- $_attr = $this->getAttributes($compiler, $args);
+ $this->compiler = $compiler;
$saved_data = $this->closeTag($compiler, array('function'));
- $_name = trim($saved_data[0]['name'], "'\"");
- // build plugin include code
- $plugins_string = '';
- if (!empty($compiler->template->required_plugins['compiled'])) {
- $plugins_string = '<?php ';
- foreach ($compiler->template->required_plugins['compiled'] as $tmp) {
- foreach ($tmp as $data) {
- $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$data['file']}';\n";
+ $_attr = $saved_data[0];
+ $_name = trim($_attr['name'], "'\"");
+ // reset flag that we are compiling a template function
+ $compiler->compiles_template_function = false;
+ $compiler->parent_compiler->templateProperties['tpl_function'][$_name]['called_functions'] = $compiler->called_functions;
+ $compiler->parent_compiler->templateProperties['tpl_function'][$_name]['compiled_filepath'] = $compiler->parent_compiler->template->compiled->filepath;
+ $compiler->parent_compiler->templateProperties['tpl_function'][$_name]['uid'] = $compiler->template->source->uid;
+ $compiler->called_functions = array();
+ $_parameter = $_attr;
+ unset($_parameter['name']);
+ // default parameter
+ $_paramsArray = array();
+ foreach ($_parameter as $_key => $_value) {
+ if (is_int($_key)) {
+ $_paramsArray[] = "$_key=>$_value";
+ } else {
+ $_paramsArray[] = "'$_key'=>$_value";
+ }
+ }
+ if (!empty($_paramsArray)) {
+ $_params = 'array(' . implode(",", $_paramsArray) . ')';
+ $_paramsCode = "\$params = array_merge($_params, \$params);\n";
+ } else {
+ $_paramsCode = '';
+ }
+ $_functionCode = $compiler->parser->current_buffer;
+ // setup buffer for template function code
+ $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template($compiler->parser);
+
+ $_funcName = "smarty_template_function_{$_name}_{$compiler->template->properties['nocache_hash']}";
+ $_funcNameCaching = $_funcName . '_nocache';
+ if ($compiler->template->has_nocache_code) {
+ $compiler->parent_compiler->templateProperties['tpl_function'][$_name]['call_name_caching'] = $_funcNameCaching;
+ $output = "<?php\n";
+ $output .= "/* {$_funcNameCaching} */\n";
+ $output .= "if (!function_exists('{$_funcNameCaching}')) {\n";
+ $output .= "function {$_funcNameCaching} (\$_smarty_tpl,\$params) {\n";
+ // build plugin include code
+ if (!empty($compiler->template->required_plugins['compiled'])) {
+ foreach ($compiler->template->required_plugins['compiled'] as $tmp) {
+ foreach ($tmp as $data) {
+ $output .= "if (!is_callable('{$data['function']}')) require_once '{$data['file']}';\n";
+ }
+ }
+ }
+ if (!empty($compiler->template->required_plugins['nocache'])) {
+ $output .= "echo '/*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/<?php ";
+ foreach ($compiler->template->required_plugins['nocache'] as $tmp) {
+ foreach ($tmp as $data) {
+ $output .= "if (!is_callable(\'{$data['function']}\')) require_once \'{$data['file']}\';\n";
+ }
}
+ $output .= "?>/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/';\n";
}
- $plugins_string .= '?>';
+ $output .= "ob_start();\n";
+ $output .= $_paramsCode;
+ $output .= "\$_smarty_tpl->properties['saved_tpl_vars'][] = \$_smarty_tpl->tpl_vars;\n";
+ $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value);\n}";
+ $output .= "\$params = var_export(\$params, true);\n";
+ $output .= "echo \"/*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/<?php ";
+ $output .= "\\\$saved_tpl_vars = \\\$_smarty_tpl->tpl_vars;\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->tpl_vars[\\\$key] = new Smarty_Variable(\\\$value);\n}\n?>";
+ $output .= "/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/\n\";?>";
+ $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
+ $compiler->parser->current_buffer->append_subtree($_functionCode);
+ $output = "<?php echo \"/*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/<?php ";
+ $output .= "foreach (Smarty::\\\$global_tpl_vars as \\\$key => \\\$value){\n";
+ $output .= "if (\\\$_smarty_tpl->tpl_vars[\\\$key] === \\\$value) \\\$saved_tpl_vars[\\\$key] = \\\$value;\n}\n";
+ $output .= "\\\$_smarty_tpl->tpl_vars = \\\$saved_tpl_vars;?>\n";
+ $output .= "/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/\";\n?>";
+ $output .= "<?php echo str_replace('{$compiler->template->properties['nocache_hash']}', \$_smarty_tpl->properties['nocache_hash'], ob_get_clean());\n";
+ $output .= "\$_smarty_tpl->tpl_vars = array_pop(\$_smarty_tpl->properties['saved_tpl_vars']);\n}\n}\n";
+ $output .= "/*/ {$_funcName}_nocache */\n\n";
+ $output .= "?>\n";
+ $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
+ $_functionCode = new Smarty_Internal_ParseTree_Tag($compiler->parser, preg_replace_callback("/((<\?php )?echo '\/\*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%\*\/([\S\s]*?)\/\*\/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%\*\/';(\?>\n)?)/", array($this, 'removeNocache'), $_functionCode->to_smarty_php()));
}
+ $compiler->parent_compiler->templateProperties['tpl_function'][$_name]['call_name'] = $_funcName;
+ $output = "<?php\n";
+ $output .= "/* {$_funcName} */\n";
+ $output .= "if (!function_exists('{$_funcName}')) {\n";
+ $output .= "function {$_funcName}(\$_smarty_tpl,\$params) {\n";
+ // build plugin include code
if (!empty($compiler->template->required_plugins['nocache'])) {
- $plugins_string .= "<?php echo '/*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/<?php ";
- foreach ($compiler->template->required_plugins['nocache'] as $tmp) {
+ $compiler->template->required_plugins['compiled'] = array_merge($compiler->template->required_plugins['compiled'], $compiler->template->required_plugins['nocache']);
+ }
+ if (!empty($compiler->template->required_plugins['compiled'])) {
+ foreach ($compiler->template->required_plugins['compiled'] as $tmp) {
foreach ($tmp as $data) {
- $plugins_string .= "if (!is_callable(\'{$data['function']}\')) include \'{$data['file']}\';\n";
+ $output .= "if (!is_callable('{$data['function']}')) require_once '{$data['file']}';\n";
}
}
- $plugins_string .= "?>/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/';?>\n";
- }
- // if caching save template function for possible nocache call
- if ($compiler->template->caching) {
- $compiler->template->properties['function'][$_name]['compiled'] .= $plugins_string
- . $compiler->parser->current_buffer->to_smarty_php();
- $compiler->template->properties['function'][$_name]['nocache_hash'] = $compiler->template->properties['nocache_hash'];
- $compiler->template->properties['function'][$_name]['has_nocache_code'] = $compiler->template->has_nocache_code;
- $compiler->template->properties['function'][$_name]['called_functions'] = $compiler->called_functions;
- $compiler->called_functions = array();
- $compiler->smarty->template_functions[$_name] = $compiler->template->properties['function'][$_name];
- $compiler->has_code = false;
- $output = true;
- } else {
- $output = $plugins_string . $compiler->parser->current_buffer->to_smarty_php() . "<?php \$_smarty_tpl->tpl_vars = \$saved_tpl_vars;
-foreach (Smarty::\$global_tpl_vars as \$key => \$value) if(!isset(\$_smarty_tpl->tpl_vars[\$key])) \$_smarty_tpl->tpl_vars[\$key] = \$value;}}?>\n";
}
- // reset flag that we are compiling a template function
- $compiler->compiles_template_function = false;
- // restore old compiler status
+ $output .= "\$saved_tpl_vars = \$_smarty_tpl->tpl_vars;\n";
+ $output .= $_paramsCode;
+ $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value);\n}?>";
+ $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
+ $compiler->parser->current_buffer->append_subtree($_functionCode);
+ $output = "<?php foreach (Smarty::\$global_tpl_vars as \$key => \$value){\n";
+ $output .= "if (\$_smarty_tpl->tpl_vars[\$key] === \$value) \$saved_tpl_vars[\$key] = \$value;\n}\n";
+ $output .= "\$_smarty_tpl->tpl_vars = \$saved_tpl_vars;\n}\n}\n";
+ $output .= "/*/ {$_funcName} */\n\n";
+ $output .= "?>\n";
+ $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
+ $compiler->parent_compiler->templateFunctionCode .= $compiler->parser->current_buffer->to_smarty_php();
+ // restore old buffer
$compiler->parser->current_buffer = $saved_data[1];
- $compiler->template->has_nocache_code = $compiler->template->has_nocache_code | $saved_data[2];
+ // restore old status
+ $compiler->template->has_nocache_code = $saved_data[2];
$compiler->template->required_plugins = $saved_data[3];
+ $compiler->template->caching = $saved_data[4];
+ return true;
+ }
- return $output;
+ /**
+ * @param $match
+ *
+ * @return mixed
+ */
+ function removeNocache($match)
+ {
+ $code = preg_replace("/((<\?php )?echo '\/\*%%SmartyNocache:{$this->compiler->template->properties['nocache_hash']}%%\*\/)|(\/\*\/%%SmartyNocache:{$this->compiler->template->properties['nocache_hash']}%%\*\/';(\?>\n)?)/", '', $match[0]);
+ $code = str_replace(array('\\\'', '\\\\\''), array('\'', '\\\''), $code);
+ return $code;
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_if.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_if.php
index d709fcfd8..d4fd30e9f 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_if.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_if.php
@@ -42,9 +42,14 @@ class Smarty_Internal_Compile_If extends Smarty_Internal_CompileBase
$_nocache = ',true';
// create nocache var to make it know for further compiling
if (is_array($parameter['if condition']['var'])) {
- $compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true);
+ $var = trim($parameter['if condition']['var']['var'], "'");
} else {
- $compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true);
+ $var = trim($parameter['if condition']['var'], "'");
+ }
+ if (isset($compiler->template->tpl_vars[$var])) {
+ $compiler->template->tpl_vars[$var]->nocache = true;
+ } else {
+ $compiler->template->tpl_vars[$var] = new Smarty_Variable(null, true);
}
} else {
$_nocache = '';
@@ -124,9 +129,14 @@ class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase
$_nocache = ',true';
// create nocache var to make it know for further compiling
if (is_array($parameter['if condition']['var'])) {
- $compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true);
+ $var = trim($parameter['if condition']['var']['var'], "'");
+ } else {
+ $var = trim($parameter['if condition']['var'], "'");
+ }
+ if (isset($compiler->template->tpl_vars[$var])) {
+ $compiler->template->tpl_vars[$var]->nocache = true;
} else {
- $compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true);
+ $compiler->template->tpl_vars[$var] = new Smarty_Variable(null, true);
}
} else {
$_nocache = '';
@@ -155,22 +165,23 @@ class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase
} else {
$tmp = '';
foreach ($compiler->prefix_code as $code) {
- $tmp .= $code;
- }
+ $tmp = $compiler->appendCode($tmp, $code);
+ }
$compiler->prefix_code = array();
+ $tmp = $compiler->appendCode("<?php } else {?>", $tmp);
$this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache));
if ($condition_by_assign) {
if (is_array($parameter['if condition']['var'])) {
- $_output = "<?php } else {?>{$tmp}<?php if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]) || !is_array(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value)) \$_smarty_tpl->createLocalArrayVariable(" . $parameter['if condition']['var']['var'] . "$_nocache);\n";
+ $_output = $compiler->appendCode($tmp, "<?php if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]) || !is_array(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value)) \$_smarty_tpl->createLocalArrayVariable(" . $parameter['if condition']['var']['var'] . "$_nocache);\n");
$_output .= "if (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value" . $parameter['if condition']['var']['smarty_internal_index'] . " = " . $parameter['if condition']['value'] . ") {?>";
} else {
- $_output = "<?php } else {?>{$tmp}<?php if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "])) \$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "] = new Smarty_Variable(null{$_nocache});";
+ $_output = $compiler->appendCode($tmp, "<?php if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "])) \$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "] = new Smarty_Variable(null{$_nocache});");
$_output .= "if (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "]->value = " . $parameter['if condition']['value'] . ") {?>";
}
return $_output;
} else {
- return "<?php } else {?>{$tmp}<?php if ({$parameter['if condition']}) {?>";
+ return $compiler->appendCode($tmp, "<?php if ({$parameter['if condition']}) {?>");
}
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_include.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_include.php
index 4b7b09ce7..b0720a29b 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_include.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_include.php
@@ -52,16 +52,18 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
/**
* Compiles code for the {include} tag
*
- * @param array $args array with attributes from parser
- * @param object $compiler compiler object
- * @param array $parameter array with compilation parameter
+ * @param array $args array with attributes from parser
+ * @param Smarty_Internal_SmartyTemplateCompiler $compiler compiler object
+ * @param array $parameter array with compilation parameter
*
+ * @throws SmartyCompilerException
* @return string compiled code
*/
- public function compile($args, $compiler, $parameter)
+ public function compile($args, Smarty_Internal_SmartyTemplateCompiler $compiler, $parameter)
{
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
+
// save possible attributes
$include_file = $_attr['file'];
@@ -82,32 +84,73 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
}
}
+ // assume caching is off
$_caching = Smarty::CACHING_OFF;
+ if ($_attr['nocache'] === true) {
+ $compiler->tag_nocache = true;
+ }
+
+ $call_nocache = $compiler->tag_nocache || $compiler->nocache;
+
+ // caching was on and {include} is not in nocache mode
+ if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) {
+ $_caching = self::CACHING_NOCACHE_CODE;
+ }
+
// flag if included template code should be merged into caller
$merge_compiled_includes = ($compiler->smarty->merge_compiled_includes || ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes) || $_attr['inline'] === true) && !$compiler->template->source->recompiled;
- // set default when in nocache mode
- // if ($compiler->template->caching && ($compiler->nocache || $compiler->tag_nocache || $compiler->forceNocache == 2)) {
- if ($compiler->template->caching && ((!$compiler->inheritance && !$compiler->nocache && !$compiler->tag_nocache) || ($compiler->inheritance && ($compiler->nocache || $compiler->tag_nocache)))) {
- $_caching = self::CACHING_NOCACHE_CODE;
+ if ($merge_compiled_includes && $_attr['inline'] !== true) {
+ // variable template name ?
+ if ($compiler->has_variable_string || !((substr_count($include_file, '"') == 2 || substr_count($include_file, "'") == 2)) || substr_count($include_file, '(') != 0 || substr_count($include_file, '$_smarty_tpl->') != 0) {
+ $merge_compiled_includes = false;
+ if ($compiler->template->caching) {
+ // must use individual cache file
+ //$_attr['caching'] = 1;
+ }
+ if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes && $_attr['inline'] !== true) {
+ $compiler->trigger_template_error(' variable template file names not allow within {block} tags');
+ }
+ }
+ // variable compile_id?
+ if (isset($_attr['compile_id'])) {
+ if (!((substr_count($_attr['compile_id'], '"') == 2 || substr_count($_attr['compile_id'], "'") == 2 || is_numeric($_attr['compile_id']))) || substr_count($_attr['compile_id'], '(') != 0 || substr_count($_attr['compile_id'], '$_smarty_tpl->') != 0) {
+ $merge_compiled_includes = false;
+ if ($compiler->template->caching) {
+ // must use individual cache file
+ //$_attr['caching'] = 1;
+ }
+ if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes && $_attr['inline'] !== true) {
+ $compiler->trigger_template_error(' variable compile_id not allow within {block} tags');
+ }
+ }
+ }
}
+
/*
- * if the {include} tag provides individual parameter for caching
- * it will not be included into the common cache file and treated like
- * a nocache section
+ * if the {include} tag provides individual parameter for caching or compile_id
+ * the subtemplate must not be included into the common cache file and is treated like
+ * a call in nocache mode.
+ *
*/
+ if ($_attr['nocache'] !== true && $_attr['caching']) {
+ $_caching = $_new_caching = (int) $_attr['caching'];
+ $call_nocache = true;
+ } else {
+ $_new_caching = Smarty::CACHING_LIFETIME_CURRENT;
+ }
if (isset($_attr['cache_lifetime'])) {
$_cache_lifetime = $_attr['cache_lifetime'];
- $compiler->tag_nocache = true;
- $_caching = Smarty::CACHING_LIFETIME_CURRENT;
+ $call_nocache = true;
+ $_caching = $_new_caching;
} else {
- $_cache_lifetime = 'null';
+ $_cache_lifetime = '$_smarty_tpl->cache_lifetime';
}
if (isset($_attr['cache_id'])) {
$_cache_id = $_attr['cache_id'];
- $compiler->tag_nocache = true;
- $_caching = Smarty::CACHING_LIFETIME_CURRENT;
+ $call_nocache = true;
+ $_caching = $_new_caching;
} else {
$_cache_id = '$_smarty_tpl->cache_id';
}
@@ -116,85 +159,47 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
} else {
$_compile_id = '$_smarty_tpl->compile_id';
}
- if ($_attr['caching'] === true) {
- $_caching = Smarty::CACHING_LIFETIME_CURRENT;
- }
- if ($_attr['nocache'] === true) {
- $compiler->tag_nocache = true;
- if ($merge_compiled_includes) {
- $_caching = self::CACHING_NOCACHE_CODE;
- } else {
- $_caching = Smarty::CACHING_OFF;
- }
+
+ // if subtemplate will be called in nocache mode do not merge
+ if ($compiler->template->caching && $call_nocache) {
+ $merge_compiled_includes = false;
}
$has_compiled_template = false;
- if ($merge_compiled_includes && $_attr['inline'] !== true) {
- // variable template name ?
- if ($compiler->has_variable_string || !((substr_count($include_file, '"') == 2 || substr_count($include_file, "'") == 2))
- || substr_count($include_file, '(') != 0 || substr_count($include_file, '$_smarty_tpl->') != 0
- ) {
- $merge_compiled_includes = false;
- if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes) {
- $compiler->trigger_template_error(' variable template file names not allow within {block} tags');
- }
- }
- // variable compile_id?
- if (isset($_attr['compile_id'])) {
- if (!((substr_count($_attr['compile_id'], '"') == 2 || substr_count($_attr['compile_id'], "'") == 2))
- || substr_count($_attr['compile_id'], '(') != 0 || substr_count($_attr['compile_id'], '$_smarty_tpl->') != 0
- ) {
- $merge_compiled_includes = false;
- if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes) {
- $compiler->trigger_template_error(' variable compile_id not allow within {block} tags');
- }
- }
- }
- }
if ($merge_compiled_includes) {
if ($compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache) && $_caching != self::CACHING_NOCACHE_CODE) {
- $merge_compiled_includes = false;
+ // $merge_compiled_includes = false;
if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes) {
$compiler->trigger_template_error(' invalid caching mode of subtemplate within {block} tags');
}
}
- }
- if ($merge_compiled_includes) {
- // we must observe different compile_id
- $uid = sha1($_compile_id);
+ $c_id = isset($_attr['compile_id']) ? $_attr['compile_id'] : $compiler->template->compile_id;
+ // we must observe different compile_id and caching
+ $uid = sha1($c_id . ($_caching ? '--caching' : '--nocaching'));
$tpl_name = null;
- $nocache = false;
+
/** @var Smarty_Internal_Template $_smarty_tpl
* used in evaluated code
*/
$_smarty_tpl = $compiler->template;
eval("\$tpl_name = $include_file;");
- if (!isset($compiler->smarty->merged_templates_func[$tpl_name][$uid])) {
- $tpl = new $compiler->smarty->template_class ($tpl_name, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $compiler->template->compile_id);
+ if (!isset($compiler->parent_compiler->mergedSubTemplatesData[$tpl_name][$uid])) {
+ $compiler->smarty->allow_ambiguous_resources = true;
+ $tpl = new $compiler->smarty->template_class ($tpl_name, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $c_id, $_caching);
// save unique function name
- $compiler->smarty->merged_templates_func[$tpl_name][$uid]['func'] = $tpl->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
- // use current nocache hash for inlined code
- $compiler->smarty->merged_templates_func[$tpl_name][$uid]['nocache_hash'] = $tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash'];
- if ($compiler->template->caching && $_caching == self::CACHING_NOCACHE_CODE) {
- // all code must be nocache
- $nocache = true;
- }
+ $compiler->parent_compiler->mergedSubTemplatesData[$tpl_name][$uid]['func'] = $tpl->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
if ($compiler->inheritance) {
$tpl->compiler->inheritance = true;
}
// make sure whole chain gets compiled
$tpl->mustCompile = true;
if (!($tpl->source->uncompiled) && $tpl->source->exists) {
-
+ $tpl->compiler->suppressTemplatePropertyHeader = true;
+ $compiler->parent_compiler->mergedSubTemplatesData[$tpl_name][$uid]['nocache_hash'] = $tpl->properties['nocache_hash'] = str_replace(array('.', ','), '_', uniqid(rand(), true));
// get compiled code
- $compiled_code = $tpl->compiler->compileTemplate($tpl, $nocache);
- // release compiler object to free memory
+ $compiled_code = Smarty_Internal_Extension_CodeFrame::createFunctionFrame($tpl, $tpl->compiler->compileTemplate($tpl, null, $compiler->parent_compiler));
unset($tpl->compiler);
- // merge compiled code for {function} tags
- $compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $tpl->properties['function']);
- // merge filedependency
- $tpl->properties['file_dependency'][$tpl->source->uid] = array($tpl->source->filepath, $tpl->source->timestamp, $tpl->source->type);
- $compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $tpl->properties['file_dependency']);
+
// remove header code
$compiled_code = preg_replace("/(<\?php \/\*%%SmartyHeaderCode:{$tpl->properties['nocache_hash']}%%\*\/(.+?)\/\*\/%%SmartyHeaderCode%%\*\/\?>\n)/s", '', $compiled_code);
if ($tpl->has_nocache_code) {
@@ -202,8 +207,22 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
$compiled_code = str_replace("{$tpl->properties['nocache_hash']}", $compiler->template->properties['nocache_hash'], $compiled_code);
$compiler->template->has_nocache_code = true;
}
- $compiler->merged_templates[$tpl->properties['unifunc']] = $compiled_code;
+ $compiler->parent_compiler->mergedSubTemplatesCode[$tpl->properties['unifunc']] = $compiled_code;
$has_compiled_template = true;
+ if (!empty($tpl->required_plugins['compiled'])) {
+ foreach ($tpl->required_plugins['compiled'] as $name => $callBack) {
+ if (!isset($compiler->template->required_plugins['compiled'][$name])) {
+ $compiler->template->required_plugins['compiled'][$name] = $callBack;
+ }
+ }
+ }
+ if (!empty($tpl->required_plugins['nocache'])) {
+ foreach ($tpl->required_plugins['nocache'] as $name => $callBack) {
+ if (!isset($compiler->template->required_plugins['nocache'][$name])) {
+ $compiler->template->required_plugins['nocache'][$name] = $callBack;
+ }
+ }
+ }
unset ($tpl);
}
} else {
@@ -213,13 +232,14 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
// delete {include} standard attributes
unset($_attr['file'], $_attr['assign'], $_attr['cache_id'], $_attr['compile_id'], $_attr['cache_lifetime'], $_attr['nocache'], $_attr['caching'], $_attr['scope'], $_attr['inline']);
// remaining attributes must be assigned as smarty variable
+ $_vars_nc = '';
if (!empty($_attr)) {
if ($_parent_scope == Smarty::SCOPE_LOCAL) {
+ $_pairs = array();
// create variables
- $nccode = '';
foreach ($_attr as $key => $value) {
$_pairs[] = "'$key'=>$value";
- $nccode .= "\$_smarty_tpl->tpl_vars['$key'] = new Smarty_variable($value);\n";
+ $_vars_nc .= "\$_smarty_tpl->tpl_vars['$key'] = new Smarty_Variable($value);\n";
}
$_vars = 'array(' . join(',', $_pairs) . ')';
} else {
@@ -228,38 +248,51 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
} else {
$_vars = 'array()';
}
- if ($has_compiled_template) {
+ $update_compile_id = $compiler->template->caching && !$compiler->tag_nocache && !$compiler->nocache && $_compile_id != '$_smarty_tpl->compile_id';
+ if ($has_compiled_template && !$call_nocache) {
+ // if ($has_compiled_template && !$compiler->tag_nocache && !$compiler->nocache) {
// never call inline templates in nocache mode
- $compiler->suppressNocacheProcessing = true;
- $_hash = $compiler->smarty->merged_templates_func[$tpl_name][$uid]['nocache_hash'];
+ //$compiler->suppressNocacheProcessing = true;
+ $_hash = $compiler->parent_compiler->mergedSubTemplatesData[$tpl_name][$uid]['nocache_hash'];
$_output = "<?php /* Call merged included template \"" . $tpl_name . "\" */\n";
- $_output .= "\$_tpl_stack[] = \$_smarty_tpl;\n";
- if (!empty($nccode) && $_caching == 9999 && $_smarty_tpl->caching) {
- $compiler->suppressNocacheProcessing = false;
- $_output .= substr($compiler->processNocacheCode('<?php ' .$nccode . "?>\n", true), 6, -3);
- $compiler->suppressNocacheProcessing = true;
+ if ($update_compile_id) {
+ $_output .= $compiler->makeNocacheCode("\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n");
}
- $_output .= " \$_smarty_tpl = \$_smarty_tpl->setupInlineSubTemplate($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope, '$_hash');\n";
- if (isset($_assign)) {
- $_output .= 'ob_start(); ';
+ if (!empty($_vars_nc) && $_caching == 9999 && $_smarty_tpl->caching) {
+ //$compiler->suppressNocacheProcessing = false;
+ $_output .= substr($compiler->processNocacheCode('<?php ' . $_vars_nc . "?>\n", true), 6, - 3);
+ //$compiler->suppressNocacheProcessing = true;
}
- $_output .= $compiler->smarty->merged_templates_func[$tpl_name][$uid]['func'] . "(\$_smarty_tpl);\n";
- $_output .= "\$_smarty_tpl = array_pop(\$_tpl_stack); ";
if (isset($_assign)) {
- $_output .= " \$_smarty_tpl->tpl_vars[$_assign] = new Smarty_variable(ob_get_clean());";
+ $_output .= " \$_smarty_tpl->tpl_vars[$_assign] = new Smarty_Variable(\$_smarty_tpl->getInlineSubTemplate({$include_file}, {$_cache_id}, {$_compile_id}, {$_caching}, {$_cache_lifetime}, {$_vars}, {$_parent_scope}, '{$_hash}', '{$compiler->parent_compiler->mergedSubTemplatesData[$tpl_name][$uid]['func']}'));\n";
+ } else {
+ $_output .= "echo \$_smarty_tpl->getInlineSubTemplate({$include_file}, {$_cache_id}, {$_compile_id}, {$_caching}, {$_cache_lifetime}, {$_vars}, {$_parent_scope}, '{$_hash}', '{$compiler->parent_compiler->mergedSubTemplatesData[$tpl_name][$uid]['func']}');\n";
}
- $_output .= "\n/* End of included template \"" . $tpl_name . "\" */?>";
+ if ($update_compile_id) {
+ $_output .= $compiler->makeNocacheCode("\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n");
+ }
+ $_output .= "/* End of included template \"" . $tpl_name . "\" */?>\n";
return $_output;
}
+ if ($call_nocache) {
+ $compiler->tag_nocache = true;
+ }
+ $_output = "<?php ";
+ if ($update_compile_id) {
+ $_output .= "\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n";
+ }
// was there an assign attribute
if (isset($_assign)) {
- $_output = "<?php \$_smarty_tpl->tpl_vars[$_assign] = new Smarty_variable(\$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope));?>\n";;
+ $_output .= "\$_smarty_tpl->tpl_vars[$_assign] = new Smarty_Variable(\$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope));\n";
} else {
- $_output = "<?php echo \$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope);?>\n";
+ $_output .= "echo \$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope);\n";
}
-
+ if ($update_compile_id) {
+ $_output .= "\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n";
+ }
+ $_output .= "?>\n";
return $_output;
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_insert.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_insert.php
index 4c6585543..57f273506 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_insert.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_insert.php
@@ -51,8 +51,11 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
{
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
- // never compile as nocache code
- $compiler->suppressNocacheProcessing = true;
+ $nocacheParam = $compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache);
+ if (!$nocacheParam) {
+ // do not compile as nocache code
+ $compiler->suppressNocacheProcessing = true;
+ }
$compiler->tag_nocache = true;
$_smarty_tpl = $compiler->template;
$_name = null;
@@ -65,7 +68,12 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
// output will be stored in a smarty variable instead of being displayed
$_assign = $_attr['assign'];
// create variable to make sure that the compiler knows about its nocache status
- $compiler->template->tpl_vars[trim($_attr['assign'], "'")] = new Smarty_Variable(null, true);
+ $var = trim($_attr['assign'], "'");
+ if (isset($compiler->template->tpl_vars[$var])) {
+ $compiler->template->tpl_vars[$var]->nocache = true;
+ } else {
+ $compiler->template->tpl_vars[$var] = new Smarty_Variable(null, true);
+ }
}
if (isset($_attr['script'])) {
// script which must be included
@@ -116,19 +124,19 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
// convert attributes into parameter array string
$_paramsArray = array();
foreach ($_attr as $_key => $_value) {
- $_paramsArray[] = "'$_key' => $_value";
+ $_paramsArray[] = "'$_key' => $_value";
}
$_params = 'array(' . implode(", ", $_paramsArray) . ')';
// call insert
if (isset($_assign)) {
- if ($_smarty_tpl->caching) {
+ if ($_smarty_tpl->caching && !$nocacheParam) {
$_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}',{$_assign});?>";
} else {
$_output .= "\$_smarty_tpl->assign({$_assign} , {$_function} ({$_params},\$_smarty_tpl), true);?>";
}
} else {
$compiler->has_output = true;
- if ($_smarty_tpl->caching) {
+ if ($_smarty_tpl->caching && !$nocacheParam) {
$_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}');?>";
} else {
$_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>";
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_nocache.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_nocache.php
index ba39717fd..6f63dcb17 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_nocache.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_nocache.php
@@ -17,6 +17,13 @@
class Smarty_Internal_Compile_Nocache extends Smarty_Internal_CompileBase
{
/**
+ * Array of names of valid option flags
+ *
+ * @var array
+ */
+ public $option_flags = array();
+
+ /**
* Compiles code for the {nocache} tag
* This tag does not generate compiled output. It only sets a compiler flag.
*
@@ -28,9 +35,7 @@ class Smarty_Internal_Compile_Nocache extends Smarty_Internal_CompileBase
public function compile($args, $compiler)
{
$_attr = $this->getAttributes($compiler, $args);
- if ($_attr['nocache'] === true) {
- $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
- }
+ $this->openTag($compiler, 'nocache', array($compiler->nocache));
// enter nocache mode
$compiler->nocache = true;
// this tag does not return compiled code
@@ -61,7 +66,7 @@ class Smarty_Internal_Compile_Nocacheclose extends Smarty_Internal_CompileBase
{
$_attr = $this->getAttributes($compiler, $args);
// leave nocache mode
- $compiler->nocache = false;
+ list($compiler->nocache) = $this->closeTag($compiler, array('nocache'));
// this tag does not return compiled code
$compiler->has_code = false;
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_private_php.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_private_php.php
new file mode 100644
index 000000000..0b7958197
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_private_php.php
@@ -0,0 +1,197 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile PHP Expression
+ * Compiles any tag which will output an expression or variable
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile PHP Expression Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Php extends Smarty_Internal_CompileBase
+{
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('code', 'type');
+
+ /**
+ * Compiles code for generating output from any expression
+ *
+ * @param array $args array with attributes from parser
+ * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ *
+ * @return string
+ * @throws \SmartyException
+ */
+ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ $compiler->has_code = false;
+ if ($_attr['type'] == 'xml') {
+ $compiler->tag_nocache = true;
+ $save = $compiler->template->has_nocache_code;
+ $output = addcslashes($_attr['code'], "'\\");
+ $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($compiler->parser, $compiler->processNocacheCode("<?php echo '" . $output . "';?>", $compiler, true)));
+ $compiler->template->has_nocache_code = $save;
+ return '';
+ }
+ if ($_attr['type'] != 'tag') {
+ if ($compiler->php_handling == Smarty::PHP_REMOVE) {
+ return '';
+ } elseif ($compiler->php_handling == Smarty::PHP_QUOTE) {
+ $output = preg_replace_callback('#(<\?(?:php|=)?)|(<%)|(<script\s+language\s*=\s*["\']?\s*php\s*["\']?\s*>)|(\?>)|(%>)|(<\/script>)#i', array($this,
+ 'quote'), $_attr['code']);
+ $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Text($compiler->parser, $output));
+ return '';
+ } elseif ($compiler->php_handling == Smarty::PHP_PASSTHRU || $_attr['type'] == 'unmatched') {
+ $compiler->tag_nocache = true;
+ $save = $compiler->template->has_nocache_code;
+ $output = addcslashes($_attr['code'], "'\\");
+ $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($compiler->parser, $compiler->processNocacheCode("<?php echo '" . $output . "';?>", $compiler, true)));
+ $compiler->template->has_nocache_code = $save;
+ return '';
+ } elseif ($compiler->php_handling == Smarty::PHP_ALLOW) {
+ if (!($compiler->smarty instanceof SmartyBC)) {
+ $compiler->trigger_template_error('$smarty->php_handling PHP_ALLOW not allowed. Use SmartyBC to enable it', $compiler->lex->taglineno);
+ }
+ $compiler->has_code = true;
+ return $_attr['code'];
+ } else {
+ $compiler->trigger_template_error('Illegal $smarty->php_handling value', $compiler->lex->taglineno);
+ }
+ } else {
+ $compiler->has_code = true;
+ if (!($compiler->smarty instanceof SmartyBC)) {
+ $compiler->trigger_template_error('{php}[/php} tags not allowed. Use SmartyBC to enable them', $compiler->lex->taglineno);
+ }
+ $ldel = preg_quote($compiler->smarty->left_delimiter, '#');
+ $rdel = preg_quote($compiler->smarty->right_delimiter, '#');
+ preg_match("#^({$ldel}php\\s*)((.)*?)({$rdel})#", $_attr['code'], $match);
+ if (!empty($match[2])) {
+ if ('nocache' == trim($match[2])) {
+ $compiler->tag_nocache = true;
+ } else {
+ $compiler->trigger_template_error("illegal value of option flag \"{$match[2]}\"", $compiler->lex->taglineno);
+ }
+ }
+ return preg_replace(array("#^{$ldel}\\s*php\\s*(.)*?{$rdel}#",
+ "#{$ldel}\\s*/\\s*php\\s*{$rdel}$#"), array('<?php ', '?>'), $_attr['code']);
+ }
+ }
+
+ /**
+ * Lexer code for PHP tags
+ *
+ * This code has been moved from lexer here fo easier debugging and maintenance
+ *
+ * @param $lex
+ */
+ public function parsePhp($lex)
+ {
+ $lex->token = Smarty_Internal_Templateparser::TP_PHP;
+ $close = 0;
+ $lex->taglineno = $lex->line;
+ $closeTag = '?>';
+ if (strpos($lex->value, '<?xml') === 0) {
+ $lex->is_xml = true;
+ $lex->token = Smarty_Internal_Templateparser::TP_NOCACHE;
+ return;
+ } elseif (strpos($lex->value, '<?') === 0) {
+ $lex->phpType = 'php';
+ } elseif (strpos($lex->value, '<%') === 0) {
+ $lex->phpType = 'asp';
+ $closeTag = '%>';
+ } elseif (strpos($lex->value, '%>') === 0) {
+ $lex->phpType = 'unmatched';
+ } elseif (strpos($lex->value, '?>') === 0) {
+ if ($lex->is_xml) {
+ $lex->is_xml = false;
+ $lex->token = Smarty_Internal_Templateparser::TP_NOCACHE;
+ return;
+ }
+ $lex->phpType = 'unmatched';
+ } elseif (strpos($lex->value, '<s') === 0) {
+ $lex->phpType = 'script';
+ $closeTag = '</script>';
+ } elseif (strpos($lex->value, $lex->smarty->left_delimiter) === 0) {
+ if ($lex->isAutoLiteral()) {
+ $lex->token = Smarty_Internal_Templateparser::TP_TEXT;
+ return;
+ }
+ $closeTag = "{$lex->smarty->left_delimiter}/php{$lex->smarty->right_delimiter}";
+ if ($lex->value == $closeTag) {
+ $lex->compiler->trigger_template_error("unexpected closing tag '{$closeTag}'");
+ }
+ $lex->phpType = 'tag';
+ }
+ if ($lex->phpType == 'unmatched') {
+ return;
+ }
+ if (($lex->phpType == 'php' || $lex->phpType == 'asp') && ($lex->compiler->php_handling == Smarty::PHP_PASSTHRU || $lex->compiler->php_handling == Smarty::PHP_QUOTE)) {
+ return;
+ }
+ $start = $lex->counter + strlen($lex->value);
+ $body = true;
+ if (preg_match('~' . preg_quote($closeTag, '~') . '~i', $lex->data, $match, PREG_OFFSET_CAPTURE, $start)) {
+ $close = $match[0][1];
+ } else {
+ $lex->compiler->trigger_template_error("missing closing tag '{$closeTag}'");
+ }
+ while ($body) {
+ if (preg_match('~([/][*])|([/][/][^\n]*)|(\'[^\'\\\\]*(?:\\.[^\'\\\\]*)*\')|("[^"\\\\]*(?:\\.[^"\\\\]*)*")~', $lex->data, $match, PREG_OFFSET_CAPTURE, $start)) {
+ $value = $match[0][0];
+ $from = $pos = $match[0][1];
+ if ($pos > $close) {
+ $body = false;
+ } else {
+ $start = $pos + strlen($value);
+ $phpCommentStart = $value == '/*';
+ if ($phpCommentStart) {
+ $phpCommentEnd = preg_match('~([*][/])~', $lex->data, $match, PREG_OFFSET_CAPTURE, $start);
+ if ($phpCommentEnd) {
+ $pos2 = $match[0][1];
+ $start = $pos2 + strlen($match[0][0]);
+ }
+ }
+ while ($close > $pos && $close < $start) {
+ if (preg_match('~' . preg_quote($closeTag, '~') . '~i', $lex->data, $match, PREG_OFFSET_CAPTURE, $from)) {
+ $close = $match[0][1];
+ $from = $close + strlen($match[0][0]);
+ } else {
+ $lex->compiler->trigger_template_error("missing closing tag '{$closeTag}'");
+ }
+ }
+ if ($phpCommentStart && (!$phpCommentEnd || $pos2 > $close)) {
+ $lex->taglineno = $lex->line + substr_count(substr($lex->data, $lex->counter, $start), "\n");
+ $lex->compiler->trigger_template_error("missing PHP comment closing tag '*/'");
+ }
+ }
+ } else {
+ $body = false;
+ }
+ }
+ $lex->value = substr($lex->data, $lex->counter, $close + strlen($closeTag) - $lex->counter);
+ }
+
+ /*
+ * Call back function for $php_handling = PHP_QUOTE
+ *
+ */
+ private function quote($match)
+ {
+ return htmlspecialchars($match[0], ENT_QUOTES);
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php
index 23b17ae14..525bc0db7 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php
@@ -30,85 +30,91 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
$_index = preg_split("/\]\[/", substr($parameter, 1, strlen($parameter) - 2));
$compiled_ref = ' ';
$variable = trim($_index[0], "'");
- switch ($variable) {
- case 'foreach':
- return "\$_smarty_tpl->getVariable('smarty')->value$parameter";
- case 'section':
- return "\$_smarty_tpl->getVariable('smarty')->value$parameter";
- case 'capture':
- return "Smarty::\$_smarty_vars$parameter";
- case 'now':
- return 'time()';
- case 'cookies':
- if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) {
- $compiler->trigger_template_error("(secure mode) super globals not permitted");
+ if (!isset($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedSpecialSmartyVar($variable, $compiler)) {
+ switch ($variable) {
+ case 'foreach':
+ $name = trim($_index[1], "'");
+ $foreachVar = "'__foreach_{$name}'";
+ return "(isset(\$_smarty_tpl->tpl_vars[$foreachVar]->value[{$_index[2]}]) ? \$_smarty_tpl->tpl_vars[$foreachVar]->value[{$_index[2]}] : null)";
+ case 'section':
+ return "\$_smarty_tpl->getVariable('smarty')->value$parameter";
+ case 'capture':
+ return "Smarty::\$_smarty_vars$parameter";
+ case 'now':
+ return 'time()';
+ case 'cookies':
+ if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) {
+ $compiler->trigger_template_error("(secure mode) super globals not permitted");
+ break;
+ }
+ $compiled_ref = '$_COOKIE';
break;
- }
- $compiled_ref = '$_COOKIE';
- break;
- case 'get':
- case 'post':
- case 'env':
- case 'server':
- case 'session':
- case 'request':
- if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) {
- $compiler->trigger_template_error("(secure mode) super globals not permitted");
+ case 'get':
+ case 'post':
+ case 'env':
+ case 'server':
+ case 'session':
+ case 'request':
+ if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) {
+ $compiler->trigger_template_error("(secure mode) super globals not permitted");
+ break;
+ }
+ $compiled_ref = '$_' . strtoupper($variable);
break;
- }
- $compiled_ref = '$_' . strtoupper($variable);
- break;
-
- case 'template':
- return 'basename($_smarty_tpl->source->filepath)';
- case 'template_object':
- return '$_smarty_tpl';
+ case 'template':
+ return 'basename($_smarty_tpl->source->filepath)';
- case 'current_dir':
- return 'dirname($_smarty_tpl->source->filepath)';
+ case 'template_object':
+ return '$_smarty_tpl';
- case 'version':
- $_version = Smarty::SMARTY_VERSION;
+ case 'current_dir':
+ return 'dirname($_smarty_tpl->source->filepath)';
- return "'$_version'";
+ case 'version':
+ $_version = Smarty::SMARTY_VERSION;
- case 'const':
- if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_constants) {
- $compiler->trigger_template_error("(secure mode) constants not permitted");
- break;
- }
+ return "'$_version'";
- return "@constant({$_index[1]})";
+ case 'const':
+ if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_constants) {
+ $compiler->trigger_template_error("(secure mode) constants not permitted");
+ break;
+ }
+ if (strpos($_index[1], '$') === false && strpos($_index[1], '\'') === false ) {
+ return "@constant('{$_index[1]}')";
+ } else {
+ return "@constant({$_index[1]})";
+ }
- case 'config':
- if (isset($_index[2])) {
- return "(is_array(\$tmp = \$_smarty_tpl->getConfigVariable($_index[1])) ? \$tmp[$_index[2]] : null)";
- } else {
- return "\$_smarty_tpl->getConfigVariable($_index[1])";
- }
- case 'ldelim':
- $_ldelim = $compiler->smarty->left_delimiter;
+ case 'config':
+ if (isset($_index[2])) {
+ return "(is_array(\$tmp = \$_smarty_tpl->getConfigVariable($_index[1])) ? \$tmp[$_index[2]] : null)";
+ } else {
+ return "\$_smarty_tpl->getConfigVariable($_index[1])";
+ }
+ case 'ldelim':
+ $_ldelim = $compiler->smarty->left_delimiter;
- return "'$_ldelim'";
+ return "'$_ldelim'";
- case 'rdelim':
- $_rdelim = $compiler->smarty->right_delimiter;
+ case 'rdelim':
+ $_rdelim = $compiler->smarty->right_delimiter;
- return "'$_rdelim'";
+ return "'$_rdelim'";
- default:
- $compiler->trigger_template_error('$smarty.' . trim($_index[0], "'") . ' is invalid');
- break;
- }
- if (isset($_index[1])) {
- array_shift($_index);
- foreach ($_index as $_ind) {
- $compiled_ref = $compiled_ref . "[$_ind]";
+ default:
+ $compiler->trigger_template_error('$smarty.' . trim($_index[0], "'") . ' is invalid');
+ break;
+ }
+ if (isset($_index[1])) {
+ array_shift($_index);
+ foreach ($_index as $_ind) {
+ $compiled_ref = $compiled_ref . "[$_ind]";
+ }
}
}
-
return $compiled_ref;
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_while.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_while.php
index 36dc049db..6a6fb3ef1 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_while.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_while.php
@@ -42,9 +42,14 @@ class Smarty_Internal_Compile_While extends Smarty_Internal_CompileBase
$_nocache = ',true';
// create nocache var to make it know for further compiling
if (is_array($parameter['if condition']['var'])) {
- $compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true);
+ $var = trim($parameter['if condition']['var']['var'], "'");
} else {
- $compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true);
+ $var = trim($parameter['if condition']['var'], "'");
+ }
+ if (isset($compiler->template->tpl_vars[$var])) {
+ $compiler->template->tpl_vars[$var]->nocache = true;
+ } else {
+ $compiler->template->tpl_vars[$var] = new Smarty_Variable(null, true);
}
} else {
$_nocache = '';
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_config.php b/library/Smarty/libs/sysplugins/smarty_internal_config.php
deleted file mode 100644
index 25694d5a9..000000000
--- a/library/Smarty/libs/sysplugins/smarty_internal_config.php
+++ /dev/null
@@ -1,306 +0,0 @@
-<?php
-/**
- * Smarty Internal Plugin Config
- *
- * @package Smarty
- * @subpackage Config
- * @author Uwe Tews
- */
-
-/**
- * Smarty Internal Plugin Config
- * Main class for config variables
- *
- * @package Smarty
- * @subpackage Config
- * @ignore
- */
-class Smarty_Internal_Config
-{
- /**
- * Smarty instance
- *
- * @var Smarty object
- */
- public $smarty = null;
- /**
- * Object of config var storage
- *
- * @var object
- */
- public $data = null;
- /**
- * Config resource
- *
- * @var string
- */
- public $config_resource = null;
- /**
- * Compiled config file
- *
- * @var string
- */
- public $compiled_config = null;
- /**
- * filepath of compiled config file
- *
- * @var string
- */
- public $compiled_filepath = null;
- /**
- * Filemtime of compiled config Filemtime
- *
- * @var int
- */
- public $compiled_timestamp = null;
- /**
- * flag if compiled config file is invalid and must be (re)compiled
- *
- * @var bool
- */
- public $mustCompile = null;
- /**
- * Config file compiler object
- *
- * @var Smarty_Internal_Config_File_Compiler object
- */
- public $compiler_object = null;
-
- /**
- * Constructor of config file object
- *
- * @param string $config_resource config file resource name
- * @param Smarty $smarty Smarty instance
- * @param object $data object for config vars storage
- */
- public function __construct($config_resource, $smarty, $data = null)
- {
- $this->data = $data;
- $this->smarty = $smarty;
- $this->config_resource = $config_resource;
- }
-
- /**
- * Returns the compiled filepath
- *
- * @return string the compiled filepath
- */
- public function getCompiledFilepath()
- {
- return $this->compiled_filepath === null ?
- ($this->compiled_filepath = $this->buildCompiledFilepath()) :
- $this->compiled_filepath;
- }
-
- /**
- * Get file path.
- *
- * @return string
- */
- public function buildCompiledFilepath()
- {
- $_compile_id = isset($this->smarty->compile_id) ? preg_replace('![^\w\|]+!', '_', $this->smarty->compile_id) : null;
- $_flag = (int) $this->smarty->config_read_hidden + (int) $this->smarty->config_booleanize * 2
- + (int) $this->smarty->config_overwrite * 4;
- $_filepath = sha1(realpath($this->source->filepath) . $_flag);
- // if use_sub_dirs, break file into directories
- if ($this->smarty->use_sub_dirs) {
- $_filepath = substr($_filepath, 0, 2) . DS
- . substr($_filepath, 2, 2) . DS
- . substr($_filepath, 4, 2) . DS
- . $_filepath;
- }
- $_compile_dir_sep = $this->smarty->use_sub_dirs ? DS : '^';
- if (isset($_compile_id)) {
- $_filepath = $_compile_id . $_compile_dir_sep . $_filepath;
- }
- $_compile_dir = $this->smarty->getCompileDir();
-
- return $_compile_dir . $_filepath . '.' . basename($this->source->name) . '.config' . '.php';
- }
-
- /**
- * Returns the timestamp of the compiled file
- *
- * @return integer the file timestamp
- */
- public function getCompiledTimestamp()
- {
- return $this->compiled_timestamp === null
- ? ($this->compiled_timestamp = (file_exists($this->getCompiledFilepath())) ? filemtime($this->getCompiledFilepath()) : false)
- : $this->compiled_timestamp;
- }
-
- /**
- * Returns if the current config file must be compiled
- * It does compare the timestamps of config source and the compiled config and checks the force compile configuration
- *
- * @return boolean true if the file must be compiled
- */
- public function mustCompile()
- {
- return $this->mustCompile === null ?
- $this->mustCompile = ($this->smarty->force_compile || $this->getCompiledTimestamp() === false || $this->smarty->compile_check && $this->getCompiledTimestamp() < $this->source->timestamp) :
- $this->mustCompile;
- }
-
- /**
- * Returns the compiled config file
- * It checks if the config file must be compiled or just read the compiled version
- *
- * @return string the compiled config file
- */
- public function getCompiledConfig()
- {
- if ($this->compiled_config === null) {
- // see if template needs compiling.
- if ($this->mustCompile()) {
- $this->compileConfigSource();
- } else {
- $this->compiled_config = file_get_contents($this->getCompiledFilepath());
- }
- }
-
- return $this->compiled_config;
- }
-
- /**
- * Compiles the config files
- *
- * @throws Exception
- */
- public function compileConfigSource()
- {
- // compile template
- if (!is_object($this->compiler_object)) {
- // load compiler
- $this->compiler_object = new Smarty_Internal_Config_File_Compiler($this->smarty);
- }
- // compile locking
- if ($this->smarty->compile_locking) {
- if ($saved_timestamp = $this->getCompiledTimestamp()) {
- touch($this->getCompiledFilepath());
- }
- }
- // call compiler
- try {
- $this->compiler_object->compileSource($this);
- }
- catch (Exception $e) {
- // restore old timestamp in case of error
- if ($this->smarty->compile_locking && $saved_timestamp) {
- touch($this->getCompiledFilepath(), $saved_timestamp);
- }
- throw $e;
- }
- // compiling succeeded
- // write compiled template
- Smarty_Internal_Write_File::writeFile($this->getCompiledFilepath(), $this->getCompiledConfig(), $this->smarty);
- }
-
- /**
- * load config variables
- *
- * @param mixed $sections array of section names, single section or null
- * @param string $scope global,parent or local
- *
- * @throws Exception
- */
- public function loadConfigVars($sections = null, $scope = 'local')
- {
- if ($this->data instanceof Smarty_Internal_Template) {
- $this->data->properties['file_dependency'][sha1($this->source->filepath)] = array($this->source->filepath, $this->source->timestamp, 'file');
- }
- if ($this->mustCompile()) {
- $this->compileConfigSource();
- }
- // pointer to scope
- if ($scope == 'local') {
- $scope_ptr = $this->data;
- } elseif ($scope == 'parent') {
- if (isset($this->data->parent)) {
- $scope_ptr = $this->data->parent;
- } else {
- $scope_ptr = $this->data;
- }
- } elseif ($scope == 'root' || $scope == 'global') {
- $scope_ptr = $this->data;
- while (isset($scope_ptr->parent)) {
- $scope_ptr = $scope_ptr->parent;
- }
- }
- $_config_vars = array();
- include($this->getCompiledFilepath());
- // copy global config vars
- foreach ($_config_vars['vars'] as $variable => $value) {
- if ($this->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
- $scope_ptr->config_vars[$variable] = $value;
- } else {
- $scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value);
- }
- }
- // scan sections
- if (!empty($sections)) {
- foreach ((array) $sections as $this_section) {
- if (isset($_config_vars['sections'][$this_section])) {
- foreach ($_config_vars['sections'][$this_section]['vars'] as $variable => $value) {
- if ($this->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
- $scope_ptr->config_vars[$variable] = $value;
- } else {
- $scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value);
- }
- }
- }
- }
- }
- }
-
- /**
- * set Smarty property in template context
- *
- * @param string $property_name property name
- * @param mixed $value value
- *
- * @throws SmartyException if $property_name is not valid
- */
- public function __set($property_name, $value)
- {
- switch ($property_name) {
- case 'source':
- case 'compiled':
- $this->$property_name = $value;
-
- return;
- }
-
- throw new SmartyException("invalid config property '$property_name'.");
- }
-
- /**
- * get Smarty property in template context
- *
- * @param string $property_name property name
- *
- * @return \Smarty_Config_Source|\Smarty_Template_Compiled
- * @throws SmartyException if $property_name is not valid
- */
- public function __get($property_name)
- {
- switch ($property_name) {
- case 'source':
- if (empty($this->config_resource)) {
- throw new SmartyException("Unable to parse resource name \"{$this->config_resource}\"");
- }
- $this->source = Smarty_Resource::config($this);
-
- return $this->source;
-
- case 'compiled':
- $this->compiled = $this->source->getCompiled($this);
-
- return $this->compiled;
- }
-
- throw new SmartyException("config attribute '$property_name' does not exist.");
- }
-}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_config_file_compiler.php b/library/Smarty/libs/sysplugins/smarty_internal_config_file_compiler.php
index 117310439..50779c7b5 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_config_file_compiler.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_config_file_compiler.php
@@ -18,6 +18,19 @@
class Smarty_Internal_Config_File_Compiler
{
/**
+ * Lexer class name
+ *
+ * @var string
+ */
+ public $lexer_class;
+
+ /**
+ * Parser class name
+ *
+ * @var string
+ */
+ public $parser_class;
+ /**
* Lexer object
*
* @var object
@@ -41,9 +54,9 @@ class Smarty_Internal_Config_File_Compiler
/**
* Smarty object
*
- * @var Smarty_Internal_Config object
+ * @var Smarty_Internal_Template object
*/
- public $config;
+ public $template;
/**
* Compiled config data sections and variables
@@ -53,39 +66,51 @@ class Smarty_Internal_Config_File_Compiler
public $config_data = array();
/**
+ * compiled config data must always be written
+ *
+ * @var bool
+ */
+ public $write_compiled_code = true;
+
+ /**
* Initialize compiler
*
- * @param Smarty $smarty base instance
+ * @param string $lexer_class class name
+ * @param string $parser_class class name
+ * @param Smarty $smarty global instance
*/
- public function __construct($smarty)
+ public function __construct($lexer_class, $parser_class, Smarty $smarty)
{
$this->smarty = $smarty;
+ // get required plugins
+ $this->lexer_class = $lexer_class;
+ $this->parser_class = $parser_class;
+ $this->smarty = $smarty;
$this->config_data['sections'] = array();
$this->config_data['vars'] = array();
}
/**
- * Method to compile a Smarty template.
+ * Method to compile Smarty config source.
*
- * @param Smarty_Internal_Config $config config object
+ * @param Smarty_Internal_Template $template
*
- * @return bool true if compiling succeeded, false if it failed
+ * @return bool true if compiling succeeded, false if it failed
*/
- public function compileSource(Smarty_Internal_Config $config)
+ public function compileTemplate(Smarty_Internal_Template $template)
{
- /* here is where the compiling takes place. Smarty
- tags in the templates are replaces with PHP code,
- then written to compiled files. */
- $this->config = $config;
- // get config file source
- $_content = $config->source->content . "\n";
- // on empty template just return
- if ($_content == '') {
+ $this->template = $template;
+ $this->template->properties['file_dependency'][$this->template->source->uid] = array($this->template->source->name, $this->template->source->timestamp, $this->template->source->type);
+ // on empty config just return
+ if ($template->source->content == '') {
return true;
}
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_compile($this->template);
+ }
// init the lexer/parser to compile the config file
- $lex = new Smarty_Internal_Configfilelexer($_content, $this);
- $parser = new Smarty_Internal_Configfileparser($lex, $this);
+ $lex = new $this->lexer_class(str_replace(array("\r\n", "\r"), "\n", $template->source->content) . "\n", $this);
+ $parser = new $this->parser_class($lex, $this);
if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
$mbEncoding = mb_internal_encoding();
@@ -94,7 +119,6 @@ class Smarty_Internal_Config_File_Compiler
$mbEncoding = null;
}
-
if ($this->smarty->_parserdebug) {
$parser->PrintTrace();
}
@@ -111,8 +135,15 @@ class Smarty_Internal_Config_File_Compiler
if ($mbEncoding) {
mb_internal_encoding($mbEncoding);
}
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_compile($this->template);
+ }
+ // template header code
+ $template_header = "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . "\n";
+ $template_header .= " compiled from \"" . $this->template->source->filepath . "\" */ ?>\n";
- $config->compiled_config = '<?php $_config_vars = ' . var_export($this->config_data, true) . '; ?>';
+ $code = '<?php Smarty_Internal_Extension_Config::loadConfigVars($_smarty_tpl, ' . var_export($this->config_data, true) . '); ?>';
+ return $template_header . Smarty_Internal_Extension_CodeFrame::create($this->template, $code);
}
/**
@@ -129,13 +160,13 @@ class Smarty_Internal_Config_File_Compiler
{
$this->lex = Smarty_Internal_Configfilelexer::instance();
$this->parser = Smarty_Internal_Configfileparser::instance();
- // get template source line which has error
+ // get config source line which has error
$line = $this->lex->line;
if (isset($args)) {
// $line--;
}
$match = preg_split("/\n/", $this->lex->data);
- $error_text = "Syntax error in config file '{$this->config->source->filepath}' on line {$line} '{$match[$line - 1]}' ";
+ $error_text = "Syntax error in config file '{$this->template->source->filepath}' on line {$line} '{$match[$line - 1]}' ";
if (isset($args)) {
// individual error message
$error_text .= $args;
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_configfilelexer.php b/library/Smarty/libs/sysplugins/smarty_internal_configfilelexer.php
index f0292196b..e62728c2c 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_configfilelexer.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_configfilelexer.php
@@ -1,6 +1,7 @@
<?php
/**
* Smarty Internal Plugin Configfilelexer
+ *
* This is the lexer to break the config file source into tokens
*
* @package Smarty
@@ -9,25 +10,134 @@
*/
/**
- * Smarty Internal Plugin Configfilelexer
+ * 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;
- public $node;
+
+ /**
+ * current line
+ *
+ * @var int
+ */
public $line;
- private $state = 1;
+
+ /**
+ * 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;
- public $state_name = array(1 => 'START', 2 => 'VALUE', 3 => 'NAKED_STRING_VALUE', 4 => 'COMMENT', 5 => 'SECTION', 6 => 'TRIPPLE');
- public $smarty_token_names = array( // Text for parser error messages
+
+ /**
+ * 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
);
- function __construct($data, $compiler)
+ /**
+ * 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);
@@ -39,6 +149,7 @@ class Smarty_Internal_Configfilelexer
$this->line = 1;
$this->compiler = $compiler;
$this->smarty = $compiler->smarty;
+ $this->configBooleanize = $this->smarty->config_booleanize;
}
public static function &instance($new_instance = null)
@@ -57,6 +168,7 @@ class Smarty_Internal_Configfilelexer
}
private $_yy_state = 1;
+
private $_yy_stack = array();
public function yylex()
@@ -97,41 +209,28 @@ class Smarty_Internal_Configfilelexer
public function yylex1()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- );
+ if (!isset($this->yy_global_pattern1)) {
+ $this->yy_global_pattern1 = "/\G(#|;)|\G(\\[)|\G(\\])|\G(=)|\G([ \t\r]+)|\G(\n)|\G([0-9]*[a-zA-Z_]\\w*)|\G([\S\s])/isS";
+ }
if ($this->counter >= strlen($this->data)) {
return false; // end of input
}
- $yy_global_pattern = "/\G(#|;)|\G(\\[)|\G(\\])|\G(=)|\G([ \t\r]+)|\G(\n)|\G([0-9]*[a-zA-Z_]\\w*)|\G([\S\s])/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state START');
+ 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 START');
}
next($yymatches); // skip global match
$this->token = key($yymatches); // token number
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r1_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r1_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -151,8 +250,7 @@ class Smarty_Internal_Configfilelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
@@ -160,52 +258,52 @@ class Smarty_Internal_Configfilelexer
const START = 1;
- function yy_r1_1($yy_subpatterns)
+ function yy_r1_1()
{
$this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART;
$this->yypushstate(self::COMMENT);
}
- function yy_r1_2($yy_subpatterns)
+ function yy_r1_2()
{
$this->token = Smarty_Internal_Configfileparser::TPC_OPENB;
$this->yypushstate(self::SECTION);
}
- function yy_r1_3($yy_subpatterns)
+ function yy_r1_3()
{
$this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB;
}
- function yy_r1_4($yy_subpatterns)
+ function yy_r1_4()
{
$this->token = Smarty_Internal_Configfileparser::TPC_EQUAL;
$this->yypushstate(self::VALUE);
}
- function yy_r1_5($yy_subpatterns)
+ function yy_r1_5()
{
return false;
}
- function yy_r1_6($yy_subpatterns)
+ function yy_r1_6()
{
$this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
}
- function yy_r1_7($yy_subpatterns)
+ function yy_r1_7()
{
$this->token = Smarty_Internal_Configfileparser::TPC_ID;
}
- function yy_r1_8($yy_subpatterns)
+ function yy_r1_8()
{
$this->token = Smarty_Internal_Configfileparser::TPC_OTHER;
@@ -213,42 +311,28 @@ class Smarty_Internal_Configfilelexer
public function yylex2()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 0,
- );
+ if (!isset($this->yy_global_pattern2)) {
+ $this->yy_global_pattern2 = "/\G([ \t\r]+)|\G(\\d+\\.\\d+(?=[ \t\r]*[\n#;]))|\G(\\d+(?=[ \t\r]*[\n#;]))|\G(\"\"\")|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#;]))|\G(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#;]))|\G([a-zA-Z]+(?=[ \t\r]*[\n#;]))|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS";
+ }
if ($this->counter >= strlen($this->data)) {
return false; // end of input
}
- $yy_global_pattern = "/\G([ \t\r]+)|\G(\\d+\\.\\d+(?=[ \t\r]*[\n#;]))|\G(\\d+(?=[ \t\r]*[\n#;]))|\G(\"\"\")|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#;]))|\G(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#;]))|\G([a-zA-Z]+(?=[ \t\r]*[\n#;]))|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state VALUE');
+ 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 VALUE');
}
next($yymatches); // skip global match
$this->token = key($yymatches); // token number
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r2_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r2_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -268,8 +352,7 @@ class Smarty_Internal_Configfilelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
@@ -277,51 +360,53 @@ class Smarty_Internal_Configfilelexer
const VALUE = 2;
- function yy_r2_1($yy_subpatterns)
+ function yy_r2_1()
{
return false;
}
- function yy_r2_2($yy_subpatterns)
+ function yy_r2_2()
{
$this->token = Smarty_Internal_Configfileparser::TPC_FLOAT;
$this->yypopstate();
}
- function yy_r2_3($yy_subpatterns)
+ function yy_r2_3()
{
$this->token = Smarty_Internal_Configfileparser::TPC_INT;
$this->yypopstate();
}
- function yy_r2_4($yy_subpatterns)
+ function yy_r2_4()
{
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES;
$this->yypushstate(self::TRIPPLE);
}
- function yy_r2_5($yy_subpatterns)
+ function yy_r2_5()
{
$this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING;
$this->yypopstate();
}
- function yy_r2_6($yy_subpatterns)
+ function yy_r2_6()
{
$this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING;
$this->yypopstate();
}
- function yy_r2_7($yy_subpatterns)
+ function yy_r2_7()
{
- if (!$this->smarty->config_booleanize || !in_array(strtolower($this->value), Array("true", "false", "on", "off", "yes", "no"))) {
+ 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
@@ -331,14 +416,14 @@ class Smarty_Internal_Configfilelexer
}
}
- function yy_r2_8($yy_subpatterns)
+ function yy_r2_8()
{
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
$this->yypopstate();
}
- function yy_r2_9($yy_subpatterns)
+ function yy_r2_9()
{
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
@@ -348,34 +433,28 @@ class Smarty_Internal_Configfilelexer
public function yylex3()
{
- $tokenMap = array(
- 1 => 0,
- );
+ if (!isset($this->yy_global_pattern3)) {
+ $this->yy_global_pattern3 = "/\G([^\n]+?(?=[ \t\r]*\n))/isS";
+ }
if ($this->counter >= strlen($this->data)) {
return false; // end of input
}
- $yy_global_pattern = "/\G([^\n]+?(?=[ \t\r]*\n))/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state NAKED_STRING_VALUE');
+ 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 NAKED_STRING_VALUE');
}
next($yymatches); // skip global match
$this->token = key($yymatches); // token number
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r3_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r3_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -395,8 +474,7 @@ class Smarty_Internal_Configfilelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
@@ -404,7 +482,7 @@ class Smarty_Internal_Configfilelexer
const NAKED_STRING_VALUE = 3;
- function yy_r3_1($yy_subpatterns)
+ function yy_r3_1()
{
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
@@ -413,36 +491,28 @@ class Smarty_Internal_Configfilelexer
public function yylex4()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 0,
- 3 => 0,
- );
+ if (!isset($this->yy_global_pattern4)) {
+ $this->yy_global_pattern4 = "/\G([ \t\r]+)|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS";
+ }
if ($this->counter >= strlen($this->data)) {
return false; // end of input
}
- $yy_global_pattern = "/\G([ \t\r]+)|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state COMMENT');
+ 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 COMMENT');
}
next($yymatches); // skip global match
$this->token = key($yymatches); // token number
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r4_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r4_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -462,8 +532,7 @@ class Smarty_Internal_Configfilelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
@@ -471,19 +540,19 @@ class Smarty_Internal_Configfilelexer
const COMMENT = 4;
- function yy_r4_1($yy_subpatterns)
+ function yy_r4_1()
{
return false;
}
- function yy_r4_2($yy_subpatterns)
+ function yy_r4_2()
{
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
}
- function yy_r4_3($yy_subpatterns)
+ function yy_r4_3()
{
$this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
@@ -492,35 +561,28 @@ class Smarty_Internal_Configfilelexer
public function yylex5()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 0,
- );
+ if (!isset($this->yy_global_pattern5)) {
+ $this->yy_global_pattern5 = "/\G(\\.)|\G(.*?(?=[\.=[\]\r\n]))/isS";
+ }
if ($this->counter >= strlen($this->data)) {
return false; // end of input
}
- $yy_global_pattern = "/\G(\\.)|\G(.*?(?=[\.=[\]\r\n]))/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state SECTION');
+ 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 SECTION');
}
next($yymatches); // skip global match
$this->token = key($yymatches); // token number
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r5_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r5_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -540,8 +602,7 @@ class Smarty_Internal_Configfilelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
@@ -549,13 +610,13 @@ class Smarty_Internal_Configfilelexer
const SECTION = 5;
- function yy_r5_1($yy_subpatterns)
+ function yy_r5_1()
{
$this->token = Smarty_Internal_Configfileparser::TPC_DOT;
}
- function yy_r5_2($yy_subpatterns)
+ function yy_r5_2()
{
$this->token = Smarty_Internal_Configfileparser::TPC_SECTION;
@@ -564,35 +625,28 @@ class Smarty_Internal_Configfilelexer
public function yylex6()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 0,
- );
+ if (!isset($this->yy_global_pattern6)) {
+ $this->yy_global_pattern6 = "/\G(\"\"\"(?=[ \t\r]*[\n#;]))|\G([\S\s])/isS";
+ }
if ($this->counter >= strlen($this->data)) {
return false; // end of input
}
- $yy_global_pattern = "/\G(\"\"\"(?=[ \t\r]*[\n#;]))|\G([\S\s])/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern6, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state TRIPPLE');
+ 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 TRIPPLE');
}
next($yymatches); // skip global match
$this->token = key($yymatches); // token number
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r6_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r6_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -612,8 +666,7 @@ class Smarty_Internal_Configfilelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
@@ -621,7 +674,7 @@ class Smarty_Internal_Configfilelexer
const TRIPPLE = 6;
- function yy_r6_1($yy_subpatterns)
+ function yy_r6_1()
{
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END;
@@ -629,7 +682,7 @@ class Smarty_Internal_Configfilelexer
$this->yypushstate(self::START);
}
- function yy_r6_2($yy_subpatterns)
+ function yy_r6_2()
{
$to = strlen($this->data);
@@ -642,5 +695,5 @@ class Smarty_Internal_Configfilelexer
$this->value = substr($this->data, $this->counter, $to - $this->counter);
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_TEXT;
}
-}
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_configfileparser.php b/library/Smarty/libs/sysplugins/smarty_internal_configfileparser.php
index fc476ce0a..69aaf990f 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_configfileparser.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_configfileparser.php
@@ -1,17 +1,9 @@
<?php
-/**
- * Smarty Internal Plugin Configfileparser
- * This is the config file parser.
- * It is generated from the internal.configfileparser.y file
- *
- * @package Smarty
- * @subpackage Compiler
- * @author Uwe Tews
- */
class TPC_yyToken implements ArrayAccess
{
public $string = '';
+
public $metadata = array();
public function __construct($s, $m = array())
@@ -31,7 +23,7 @@ class TPC_yyToken implements ArrayAccess
public function __toString()
{
- return $this->_string;
+ return $this->string;
}
public function offsetExists($offset)
@@ -48,8 +40,7 @@ class TPC_yyToken implements ArrayAccess
{
if ($offset === null) {
if (isset($value[0])) {
- $x = ($value instanceof TPC_yyToken) ?
- $value->metadata : $value;
+ $x = ($value instanceof TPC_yyToken) ? $value->metadata : $value;
$this->metadata = array_merge($this->metadata, $x);
return;
@@ -76,8 +67,8 @@ class TPC_yyToken implements ArrayAccess
class TPC_yyStackEntry
{
- public $stateno; /* The state-number */
- public $major; /* The major token value. This is the code
+ public $stateno; /* The state-number */
+ public $major; /* The major token value. This is the code
** number for the token at this stack level */
public $minor; /* The user-supplied minor token value. This
** is the value of the token */
@@ -85,26 +76,112 @@ class TPC_yyStackEntry
;
-#line 12 "smarty_internal_configfileparser.y"
-class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparser.php"
+#line 12 "../smarty/lexer/smarty_internal_configfileparser.y"
+
+/**
+ * Smarty Internal Plugin Configfileparse
+ *
+ * This is the config file parser.
+ * It is generated from the smarty_internal_configfileparser.y file
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+class Smarty_Internal_Configfileparser
{
- #line 14 "smarty_internal_configfileparser.y"
+ #line 25 "../smarty/lexer/smarty_internal_configfileparser.y"
- // states whether the parse was successful or not
+ /**
+ * 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;
- function __construct($lex, $compiler)
+ /**
+ * 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;
@@ -114,9 +191,17 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
return $instance;
}
+ /**
+ * parse optional boolean keywords
+ *
+ * @param string $str
+ *
+ * @return bool
+ */
private function parse_bool($str)
{
- if (in_array(strtolower($str), array('on', 'yes', 'true'))) {
+ $str = strtolower($str);
+ if (in_array($str, array('on', 'yes', 'true'))) {
$res = true;
} else {
$res = false;
@@ -124,9 +209,15 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
return $res;
}
- private static $escapes_single = Array('\\' => '\\',
- '\'' => '\'');
-
+ /**
+ * 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
@@ -140,30 +231,48 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
$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->smarty->config_overwrite || !isset($target_array['vars'][$key])) {
+ if ($this->configOverwrite || !isset($target_array['vars'][$key])) {
$target_array['vars'][$key] = $value;
} else {
settype($target_array['vars'][$key], 'array');
@@ -171,6 +280,11 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
}
}
+ /**
+ * add config variable to global vars
+ *
+ * @param array $vars
+ */
private function add_global_vars(Array $vars)
{
if (!isset($this->compiler->config_data['vars'])) {
@@ -181,6 +295,12 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
}
}
+ /**
+ * 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'])) {
@@ -191,158 +311,92 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
}
}
- #line 174 "smarty_internal_configfileparser.php"
-
const TPC_OPENB = 1;
+
const TPC_SECTION = 2;
+
const TPC_CLOSEB = 3;
+
const TPC_DOT = 4;
+
const TPC_ID = 5;
+
const TPC_EQUAL = 6;
+
const TPC_FLOAT = 7;
+
const TPC_INT = 8;
+
const TPC_BOOL = 9;
+
const TPC_SINGLE_QUOTED_STRING = 10;
+
const TPC_DOUBLE_QUOTED_STRING = 11;
+
const TPC_TRIPPLE_QUOTES = 12;
+
const TPC_TRIPPLE_TEXT = 13;
+
const TPC_TRIPPLE_QUOTES_END = 14;
+
const TPC_NAKED_STRING = 15;
+
const TPC_OTHER = 16;
+
const TPC_NEWLINE = 17;
+
const TPC_COMMENTSTART = 18;
+
const YY_NO_ACTION = 60;
+
const YY_ACCEPT_ACTION = 59;
+
const YY_ERROR_ACTION = 58;
const YY_SZ_ACTTAB = 38;
- static public $yy_action = array(
- /* 0 */
- 29, 30, 34, 33, 24, 13, 19, 25, 35, 21,
- /* 10 */
- 59, 8, 3, 1, 20, 12, 14, 31, 20, 12,
- /* 20 */
- 15, 17, 23, 18, 27, 26, 4, 5, 6, 32,
- /* 30 */
- 2, 11, 28, 22, 16, 9, 7, 10,
- );
- static public $yy_lookahead = array(
- /* 0 */
- 7, 8, 9, 10, 11, 12, 5, 27, 15, 16,
- /* 10 */
- 20, 21, 23, 23, 17, 18, 13, 14, 17, 18,
- /* 20 */
- 15, 2, 17, 4, 25, 26, 6, 3, 3, 14,
- /* 30 */
- 23, 1, 24, 17, 2, 25, 22, 25,
- );
+
+ static public $yy_action = array(29, 30, 34, 33, 24, 13, 19, 25, 35, 21, 59, 8, 3, 1, 20, 12, 14, 31, 20, 12, 15,
+ 17, 23, 18, 27, 26, 4, 5, 6, 32, 2, 11, 28, 22, 16, 9, 7, 10,);
+
+ static public $yy_lookahead = array(7, 8, 9, 10, 11, 12, 5, 27, 15, 16, 20, 21, 23, 23, 17, 18, 13, 14, 17, 18, 15,
+ 2, 17, 4, 25, 26, 6, 3, 3, 14, 23, 1, 24, 17, 2, 25, 22, 25,);
+
const YY_SHIFT_USE_DFLT = - 8;
+
const YY_SHIFT_MAX = 19;
- static public $yy_shift_ofst = array(
- /* 0 */
- - 8, 1, 1, 1, - 7, - 3, - 3, 30, - 8, - 8,
- /* 10 */
- - 8, 19, 5, 3, 15, 16, 24, 25, 32, 20,
- );
+
+ static public $yy_shift_ofst = array(- 8, 1, 1, 1, - 7, - 3, - 3, 30, - 8, - 8, - 8, 19, 5, 3, 15, 16, 24, 25, 32,
+ 20,);
+
const YY_REDUCE_USE_DFLT = - 21;
+
const YY_REDUCE_MAX = 10;
- static public $yy_reduce_ofst = array(
- /* 0 */
- - 10, - 1, - 1, - 1, - 20, 10, 12, 8, 14, 7,
- /* 10 */
- - 11,
- );
- static public $yyExpectedTokens = array(
- /* 0 */
- array(),
- /* 1 */
- array(5, 17, 18,),
- /* 2 */
- array(5, 17, 18,),
- /* 3 */
- array(5, 17, 18,),
- /* 4 */
- array(7, 8, 9, 10, 11, 12, 15, 16,),
- /* 5 */
- array(17, 18,),
- /* 6 */
- array(17, 18,),
- /* 7 */
- array(1,),
- /* 8 */
- array(),
- /* 9 */
- array(),
- /* 10 */
- array(),
- /* 11 */
- array(2, 4,),
- /* 12 */
- array(15, 17,),
- /* 13 */
- array(13, 14,),
- /* 14 */
- array(14,),
- /* 15 */
- array(17,),
- /* 16 */
- array(3,),
- /* 17 */
- array(3,),
- /* 18 */
- array(2,),
- /* 19 */
- array(6,),
- /* 20 */
- array(),
- /* 21 */
- array(),
- /* 22 */
- array(),
- /* 23 */
- array(),
- /* 24 */
- array(),
- /* 25 */
- array(),
- /* 26 */
- array(),
- /* 27 */
- array(),
- /* 28 */
- array(),
- /* 29 */
- array(),
- /* 30 */
- array(),
- /* 31 */
- array(),
- /* 32 */
- array(),
- /* 33 */
- array(),
- /* 34 */
- array(),
- /* 35 */
- array(),
- );
- static public $yy_default = array(
- /* 0 */
- 44, 37, 41, 40, 58, 58, 58, 36, 39, 44,
- /* 10 */
- 44, 58, 58, 58, 58, 58, 58, 58, 58, 58,
- /* 20 */
- 55, 54, 57, 56, 50, 45, 43, 42, 38, 46,
- /* 30 */
- 47, 52, 51, 49, 48, 53,
- );
+
+ static public $yy_reduce_ofst = array(- 10, - 1, - 1, - 1, - 20, 10, 12, 8, 14, 7, - 11,);
+
+ static public $yyExpectedTokens = array(array(), array(5, 17, 18,), array(5, 17, 18,), array(5, 17, 18,),
+ array(7, 8, 9, 10, 11, 12, 15, 16,), array(17, 18,), array(17, 18,), array(1,), array(), array(), array(),
+ array(2, 4,), array(15, 17,), array(13, 14,), array(14,), array(17,), array(3,), array(3,), array(2,),
+ array(6,), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(),
+ array(), array(), array(), array(), array(),);
+
+ static public $yy_default = array(44, 37, 41, 40, 58, 58, 58, 36, 39, 44, 44, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 55, 54, 57, 56, 50, 45, 43, 42, 38, 46, 47, 52, 51, 49, 48, 53,);
+
const YYNOCODE = 29;
+
const YYSTACKDEPTH = 100;
+
const YYNSTATE = 36;
+
const YYNRULE = 22;
+
const YYERRORSYMBOL = 19;
+
const YYERRSYMDT = 'yy0';
+
const YYFALLBACK = 0;
+
public static $yyFallback = array();
public function Trace($TraceFILE, $zTracePrompt)
@@ -363,67 +417,26 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
}
public $yyTraceFILE;
+
public $yyTracePrompt;
- public $yyidx; /* Index of top element in stack */
- public $yyerrcnt; /* Shifts left before out of the error */
- public $yystack = array(); /* The parser's stack */
-
- public $yyTokenName = array(
- '$', 'OPENB', 'SECTION', 'CLOSEB',
- 'DOT', 'ID', 'EQUAL', 'FLOAT',
- 'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING',
- 'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END', 'NAKED_STRING',
- 'OTHER', 'NEWLINE', 'COMMENTSTART', 'error',
- 'start', 'global_vars', 'sections', 'var_list',
- 'section', 'newline', 'var', 'value',
- );
-
- public static $yyRuleName = array(
- /* 0 */
- "start ::= global_vars sections",
- /* 1 */
- "global_vars ::= var_list",
- /* 2 */
- "sections ::= sections section",
- /* 3 */
- "sections ::=",
- /* 4 */
- "section ::= OPENB SECTION CLOSEB newline var_list",
- /* 5 */
- "section ::= OPENB DOT SECTION CLOSEB newline var_list",
- /* 6 */
- "var_list ::= var_list newline",
- /* 7 */
- "var_list ::= var_list var",
- /* 8 */
- "var_list ::=",
- /* 9 */
- "var ::= ID EQUAL value",
- /* 10 */
- "value ::= FLOAT",
- /* 11 */
- "value ::= INT",
- /* 12 */
- "value ::= BOOL",
- /* 13 */
- "value ::= SINGLE_QUOTED_STRING",
- /* 14 */
- "value ::= DOUBLE_QUOTED_STRING",
- /* 15 */
- "value ::= TRIPPLE_QUOTES TRIPPLE_TEXT TRIPPLE_QUOTES_END",
- /* 16 */
- "value ::= TRIPPLE_QUOTES TRIPPLE_QUOTES_END",
- /* 17 */
- "value ::= NAKED_STRING",
- /* 18 */
- "value ::= OTHER",
- /* 19 */
- "newline ::= NEWLINE",
- /* 20 */
- "newline ::= COMMENTSTART NEWLINE",
- /* 21 */
- "newline ::= COMMENTSTART NAKED_STRING NEWLINE",
- );
+
+ public $yyidx; /* Index of top element in stack */
+ public $yyerrcnt; /* Shifts left before out of the error */
+ public $yystack = array(); /* The parser's stack */
+
+ public $yyTokenName = array('$', 'OPENB', 'SECTION', 'CLOSEB', 'DOT', 'ID', 'EQUAL', 'FLOAT', 'INT', 'BOOL',
+ 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING', 'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END',
+ 'NAKED_STRING', 'OTHER', 'NEWLINE', 'COMMENTSTART', 'error', 'start', 'global_vars', 'sections', 'var_list',
+ 'section', 'newline', 'var', 'value',);
+
+ public static $yyRuleName = array('start ::= global_vars sections', 'global_vars ::= var_list',
+ 'sections ::= sections section', 'sections ::=', 'section ::= OPENB SECTION CLOSEB newline var_list',
+ 'section ::= OPENB DOT SECTION CLOSEB newline var_list', 'var_list ::= var_list newline',
+ 'var_list ::= var_list var', 'var_list ::=', 'var ::= ID EQUAL value', 'value ::= FLOAT', 'value ::= INT',
+ 'value ::= BOOL', 'value ::= SINGLE_QUOTED_STRING', 'value ::= DOUBLE_QUOTED_STRING',
+ 'value ::= TRIPPLE_QUOTES TRIPPLE_TEXT TRIPPLE_QUOTES_END', 'value ::= TRIPPLE_QUOTES TRIPPLE_QUOTES_END',
+ 'value ::= NAKED_STRING', 'value ::= OTHER', 'newline ::= NEWLINE', 'newline ::= COMMENTSTART NEWLINE',
+ 'newline ::= COMMENTSTART NAKED_STRING NEWLINE',);
public function tokenName($tokenType)
{
@@ -441,20 +454,18 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
{
switch ($yymajor) {
default:
- break; /* If no destructor action specified: do nothing */
+ break; /* If no destructor action specified: do nothing */
}
}
public function yy_pop_parser_stack()
{
- if (!count($this->yystack)) {
+ if (empty($this->yystack)) {
return;
}
$yytos = array_pop($this->yystack);
if ($this->yyTraceFILE && $this->yyidx >= 0) {
- fwrite($this->yyTraceFILE,
- $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
- "\n");
+ fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] . "\n");
}
$yymajor = $yytos->major;
self::yy_destructor($yymajor, $yytos->minor);
@@ -475,10 +486,18 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
public function yy_get_expected_tokens($token)
{
+ static $res3 = array();
+ static $res4 = array();
$state = $this->yystack[$this->yyidx]->stateno;
$expected = self::$yyExpectedTokens[$state];
- if (in_array($token, self::$yyExpectedTokens[$state], true)) {
- return $expected;
+ if (isset($res3[$state][$token])) {
+ if ($res3[$state][$token]) {
+ return $expected;
+ }
+ } else {
+ if ($res3[$state][$token] = in_array($token, self::$yyExpectedTokens[$state], true)) {
+ return $expected;
+ }
}
$stack = $this->yystack;
$yyidx = $this->yyidx;
@@ -496,18 +515,22 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
return array_unique($expected);
}
$yyruleno = $yyact - self::YYNSTATE;
- $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
- $nextstate = $this->yy_find_reduce_action(
- $this->yystack[$this->yyidx]->stateno,
- self::$yyRuleInfo[$yyruleno]['lhs']);
+ $this->yyidx -= self::$yyRuleInfo[$yyruleno][1];
+ $nextstate = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, self::$yyRuleInfo[$yyruleno][0]);
if (isset(self::$yyExpectedTokens[$nextstate])) {
$expected = array_merge($expected, self::$yyExpectedTokens[$nextstate]);
- if (in_array($token,
- self::$yyExpectedTokens[$nextstate], true)) {
- $this->yyidx = $yyidx;
- $this->yystack = $stack;
-
- return array_unique($expected);
+ if (isset($res4[$nextstate][$token])) {
+ if ($res4[$nextstate][$token]) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return array_unique($expected);
+ }
+ } else {
+ if ($res4[$nextstate][$token] = in_array($token, self::$yyExpectedTokens[$nextstate], true)) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return array_unique($expected);
+ }
}
}
if ($nextstate < self::YYNSTATE) {
@@ -515,7 +538,7 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
$this->yyidx ++;
$x = new TPC_yyStackEntry;
$x->stateno = $nextstate;
- $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
+ $x->major = self::$yyRuleInfo[$yyruleno][0];
$this->yystack[$this->yyidx] = $x;
continue 2;
} elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
@@ -545,12 +568,20 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
public function yy_is_expected_token($token)
{
+ static $res = array();
+ static $res2 = array();
if ($token === 0) {
return true; // 0 is not part of this
}
$state = $this->yystack[$this->yyidx]->stateno;
- if (in_array($token, self::$yyExpectedTokens[$state], true)) {
- return true;
+ if (isset($res[$state][$token])) {
+ if ($res[$state][$token]) {
+ return true;
+ }
+ } else {
+ if ($res[$state][$token] = in_array($token, self::$yyExpectedTokens[$state], true)) {
+ return true;
+ }
}
$stack = $this->yystack;
$yyidx = $this->yyidx;
@@ -568,24 +599,27 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
return true;
}
$yyruleno = $yyact - self::YYNSTATE;
- $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
- $nextstate = $this->yy_find_reduce_action(
- $this->yystack[$this->yyidx]->stateno,
- self::$yyRuleInfo[$yyruleno]['lhs']);
- if (isset(self::$yyExpectedTokens[$nextstate]) &&
- in_array($token, self::$yyExpectedTokens[$nextstate], true)
- ) {
- $this->yyidx = $yyidx;
- $this->yystack = $stack;
-
- return true;
+ $this->yyidx -= self::$yyRuleInfo[$yyruleno][1];
+ $nextstate = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, self::$yyRuleInfo[$yyruleno][0]);
+ if (isset($res2[$nextstate][$token])) {
+ if ($res2[$nextstate][$token]) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return true;
+ }
+ } else {
+ if ($res2[$nextstate][$token] = (isset(self::$yyExpectedTokens[$nextstate]) && in_array($token, self::$yyExpectedTokens[$nextstate], true))) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return true;
+ }
}
if ($nextstate < self::YYNSTATE) {
// we need to shift a non-terminal
$this->yyidx ++;
$x = new TPC_yyStackEntry;
$x->stateno = $nextstate;
- $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
+ $x->major = self::$yyRuleInfo[$yyruleno][0];
$this->yystack[$this->yyidx] = $x;
continue 2;
} elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
@@ -634,16 +668,10 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
return self::YY_NO_ACTION;
}
$i += $iLookAhead;
- if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
- self::$yy_lookahead[$i] != $iLookAhead
- ) {
- if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
- && ($iFallback = self::$yyFallback[$iLookAhead]) != 0
- ) {
+ if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[$i] != $iLookAhead) {
+ if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) && ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
if ($this->yyTraceFILE) {
- fwrite($this->yyTraceFILE, $this->yyTracePrompt . "FALLBACK " .
- $this->yyTokenName[$iLookAhead] . " => " .
- $this->yyTokenName[$iFallback] . "\n");
+ fwrite($this->yyTraceFILE, $this->yyTracePrompt . "FALLBACK " . $this->yyTokenName[$iLookAhead] . " => " . $this->yyTokenName[$iFallback] . "\n");
}
return $this->yy_find_shift_action($iFallback);
@@ -670,9 +698,7 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
return self::YY_NO_ACTION;
}
$i += $iLookAhead;
- if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
- self::$yy_lookahead[$i] != $iLookAhead
- ) {
+ if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[$i] != $iLookAhead) {
return self::$yy_default[$stateno];
} else {
return self::$yy_action[$i];
@@ -690,11 +716,10 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
while ($this->yyidx >= 0) {
$this->yy_pop_parser_stack();
}
- #line 125 "smarty_internal_configfileparser.y"
+ #line 255 "../smarty/lexer/smarty_internal_configfileparser.y"
$this->internalError = true;
$this->compiler->trigger_config_file_error("Stack overflow in configfile parser");
- #line 601 "smarty_internal_configfileparser.php"
return;
}
@@ -702,194 +727,147 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
$yytos->stateno = $yyNewState;
$yytos->major = $yyMajor;
$yytos->minor = $yypMinor;
- array_push($this->yystack, $yytos);
+ $this->yystack[] = $yytos;
if ($this->yyTraceFILE && $this->yyidx > 0) {
- fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt,
- $yyNewState);
+ fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt, $yyNewState);
fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt);
for ($i = 1; $i <= $this->yyidx; $i ++) {
- fprintf($this->yyTraceFILE, " %s",
- $this->yyTokenName[$this->yystack[$i]->major]);
+ fprintf($this->yyTraceFILE, " %s", $this->yyTokenName[$this->yystack[$i]->major]);
}
fwrite($this->yyTraceFILE, "\n");
}
}
- public static $yyRuleInfo = array(
- array('lhs' => 20, 'rhs' => 2),
- array('lhs' => 21, 'rhs' => 1),
- array('lhs' => 22, 'rhs' => 2),
- array('lhs' => 22, 'rhs' => 0),
- array('lhs' => 24, 'rhs' => 5),
- array('lhs' => 24, 'rhs' => 6),
- array('lhs' => 23, 'rhs' => 2),
- array('lhs' => 23, 'rhs' => 2),
- array('lhs' => 23, 'rhs' => 0),
- array('lhs' => 26, 'rhs' => 3),
- array('lhs' => 27, 'rhs' => 1),
- array('lhs' => 27, 'rhs' => 1),
- array('lhs' => 27, 'rhs' => 1),
- array('lhs' => 27, 'rhs' => 1),
- array('lhs' => 27, 'rhs' => 1),
- array('lhs' => 27, 'rhs' => 3),
- array('lhs' => 27, 'rhs' => 2),
- array('lhs' => 27, 'rhs' => 1),
- array('lhs' => 27, 'rhs' => 1),
- array('lhs' => 25, 'rhs' => 1),
- array('lhs' => 25, 'rhs' => 2),
- array('lhs' => 25, 'rhs' => 3),
- );
-
- public static $yyReduceMap = array(
- 0 => 0,
- 2 => 0,
- 3 => 0,
- 19 => 0,
- 20 => 0,
- 21 => 0,
- 1 => 1,
- 4 => 4,
- 5 => 5,
- 6 => 6,
- 7 => 7,
- 8 => 8,
- 9 => 9,
- 10 => 10,
- 11 => 11,
- 12 => 12,
- 13 => 13,
- 14 => 14,
- 15 => 15,
- 16 => 16,
- 17 => 17,
- 18 => 17,
- );
-
- #line 131 "smarty_internal_configfileparser.y"
+ public static $yyRuleInfo = array(array(0 => 20, 1 => 2), array(0 => 21, 1 => 1), array(0 => 22, 1 => 2),
+ array(0 => 22, 1 => 0), array(0 => 24, 1 => 5), array(0 => 24, 1 => 6), array(0 => 23, 1 => 2),
+ array(0 => 23, 1 => 2), array(0 => 23, 1 => 0), array(0 => 26, 1 => 3), array(0 => 27, 1 => 1),
+ array(0 => 27, 1 => 1), array(0 => 27, 1 => 1), array(0 => 27, 1 => 1), array(0 => 27, 1 => 1),
+ array(0 => 27, 1 => 3), array(0 => 27, 1 => 2), array(0 => 27, 1 => 1), array(0 => 27, 1 => 1),
+ array(0 => 25, 1 => 1), array(0 => 25, 1 => 2), array(0 => 25, 1 => 3),);
+
+ public static $yyReduceMap = array(0 => 0, 2 => 0, 3 => 0, 19 => 0, 20 => 0, 21 => 0, 1 => 1, 4 => 4, 5 => 5,
+ 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13,
+ 14 => 14, 15 => 15, 16 => 16, 17 => 17, 18 => 17,);
+
+ #line 261 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r0()
{
$this->_retvalue = null;
}
- #line 675 "smarty_internal_configfileparser.php"
- #line 136 "smarty_internal_configfileparser.y"
+
+ #line 266 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r1()
{
$this->add_global_vars($this->yystack[$this->yyidx + 0]->minor);
$this->_retvalue = null;
}
- #line 680 "smarty_internal_configfileparser.php"
- #line 149 "smarty_internal_configfileparser.y"
+
+ #line 280 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r4()
{
$this->add_section_vars($this->yystack[$this->yyidx + - 3]->minor, $this->yystack[$this->yyidx + 0]->minor);
$this->_retvalue = null;
}
- #line 686 "smarty_internal_configfileparser.php"
- #line 154 "smarty_internal_configfileparser.y"
+
+ #line 285 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r5()
{
- if ($this->smarty->config_read_hidden) {
+ if ($this->configReadHidden) {
$this->add_section_vars($this->yystack[$this->yyidx + - 3]->minor, $this->yystack[$this->yyidx + 0]->minor);
}
$this->_retvalue = null;
}
- #line 694 "smarty_internal_configfileparser.php"
- #line 162 "smarty_internal_configfileparser.y"
+
+ #line 293 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r6()
{
$this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor;
}
- #line 699 "smarty_internal_configfileparser.php"
- #line 166 "smarty_internal_configfileparser.y"
+
+ #line 297 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r7()
{
$this->_retvalue = array_merge($this->yystack[$this->yyidx + - 1]->minor, Array($this->yystack[$this->yyidx + 0]->minor));
}
- #line 704 "smarty_internal_configfileparser.php"
- #line 170 "smarty_internal_configfileparser.y"
+
+ #line 301 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r8()
{
$this->_retvalue = Array();
}
- #line 709 "smarty_internal_configfileparser.php"
- #line 176 "smarty_internal_configfileparser.y"
+
+ #line 307 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r9()
{
- $this->_retvalue = Array("key" => $this->yystack[$this->yyidx + - 2]->minor, "value" => $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = Array("key" => $this->yystack[$this->yyidx + - 2]->minor,
+ "value" => $this->yystack[$this->yyidx + 0]->minor);
}
- #line 714 "smarty_internal_configfileparser.php"
- #line 181 "smarty_internal_configfileparser.y"
+
+ #line 312 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r10()
{
$this->_retvalue = (float) $this->yystack[$this->yyidx + 0]->minor;
}
- #line 719 "smarty_internal_configfileparser.php"
- #line 185 "smarty_internal_configfileparser.y"
+
+ #line 316 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r11()
{
$this->_retvalue = (int) $this->yystack[$this->yyidx + 0]->minor;
}
- #line 724 "smarty_internal_configfileparser.php"
- #line 189 "smarty_internal_configfileparser.y"
+
+ #line 320 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r12()
{
$this->_retvalue = $this->parse_bool($this->yystack[$this->yyidx + 0]->minor);
}
- #line 729 "smarty_internal_configfileparser.php"
- #line 193 "smarty_internal_configfileparser.y"
+
+ #line 324 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r13()
{
$this->_retvalue = self::parse_single_quoted_string($this->yystack[$this->yyidx + 0]->minor);
}
- #line 734 "smarty_internal_configfileparser.php"
- #line 197 "smarty_internal_configfileparser.y"
+
+ #line 328 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r14()
{
$this->_retvalue = self::parse_double_quoted_string($this->yystack[$this->yyidx + 0]->minor);
}
- #line 739 "smarty_internal_configfileparser.php"
- #line 201 "smarty_internal_configfileparser.y"
+
+ #line 332 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r15()
{
$this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[$this->yyidx + - 1]->minor);
}
- #line 744 "smarty_internal_configfileparser.php"
- #line 205 "smarty_internal_configfileparser.y"
+
+ #line 336 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r16()
{
$this->_retvalue = '';
}
- #line 749 "smarty_internal_configfileparser.php"
- #line 209 "smarty_internal_configfileparser.y"
+
+ #line 340 "../smarty/lexer/smarty_internal_configfileparser.y"
function yy_r17()
{
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
}
- #line 754 "smarty_internal_configfileparser.php"
-
private $_retvalue;
public function yy_reduce($yyruleno)
{
- $yymsp = $this->yystack[$this->yyidx];
- if ($this->yyTraceFILE && $yyruleno >= 0
- && $yyruleno < count(self::$yyRuleName)
- ) {
- fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n",
- $this->yyTracePrompt, $yyruleno,
- self::$yyRuleName[$yyruleno]);
+ if ($this->yyTraceFILE && $yyruleno >= 0 && $yyruleno < count(self::$yyRuleName)) {
+ fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n", $this->yyTracePrompt, $yyruleno, self::$yyRuleName[$yyruleno]);
}
$this->_retvalue = $yy_lefthand_side = null;
- if (array_key_exists($yyruleno, self::$yyReduceMap)) {
+ if (isset(self::$yyReduceMap[$yyruleno])) {
// call the action
$this->_retvalue = null;
$this->{'yy_r' . self::$yyReduceMap[$yyruleno]}();
$yy_lefthand_side = $this->_retvalue;
}
- $yygoto = self::$yyRuleInfo[$yyruleno]['lhs'];
- $yysize = self::$yyRuleInfo[$yyruleno]['rhs'];
+ $yygoto = self::$yyRuleInfo[$yyruleno][0];
+ $yysize = self::$yyRuleInfo[$yyruleno][1];
$this->yyidx -= $yysize;
for ($i = $yysize; $i; $i --) {
// pop all of the right-hand side parameters
@@ -924,12 +902,11 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
public function yy_syntax_error($yymajor, $TOKEN)
{
- #line 118 "smarty_internal_configfileparser.y"
+ #line 248 "../smarty/lexer/smarty_internal_configfileparser.y"
$this->internalError = true;
$this->yymajor = $yymajor;
$this->compiler->trigger_config_file_error();
- #line 816 "smarty_internal_configfileparser.php"
}
public function yy_accept()
@@ -938,20 +915,18 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt);
}
while ($this->yyidx >= 0) {
- $stack = $this->yy_pop_parser_stack();
+ $this->yy_pop_parser_stack();
}
- #line 110 "smarty_internal_configfileparser.y"
+ #line 241 "../smarty/lexer/smarty_internal_configfileparser.y"
$this->successful = !$this->internalError;
$this->internalError = false;
$this->retvalue = $this->_retvalue;
- //echo $this->retvalue."\n\n";
- #line 833 "smarty_internal_configfileparser.php"
}
public function doParse($yymajor, $yytokenvalue)
{
- $yyerrorhit = 0; /* True if yymajor has invoked an error */
+ $yyerrorhit = 0; /* True if yymajor has invoked an error */
if ($this->yyidx === null || $this->yyidx < 0) {
$this->yyidx = 0;
@@ -960,20 +935,17 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
$x->stateno = 0;
$x->major = 0;
$this->yystack = array();
- array_push($this->yystack, $x);
+ $this->yystack[] = $x;
}
$yyendofinput = ($yymajor == 0);
if ($this->yyTraceFILE) {
- fprintf($this->yyTraceFILE, "%sInput %s\n",
- $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
+ fprintf($this->yyTraceFILE, "%sInput %s\n", $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
}
do {
$yyact = $this->yy_find_shift_action($yymajor);
- if ($yymajor < self::YYERRORSYMBOL &&
- !$this->yy_is_expected_token($yymajor)
- ) {
+ if ($yymajor < self::YYERRORSYMBOL && !$this->yy_is_expected_token($yymajor)) {
// force a syntax error
$yyact = self::YY_ERROR_ACTION;
}
@@ -989,8 +961,7 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
$this->yy_reduce($yyact - self::YYNSTATE);
} elseif ($yyact == self::YY_ERROR_ACTION) {
if ($this->yyTraceFILE) {
- fprintf($this->yyTraceFILE, "%sSyntax Error!\n",
- $this->yyTracePrompt);
+ fprintf($this->yyTraceFILE, "%sSyntax Error!\n", $this->yyTracePrompt);
}
if (self::YYERRORSYMBOL) {
if ($this->yyerrcnt < 0) {
@@ -999,16 +970,12 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
$yymx = $this->yystack[$this->yyidx]->major;
if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) {
if ($this->yyTraceFILE) {
- fprintf($this->yyTraceFILE, "%sDiscard input token %s\n",
- $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
+ fprintf($this->yyTraceFILE, "%sDiscard input token %s\n", $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
}
$this->yy_destructor($yymajor, $yytokenvalue);
$yymajor = self::YYNOCODE;
} else {
- while ($this->yyidx >= 0 &&
- $yymx != self::YYERRORSYMBOL &&
- ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE
- ) {
+ while ($this->yyidx >= 0 && $yymx != self::YYERRORSYMBOL && ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE) {
$this->yy_pop_parser_stack();
}
if ($this->yyidx < 0 || $yymajor == 0) {
@@ -1040,3 +1007,4 @@ class Smarty_Internal_Configfileparser #line 80 "smarty_internal_configfileparse
} while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
}
}
+
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_data.php b/library/Smarty/libs/sysplugins/smarty_internal_data.php
index 9e16f10c0..2ca0f31da 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_data.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_data.php
@@ -55,12 +55,12 @@ class Smarty_Internal_Data
if (is_array($tpl_var)) {
foreach ($tpl_var as $_key => $_val) {
if ($_key != '') {
- $this->tpl_vars[$_key] = new Smarty_variable($_val, $nocache);
+ $this->tpl_vars[$_key] = new Smarty_Variable($_val, $nocache);
}
}
} else {
if ($tpl_var != '') {
- $this->tpl_vars[$tpl_var] = new Smarty_variable($value, $nocache);
+ $this->tpl_vars[$tpl_var] = new Smarty_Variable($value, $nocache);
}
}
@@ -79,7 +79,7 @@ class Smarty_Internal_Data
public function assignGlobal($varname, $value = null, $nocache = false)
{
if ($varname != '') {
- Smarty::$global_tpl_vars[$varname] = new Smarty_variable($value, $nocache);
+ Smarty::$global_tpl_vars[$varname] = new Smarty_Variable($value, $nocache);
$ptr = $this;
while ($ptr instanceof Smarty_Internal_Template) {
$ptr->tpl_vars[$varname] = clone Smarty::$global_tpl_vars[$varname];
@@ -102,8 +102,8 @@ class Smarty_Internal_Data
public function assignByRef($tpl_var, &$value, $nocache = false)
{
if ($tpl_var != '') {
- $this->tpl_vars[$tpl_var] = new Smarty_variable(null, $nocache);
- $this->tpl_vars[$tpl_var]->value = & $value;
+ $this->tpl_vars[$tpl_var] = new Smarty_Variable(null, $nocache);
+ $this->tpl_vars[$tpl_var]->value = &$value;
}
return $this;
@@ -127,8 +127,8 @@ class Smarty_Internal_Data
if ($_key != '') {
if (!isset($this->tpl_vars[$_key])) {
$tpl_var_inst = $this->getVariable($_key, null, true, false);
- if ($tpl_var_inst instanceof Undefined_Smarty_Variable) {
- $this->tpl_vars[$_key] = new Smarty_variable(null, $nocache);
+ if ($tpl_var_inst instanceof Smarty_Undefined_Variable) {
+ $this->tpl_vars[$_key] = new Smarty_Variable(null, $nocache);
} else {
$this->tpl_vars[$_key] = clone $tpl_var_inst;
}
@@ -149,8 +149,8 @@ class Smarty_Internal_Data
if ($tpl_var != '' && isset($value)) {
if (!isset($this->tpl_vars[$tpl_var])) {
$tpl_var_inst = $this->getVariable($tpl_var, null, true, false);
- if ($tpl_var_inst instanceof Undefined_Smarty_Variable) {
- $this->tpl_vars[$tpl_var] = new Smarty_variable(null, $nocache);
+ if ($tpl_var_inst instanceof Smarty_Undefined_Variable) {
+ $this->tpl_vars[$tpl_var] = new Smarty_Variable(null, $nocache);
} else {
$this->tpl_vars[$tpl_var] = clone $tpl_var_inst;
}
@@ -184,17 +184,17 @@ class Smarty_Internal_Data
{
if ($tpl_var != '' && isset($value)) {
if (!isset($this->tpl_vars[$tpl_var])) {
- $this->tpl_vars[$tpl_var] = new Smarty_variable();
+ $this->tpl_vars[$tpl_var] = new Smarty_Variable();
}
if (!is_array($this->tpl_vars[$tpl_var]->value)) {
settype($this->tpl_vars[$tpl_var]->value, 'array');
}
if ($merge && is_array($value)) {
foreach ($value as $_key => $_val) {
- $this->tpl_vars[$tpl_var]->value[$_key] = & $value[$_key];
+ $this->tpl_vars[$tpl_var]->value[$_key] = &$value[$_key];
}
} else {
- $this->tpl_vars[$tpl_var]->value[] = & $value;
+ $this->tpl_vars[$tpl_var]->value[] = &$value;
}
}
@@ -205,7 +205,7 @@ class Smarty_Internal_Data
* Returns a single or all template variables
*
* @param string $varname variable name or null
- * @param object $_ptr optional pointer to data object
+ * @param object $_ptr optional pointer to data object
* @param boolean $search_parents include parent templates?
*
* @return string variable value or or array of variables
@@ -292,9 +292,7 @@ class Smarty_Internal_Data
public function configLoad($config_file, $sections = null)
{
// load Config class
- $config = new Smarty_Internal_Config($config_file, $this->smarty, $this);
- $config->loadConfigVars($sections);
-
+ Smarty_Internal_Extension_Config::configLoad($this, $config_file, $sections);
return $this;
}
@@ -329,12 +327,13 @@ class Smarty_Internal_Data
// found it, return it
return Smarty::$global_tpl_vars[$variable];
}
- if ($this->smarty->error_unassigned && $error_enable) {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if ($smarty->error_unassigned && $error_enable) {
// force a notice
$x = $$variable;
}
- return new Undefined_Smarty_Variable;
+ return new Smarty_Undefined_Variable;
}
/**
@@ -347,49 +346,7 @@ class Smarty_Internal_Data
*/
public function getConfigVariable($variable, $error_enable = true)
{
- $_ptr = $this;
- while ($_ptr !== null) {
- if (isset($_ptr->config_vars[$variable])) {
- // found it, return it
- return $_ptr->config_vars[$variable];
- }
- // not found, try at parent
- $_ptr = $_ptr->parent;
- }
- if ($this->smarty->error_unassigned && $error_enable) {
- // force a notice
- $x = $$variable;
- }
-
- return null;
- }
-
- /**
- * gets a stream variable
- *
- * @param string $variable the stream of the variable
- *
- * @throws SmartyException
- * @return mixed the value of the stream variable
- */
- public function getStreamVariable($variable)
- {
- $_result = '';
- $fp = fopen($variable, 'r+');
- if ($fp) {
- while (!feof($fp) && ($current_line = fgets($fp)) !== false) {
- $_result .= $current_line;
- }
- fclose($fp);
-
- return $_result;
- }
-
- if ($this->smarty->error_unassigned) {
- throw new SmartyException('Undefined stream variable "' . $variable . '"');
- } else {
- return null;
- }
+ return Smarty_Internal_Extension_Config::getConfigVariable($this, $variable, $error_enable = true);
}
/**
@@ -402,28 +359,7 @@ class Smarty_Internal_Data
*/
public function getConfigVars($varname = null, $search_parents = true)
{
- $_ptr = $this;
- $var_array = array();
- while ($_ptr !== null) {
- if (isset($varname)) {
- if (isset($_ptr->config_vars[$varname])) {
- return $_ptr->config_vars[$varname];
- }
- } else {
- $var_array = array_merge($_ptr->config_vars, $var_array);
- }
- // not found, try at parent
- if ($search_parents) {
- $_ptr = $_ptr->parent;
- } else {
- $_ptr = null;
- }
- }
- if (isset($varname)) {
- return '';
- } else {
- return $var_array;
- }
+ return Smarty_Internal_Extension_Config::getConfigVars($this, $varname, $search_parents);
}
/**
@@ -435,142 +371,34 @@ class Smarty_Internal_Data
*/
public function clearConfig($varname = null)
{
- if (isset($varname)) {
- unset($this->config_vars[$varname]);
- } else {
- $this->config_vars = array();
- }
-
- return $this;
+ return Smarty_Internal_Extension_Config::clearConfig($this, $varname);
}
-}
-
-/**
- * class for the Smarty data object
- * The Smarty data object will hold Smarty variables in the current scope
- *
- * @package Smarty
- * @subpackage Template
- */
-class Smarty_Data extends Smarty_Internal_Data
-{
- /**
- * Smarty object
- *
- * @var Smarty
- */
- public $smarty = null;
/**
- * create Smarty data object
+ * gets a stream variable
*
- * @param Smarty|array $_parent parent template
- * @param Smarty|Smarty_Internal_Template $smarty global smarty instance
+ * @param string $variable the stream of the variable
*
* @throws SmartyException
+ * @return mixed the value of the stream variable
*/
- public function __construct($_parent = null, $smarty = null)
+ public function getStreamVariable($variable)
{
- $this->smarty = $smarty;
- if (is_object($_parent)) {
- // when object set up back pointer
- $this->parent = $_parent;
- } elseif (is_array($_parent)) {
- // set up variable values
- foreach ($_parent as $_key => $_val) {
- $this->tpl_vars[$_key] = new Smarty_variable($_val);
+ $_result = '';
+ $fp = fopen($variable, 'r+');
+ if ($fp) {
+ while (!feof($fp) && ($current_line = fgets($fp)) !== false) {
+ $_result .= $current_line;
}
- } elseif ($_parent != null) {
- throw new SmartyException("Wrong type for template variables");
- }
- }
-}
-
-/**
- * class for the Smarty variable object
- * This class defines the Smarty variable object
- *
- * @package Smarty
- * @subpackage Template
- */
-class Smarty_Variable
-{
- /**
- * template variable
- *
- * @var mixed
- */
- public $value = null;
- /**
- * if true any output of this variable will be not cached
- *
- * @var boolean
- */
- public $nocache = false;
- /**
- * the scope the variable will have (local,parent or root)
- *
- * @var int
- */
- public $scope = Smarty::SCOPE_LOCAL;
-
- /**
- * create Smarty variable object
- *
- * @param mixed $value the value to assign
- * @param boolean $nocache if true any output of this variable will be not cached
- * @param int $scope the scope the variable will have (local,parent or root)
- */
- public function __construct($value = null, $nocache = false, $scope = Smarty::SCOPE_LOCAL)
- {
- $this->value = $value;
- $this->nocache = $nocache;
- $this->scope = $scope;
- }
-
- /**
- * <<magic>> String conversion
- *
- * @return string
- */
- public function __toString()
- {
- return (string) $this->value;
- }
-}
+ fclose($fp);
-/**
- * class for undefined variable object
- * This class defines an object for undefined variable handling
- *
- * @package Smarty
- * @subpackage Template
- */
-class Undefined_Smarty_Variable
-{
- /**
- * Returns FALSE for 'nocache' and NULL otherwise.
- *
- * @param string $name
- *
- * @return bool
- */
- public function __get($name)
- {
- if ($name == 'nocache') {
- return false;
+ return $_result;
+ }
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if ($smarty->error_unassigned) {
+ throw new SmartyException('Undefined stream variable "' . $variable . '"');
} else {
return null;
}
}
-
- /**
- * Always returns an empty string.
- *
- * @return string
- */
- public function __toString()
- {
- return "";
- }
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_debug.php b/library/Smarty/libs/sysplugins/smarty_internal_debug.php
index e5175d51d..89eb9f3ab 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_debug.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_debug.php
@@ -1,7 +1,7 @@
<?php
/**
* Smarty Internal Plugin Debug
- * Class to collect data for the Smarty Debugging Consol
+ * Class to collect data for the Smarty Debugging Console
*
* @package Smarty
* @subpackage Debug
@@ -31,38 +31,67 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data
public static $ignore_uid = array();
/**
- * Ignore template
+ * Index of display() and fetch() calls
+ *
+ * @var int
+ */
+ public static $index = 0;
+
+ /**
+ * Counter for window offset
*
- * @param object $template
+ * @var int
*/
- public static function ignore($template)
+ public static $offset = 0;
+
+ /**
+ * Start logging template
+ *
+ * @param \Smarty_Internal_Template $template template
+ * @param null $mode true: display false: fetch null: subtemolate
+ */
+ public static function start_template(Smarty_Internal_Template $template, $mode = null)
{
- // calculate Uid if not already done
- if ($template->source->uid == '') {
- $template->source->filepath;
+ if (isset($mode)) {
+ self::$index ++;
+ self::$offset ++;
+ self::$template_data[self::$index] = null;
}
- self::$ignore_uid[$template->source->uid] = true;
+ $key = self::get_key($template);
+ self::$template_data[self::$index][$key]['start_template_time'] = microtime(true);
+ }
+
+ /**
+ * End logging of cache time
+ *
+ * @param \Smarty_Internal_Template $template cached template
+ */
+ public static function end_template(Smarty_Internal_Template $template)
+ {
+ $key = self::get_key($template);
+ self::$template_data[self::$index][$key]['total_time'] += microtime(true) - self::$template_data[self::$index][$key]['start_template_time'];
+ self::$template_data[self::$index][$key]['properties'] = $template->properties;
}
/**
* Start logging of compile time
*
- * @param object $template
+ * @param \Smarty_Internal_Template $template
*/
- public static function start_compile($template)
+ public static function start_compile(Smarty_Internal_Template $template)
{
static $_is_stringy = array('string' => true, 'eval' => true);
if (!empty($template->compiler->trace_uid)) {
$key = $template->compiler->trace_uid;
- if (!isset(self::$template_data[$key])) {
+ if (!isset(self::$template_data[self::$index][$key])) {
if (isset($_is_stringy[$template->source->type])) {
- self::$template_data[$key]['name'] = '\'' . substr($template->source->name, 0, 25) . '...\'';
+ self::$template_data[self::$index][$key]['name'] = '\'' . substr($template->source->name, 0, 25) . '...\'';
} else {
- self::$template_data[$key]['name'] = $template->source->filepath;
+ self::$template_data[self::$index][$key]['name'] = $template->source->filepath;
}
- self::$template_data[$key]['compile_time'] = 0;
- self::$template_data[$key]['render_time'] = 0;
- self::$template_data[$key]['cache_time'] = 0;
+ self::$template_data[self::$index][$key]['compile_time'] = 0;
+ self::$template_data[self::$index][$key]['render_time'] = 0;
+ self::$template_data[self::$index][$key]['cache_time'] = 0;
}
} else {
if (isset(self::$ignore_uid[$template->source->uid])) {
@@ -70,15 +99,15 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data
}
$key = self::get_key($template);
}
- self::$template_data[$key]['start_time'] = microtime(true);
+ self::$template_data[self::$index][$key]['start_time'] = microtime(true);
}
/**
* End logging of compile time
*
- * @param object $template
+ * @param \Smarty_Internal_Template $template
*/
- public static function end_compile($template)
+ public static function end_compile(Smarty_Internal_Template $template)
{
if (!empty($template->compiler->trace_uid)) {
$key = $template->compiler->trace_uid;
@@ -89,97 +118,143 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data
$key = self::get_key($template);
}
- self::$template_data[$key]['compile_time'] += microtime(true) - self::$template_data[$key]['start_time'];
+ self::$template_data[self::$index][$key]['compile_time'] += microtime(true) - self::$template_data[self::$index][$key]['start_time'];
}
/**
* Start logging of render time
*
- * @param object $template
+ * @param \Smarty_Internal_Template $template
*/
- public static function start_render($template)
+ public static function start_render(Smarty_Internal_Template $template)
{
$key = self::get_key($template);
- self::$template_data[$key]['start_time'] = microtime(true);
+ self::$template_data[self::$index][$key]['start_time'] = microtime(true);
}
/**
* End logging of compile time
*
- * @param object $template
+ * @param \Smarty_Internal_Template $template
*/
- public static function end_render($template)
+ public static function end_render(Smarty_Internal_Template $template)
{
$key = self::get_key($template);
- self::$template_data[$key]['render_time'] += microtime(true) - self::$template_data[$key]['start_time'];
+ self::$template_data[self::$index][$key]['render_time'] += microtime(true) - self::$template_data[self::$index][$key]['start_time'];
}
/**
* Start logging of cache time
*
- * @param object $template cached template
+ * @param \Smarty_Internal_Template $template cached template
*/
- public static function start_cache($template)
+ public static function start_cache(Smarty_Internal_Template $template)
{
$key = self::get_key($template);
- self::$template_data[$key]['start_time'] = microtime(true);
+ self::$template_data[self::$index][$key]['start_time'] = microtime(true);
}
/**
* End logging of cache time
*
- * @param object $template cached template
+ * @param \Smarty_Internal_Template $template cached template
*/
- public static function end_cache($template)
+ public static function end_cache(Smarty_Internal_Template $template)
{
$key = self::get_key($template);
- self::$template_data[$key]['cache_time'] += microtime(true) - self::$template_data[$key]['start_time'];
+ self::$template_data[self::$index][$key]['cache_time'] += microtime(true) - self::$template_data[self::$index][$key]['start_time'];
+ }
+
+ /**
+ * Register template object
+ *
+ * @param \Smarty_Internal_Template $template cached template
+ */
+ public static function register_template(Smarty_Internal_Template $template)
+ {
+ }
+
+ /**
+ * Register data object
+ *
+ * @param \Smarty_Data $data data object
+ */
+ public static function register_data(Smarty_Data $data)
+ {
}
/**
- * Opens a window for the Smarty Debugging Consol and display the data
+ * Opens a window for the Smarty Debugging Console and display the data
*
* @param Smarty_Internal_Template|Smarty $obj object to debug
+ * @param bool $full
*/
- public static function display_debug($obj)
+ public static function display_debug($obj, $full = false)
{
- // prepare information of assigned variables
- $ptr = self::get_debug_vars($obj);
+ if (!$full) {
+ self::$offset ++;
+ $savedIndex = self::$index;
+ self::$index = 9999;
+ }
if ($obj instanceof Smarty) {
- $smarty = clone $obj;
+ $smarty = $obj;
} else {
- $smarty = clone $obj->smarty;
+ $smarty = $obj->smarty;
}
+ // create fresh instance of smarty for displaying the debug console
+ // to avoid problems if the application did overload the Smarty class
+ $debObj = new Smarty();
+ // copy the working dirs from application
+ $debObj->setCompileDir($smarty->getCompileDir());
+ // init properties by hand as user may have edited the original Smarty class
+ $debObj->setPluginsDir(is_dir(__DIR__ . '/../plugins') ? __DIR__ . '/../plugins' : $smarty->getPluginsDir());
+ $debObj->force_compile = false;
+ $debObj->compile_check = true;
+ $debObj->left_delimiter = '{';
+ $debObj->right_delimiter = '}';
+ $debObj->security_policy = null;
+ $debObj->debugging = false;
+ $debObj->debugging_ctrl = 'NONE';
+ $debObj->error_reporting = E_ALL & ~E_NOTICE;
+ $debObj->debug_tpl = isset($smarty->debug_tpl) ? $smarty->debug_tpl : 'file:' . __DIR__ . '/../debug.tpl';
+ $debObj->registered_plugins = array();
+ $debObj->registered_resources = array();
+ $debObj->registered_filters = array();
+ $debObj->autoload_filters = array();
+ $debObj->default_modifiers = array();
+ $debObj->escape_html = true;
+ $debObj->caching = false;
+ $debObj->compile_id = null;
+ $debObj->cache_id = null;
+ // prepare information of assigned variables
+ $ptr = self::get_debug_vars($obj);
$_assigned_vars = $ptr->tpl_vars;
ksort($_assigned_vars);
$_config_vars = $ptr->config_vars;
ksort($_config_vars);
- $smarty->registered_filters = array();
- $smarty->autoload_filters = array();
- $smarty->default_modifiers = array();
- $smarty->force_compile = false;
- $smarty->left_delimiter = '{';
- $smarty->right_delimiter = '}';
- $smarty->debugging = false;
- $smarty->debugging_ctrl = 'NONE';
- $smarty->force_compile = false;
- $_template = new Smarty_Internal_Template($smarty->debug_tpl, $smarty);
- $_template->caching = false;
- $_template->disableSecurity();
- $_template->cache_id = null;
- $_template->compile_id = null;
+ $debugging = $smarty->debugging;
+
+ $_template = new Smarty_Internal_Template($debObj->debug_tpl, $debObj);
if ($obj instanceof Smarty_Internal_Template) {
$_template->assign('template_name', $obj->source->type . ':' . $obj->source->name);
}
- if ($obj instanceof Smarty) {
- $_template->assign('template_data', self::$template_data);
+ if ($obj instanceof Smarty || $full) {
+ $_template->assign('template_data', self::$template_data[self::$index]);
} else {
$_template->assign('template_data', null);
}
$_template->assign('assigned_vars', $_assigned_vars);
$_template->assign('config_vars', $_config_vars);
$_template->assign('execution_time', microtime(true) - $smarty->start_time);
+ $_template->assign('display_mode', $debugging == 2 || !$full);
+ $_template->assign('offset', self::$offset * 50);
echo $_template->fetch();
+ if (isset($full)) {
+ self::$index --;
+ }
+ if (!$full) {
+ self::$index = $savedIndex;
+ }
}
/**
@@ -191,29 +266,77 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data
*/
public static function get_debug_vars($obj)
{
- $config_vars = $obj->config_vars;
+ $config_vars = array();
+ foreach ($obj->config_vars as $key => $var) {
+ $config_vars[$key]['value'] = $var;
+ if ($obj instanceof Smarty_Internal_Template) {
+ $config_vars[$key]['scope'] = $obj->source->type . ':' . $obj->source->name;
+ } elseif ($obj instanceof Smarty_Data) {
+ $tpl_vars[$key]['scope'] = $obj->dataObjectName;
+ } else {
+ $config_vars[$key]['scope'] = 'Smarty object';
+ }
+ }
$tpl_vars = array();
foreach ($obj->tpl_vars as $key => $var) {
- $tpl_vars[$key] = clone $var;
+ foreach ($var as $varkey => $varvalue) {
+ if ($varkey == 'value') {
+ $tpl_vars[$key][$varkey] = $varvalue;
+ } else {
+ if ($varkey == 'nocache') {
+ if ($varvalue == true) {
+ $tpl_vars[$key][$varkey] = $varvalue;
+ }
+ } else {
+ if ($varkey != 'scope' || $varvalue !== 0) {
+ $tpl_vars[$key]['attributes'][$varkey] = $varvalue;
+ }
+ }
+ }
+ }
if ($obj instanceof Smarty_Internal_Template) {
- $tpl_vars[$key]->scope = $obj->source->type . ':' . $obj->source->name;
+ $tpl_vars[$key]['scope'] = $obj->source->type . ':' . $obj->source->name;
} elseif ($obj instanceof Smarty_Data) {
- $tpl_vars[$key]->scope = 'Data object';
+ $tpl_vars[$key]['scope'] = $obj->dataObjectName;
} else {
- $tpl_vars[$key]->scope = 'Smarty root';
+ $tpl_vars[$key]['scope'] = 'Smarty object';
}
}
if (isset($obj->parent)) {
$parent = self::get_debug_vars($obj->parent);
+ foreach ($parent->tpl_vars as $name => $pvar) {
+ if (isset($tpl_vars[$name]) && $tpl_vars[$name]['value'] === $pvar['value']) {
+ $tpl_vars[$name]['scope'] = $pvar['scope'];
+ }
+ }
$tpl_vars = array_merge($parent->tpl_vars, $tpl_vars);
+
+ foreach ($parent->config_vars as $name => $pvar) {
+ if (isset($config_vars[$name]) && $config_vars[$name]['value'] === $pvar['value']) {
+ $config_vars[$name]['scope'] = $pvar['scope'];
+ }
+ }
$config_vars = array_merge($parent->config_vars, $config_vars);
} else {
- foreach (Smarty::$global_tpl_vars as $name => $var) {
- if (!array_key_exists($name, $tpl_vars)) {
- $clone = clone $var;
- $clone->scope = 'Global';
- $tpl_vars[$name] = $clone;
+ foreach (Smarty::$global_tpl_vars as $key => $var) {
+ if (!array_key_exists($key, $tpl_vars)) {
+ foreach ($var as $varkey => $varvalue) {
+ if ($varkey == 'value') {
+ $tpl_vars[$key][$varkey] = $varvalue;
+ } else {
+ if ($varkey == 'nocache') {
+ if ($varvalue == true) {
+ $tpl_vars[$key][$varkey] = $varvalue;
+ }
+ } else {
+ if ($varkey != 'scope' || $varvalue !== 0) {
+ $tpl_vars[$key]['attributes'][$varkey] = $varvalue;
+ }
+ }
+ }
+ }
+ $tpl_vars[$key]['scope'] = 'Global';
}
}
}
@@ -224,11 +347,11 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data
/**
* Return key into $template_data for template
*
- * @param object $template template object
+ * @param \Smarty_Internal_Template $template template object
*
* @return string key into $template_data
*/
- private static function get_key($template)
+ private static function get_key(Smarty_Internal_Template $template)
{
static $_is_stringy = array('string' => true, 'eval' => true);
// calculate Uid if not already done
@@ -236,19 +359,66 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data
$template->source->filepath;
}
$key = $template->source->uid;
- if (isset(self::$template_data[$key])) {
+ if (isset(self::$template_data[self::$index][$key])) {
return $key;
} else {
if (isset($_is_stringy[$template->source->type])) {
- self::$template_data[$key]['name'] = '\'' . substr($template->source->name, 0, 25) . '...\'';
+ self::$template_data[self::$index][$key]['name'] = '\'' . substr($template->source->name, 0, 25) . '...\'';
} else {
- self::$template_data[$key]['name'] = $template->source->filepath;
+ self::$template_data[self::$index][$key]['name'] = $template->source->filepath;
}
- self::$template_data[$key]['compile_time'] = 0;
- self::$template_data[$key]['render_time'] = 0;
- self::$template_data[$key]['cache_time'] = 0;
+ self::$template_data[self::$index][$key]['compile_time'] = 0;
+ self::$template_data[self::$index][$key]['render_time'] = 0;
+ self::$template_data[self::$index][$key]['cache_time'] = 0;
+ self::$template_data[self::$index][$key]['total_time'] = 0;
return $key;
}
}
+
+ /**
+ * Ignore template
+ *
+ * @param \Smarty_Internal_Template $template
+ */
+ public static function ignore(Smarty_Internal_Template $template)
+ {
+ // calculate Uid if not already done
+ if ($template->source->uid == '') {
+ $template->source->filepath;
+ }
+ self::$ignore_uid[$template->source->uid] = true;
+ }
+
+ /**
+ * handle 'URL' debugging mode
+ *
+ * @param Smarty_Internal_Template $_template
+ */
+ public static function debugUrl(Smarty_Internal_Template $_template)
+ {
+ if (isset($_SERVER['QUERY_STRING'])) {
+ $_query_string = $_SERVER['QUERY_STRING'];
+ } else {
+ $_query_string = '';
+ }
+ if (false !== strpos($_query_string, $_template->smarty->smarty_debug_id)) {
+ if (false !== strpos($_query_string, $_template->smarty->smarty_debug_id . '=on')) {
+ // enable debugging for this browser session
+ setcookie('SMARTY_DEBUG', true);
+ $_template->smarty->debugging = true;
+ } elseif (false !== strpos($_query_string, $_template->smarty->smarty_debug_id . '=off')) {
+ // disable debugging for this browser session
+ setcookie('SMARTY_DEBUG', false);
+ $_template->smarty->debugging = false;
+ } else {
+ // enable debugging for this page
+ $_template->smarty->debugging = true;
+ }
+ } else {
+ if (isset($_COOKIE['SMARTY_DEBUG'])) {
+ $_template->smarty->debugging = true;
+ }
+ }
+ }
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_extension_codeframe.php b/library/Smarty/libs/sysplugins/smarty_internal_extension_codeframe.php
new file mode 100644
index 000000000..0474378ce
--- /dev/null
+++ b/library/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/library/Smarty/libs/sysplugins/smarty_internal_extension_config.php b/library/Smarty/libs/sysplugins/smarty_internal_extension_config.php
new file mode 100644
index 000000000..a30bb22da
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_internal_extension_config.php
@@ -0,0 +1,160 @@
+<?php
+
+/**
+ * @package Smarty
+ * @subpackage PluginsInternal
+ */
+class Smarty_Internal_Extension_Config
+{
+ /**
+ * @param $obj
+ * @param $config_file
+ * @param null $sections
+ * @param string $scope
+ */
+ static function configLoad($obj, $config_file, $sections = null, $scope = 'local')
+ {
+ $smarty = isset($obj->smarty) ? $obj->smarty : $obj;
+ $confObj = new $smarty->template_class($config_file, $smarty, $obj);
+ $confObj->caching = Smarty::CACHING_OFF;
+ $confObj->source = Smarty_Template_Config::load($confObj);
+ $confObj->source->config_sections = $sections;
+ $confObj->source->scope = $scope;
+ $confObj->compiled = Smarty_Template_Compiled::load($confObj);
+ if ($confObj->smarty->debugging) {
+ Smarty_Internal_Debug::start_render($confObj);
+ }
+ $confObj->compiled->render($confObj);
+ if ($confObj->smarty->debugging) {
+ Smarty_Internal_Debug::end_render($confObj);
+ }
+ if ($obj instanceof Smarty_Internal_Template) {
+ $obj->properties['file_dependency'][$confObj->source->uid] = array($confObj->source->filepath, $confObj->source->timestamp, $confObj->source->type);
+ }
+ }
+
+ /**
+ * load config variables
+ *
+ * @param mixed $sections array of section names, single section or null
+ * @param string $scope global,parent or local
+ *
+ * @throws Exception
+ */
+ static function loadConfigVars($_template, $_config_vars)
+ {
+ $scope = $_template->source->scope;
+ // pointer to scope (local scope is parent of template object
+ $scope_ptr = $_template->parent;
+ if ($scope == 'parent') {
+ if (isset($_template->parent->parent)) {
+ $scope_ptr = $_template->parent->parent;
+ }
+ } elseif ($scope == 'root' || $scope == 'global') {
+ while (isset($scope_ptr->parent)) {
+ $scope_ptr = $scope_ptr->parent;
+ }
+ }
+ // copy global config vars
+ foreach ($_config_vars['vars'] as $variable => $value) {
+ if ($_template->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
+ $scope_ptr->config_vars[$variable] = $value;
+ } else {
+ $scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value);
+ }
+ }
+ // scan sections
+ $sections = $_template->source->config_sections;
+ if (!empty($sections)) {
+ foreach ((array) $sections as $_template_section) {
+ if (isset($_config_vars['sections'][$_template_section])) {
+ foreach ($_config_vars['sections'][$_template_section]['vars'] as $variable => $value) {
+ if ($_template->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
+ $scope_ptr->config_vars[$variable] = $value;
+ } else {
+ $scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns a single or all config variables
+ *
+ * @param string $varname variable name or null
+ * @param bool $search_parents
+ *
+ * @return string variable value or or array of variables
+ */
+ static function getConfigVars($obj, $varname = null, $search_parents = true)
+ {
+ $_ptr = $obj;
+ $var_array = array();
+ while ($_ptr !== null) {
+ if (isset($varname)) {
+ if (isset($_ptr->config_vars[$varname])) {
+ return $_ptr->config_vars[$varname];
+ }
+ } else {
+ $var_array = array_merge($_ptr->config_vars, $var_array);
+ }
+ // not found, try at parent
+ if ($search_parents) {
+ $_ptr = $_ptr->parent;
+ } else {
+ $_ptr = null;
+ }
+ }
+ if (isset($varname)) {
+ return '';
+ } else {
+ return $var_array;
+ }
+ }
+
+ /**
+ * gets a config variable
+ *
+ * @param string $variable the name of the config variable
+ * @param bool $error_enable
+ *
+ * @return mixed the value of the config variable
+ */
+ static function getConfigVariable($obj, $variable, $error_enable = true)
+ {
+ $_ptr = $obj;
+ while ($_ptr !== null) {
+ if (isset($_ptr->config_vars[$variable])) {
+ // found it, return it
+ return $_ptr->config_vars[$variable];
+ }
+ // not found, try at parent
+ $_ptr = $_ptr->parent;
+ }
+ if ($obj->error_unassigned && $error_enable) {
+ // force a notice
+ $x = $$variable;
+ }
+
+ return null;
+ }
+
+ /**
+ * remove a single or all config variables
+ *
+ * @param string $name variable name or null
+ *
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ static function clearConfig($obj, $name = null)
+ {
+ if (isset($name)) {
+ unset($obj->config_vars[$name]);
+ } else {
+ $obj->config_vars = array();
+ }
+ return $obj;
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_extension_defaulttemplatehandler.php b/library/Smarty/libs/sysplugins/smarty_internal_extension_defaulttemplatehandler.php
new file mode 100644
index 000000000..ed6029204
--- /dev/null
+++ b/library/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/library/Smarty/libs/sysplugins/smarty_internal_function_call_handler.php b/library/Smarty/libs/sysplugins/smarty_internal_function_call_handler.php
index a81ff728b..6cf4188a2 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_function_call_handler.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_function_call_handler.php
@@ -8,7 +8,10 @@
*/
/**
- * This class does call function defined with the {function} tag
+ * This class does handles template functions defined with the {function} tag missing in cache file.
+ * It can happen when the template function was called with the nocache option or within a nocache section.
+ * The template function will be loaded from it's compiled template file, executed and added to the cache file
+ * for later use.
*
* @package Smarty
* @subpackage PluginsInternal
@@ -20,33 +23,49 @@ class Smarty_Internal_Function_Call_Handler
* It does create a PHP function at the first call
*
* @param string $_name template function name
- * @param Smarty_Internal_Template $_template template object
+ * @param Smarty_Internal_Template $_smarty_tpl
+ * @param string $_function PHP function name
* @param array $_params Smarty variables passed as call parameter
- * @param string $_hash nocache hash value
* @param bool $_nocache nocache flag
+ *
+ * @return bool
*/
- public static function call($_name, Smarty_Internal_Template $_template, $_params, $_hash, $_nocache)
+ public static function call($_name, Smarty_Internal_Template $_smarty_tpl, $_function, $_params, $_nocache)
{
- if ($_nocache) {
- $_function = "smarty_template_function_{$_name}_nocache";
- } else {
- $_function = "smarty_template_function_{$_hash}_{$_name}";
- }
- if (!is_callable($_function)) {
- $_code = "function {$_function}(\$_smarty_tpl,\$params) {
- \$saved_tpl_vars = \$_smarty_tpl->tpl_vars;
- foreach (\$_smarty_tpl->smarty->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);};
- foreach (\$params as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}?>";
- if ($_nocache) {
- $_code .= preg_replace(array("!<\?php echo \\'/\*%%SmartyNocache:{$_template->smarty->template_functions[$_name]['nocache_hash']}%%\*/|/\*/%%SmartyNocache:{$_template->smarty->template_functions[$_name]['nocache_hash']}%%\*/\\';\?>!",
- "!\\\'!"), array('', "'"), $_template->smarty->template_functions[$_name]['compiled']);
- $_template->smarty->template_functions[$_name]['called_nocache'] = true;
- } else {
- $_code .= preg_replace("/{$_template->smarty->template_functions[$_name]['nocache_hash']}/", $_template->properties['nocache_hash'], $_template->smarty->template_functions[$_name]['compiled']);
+ $funcParam = $_smarty_tpl->properties['tpl_function'][$_name];
+ if (is_file($funcParam['compiled_filepath'])) {
+ // read compiled file
+ $code = file_get_contents($funcParam['compiled_filepath']);
+ // grab template function
+ if (preg_match("/\/\* {$_function} \*\/([\S\s]*?)\/\*\/ {$_function} \*\//", $code, $match)) {
+ // grab source info from file dependency
+ preg_match("/\s*'{$funcParam['uid']}'([\S\s]*?)\),/", $code, $match1);
+ unset($code);
+ $output = '';
+ // make PHP function known
+ eval($match[0]);
+ if (function_exists($_function)) {
+ // search cache file template
+ $tplPtr = $_smarty_tpl;
+ while (!isset($tplPtr->cached) && isset($tplPtr->parent)) {
+ $tplPtr = $tplPtr->parent;
+ }
+ // add template function code to cache file
+ if (isset($tplPtr->cached)) {
+ $cache = $tplPtr->cached;
+ $content = $cache->read($tplPtr);
+ if ($content) {
+ // check if we must update file dependency
+ if (!preg_match("/'{$funcParam['uid']}'([\S\s]*?)'nocache_hash'/", $content, $match2)) {
+ $content = preg_replace("/('file_dependency'([\S\s]*?)\()/", "\\1{$match1[0]}", $content);
+ }
+ $cache->write($tplPtr, $content . "<?php " . $match[0] . "?>\n");
+ }
+ }
+ return true;
+ }
}
- $_code .= "<?php \$_smarty_tpl->tpl_vars = \$saved_tpl_vars;}";
- eval($_code);
}
- $_function($_template, $_params);
+ return false;
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_parsetree.php b/library/Smarty/libs/sysplugins/smarty_internal_parsetree.php
index 186671021..c96731ed9 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_parsetree.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_parsetree.php
@@ -14,14 +14,16 @@
* @subpackage Compiler
* @ignore
*/
-abstract class _smarty_parsetree
+abstract class Smarty_Internal_ParseTree
{
+
/**
* Parser object
*
* @var object
*/
public $parser;
+
/**
* Buffer content
*
@@ -44,318 +46,4 @@ abstract class _smarty_parsetree
abstract public function to_smarty_php();
}
-/**
- * A complete smarty tag.
- *
- * @package Smarty
- * @subpackage Compiler
- * @ignore
- */
-class _smarty_tag extends _smarty_parsetree
-{
- /**
- * Saved block nesting level
- *
- * @var int
- */
- public $saved_block_nesting;
-
- /**
- * Create parse tree buffer for Smarty tag
- *
- * @param object $parser parser object
- * @param string $data content
- */
- public function __construct($parser, $data)
- {
- $this->parser = $parser;
- $this->data = $data;
- $this->saved_block_nesting = $parser->block_nesting_level;
- }
-
- /**
- * Return buffer content
- *
- * @return string content
- */
- public function to_smarty_php()
- {
- return $this->data;
- }
-
- /**
- * Return complied code that loads the evaluated output of buffer content into a temporary variable
- *
- * @return string template code
- */
- public function assign_to_var()
- {
- $var = sprintf('$_tmp%d', ++Smarty_Internal_Templateparser::$prefix_number);
- $this->parser->compiler->prefix_code[] = sprintf("<?php ob_start();\n%s\n%s=ob_get_clean();?>", preg_replace(array('/^\s*<\?php\s+/','/\s*\?>\s*$/'), '', $this->data), $var);
-
- return $var;
- }
-}
-
-/**
- * Code fragment inside a tag.
- *
- * @package Smarty
- * @subpackage Compiler
- * @ignore
- */
-class _smarty_code extends _smarty_parsetree
-{
- /**
- * Create parse tree buffer for code fragment
- *
- * @param object $parser parser object
- * @param string $data content
- */
- public function __construct($parser, $data)
- {
- $this->parser = $parser;
- $this->data = $data;
- }
-
- /**
- * Return buffer content in parentheses
- *
- * @return string content
- */
- public function to_smarty_php()
- {
- return sprintf("(%s)", $this->data);
- }
-}
-
-/**
- * Double quoted string inside a tag.
- *
- * @package Smarty
- * @subpackage Compiler
- * @ignore
- */
-class _smarty_doublequoted extends _smarty_parsetree
-{
- /**
- * Create parse tree buffer for double quoted string subtrees
- *
- * @param object $parser parser object
- * @param _smarty_parsetree $subtree parsetree buffer
- */
- public function __construct($parser, _smarty_parsetree $subtree)
- {
- $this->parser = $parser;
- $this->subtrees[] = $subtree;
- if ($subtree instanceof _smarty_tag) {
- $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
- }
- }
-
- /**
- * Append buffer to subtree
- *
- * @param _smarty_parsetree $subtree parsetree buffer
- */
- public function append_subtree(_smarty_parsetree $subtree)
- {
- $last_subtree = count($this->subtrees) - 1;
- if ($last_subtree >= 0 && $this->subtrees[$last_subtree] instanceof _smarty_tag && $this->subtrees[$last_subtree]->saved_block_nesting < $this->parser->block_nesting_level) {
- if ($subtree instanceof _smarty_code) {
- $this->subtrees[$last_subtree]->data .= '<?php echo ' . $subtree->data . ';?>';
- } elseif ($subtree instanceof _smarty_dq_content) {
- $this->subtrees[$last_subtree]->data .= '<?php echo "' . $subtree->data . '";?>';
- } else {
- $this->subtrees[$last_subtree]->data .= $subtree->data;
- }
- } else {
- $this->subtrees[] = $subtree;
- }
- if ($subtree instanceof _smarty_tag) {
- $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
- }
- }
-
- /**
- * Merge subtree buffer content together
- *
- * @return string compiled template code
- */
- public function to_smarty_php()
- {
- $code = '';
- foreach ($this->subtrees as $subtree) {
- if ($code !== "") {
- $code .= ".";
- }
- if ($subtree instanceof _smarty_tag) {
- $more_php = $subtree->assign_to_var();
- } else {
- $more_php = $subtree->to_smarty_php();
- }
-
- $code .= $more_php;
-
- if (!$subtree instanceof _smarty_dq_content) {
- $this->parser->compiler->has_variable_string = true;
- }
- }
-
- return $code;
- }
-}
-
-/**
- * Raw chars as part of a double quoted string.
- *
- * @package Smarty
- * @subpackage Compiler
- * @ignore
- */
-class _smarty_dq_content extends _smarty_parsetree
-{
- /**
- * Create parse tree buffer with string content
- *
- * @param object $parser parser object
- * @param string $data string section
- */
- public function __construct($parser, $data)
- {
- $this->parser = $parser;
- $this->data = $data;
- }
- /**
- * Return content as double quoted string
- *
- * @return string doubled quoted string
- */
- public function to_smarty_php()
- {
- return '"' . $this->data . '"';
- }
-}
-
-/**
- * Template element
- *
- * @package Smarty
- * @subpackage Compiler
- * @ignore
- */
-class _smarty_template_buffer extends _smarty_parsetree
-{
- /**
- * Array of template elements
- *
- * @var array
- */
- public $subtrees = Array();
-
- /**
- * Create root of parse tree for template elements
- *
- * @param object $parser parse object
- */
- public function __construct($parser)
- {
- $this->parser = $parser;
- }
-
- /**
- * Append buffer to subtree
- *
- * @param _smarty_parsetree $subtree
- */
- public function append_subtree(_smarty_parsetree $subtree)
- {
- if ($subtree->data !== '') {
- $this->subtrees[] = $subtree;
- }
- }
-
- /**
- * Sanitize and merge subtree buffers together
- *
- * @return string template code content
- */
- public function to_smarty_php()
- {
- $code = '';
- for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key ++) {
- if ($this->subtrees[$key] instanceof _smarty_text) {
- $subtree = $this->subtrees[$key]->to_smarty_php();
- while ($key + 1 < $cnt && ($this->subtrees[$key+1] instanceof _smarty_text || $this->subtrees[$key +1]->data == '')) {
- $key++;
- if ($this->subtrees[$key]->data == '') {
- continue;
- }
- $subtree .= $this->subtrees[$key]->to_smarty_php();
- }
- if ($subtree == '') {
- continue;
- }
- $code .= preg_replace('/(<%|%>|<\?php|<\?|\?>|<\/?script)/', "<?php echo '\$1'; ?>\n", $subtree);
- continue;
- }
- if ($this->subtrees[$key] instanceof _smarty_tag) {
- $subtree = $this->subtrees[$key]->to_smarty_php();
- while ($key + 1 < $cnt && ($this->subtrees[$key+1] instanceof _smarty_tag || $this->subtrees[$key +1]->data == '')) {
- $key++;
- if ($this->subtrees[$key]->data == '') {
- continue;
- }
- $newCode = $this->subtrees[$key]->to_smarty_php();
- if ((preg_match('/^\s*<\?php\s+/', $newCode) && preg_match('/\s*\?>\s*$/', $subtree))) {
- $subtree = preg_replace('/\s*\?>\s*$/', "\n", $subtree);
- $subtree .= preg_replace('/^\s*<\?php\s+/', '', $newCode);
- } else {
- $subtree .= $newCode;
- }
- }
- if ($subtree == '') {
- continue;
- }
- $code .= $subtree;
- continue;
- }
- $code .= $this->subtrees[$key]->to_smarty_php();
- }
- return $code;
- }
-
-}
-
-/**
- * template text
- *
- * @package Smarty
- * @subpackage Compiler
- * @ignore
- */
-class _smarty_text extends _smarty_parsetree
-{
- /**
- * Create template text buffer
- *
- * @param object $parser parser object
- * @param string $data text
- */
- public function __construct($parser, $data)
- {
- $this->parser = $parser;
- $this->data = $data;
- }
-
- /**
- * Return buffer content
- *
- * @return strint text
- */
- public function to_smarty_php()
- {
- return $this->data;
- }
-}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_parsetree_code.php b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_code.php
new file mode 100644
index 000000000..a44ae499c
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_code.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Smarty Internal Plugin Templateparser Parse Tree
+ * These are classes to build parse trees in the template parser
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Thue Kristensen
+ * @author Uwe Tews
+ */
+
+/**
+ * Code fragment inside a tag .
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_Code extends Smarty_Internal_ParseTree
+{
+ /**
+ * Create parse tree buffer for code fragment
+ *
+ * @param object $parser parser object
+ * @param string $data content
+ */
+ public function __construct($parser, $data)
+ {
+ $this->parser = $parser;
+ $this->data = $data;
+ }
+
+ /**
+ * Return buffer content in parentheses
+ *
+ * @return string content
+ */
+ public function to_smarty_php()
+ {
+ return sprintf("(%s)", $this->data);
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_parsetree_dq.php b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_dq.php
new file mode 100644
index 000000000..bdfa4c48f
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_dq.php
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * Double quoted string inside a tag.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+
+/**
+ * Double quoted string inside a tag.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_Dq extends Smarty_Internal_ParseTree
+{
+ /**
+ * Create parse tree buffer for double quoted string subtrees
+ *
+ * @param object $parser parser object
+ * @param Smarty_Internal_ParseTree $subtree parse tree buffer
+ */
+ public function __construct($parser, Smarty_Internal_ParseTree $subtree)
+ {
+ $this->parser = $parser;
+ $this->subtrees[] = $subtree;
+ if ($subtree instanceof Smarty_Internal_ParseTree_Tag) {
+ $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
+ }
+ }
+
+ /**
+ * Append buffer to subtree
+ *
+ * @param Smarty_Internal_ParseTree $subtree parse tree buffer
+ */
+ public function append_subtree(Smarty_Internal_ParseTree $subtree)
+ {
+ $last_subtree = count($this->subtrees) - 1;
+ if ($last_subtree >= 0 && $this->subtrees[$last_subtree] instanceof Smarty_Internal_ParseTree_Tag && $this->subtrees[$last_subtree]->saved_block_nesting < $this->parser->block_nesting_level) {
+ if ($subtree instanceof Smarty_Internal_ParseTree_Code) {
+ $this->subtrees[$last_subtree]->data = $this->parser->compiler->appendCode($this->subtrees[$last_subtree]->data, '<?php echo ' . $subtree->data . ';?>');
+ } elseif ($subtree instanceof Smarty_Internal_ParseTree_DqContent) {
+ $this->subtrees[$last_subtree]->data = $this->parser->compiler->appendCode($this->subtrees[$last_subtree]->data, '<?php echo "' . $subtree->data . '";?>');
+ } else {
+ $this->subtrees[$last_subtree]->data = $this->parser->compiler->appendCode($this->subtrees[$last_subtree]->data, $subtree->data);
+ }
+ } else {
+ $this->subtrees[] = $subtree;
+ }
+ if ($subtree instanceof Smarty_Internal_ParseTree_Tag) {
+ $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
+ }
+ }
+
+ /**
+ * Merge subtree buffer content together
+ *
+ * @return string compiled template code
+ */
+ public function to_smarty_php()
+ {
+ $code = '';
+ foreach ($this->subtrees as $subtree) {
+ if ($code !== "") {
+ $code .= ".";
+ }
+ if ($subtree instanceof Smarty_Internal_ParseTree_Tag) {
+ $more_php = $subtree->assign_to_var();
+ } else {
+ $more_php = $subtree->to_smarty_php();
+ }
+
+ $code .= $more_php;
+
+ if (!$subtree instanceof Smarty_Internal_ParseTree_DqContent) {
+ $this->parser->compiler->has_variable_string = true;
+ }
+ }
+
+ return $code;
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php
new file mode 100644
index 000000000..3197772d1
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Smarty Internal Plugin Templateparser Parse Tree
+ * These are classes to build parse tree in the template parser
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Thue Kristensen
+ * @author Uwe Tews
+ */
+
+/**
+ * Raw chars as part of a double quoted string.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_DqContent extends Smarty_Internal_ParseTree
+{
+ /**
+ * Create parse tree buffer with string content
+ *
+ * @param object $parser parser object
+ * @param string $data string section
+ */
+ public function __construct($parser, $data)
+ {
+ $this->parser = $parser;
+ $this->data = $data;
+ }
+
+ /**
+ * Return content as double quoted string
+ *
+ * @return string doubled quoted string
+ */
+ public function to_smarty_php()
+ {
+ return '"' . $this->data . '"';
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_parsetree_tag.php b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_tag.php
new file mode 100644
index 000000000..81475b5f0
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_tag.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Smarty Internal Plugin Templateparser Parse Tree
+ * These are classes to build parse tree in the template parser
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Thue Kristensen
+ * @author Uwe Tews
+ */
+
+/**
+ * A complete smarty tag.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_Tag extends Smarty_Internal_ParseTree
+{
+
+ /**
+ * Saved block nesting level
+ *
+ * @var int
+ */
+ public $saved_block_nesting;
+
+ /**
+ * Create parse tree buffer for Smarty tag
+ *
+ * @param object $parser parser object
+ * @param string $data content
+ */
+ public function __construct($parser, $data)
+ {
+ $this->parser = $parser;
+ $this->data = $data;
+ $this->saved_block_nesting = $parser->block_nesting_level;
+ }
+
+ /**
+ * Return buffer content
+ *
+ * @return string content
+ */
+ public function to_smarty_php()
+ {
+ return $this->data;
+ }
+
+ /**
+ * Return complied code that loads the evaluated output of buffer content into a temporary variable
+ *
+ * @return string template code
+ */
+ public function assign_to_var()
+ {
+ $var = sprintf('$_tmp%d', ++ Smarty_Internal_Templateparser::$prefix_number);
+ $tmp = $this->parser->compiler->appendCode('<?php ob_start();?>', $this->data);
+ $tmp = $this->parser->compiler->appendCode($tmp, "<?php {$var}=ob_get_clean();?>");
+ $this->parser->compiler->prefix_code[] = sprintf("%s", $tmp);
+
+ return $var;
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_parsetree_template.php b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_template.php
new file mode 100644
index 000000000..7d814edaa
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_template.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Smarty Internal Plugin Templateparser Parse Tree
+ * These are classes to build parse tree in the template parser
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Thue Kristensen
+ * @author Uwe Tews
+ */
+
+/**
+ * Template element
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_Template extends Smarty_Internal_ParseTree
+{
+
+ /**
+ * Array of template elements
+ *
+ * @var array
+ */
+ public $subtrees = Array();
+
+ /**
+ * Create root of parse tree for template elements
+ *
+ * @param object $parser parse object
+ */
+ public function __construct($parser)
+ {
+ $this->parser = $parser;
+ }
+
+ /**
+ * Append buffer to subtree
+ *
+ * @param Smarty_Internal_ParseTree $subtree
+ */
+ public function append_subtree(Smarty_Internal_ParseTree $subtree)
+ {
+ if (!empty($subtree->subtrees)) {
+ $this->subtrees = array_merge($this->subtrees, $subtree->subtrees);
+ } else {
+ if ($subtree->data !== '') {
+ $this->subtrees[] = $subtree;
+ }
+ }
+ }
+
+ /**
+ * Sanitize and merge subtree buffers together
+ *
+ * @return string template code content
+ */
+ public function to_smarty_php()
+ {
+ $code = '';
+ for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key ++) {
+ if ($this->subtrees[$key] instanceof Smarty_Internal_ParseTree_Text) {
+ $subtree = $this->subtrees[$key]->to_smarty_php();
+ while ($key + 1 < $cnt && ($this->subtrees[$key + 1] instanceof Smarty_Internal_ParseTree_Text || $this->subtrees[$key + 1]->data == '')) {
+ $key ++;
+ if ($this->subtrees[$key]->data == '') {
+ continue;
+ }
+ $subtree .= $this->subtrees[$key]->to_smarty_php();
+ }
+ if ($subtree == '') {
+ continue;
+ }
+ $code .= preg_replace('/((<%)|(%>)|(<\?php)|(<\?)|(\?>)|(<\/?script))/', "<?php echo '\$1'; ?>\n", $subtree);
+ continue;
+ }
+ if ($this->subtrees[$key] instanceof Smarty_Internal_ParseTree_Tag) {
+ $subtree = $this->subtrees[$key]->to_smarty_php();
+ while ($key + 1 < $cnt && ($this->subtrees[$key + 1] instanceof Smarty_Internal_ParseTree_Tag || $this->subtrees[$key + 1]->data == '')) {
+ $key ++;
+ if ($this->subtrees[$key]->data == '') {
+ continue;
+ }
+ $subtree = $this->parser->compiler->appendCode($subtree, $this->subtrees[$key]->to_smarty_php());
+ }
+ if ($subtree == '') {
+ continue;
+ }
+ $code .= $subtree;
+ continue;
+ }
+ $code .= $this->subtrees[$key]->to_smarty_php();
+ }
+ return $code;
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_parsetree_text.php b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_text.php
new file mode 100644
index 000000000..42d5bd299
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_internal_parsetree_text.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Smarty Internal Plugin Templateparser Parse Tree
+ * These are classes to build parse tree in the template parser
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Thue Kristensen
+ * @author Uwe Tews
+ * *
+ * template text
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_Text extends Smarty_Internal_ParseTree
+{
+ /**
+ * Create template text buffer
+ *
+ * @param object $parser parser object
+ * @param string $data text
+ */
+ public function __construct($parser, $data)
+ {
+ $this->parser = $parser;
+ $this->data = $data;
+ }
+
+ /**
+ * Return buffer content
+ *
+ * @return string text
+ */
+ public function to_smarty_php()
+ {
+ return $this->data;
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_resource_eval.php b/library/Smarty/libs/sysplugins/smarty_internal_resource_eval.php
index 1c64b7cf5..aca710350 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_resource_eval.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_resource_eval.php
@@ -73,11 +73,11 @@ class Smarty_Internal_Resource_Eval extends Smarty_Resource_Recompiled
*
* @param Smarty $smarty Smarty instance
* @param string $resource_name resource_name to make unique
- * @param boolean $is_config flag for config resource
+ * @param boolean $isConfig flag for config resource
*
* @return string unique resource name
*/
- protected function buildUniqueResourceName(Smarty $smarty, $resource_name, $is_config = false)
+ public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
{
return get_class($this) . '#' . $this->decode($resource_name);
}
@@ -89,7 +89,7 @@ class Smarty_Internal_Resource_Eval extends Smarty_Resource_Recompiled
*
* @return string resource's basename
*/
- protected function getBasename(Smarty_Template_Source $source)
+ public function getBasename(Smarty_Template_Source $source)
{
return '';
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_resource_extends.php b/library/Smarty/libs/sysplugins/smarty_internal_resource_extends.php
index c78dba512..16974ef29 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_resource_extends.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_resource_extends.php
@@ -34,7 +34,7 @@ class Smarty_Internal_Resource_Extends extends Smarty_Resource
*/
public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
{
- $uid = '';
+ $uid = sha1(getcwd());
$sources = array();
$components = explode('|', $source->name);
$exists = true;
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_resource_file.php b/library/Smarty/libs/sysplugins/smarty_internal_resource_file.php
index 0abdc4495..b34033dd8 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_resource_file.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_resource_file.php
@@ -18,6 +18,134 @@
class Smarty_Internal_Resource_File extends Smarty_Resource
{
/**
+ * build template filepath by traversing the template_dir array
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ *
+ * @return string fully qualified filepath
+ * @throws SmartyException
+ */
+ protected function buildFilepath(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
+ {
+ $file = $source->name;
+ preg_match('#^(?P<absolute>[\\\/]|[a-zA-Z]:[\\\/])|(\[(?P<index>[^\]]+)\])|(?P<rel>\.[\\\/])#', $file, $fileMatch);
+ // save basename
+ if (!empty($fileMatch['absolute'])) {
+ $file = $this->normalizePath($file);
+ return is_file($file) ? $file : false;
+ }
+ // go relative to a given template?
+ if (!empty($fileMatch['rel']) && $_template && $_template->parent instanceof Smarty_Internal_Template) {
+ if ($_template->parent->source->type != 'file' && $_template->parent->source->type != 'extends' && !$_template->parent->allow_relative_path) {
+ throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'");
+ }
+ $path = dirname($_template->parent->source->filepath) . DS . $file;
+ // normalize path
+ $path = $this->normalizePath($path);
+ // files relative to a template only get one shot
+ return is_file($path) ? $path : false;
+ }
+
+ if ($source->isConfig) {
+ $_directories = $source->smarty->getConfigDir();
+ } else {
+ $_directories = $source->smarty->getTemplateDir();
+ }
+ // template_dir index?
+ if (!empty($fileMatch['index'])) {
+ $index = $fileMatch['index'];
+ $_directory = null;
+ // try string indexes
+ if (isset($_directories[$index])) {
+ $_directory = $_directories[$index];
+ } elseif (is_numeric($index)) {
+ // try numeric index
+ $index = (int) $index;
+ if (isset($_directories[$index])) {
+ $_directory = $_directories[$index];
+ } else {
+ // try at location index
+ $keys = array_keys($_directories);
+ $_directory = $_directories[$keys[$index]];
+ }
+ }
+ if ($_directory) {
+ preg_match('#\](.+)$#', $file, $fileMatch);
+ $path = $_directory . $fileMatch[1];
+ $path = $this->normalizePath($path);
+ if (is_file($path)) {
+ return $path;
+ }
+ } else {
+ // index not found
+ return false;
+ }
+ }
+
+ // relative file name?
+ foreach ($_directories as $_directory) {
+ $_filepath = $_directory . $file;
+ $path = $this->normalizePath($_filepath);
+ if (is_file($path)) {
+ return $path;
+ }
+ if ($source->smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_directory)) {
+ // try PHP include_path
+ if (function_exists('stream_resolve_include_path')) {
+ $_filepath = stream_resolve_include_path($_filepath);
+ } else {
+ $_filepath = Smarty_Internal_Get_Include_Path::getIncludePath($_filepath);
+ }
+ if ($_filepath !== false) {
+ $path = $this->normalizePath($_filepath);
+ if (is_file($path)) {
+ return $path;
+ }
+ }
+ }
+ }
+ // Could be relative to cwd
+ $path = $this->normalizePath(getcwd() . DS . $file);
+ return is_file($path) ? $path : false;
+ }
+
+ /**
+ * Normalize path
+ * - remove /./ and /../
+ * - make it absolute
+ *
+ * @param string $path file path
+ *
+ * @return string
+ */
+ public function normalizePath($path)
+ {
+ if ($path[0] == '.') {
+ $path = getcwd() . DS . $path;
+ }
+ $path = preg_replace('#[\\\/]+([.][\\\/]+)*#', DS, $path);
+ while (strrpos($path, '.' . DS) !== false) {
+ $path = preg_replace('#([\\\/]([^\\\/]+[\\\/]){2}([.][.][\\\/]){2})|([\\\/][^\\\/]+[\\\/][.][.][\\\/])#', DS, $path);
+ }
+ return $path;
+ }
+
+ /**
+ * test is file exists and save timestamp
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param string $file file name
+ *
+ * @return bool true if file exists
+ */
+ protected function fileExists(Smarty_Template_Source $source, $file)
+ {
+ $source->timestamp = is_file($file) ? @filemtime($file) : false;
+ return $source->exists = !!$source->timestamp;
+ }
+
+ /**
* populate Source Object with meta data from Resource
*
* @param Smarty_Template_Source $source source object
@@ -31,12 +159,14 @@ class Smarty_Internal_Resource_File extends Smarty_Resource
if (is_object($source->smarty->security_policy)) {
$source->smarty->security_policy->isTrustedResourceDir($source->filepath);
}
-
- $source->uid = sha1(realpath($source->filepath));
+ $source->exists = true;
+ $source->uid = sha1($source->filepath);
if ($source->smarty->compile_check && !isset($source->timestamp)) {
$source->timestamp = @filemtime($source->filepath);
- $source->exists = !!$source->timestamp;
}
+ } else {
+ $source->timestamp = false;
+ $source->exists = false;
}
}
@@ -47,8 +177,10 @@ class Smarty_Internal_Resource_File extends Smarty_Resource
*/
public function populateTimestamp(Smarty_Template_Source $source)
{
- $source->timestamp = @filemtime($source->filepath);
- $source->exists = !!$source->timestamp;
+ $source->timestamp = $source->exists = is_file($source->filepath);
+ if ($source->exists) {
+ $source->timestamp = @filemtime($source->filepath);
+ }
}
/**
@@ -79,11 +211,6 @@ class Smarty_Internal_Resource_File extends Smarty_Resource
*/
public function getBasename(Smarty_Template_Source $source)
{
- $_file = $source->name;
- if (($_pos = strpos($_file, ']')) !== false) {
- $_file = substr($_file, $_pos + 1);
- }
-
- return basename($_file);
+ return basename($source->filepath);
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_resource_php.php b/library/Smarty/libs/sysplugins/smarty_internal_resource_php.php
index 7463c2960..c836d1b26 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_resource_php.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_resource_php.php
@@ -9,9 +9,15 @@
* @author Uwe Tews
* @author Rodney Rehm
*/
-class Smarty_Internal_Resource_PHP extends Smarty_Resource_Uncompiled
+class Smarty_Internal_Resource_Php extends Smarty_Internal_Resource_File
{
/**
+ * Flag that it's an uncompiled resource
+ *
+ * @var bool
+ */
+ public $uncompiled = true;
+ /**
* container for short_open_tag directive's value before executing PHP templates
*
* @var string
@@ -28,44 +34,6 @@ class Smarty_Internal_Resource_PHP extends Smarty_Resource_Uncompiled
}
/**
- * 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)
- {
- $source->filepath = $this->buildFilepath($source, $_template);
-
- if ($source->filepath !== false) {
- if (is_object($source->smarty->security_policy)) {
- $source->smarty->security_policy->isTrustedResourceDir($source->filepath);
- }
-
- $source->uid = sha1($source->filepath);
- if ($source->smarty->compile_check) {
- $source->timestamp = @filemtime($source->filepath);
- $source->exists = !!$source->timestamp;
- }
- }
- }
-
- /**
- * populate Source Object with timestamp and exists from Resource
- *
- * @param Smarty_Template_Source $source source object
- *
- * @return void
- */
- public function populateTimestamp(Smarty_Template_Source $source)
- {
- $source->timestamp = @filemtime($source->filepath);
- $source->exists = !!$source->timestamp;
- }
-
- /**
* Load template's source from file into current template object
*
* @param Smarty_Template_Source $source source object
@@ -116,4 +84,17 @@ class Smarty_Internal_Resource_PHP extends Smarty_Resource_Uncompiled
include($source->filepath);
ini_set('short_open_tag', $this->short_open_tag);
}
+
+ /**
+ * populate compiled object with compiled filepath
+ *
+ * @param Smarty_Template_Compiled $compiled compiled object
+ * @param Smarty_Internal_Template $_template template object (is ignored)
+ */
+ public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template)
+ {
+ $compiled->filepath = false;
+ $compiled->timestamp = false;
+ $compiled->exists = false;
+ }
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_resource_registered.php b/library/Smarty/libs/sysplugins/smarty_internal_resource_registered.php
index f12d843e1..f7175dd93 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_resource_registered.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_resource_registered.php
@@ -91,7 +91,7 @@ class Smarty_Internal_Resource_Registered extends Smarty_Resource
*
* @return string resource's basename
*/
- protected function getBasename(Smarty_Template_Source $source)
+ public function getBasename(Smarty_Template_Source $source)
{
return basename($source->name);
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_resource_stream.php b/library/Smarty/libs/sysplugins/smarty_internal_resource_stream.php
index f7d1aac31..8a902268c 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_resource_stream.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_resource_stream.php
@@ -70,11 +70,11 @@ class Smarty_Internal_Resource_Stream extends Smarty_Resource_Recompiled
*
* @param Smarty $smarty Smarty instance
* @param string $resource_name resource_name to make unique
- * @param boolean $is_config flag for config resource
+ * @param boolean $isConfig flag for config resource
*
* @return string unique resource name
*/
- protected function buildUniqueResourceName(Smarty $smarty, $resource_name, $is_config = false)
+ public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
{
return get_class($this) . '#' . $resource_name;
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_resource_string.php b/library/Smarty/libs/sysplugins/smarty_internal_resource_string.php
index bfa069974..75e99e6fb 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_resource_string.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_resource_string.php
@@ -73,11 +73,11 @@ class Smarty_Internal_Resource_String extends Smarty_Resource
*
* @param Smarty $smarty Smarty instance
* @param string $resource_name resource_name to make unique
- * @param boolean $is_config flag for config resource
+ * @param boolean $isConfig flag for config resource
*
* @return string unique resource name
*/
- protected function buildUniqueResourceName(Smarty $smarty, $resource_name, $is_config = false)
+ public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
{
return get_class($this) . '#' . $this->decode($resource_name);
}
@@ -90,7 +90,7 @@ class Smarty_Internal_Resource_String extends Smarty_Resource
*
* @return string resource's basename
*/
- protected function getBasename(Smarty_Template_Source $source)
+ public function getBasename(Smarty_Template_Source $source)
{
return '';
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php b/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php
index 50bd16ef2..ca9bc669b 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php
@@ -11,7 +11,7 @@
/**
* @ignore
*/
-include 'smarty_internal_parsetree.php';
+//include 'smarty_internal_parsetree.php';
/**
* Class SmartyTemplateCompiler
@@ -50,13 +50,6 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom
public $parser;
/**
- * Smarty object
- *
- * @var object
- */
- public $smarty;
-
- /**
* array of vars which can be compiled in local scope
*
* @var array
@@ -86,14 +79,17 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom
*
* @return bool true if compiling succeeded, false if it failed
*/
- protected function doCompile($_content)
+ protected function doCompile($_content, $isTemplateSource = false)
{
/* here is where the compiling takes place. Smarty
tags in the templates are replaces with PHP code,
then written to compiled files. */
// init the lexer/parser to compile the template
- $this->lex = new $this->lexer_class($_content, $this);
+ $this->lex = new $this->lexer_class(str_replace(array("\r\n", "\r"), "\n", $_content), $this);
$this->parser = new $this->parser_class($this->lex, $this);
+ if ($isTemplateSource) {
+ $this->parser->insertPhpCode("<?php\n\$_smarty_tpl->properties['nocache_hash'] = '{$this->nocache_hash}';\n?>\n");
+ }
if ($this->inheritance_child) {
// start state on child templates
$this->lex->yypushstate(Smarty_Internal_Templatelexer::CHILDBODY);
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_template.php b/library/Smarty/libs/sysplugins/smarty_internal_template.php
index f1a73a4ae..4721f3086 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_template.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_template.php
@@ -13,6 +13,7 @@
*
* @package Smarty
* @subpackage Template
+ *
* @property Smarty_Template_Source $source
* @property Smarty_Template_Compiled $compiled
* @property Smarty_Template_Cached $cached
@@ -20,28 +21,12 @@
class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
{
/**
- * cache_id
- *
- * @var string
- */
- public $cache_id = null;
- /**
- * $compile_id
- * @var string
- */
- public $compile_id = null;
- /**
- * caching enabled
- *
- * @var boolean
- */
- public $caching = null;
- /**
- * cache lifetime in seconds
+ * Global smarty instance
*
- * @var integer
+ * @var Smarty
*/
- public $cache_lifetime = null;
+ public $smarty = null;
+
/**
* Template resource
*
@@ -49,6 +34,12 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
*/
public $template_resource = null;
/**
+ * Saved template Id
+ *
+ * @var null|string
+ */
+ public $templateId = null;
+ /**
* flag if compiled template is invalid and must be (re)compiled
*
* @var bool
@@ -67,7 +58,8 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
*/
public $properties = array('file_dependency' => array(),
'nocache_hash' => '',
- 'function' => array());
+ 'tpl_function' => array(),
+ );
/**
* required plugins
*
@@ -75,12 +67,6 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
*/
public $required_plugins = array('compiled' => array(), 'nocache' => array());
/**
- * Global smarty instance
- *
- * @var Smarty
- */
- public $smarty = null;
- /**
* blocks for template inheritance
*
* @var array
@@ -114,7 +100,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
/**
* Create template data object
* Some of the global Smarty settings copied to template scope
- * It load the required template resources and cacher plugins
+ * It load the required template resources and caching plugins
*
* @param string $template_resource template resource string
* @param Smarty $smarty Smarty instance
@@ -126,7 +112,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
*/
public function __construct($template_resource, $smarty, $_parent = null, $_cache_id = null, $_compile_id = null, $_caching = null, $_cache_lifetime = null)
{
- $this->smarty = & $smarty;
+ $this->smarty = &$smarty;
// Smarty parameter
$this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id;
$this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id;
@@ -145,8 +131,266 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
}
/**
+ * fetches rendered template
+ *
+ * @throws Exception
+ * @throws SmartyException
+ * @return string rendered template output
+ */
+ public function fetch()
+ {
+ return $this->render(true, false, false);
+ }
+
+ /**
+ * displays a Smarty template
+ */
+ public function display()
+ {
+ $this->render(true, false, true);
+ }
+
+ /**
+ * render template
+ *
+ * @param bool $merge_tpl_vars if true parent template variables merged in to local scope
+ * @param bool $no_output_filter if true do not run output filter
+ * @param bool $display true: display, false: fetch null: subtemplate
+ *
+ * @throws Exception
+ * @throws SmartyException
+ * @return string rendered template output
+ */
+ public function render($merge_tpl_vars = false, $no_output_filter = true, $display = null)
+ {
+ $parentIsTpl = $this->parent instanceof Smarty_Internal_Template;
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_template($this, $display);
+ }
+ $save_tpl_vars = null;
+ $save_config_vars = null;
+ // merge all variable scopes into template
+ if ($merge_tpl_vars) {
+ // save local variables
+ $save_tpl_vars = $this->tpl_vars;
+ $save_config_vars = $this->config_vars;
+ $ptr_array = array($this);
+ $ptr = $this;
+ while (isset($ptr->parent)) {
+ $ptr_array[] = $ptr = $ptr->parent;
+ }
+ $ptr_array = array_reverse($ptr_array);
+ $parent_ptr = reset($ptr_array);
+ $tpl_vars = $parent_ptr->tpl_vars;
+ $config_vars = $parent_ptr->config_vars;
+ while ($parent_ptr = next($ptr_array)) {
+ if (!empty($parent_ptr->tpl_vars)) {
+ $tpl_vars = array_merge($tpl_vars, $parent_ptr->tpl_vars);
+ }
+ if (!empty($parent_ptr->config_vars)) {
+ $config_vars = array_merge($config_vars, $parent_ptr->config_vars);
+ }
+ }
+ if (!empty(Smarty::$global_tpl_vars)) {
+ $tpl_vars = array_merge(Smarty::$global_tpl_vars, $tpl_vars);
+ }
+ $this->tpl_vars = $tpl_vars;
+ $this->config_vars = $config_vars;
+ }
+ // dummy local smarty variable
+ if (!isset($this->tpl_vars['smarty'])) {
+ $this->tpl_vars['smarty'] = new Smarty_Variable;
+ }
+ $_smarty_old_error_level = isset($this->smarty->error_reporting) ? error_reporting($this->smarty->error_reporting) : null;
+ // check URL debugging control
+ if (!$this->smarty->debugging && $this->smarty->debugging_ctrl == 'URL') {
+ Smarty_Internal_Debug::debugUrl($this);
+ }
+ if (!isset($this->source)) {
+ $this->loadSource();
+ }
+ // checks if template exists
+ if (!$this->source->exists) {
+ if ($parentIsTpl) {
+ $parent_resource = " in '{$this->parent->template_resource}'";
+ } else {
+ $parent_resource = '';
+ }
+ throw new SmartyException("Unable to load template {$this->source->type} '{$this->source->name}'{$parent_resource}");
+ }
+ // disable caching for evaluated code
+ if ($this->source->recompiled) {
+ $this->caching = false;
+ }
+ // read from cache or render
+ $isCacheTpl = $this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED;
+ if ($isCacheTpl) {
+ if (!isset($this->cached)) {
+ $this->loadCached();
+ }
+ $this->cached->isCached($this);
+ }
+ if (!($isCacheTpl) || !$this->cached->valid) {
+ if ($isCacheTpl) {
+ $this->properties['tpl_function'] = array();
+ }
+ // render template (not loaded and not in cache)
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_render($this);
+ }
+ if (!$this->source->uncompiled) {
+ // render compiled code
+ if (!isset($this->compiled)) {
+ $this->loadCompiled();
+ }
+ $content = $this->compiled->render($this);
+ } else {
+ $content = $this->source->renderUncompiled($this);
+ }
+ if (!$this->source->recompiled && empty($this->properties['file_dependency'][$this->source->uid])) {
+ $this->properties['file_dependency'][$this->source->uid] = array($this->source->filepath, $this->source->timestamp, $this->source->type);
+ }
+ if ($parentIsTpl) {
+ $this->parent->properties['file_dependency'] = array_merge($this->parent->properties['file_dependency'], $this->properties['file_dependency']);
+ //$this->parent->properties['tpl_function'] = array_merge($this->parent->properties['tpl_function'], $this->properties['tpl_function']);
+ }
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_render($this);
+ }
+ // write to cache when necessary
+ if (!$this->source->recompiled && $isCacheTpl) {
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_cache($this);
+ }
+ $this->cached->updateCache($this, $content, $no_output_filter);
+ $compile_check = $this->smarty->compile_check;
+ $this->smarty->compile_check = false;
+ if ($parentIsTpl) {
+ $this->properties['tpl_function'] = $this->parent->properties['tpl_function'];
+ }
+ if (!$this->cached->processed) {
+ $this->cached->process($this);
+ }
+ $this->smarty->compile_check = $compile_check;
+ $content = $this->getRenderedTemplateCode();
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_cache($this);
+ }
+ } else {
+ if (!empty($this->properties['nocache_hash']) && !empty($this->parent->properties['nocache_hash'])) {
+ // replace nocache_hash
+ $content = str_replace("{$this->properties['nocache_hash']}", $this->parent->properties['nocache_hash'], $content);
+ $this->parent->has_nocache_code = $this->parent->has_nocache_code || $this->has_nocache_code;
+ }
+ }
+ } else {
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_cache($this);
+ }
+ $content = $this->cached->render($this);
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_cache($this);
+ }
+ }
+ if ((!$this->caching || $this->has_nocache_code || $this->source->recompiled) && !$no_output_filter && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) {
+ $content = Smarty_Internal_Filter_Handler::runFilter('output', $content, $this);
+ }
+ if (isset($_smarty_old_error_level)) {
+ error_reporting($_smarty_old_error_level);
+ }
+ // display or fetch
+ if ($display) {
+ if ($this->caching && $this->smarty->cache_modified_check) {
+ $this->cached->cacheModifiedCheck($this, $content);
+ } else {
+ echo $content;
+ }
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_template($this);
+ }
+ // debug output
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::display_debug($this, true);
+ }
+ if ($merge_tpl_vars) {
+ // restore local variables
+ $this->tpl_vars = $save_tpl_vars;
+ $this->config_vars = $save_config_vars;
+ }
+ return '';
+ } else {
+ if ($merge_tpl_vars) {
+ // restore local variables
+ $this->tpl_vars = $save_tpl_vars;
+ $this->config_vars = $save_config_vars;
+ }
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_template($this);
+ }
+ if ($this->smarty->debugging == 2 and $display === false) {
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::display_debug($this, true);
+ }
+ }
+ if ($parentIsTpl) {
+ $this->parent->properties['tpl_function'] = array_merge($this->parent->properties['tpl_function'], $this->properties['tpl_function']);
+ foreach ($this->required_plugins as $code => $tmp1) {
+ foreach ($tmp1 as $name => $tmp) {
+ foreach ($tmp as $type => $data) {
+ $this->parent->required_plugins[$code][$name][$type] = $data;
+ }
+ }
+ }
+ }
+ // return cache content
+ return $content;
+ }
+ }
+
+ /**
+ * get rendered template content by calling compiled or cached template code
+ *
+ * @return string
+ * @throws Exception
+ */
+ public function getRenderedTemplateCode()
+ {
+ $level = ob_get_level();
+ try {
+ ob_start();
+ if (empty($this->properties['unifunc']) || !is_callable($this->properties['unifunc'])) {
+ throw new SmartyException("Invalid compiled template for '{$this->template_resource}'");
+ }
+ if (isset($this->smarty->security_policy)) {
+ $this->smarty->security_policy->startTemplate($this);
+ }
+ array_unshift($this->_capture_stack, array());
+ //
+ // render compiled or saved template code
+ //
+ $this->properties['unifunc']($this);
+ // any unclosed {capture} tags ?
+ if (isset($this->_capture_stack[0][0])) {
+ $this->capture_error();
+ }
+ array_shift($this->_capture_stack);
+ if (isset($this->smarty->security_policy)) {
+ $this->smarty->security_policy->exitTemplate($this);
+ }
+ return ob_get_clean();
+ }
+ catch (Exception $e) {
+ while (ob_get_level() > $level) {
+ ob_end_clean();
+ }
+ throw $e;
+ }
+ }
+
+ /**
* Returns if the current template must be compiled by the Smarty compiler
- * It does compare the timestamps of template source and the compiled templates and checks the force compile configuration
+ * It does compare the timestamps of template source and the compiled templates and checks the force compile
+ * configuration
*
* @throws SmartyException
* @return boolean true if the template must be compiled
@@ -175,51 +419,11 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
*/
public function compileTemplateSource()
{
- if (!$this->source->recompiled) {
- $this->properties['file_dependency'] = array();
- if ($this->source->components) {
- // for the extends resource the compiler will fill it
- // uses real resource for file dependency
- // $source = end($this->source->components);
- // $this->properties['file_dependency'][$this->source->uid] = array($this->source->filepath, $this->source->timestamp, $source->type);
- } else {
- $this->properties['file_dependency'][$this->source->uid] = array($this->source->filepath, $this->source->timestamp, $this->source->type);
- }
- }
- // compile locking
- if ($this->smarty->compile_locking && !$this->source->recompiled) {
- if ($saved_timestamp = $this->compiled->timestamp) {
- touch($this->compiled->filepath);
- }
- }
- // call compiler
- try {
- $code = $this->compiler->compileTemplate($this);
- }
- catch (Exception $e) {
- // restore old timestamp in case of error
- if ($this->smarty->compile_locking && !$this->source->recompiled && $saved_timestamp) {
- touch($this->compiled->filepath, $saved_timestamp);
- }
- throw $e;
- }
- // compiling succeded
- if (!$this->source->recompiled && $this->compiler->write_compiled_code) {
- // write compiled template
- $_filepath = $this->compiled->filepath;
- if ($_filepath === false) {
- throw new SmartyException('getCompiledFilepath() did not return a destination to save the compiled template to');
- }
- Smarty_Internal_Write_File::writeFile($_filepath, $code, $this->smarty);
- $this->compiled->exists = true;
- $this->compiled->isCompiled = true;
- }
- // release compiler object to free memory
- unset($this->compiler);
+ return $this->compiled->compileTemplateSource($this);
}
/**
- * Writes the cached template output
+ * Writes the content to cache resource
*
* @param string $content
*
@@ -227,23 +431,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
*/
public function writeCachedContent($content)
{
- if ($this->source->recompiled || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) {
- // don't write cache file
- return false;
- }
- $this->cached->timestamp = time();
- $this->properties['cache_lifetime'] = $this->cache_lifetime;
- $this->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
- $content = $this->createTemplateCodeFrame($content, true);
- /** @var Smarty_Internal_Template $_smarty_tpl
- * used in evaluated code
- */
- $_smarty_tpl = $this;
- eval("?>" . $content);
- $this->cached->valid = true;
- $this->cached->processed = true;
-
- return $this->cached->write($this, $content);
+ return $this->cached->writeCachedContent($this, $content);
}
/**
@@ -261,47 +449,62 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
*/
public function getSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope)
{
- // already in template cache?
- if ($this->smarty->allow_ambiguous_resources) {
- $_templateId = Smarty_Resource::getUniqueTemplateName($this, $template) . $cache_id . $compile_id;
- } else {
- $_templateId = $this->smarty->joined_template_dir . '#' . $template . $cache_id . $compile_id;
- }
+ $tpl = $this->setupSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope);
+ return $tpl->render();
+ }
- if (isset($_templateId[150])) {
- $_templateId = sha1($_templateId);
- }
+ /**
+ * Template code runtime function to set up an inline subtemplate
+ *
+ * @param string $template the resource handle of the template file
+ * @param mixed $cache_id cache id to be used with this template
+ * @param mixed $compile_id compile id to be used with this template
+ * @param integer $caching cache mode
+ * @param integer $cache_lifetime life time of cache data
+ * @param array $data passed parameter template variables
+ * @param int $parent_scope scope in which {include} should execute
+ *
+ * @returns object template object
+ */
+ public function setupSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope)
+ {
+ $_templateId = $this->getTemplateId($template, $cache_id, $compile_id);
+ // already in template cache?
if (isset($this->smarty->template_objects[$_templateId])) {
// clone cached template object because of possible recursive call
$tpl = clone $this->smarty->template_objects[$_templateId];
$tpl->parent = $this;
+ if ((bool) $tpl->caching !== (bool) $caching) {
+ unset($tpl->compiled);
+ }
$tpl->caching = $caching;
$tpl->cache_lifetime = $cache_lifetime;
} else {
$tpl = new $this->smarty->template_class($template, $this->smarty, $this, $cache_id, $compile_id, $caching, $cache_lifetime);
+ $tpl->templateId = $_templateId;
}
// get variables from calling scope
if ($parent_scope == Smarty::SCOPE_LOCAL) {
$tpl->tpl_vars = $this->tpl_vars;
$tpl->tpl_vars['smarty'] = clone $this->tpl_vars['smarty'];
} elseif ($parent_scope == Smarty::SCOPE_PARENT) {
- $tpl->tpl_vars = & $this->tpl_vars;
+ $tpl->tpl_vars = &$this->tpl_vars;
} elseif ($parent_scope == Smarty::SCOPE_GLOBAL) {
- $tpl->tpl_vars = & Smarty::$global_tpl_vars;
+ $tpl->tpl_vars = &Smarty::$global_tpl_vars;
} elseif (($scope_ptr = $this->getScopePointer($parent_scope)) == null) {
- $tpl->tpl_vars = & $this->tpl_vars;
+ $tpl->tpl_vars = &$this->tpl_vars;
} else {
- $tpl->tpl_vars = & $scope_ptr->tpl_vars;
+ $tpl->tpl_vars = &$scope_ptr->tpl_vars;
}
$tpl->config_vars = $this->config_vars;
if (!empty($data)) {
// set up variable values
foreach ($data as $_key => $_val) {
- $tpl->tpl_vars[$_key] = new Smarty_variable($_val);
+ $tpl->tpl_vars[$_key] = new Smarty_Variable($_val);
}
}
-
- return $tpl->fetch(null, null, null, null, false, false, true);
+ $tpl->properties['tpl_function'] = $this->properties['tpl_function'];
+ return $tpl;
}
/**
@@ -312,127 +515,70 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
* @param mixed $compile_id compile id to be used with this template
* @param integer $caching cache mode
* @param integer $cache_lifetime life time of cache data
- * @param $data
+ * @param array $data passed parameter template variables
* @param int $parent_scope scope in which {include} should execute
* @param string $hash nocache hash code
+ * @param string $content_func name of content function
*
- * @returns string template content
+ * @returns object template content
*/
- public function setupInlineSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope, $hash)
+ public function getInlineSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope, $hash, $content_func)
{
- $tpl = new $this->smarty->template_class($template, $this->smarty, $this, $cache_id, $compile_id, $caching, $cache_lifetime);
+ $tpl = $this->setupSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope);
$tpl->properties['nocache_hash'] = $hash;
- // get variables from calling scope
- if ($parent_scope == Smarty::SCOPE_LOCAL) {
- $tpl->tpl_vars = $this->tpl_vars;
- $tpl->tpl_vars['smarty'] = clone $this->tpl_vars['smarty'];
- } elseif ($parent_scope == Smarty::SCOPE_PARENT) {
- $tpl->tpl_vars = & $this->tpl_vars;
- } elseif ($parent_scope == Smarty::SCOPE_GLOBAL) {
- $tpl->tpl_vars = & Smarty::$global_tpl_vars;
- } elseif (($scope_ptr = $this->getScopePointer($parent_scope)) == null) {
- $tpl->tpl_vars = & $this->tpl_vars;
- } else {
- $tpl->tpl_vars = & $scope_ptr->tpl_vars;
+ if (!isset($this->smarty->template_objects[$tpl->templateId])) {
+ $this->smarty->template_objects[$tpl->templateId] = $tpl;
}
- $tpl->config_vars = $this->config_vars;
- if (!empty($data)) {
- // set up variable values
- foreach ($data as $_key => $_val) {
- $tpl->tpl_vars[$_key] = new Smarty_variable($_val);
- }
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_template($tpl);
+ Smarty_Internal_Debug::start_render($tpl);
}
-
- return $tpl;
+ $tpl->properties['unifunc'] = $content_func;
+ $output = $tpl->getRenderedTemplateCode();
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_template($tpl);
+ Smarty_Internal_Debug::end_render($tpl);
+ }
+ if (!empty($tpl->properties['file_dependency'])) {
+ $this->properties['file_dependency'] = array_merge($this->properties['file_dependency'], $tpl->properties['file_dependency']);
+ }
+ $this->properties['tpl_function'] = $tpl->properties['tpl_function'];
+ return str_replace($tpl->properties['nocache_hash'], $this->properties['nocache_hash'], $output);
}
/**
- * Create code frame for compiled and cached templates
+ * Call template function
*
- * @param string $content optional template content
- * @param bool $cache flag for cache file
+ * @param string $name template function name
+ * @param object|\Smarty_Internal_Template $_smarty_tpl template object
+ * @param array $params parameter array
+ * @param bool $nocache true if called nocache
*
- * @return string
+ * @throws \SmartyException
*/
- public function createTemplateCodeFrame($content = '', $cache = false)
+ public function callTemplateFunction($name, Smarty_Internal_Template $_smarty_tpl, $params, $nocache)
{
- $plugins_string = '';
- // include code for plugins
- if (!$cache) {
- if (!empty($this->required_plugins['compiled'])) {
- $plugins_string = '<?php ';
- foreach ($this->required_plugins['compiled'] as $tmp) {
- foreach ($tmp as $data) {
- $file = addslashes($data['file']);
- if (is_Array($data['function'])) {
- $plugins_string .= "if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) include '{$file}';\n";
- } else {
- $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$file}';\n";
- }
- }
- }
- $plugins_string .= '?>';
- }
- if (!empty($this->required_plugins['nocache'])) {
- $this->has_nocache_code = true;
- $plugins_string .= "<?php echo '/*%%SmartyNocache:{$this->properties['nocache_hash']}%%*/<?php \$_smarty = \$_smarty_tpl->smarty; ";
- foreach ($this->required_plugins['nocache'] as $tmp) {
- foreach ($tmp as $data) {
- $file = addslashes($data['file']);
- if (is_Array($data['function'])) {
- $plugins_string .= addslashes("if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) include '{$file}';\n");
- } else {
- $plugins_string .= addslashes("if (!is_callable('{$data['function']}')) include '{$file}';\n");
- }
- }
+ if (isset($_smarty_tpl->properties['tpl_function'][$name])) {
+ if (!$_smarty_tpl->caching || ($_smarty_tpl->caching && $nocache)) {
+ $function = $_smarty_tpl->properties['tpl_function'][$name]['call_name'];
+ } else {
+ if (isset($_smarty_tpl->properties['tpl_function'][$name]['call_name_caching'])) {
+ $function = $_smarty_tpl->properties['tpl_function'][$name]['call_name_caching'];
+ } else {
+ $function = $_smarty_tpl->properties['tpl_function'][$name]['call_name'];
}
- $plugins_string .= "?>/*/%%SmartyNocache:{$this->properties['nocache_hash']}%%*/';?>\n";
}
- }
- // build property code
- $this->properties['has_nocache_code'] = $this->has_nocache_code;
- $output = '';
- if (!$this->source->recompiled) {
- $output = "<?php /*%%SmartyHeaderCode:{$this->properties['nocache_hash']}%%*/";
- if ($this->smarty->direct_access_security) {
- $output .= "if(!defined('SMARTY_DIR')) exit('no direct access allowed');\n";
+ if (function_exists($function)) {
+ $function ($_smarty_tpl, $params);
+ return;
}
- }
- if ($cache) {
- // remove compiled code of{function} definition
- unset($this->properties['function']);
- if (!empty($this->smarty->template_functions)) {
- // copy code of {function} tags called in nocache mode
- foreach ($this->smarty->template_functions as $name => $function_data) {
- if (isset($function_data['called_nocache'])) {
- foreach ($function_data['called_functions'] as $func_name) {
- $this->smarty->template_functions[$func_name]['called_nocache'] = true;
- }
- }
- }
- foreach ($this->smarty->template_functions as $name => $function_data) {
- if (isset($function_data['called_nocache'])) {
- unset($function_data['called_nocache'], $function_data['called_functions'], $this->smarty->template_functions[$name]['called_nocache']);
- $this->properties['function'][$name] = $function_data;
- }
- }
+ // try to load template function dynamically
+ if (Smarty_Internal_Function_Call_Handler::call($name, $_smarty_tpl, $function, $params, $nocache)) {
+ $function ($_smarty_tpl, $params);
+ return;
}
}
- $this->properties['version'] = Smarty::SMARTY_VERSION;
- if (!isset($this->properties['unifunc'])) {
- $this->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
- }
- if (!$this->source->recompiled) {
- $output .= "\$_valid = \$_smarty_tpl->decodeProperties(" . var_export($this->properties, true) . ',' . ($cache ? 'true' : 'false') . "); /*/%%SmartyHeaderCode%%*/?>\n";
- $output .= '<?php if ($_valid && !is_callable(\'' . $this->properties['unifunc'] . '\')) {function ' . $this->properties['unifunc'] . '($_smarty_tpl) {?>';
- }
- $output .= $plugins_string;
- $output .= $content;
- if (!$this->source->recompiled) {
- $output .= "<?php }} ?>\n";
- }
-
- return $output;
+ throw new SmartyException("Unable to find template function '{$name}'");
}
/**
@@ -447,33 +593,21 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
*/
public function decodeProperties($properties, $cache = false)
{
- $this->has_nocache_code = $properties['has_nocache_code'];
- $this->properties['nocache_hash'] = $properties['nocache_hash'];
- if (isset($properties['cache_lifetime'])) {
- $this->properties['cache_lifetime'] = $properties['cache_lifetime'];
- }
- if (isset($properties['file_dependency'])) {
- $this->properties['file_dependency'] = array_merge($this->properties['file_dependency'], $properties['file_dependency']);
- }
- if (!empty($properties['function'])) {
- $this->properties['function'] = array_merge($this->properties['function'], $properties['function']);
- $this->smarty->template_functions = array_merge($this->smarty->template_functions, $properties['function']);
- }
- $this->properties['version'] = (isset($properties['version'])) ? $properties['version'] : '';
- $this->properties['unifunc'] = $properties['unifunc'];
- // check file dependencies at compiled code
+ $properties['version'] = (isset($properties['version'])) ? $properties['version'] : '';
$is_valid = true;
- if ($this->properties['version'] != Smarty::SMARTY_VERSION) {
+ if (Smarty::SMARTY_VERSION != $properties['version']) {
+ // new version must rebuild
$is_valid = false;
- } elseif (((!$cache && $this->smarty->compile_check && empty($this->compiled->_properties) && !$this->compiled->isCompiled) || $cache && ($this->smarty->compile_check === true || $this->smarty->compile_check === Smarty::COMPILECHECK_ON)) && !empty($this->properties['file_dependency'])) {
- foreach ($this->properties['file_dependency'] as $_file_to_check) {
+ } elseif ((!$cache && $this->smarty->compile_check || $cache && ($this->smarty->compile_check === true || $this->smarty->compile_check === Smarty::COMPILECHECK_ON)) && !empty($properties['file_dependency'])) {
+ // check file dependencies at compiled code
+ foreach ($properties['file_dependency'] as $_file_to_check) {
if ($_file_to_check[2] == 'file' || $_file_to_check[2] == 'php') {
if ($this->source->filepath == $_file_to_check[0] && isset($this->source->timestamp)) {
// do not recheck current template
$mtime = $this->source->timestamp;
} else {
// file and php types can be checked without loading the respective resource handlers
- $mtime = @filemtime($_file_to_check[0]);
+ $mtime = is_file($_file_to_check[0]) ? @filemtime($_file_to_check[0]) : false;
}
} elseif ($_file_to_check[2] == 'string') {
continue;
@@ -490,8 +624,8 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
if ($cache) {
// CACHING_LIFETIME_SAVED cache expiry has to be validated here since otherwise we'd define the unifunc
if ($this->caching === Smarty::CACHING_LIFETIME_SAVED &&
- $this->properties['cache_lifetime'] >= 0 &&
- (time() > ($this->cached->timestamp + $this->properties['cache_lifetime']))
+ $properties['cache_lifetime'] >= 0 &&
+ (time() > ($this->cached->timestamp + $properties['cache_lifetime']))
) {
$is_valid = false;
}
@@ -499,25 +633,35 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
} else {
$this->mustCompile = !$is_valid;
}
- // store data in reusable Smarty_Template_Compiled
- if (!$cache) {
- $this->compiled->_properties = $properties;
+ if ($is_valid) {
+ $this->has_nocache_code = $properties['has_nocache_code'];
+ // $this->properties['nocache_hash'] = $properties['nocache_hash'];
+ if (isset($properties['cache_lifetime'])) {
+ $this->properties['cache_lifetime'] = $properties['cache_lifetime'];
+ }
+ if (isset($properties['file_dependency'])) {
+ $this->properties['file_dependency'] = array_merge($this->properties['file_dependency'], $properties['file_dependency']);
+ }
+ if (isset($properties['tpl_function'])) {
+ $this->properties['tpl_function'] = array_merge($this->properties['tpl_function'], $properties['tpl_function']);
+ }
+ $this->properties['version'] = $properties['version'];
+ $this->properties['unifunc'] = $properties['unifunc'];
}
-
return $is_valid;
}
/**
* Template code runtime function to create a local Smarty variable for array assignments
*
- * @param string $tpl_var tempate variable name
+ * @param string $tpl_var template variable name
* @param bool $nocache cache mode of variable
* @param int $scope scope of variable
*/
public function createLocalArrayVariable($tpl_var, $nocache = false, $scope = Smarty::SCOPE_LOCAL)
{
if (!isset($this->tpl_vars[$tpl_var])) {
- $this->tpl_vars[$tpl_var] = new Smarty_variable(array(), $nocache, $scope);
+ $this->tpl_vars[$tpl_var] = new Smarty_Variable(array(), $nocache, $scope);
} else {
$this->tpl_vars[$tpl_var] = clone $this->tpl_vars[$tpl_var];
if ($scope != Smarty::SCOPE_LOCAL) {
@@ -558,7 +702,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
/**
* Get parent or root of template parent chain
*
- * @param int $scope pqrent or root scope
+ * @param int $scope parent or root scope
*
* @return mixed object
*/
@@ -579,11 +723,12 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
}
/**
- * [util function] counts an array, arrayaccess/traversable or PDOStatement object
+ * [util function] counts an array, arrayAccess/traversable or PDOStatement object
*
* @param mixed $value
*
- * @return int the count for arrays and objects that implement countable, 1 for other objects that don't, and 0 for empty elements
+ * @return int the count for arrays and objects that implement countable, 1 for other objects that don't, and 0
+ * for empty elements
*/
public function _count($value)
{
@@ -612,7 +757,6 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
/**
* runtime error not matching capture tags
-
*/
public function capture_error()
{
@@ -630,7 +774,78 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
{
Smarty_CacheResource::invalidLoadedCache($this->smarty);
- return $this->cached->handler->clear($this->smarty, $this->template_name, $this->cache_id, $this->compile_id, $exp_time);
+ return $this->cached->handler->clear($this->smarty, $this->template_resource, $this->cache_id, $this->compile_id, $exp_time);
+ }
+
+ /**
+ * Load source resource
+ *
+ * @throws SmartyException
+ */
+ public function loadSource()
+ {
+ $this->source = Smarty_Template_Source::load($this);
+ if ($this->smarty->template_resource_caching && !$this->source->recompiled && isset($this->templateId)) {
+ $this->smarty->template_objects[$this->templateId] = $this;
+ }
+ }
+
+ /**
+ * Load compiled object
+ *
+ */
+ public function loadCompiled()
+ {
+ if (!isset($this->compiled)) {
+ if (!class_exists('Smarty_Template_Compiled', false)) {
+ require SMARTY_SYSPLUGINS_DIR . 'smarty_template_compiled.php';
+ }
+ $this->compiled = Smarty_Template_Compiled::load($this);
+ }
+ }
+
+ /**
+ * Load cached object
+ *
+ */
+ public function loadCached()
+ {
+ if (!isset($this->cached)) {
+ if (!class_exists('Smarty_Template_Cached', false)) {
+ require SMARTY_SYSPLUGINS_DIR . 'smarty_template_cached.php';
+ }
+ $this->cached = Smarty_Template_Cached::load($this);
+ }
+ }
+
+ /**
+ * Load compiler object
+ *
+ * @throws \SmartyException
+ */
+ public function loadCompiler()
+ {
+ $this->smarty->loadPlugin($this->source->compiler_class);
+ $this->compiler = new $this->source->compiler_class($this->source->template_lexer_class, $this->source->template_parser_class, $this->smarty);
+ }
+
+ /**
+ * Handle unknown class methods
+ *
+ * @param string $name unknown method-name
+ * @param array $args argument array
+ *
+ * @return mixed
+ * @throws SmartyException
+ */
+ public function __call($name, $args)
+ {
+ // method of Smarty object?
+ if (method_exists($this->smarty, $name)) {
+ return call_user_func_array(array($this->smarty, $name), $args);
+ }
+ // parent
+ return parent::__call($name, $args);
}
/**
@@ -649,18 +864,14 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
case 'cached':
case 'compiler':
$this->$property_name = $value;
-
return;
-
- // FIXME: routing of template -> smarty attributes
default:
+ // Smarty property ?
if (property_exists($this->smarty, $property_name)) {
$this->smarty->$property_name = $value;
-
return;
}
}
-
throw new SmartyException("invalid template property '$property_name'.");
}
@@ -669,65 +880,38 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
*
* @param string $property_name property name
*
+ * @return mixed|Smarty_Template_Cached
* @throws SmartyException
*/
public function __get($property_name)
{
switch ($property_name) {
case 'source':
- if (strlen($this->template_resource) == 0) {
- throw new SmartyException('Missing template name');
- }
- $this->source = Smarty_Resource::source($this);
- // cache template object under a unique ID
- // do not cache eval resources
- if ($this->source->type != 'eval') {
- if ($this->smarty->allow_ambiguous_resources) {
- $_templateId = $this->source->unique_resource . $this->cache_id . $this->compile_id;
- } else {
- $_templateId = $this->smarty->joined_template_dir . '#' . $this->template_resource . $this->cache_id . $this->compile_id;
- }
-
- if (isset($_templateId[150])) {
- $_templateId = sha1($_templateId);
- }
- $this->smarty->template_objects[$_templateId] = $this;
- }
-
+ $this->loadSource();
return $this->source;
case 'compiled':
- $this->compiled = $this->source->getCompiled($this);
-
+ $this->loadCompiled();
return $this->compiled;
case 'cached':
- if (!class_exists('Smarty_Template_Cached')) {
- include SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php';
- }
- $this->cached = new Smarty_Template_Cached($this);
-
+ $this->loadCached();
return $this->cached;
case 'compiler':
- $this->smarty->loadPlugin($this->source->compiler_class);
- $this->compiler = new $this->source->compiler_class($this->source->template_lexer_class, $this->source->template_parser_class, $this->smarty);
-
+ $this->loadCompiler();
return $this->compiler;
-
- // FIXME: routing of template -> smarty attributes
default:
+ // Smarty property ?
if (property_exists($this->smarty, $property_name)) {
return $this->smarty->$property_name;
}
}
-
throw new SmartyException("template property '$property_name' does not exist.");
}
/**
* Template data object destructor
-
*/
public function __destruct()
{
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_templatebase.php b/library/Smarty/libs/sysplugins/smarty_internal_templatebase.php
index f8f1c9e1e..68fd4be2e 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_templatebase.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_templatebase.php
@@ -1,860 +1,557 @@
-<?php
-/**
- * Smarty Internal Plugin Smarty Template Base
- * This file contains the basic shared methods for template handling
- *
- * @package Smarty
- * @subpackage Template
- * @author Uwe Tews
- */
-
-/**
- * Class with shared template methods
- *
- * @package Smarty
- * @subpackage Template
- */
-abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
-{
- /**
- * fetches a rendered Smarty template
- *
- * @param string $template the resource handle of the template file or template object
- * @param mixed $cache_id cache id to be used with this template
- * @param mixed $compile_id compile id to be used with this template
- * @param object $parent next higher level of Smarty variables
- * @param bool $display true: display, false: fetch
- * @param bool $merge_tpl_vars if true parent template variables merged in to local scope
- * @param bool $no_output_filter if true do not run output filter
- *
- * @throws Exception
- * @throws SmartyException
- * @return string rendered template output
- */
- public function fetch($template = null, $cache_id = null, $compile_id = null, $parent = null, $display = false, $merge_tpl_vars = true, $no_output_filter = false)
- {
- if ($template === null && $this instanceof $this->template_class) {
- $template = $this;
- }
- if ($cache_id !== null && is_object($cache_id)) {
- $parent = $cache_id;
- $cache_id = null;
- }
- if ($parent === null && ($this instanceof Smarty || is_string($template))) {
- $parent = $this;
- }
- // create template object if necessary
- $_template = ($template instanceof $this->template_class)
- ? $template
- : $this->smarty->createTemplate($template, $cache_id, $compile_id, $parent, false);
- // if called by Smarty object make sure we use current caching status
- if ($this instanceof Smarty) {
- $_template->caching = $this->caching;
- }
- // merge all variable scopes into template
- if ($merge_tpl_vars) {
- // save local variables
- $save_tpl_vars = $_template->tpl_vars;
- $save_config_vars = $_template->config_vars;
- $ptr_array = array($_template);
- $ptr = $_template;
- while (isset($ptr->parent)) {
- $ptr_array[] = $ptr = $ptr->parent;
- }
- $ptr_array = array_reverse($ptr_array);
- $parent_ptr = reset($ptr_array);
- $tpl_vars = $parent_ptr->tpl_vars;
- $config_vars = $parent_ptr->config_vars;
- while ($parent_ptr = next($ptr_array)) {
- if (!empty($parent_ptr->tpl_vars)) {
- $tpl_vars = array_merge($tpl_vars, $parent_ptr->tpl_vars);
- }
- if (!empty($parent_ptr->config_vars)) {
- $config_vars = array_merge($config_vars, $parent_ptr->config_vars);
- }
- }
- if (!empty(Smarty::$global_tpl_vars)) {
- $tpl_vars = array_merge(Smarty::$global_tpl_vars, $tpl_vars);
- }
- $_template->tpl_vars = $tpl_vars;
- $_template->config_vars = $config_vars;
- }
- // dummy local smarty variable
- if (!isset($_template->tpl_vars['smarty'])) {
- $_template->tpl_vars['smarty'] = new Smarty_Variable;
- }
- if (isset($this->smarty->error_reporting)) {
- $_smarty_old_error_level = error_reporting($this->smarty->error_reporting);
- }
- // check URL debugging control
- if (!$this->smarty->debugging && $this->smarty->debugging_ctrl == 'URL') {
- if (isset($_SERVER['QUERY_STRING'])) {
- $_query_string = $_SERVER['QUERY_STRING'];
- } else {
- $_query_string = '';
- }
- if (false !== strpos($_query_string, $this->smarty->smarty_debug_id)) {
- if (false !== strpos($_query_string, $this->smarty->smarty_debug_id . '=on')) {
- // enable debugging for this browser session
- setcookie('SMARTY_DEBUG', true);
- $this->smarty->debugging = true;
- } elseif (false !== strpos($_query_string, $this->smarty->smarty_debug_id . '=off')) {
- // disable debugging for this browser session
- setcookie('SMARTY_DEBUG', false);
- $this->smarty->debugging = false;
- } else {
- // enable debugging for this page
- $this->smarty->debugging = true;
- }
- } else {
- if (isset($_COOKIE['SMARTY_DEBUG'])) {
- $this->smarty->debugging = true;
- }
- }
- }
- // must reset merge template date
- $_template->smarty->merged_templates_func = array();
- // get rendered template
- // disable caching for evaluated code
- if ($_template->source->recompiled) {
- $_template->caching = false;
- }
- // checks if template exists
- if (!$_template->source->exists) {
- if ($_template->parent instanceof Smarty_Internal_Template) {
- $parent_resource = " in '{$_template->parent->template_resource}'";
- } else {
- $parent_resource = '';
- }
- throw new SmartyException("Unable to load template {$_template->source->type} '{$_template->source->name}'{$parent_resource}");
- }
- // read from cache or render
- if (!($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED) || !$_template->cached->valid) {
- // render template (not loaded and not in cache)
- if (!$_template->source->uncompiled) {
- /** @var Smarty_Internal_Template $_smarty_tpl
- * used in evaluated code
- */
- $_smarty_tpl = $_template;
- if ($_template->source->recompiled) {
- $code = $_template->compiler->compileTemplate($_template);
- if ($this->smarty->debugging) {
- Smarty_Internal_Debug::start_render($_template);
- }
- try {
- ob_start();
- eval("?>" . $code);
- unset($code);
- }
- catch (Exception $e) {
- ob_get_clean();
- throw $e;
- }
- } else {
- if (!$_template->compiled->exists || ($_template->smarty->force_compile && !$_template->compiled->isCompiled)) {
- $_template->compileTemplateSource();
- $code = file_get_contents($_template->compiled->filepath);
- eval("?>" . $code);
- unset($code);
- $_template->compiled->loaded = true;
- $_template->compiled->isCompiled = true;
- }
- if ($this->smarty->debugging) {
- Smarty_Internal_Debug::start_render($_template);
- }
- if (!$_template->compiled->loaded) {
- include($_template->compiled->filepath);
- if ($_template->mustCompile) {
- // recompile and load again
- $_template->compileTemplateSource();
- $code = file_get_contents($_template->compiled->filepath);
- eval("?>" . $code);
- unset($code);
- $_template->compiled->isCompiled = true;
- }
- $_template->compiled->loaded = true;
- } else {
- $_template->decodeProperties($_template->compiled->_properties, false);
- }
- try {
- ob_start();
- if (empty($_template->properties['unifunc']) || !is_callable($_template->properties['unifunc'])) {
- throw new SmartyException("Invalid compiled template for '{$_template->template_resource}'");
- }
- array_unshift($_template->_capture_stack, array());
- //
- // render compiled template
- //
- $_template->properties['unifunc']($_template);
- // any unclosed {capture} tags ?
- if (isset($_template->_capture_stack[0][0])) {
- $_template->capture_error();
- }
- array_shift($_template->_capture_stack);
- }
- catch (Exception $e) {
- ob_get_clean();
- throw $e;
- }
- }
- } else {
- if ($_template->source->uncompiled) {
- if ($this->smarty->debugging) {
- Smarty_Internal_Debug::start_render($_template);
- }
- try {
- ob_start();
- $_template->source->renderUncompiled($_template);
- }
- catch (Exception $e) {
- ob_get_clean();
- throw $e;
- }
- } else {
- throw new SmartyException("Resource '$_template->source->type' must have 'renderUncompiled' method");
- }
- }
- $_output = ob_get_clean();
- if (!$_template->source->recompiled && empty($_template->properties['file_dependency'][$_template->source->uid])) {
- $_template->properties['file_dependency'][$_template->source->uid] = array($_template->source->filepath, $_template->source->timestamp, $_template->source->type);
- }
- if ($_template->parent instanceof Smarty_Internal_Template) {
- $_template->parent->properties['file_dependency'] = array_merge($_template->parent->properties['file_dependency'], $_template->properties['file_dependency']);
- foreach ($_template->required_plugins as $code => $tmp1) {
- foreach ($tmp1 as $name => $tmp) {
- foreach ($tmp as $type => $data) {
- $_template->parent->required_plugins[$code][$name][$type] = $data;
- }
- }
- }
- }
- if ($this->smarty->debugging) {
- Smarty_Internal_Debug::end_render($_template);
- }
- // write to cache when nessecary
- if (!$_template->source->recompiled && ($_template->caching == Smarty::CACHING_LIFETIME_SAVED || $_template->caching == Smarty::CACHING_LIFETIME_CURRENT)) {
- if ($this->smarty->debugging) {
- Smarty_Internal_Debug::start_cache($_template);
- }
- $_template->properties['has_nocache_code'] = false;
- // get text between non-cached items
- $cache_split = preg_split("!/\*%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!s", $_output);
- // get non-cached items
- preg_match_all("!/\*%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!s", $_output, $cache_parts);
- $output = '';
- // loop over items, stitch back together
- foreach ($cache_split as $curr_idx => $curr_split) {
- // escape PHP tags in template content
- $output .= preg_replace('/(<%|%>|<\?php|<\?|\?>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>)/', "<?php echo '\$1'; ?>\n", $curr_split);
- if (isset($cache_parts[0][$curr_idx])) {
- $_template->properties['has_nocache_code'] = true;
- // remove nocache tags from cache output
- $output .= preg_replace("!/\*/?%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!", '', $cache_parts[0][$curr_idx]);
- }
- }
- if (!$no_output_filter && !$_template->has_nocache_code && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) {
- $output = Smarty_Internal_Filter_Handler::runFilter('output', $output, $_template);
- }
- // rendering (must be done before writing cache file because of {function} nocache handling)
- /** @var Smarty_Internal_Template $_smarty_tpl
- * used in evaluated code
- */
- $_smarty_tpl = $_template;
- try {
- ob_start();
- eval("?>" . $output);
- $_output = ob_get_clean();
- }
- catch (Exception $e) {
- ob_get_clean();
- throw $e;
- }
- // write cache file content
- $_template->writeCachedContent($output);
- if ($this->smarty->debugging) {
- Smarty_Internal_Debug::end_cache($_template);
- }
- } else {
- // var_dump('renderTemplate', $_template->has_nocache_code, $_template->template_resource, $_template->properties['nocache_hash'], $_template->parent->properties['nocache_hash'], $_output);
- if (!empty($_template->properties['nocache_hash']) && !empty($_template->parent->properties['nocache_hash'])) {
- // replace nocache_hash
- $_output = str_replace("{$_template->properties['nocache_hash']}", $_template->parent->properties['nocache_hash'], $_output);
- $_template->parent->has_nocache_code = $_template->parent->has_nocache_code || $_template->has_nocache_code;
- }
- }
- } else {
- if ($this->smarty->debugging) {
- Smarty_Internal_Debug::start_cache($_template);
- }
- try {
- ob_start();
- array_unshift($_template->_capture_stack, array());
- //
- // render cached template
- //
- $_template->properties['unifunc']($_template);
- // any unclosed {capture} tags ?
- if (isset($_template->_capture_stack[0][0])) {
- $_template->capture_error();
- }
- array_shift($_template->_capture_stack);
- $_output = ob_get_clean();
- }
- catch (Exception $e) {
- ob_get_clean();
- throw $e;
- }
- if ($this->smarty->debugging) {
- Smarty_Internal_Debug::end_cache($_template);
- }
- }
- if ((!$this->caching || $_template->has_nocache_code || $_template->source->recompiled) && !$no_output_filter && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) {
- $_output = Smarty_Internal_Filter_Handler::runFilter('output', $_output, $_template);
- }
- if (isset($this->error_reporting)) {
- error_reporting($_smarty_old_error_level);
- }
- // display or fetch
- if ($display) {
- if ($this->caching && $this->cache_modified_check) {
- $_isCached = $_template->isCached() && !$_template->has_nocache_code;
- $_last_modified_date = @substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
- if ($_isCached && $_template->cached->timestamp <= strtotime($_last_modified_date)) {
- switch (PHP_SAPI) {
- case 'cgi': // php-cgi < 5.3
- case 'cgi-fcgi': // php-cgi >= 5.3
- case 'fpm-fcgi': // php-fpm >= 5.3.3
- header('Status: 304 Not Modified');
- break;
-
- case 'cli':
- if ( /* ^phpunit */
- !empty($_SERVER['SMARTY_PHPUNIT_DISABLE_HEADERS']) /* phpunit$ */
- ) {
- $_SERVER['SMARTY_PHPUNIT_HEADERS'][] = '304 Not Modified';
- }
- break;
-
- default:
- header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
- break;
- }
- } else {
- switch (PHP_SAPI) {
- case 'cli':
- if ( /* ^phpunit */
- !empty($_SERVER['SMARTY_PHPUNIT_DISABLE_HEADERS']) /* phpunit$ */
- ) {
- $_SERVER['SMARTY_PHPUNIT_HEADERS'][] = 'Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->cached->timestamp) . ' GMT';
- }
- break;
-
- default:
- header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->cached->timestamp) . ' GMT');
- break;
- }
- echo $_output;
- }
- } else {
- echo $_output;
- }
- // debug output
- if ($this->smarty->debugging) {
- Smarty_Internal_Debug::display_debug($_template);
- }
- if ($merge_tpl_vars) {
- // restore local variables
- $_template->tpl_vars = $save_tpl_vars;
- $_template->config_vars = $save_config_vars;
- }
-
- return;
- } else {
- if ($merge_tpl_vars) {
- // restore local variables
- $_template->tpl_vars = $save_tpl_vars;
- $_template->config_vars = $save_config_vars;
- }
- // return fetched content
- return $_output;
- }
- }
-
- /**
- * displays a Smarty template
- *
- * @param string $template the resource handle of the template file or template object
- * @param mixed $cache_id cache id to be used with this template
- * @param mixed $compile_id compile id to be used with this template
- * @param object $parent next higher level of Smarty variables
- */
- public function display($template = null, $cache_id = null, $compile_id = null, $parent = null)
- {
- // display template
- $this->fetch($template, $cache_id, $compile_id, $parent, true);
- }
-
- /**
- * test if cache is valid
- *
- * @param string|object $template the resource handle of the template file or template object
- * @param mixed $cache_id cache id to be used with this template
- * @param mixed $compile_id compile id to be used with this template
- * @param object $parent next higher level of Smarty variables
- *
- * @return boolean cache status
- */
- public function isCached($template = null, $cache_id = null, $compile_id = null, $parent = null)
- {
- if ($template === null && $this instanceof $this->template_class) {
- return $this->cached->valid;
- }
- if (!($template instanceof $this->template_class)) {
- if ($parent === null) {
- $parent = $this;
- }
- $template = $this->smarty->createTemplate($template, $cache_id, $compile_id, $parent, false);
- }
- // return cache status of template
- return $template->cached->valid;
- }
-
- /**
- * creates a data object
- *
- * @param object $parent next higher level of Smarty variables
- *
- * @returns Smarty_Data data object
- */
- public function createData($parent = null)
- {
- return new Smarty_Data($parent, $this);
- }
-
- /**
- * Registers plugin to be used in templates
- *
- * @param string $type plugin type
- * @param string $tag name of template tag
- * @param callback $callback PHP callback to register
- * @param boolean $cacheable if true (default) this fuction is cachable
- * @param array $cache_attr caching attributes if any
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- * @throws SmartyException when the plugin tag is invalid
- */
- public function registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = null)
- {
- if (isset($this->smarty->registered_plugins[$type][$tag])) {
- throw new SmartyException("Plugin tag \"{$tag}\" already registered");
- } elseif (!is_callable($callback)) {
- throw new SmartyException("Plugin \"{$tag}\" not callable");
- } else {
- $this->smarty->registered_plugins[$type][$tag] = array($callback, (bool) $cacheable, (array) $cache_attr);
- }
-
- return $this;
- }
-
- /**
- * Unregister Plugin
- *
- * @param string $type of plugin
- * @param string $tag name of plugin
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function unregisterPlugin($type, $tag)
- {
- if (isset($this->smarty->registered_plugins[$type][$tag])) {
- unset($this->smarty->registered_plugins[$type][$tag]);
- }
-
- return $this;
- }
-
- /**
- * Registers a resource to fetch a template
- *
- * @param string $type name of resource type
- * @param Smarty_Resource|array $callback or instance of Smarty_Resource, or array of callbacks to handle resource (deprecated)
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function registerResource($type, $callback)
- {
- $this->smarty->registered_resources[$type] = $callback instanceof Smarty_Resource ? $callback : array($callback, false);
-
- return $this;
- }
-
- /**
- * Unregisters a resource
- *
- * @param string $type name of resource type
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function unregisterResource($type)
- {
- if (isset($this->smarty->registered_resources[$type])) {
- unset($this->smarty->registered_resources[$type]);
- }
-
- return $this;
- }
-
- /**
- * Registers a cache resource to cache a template's output
- *
- * @param string $type name of cache resource type
- * @param Smarty_CacheResource $callback instance of Smarty_CacheResource to handle output caching
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function registerCacheResource($type, Smarty_CacheResource $callback)
- {
- $this->smarty->registered_cache_resources[$type] = $callback;
-
- return $this;
- }
-
- /**
- * Unregisters a cache resource
- *
- * @param string $type name of cache resource type
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function unregisterCacheResource($type)
- {
- if (isset($this->smarty->registered_cache_resources[$type])) {
- unset($this->smarty->registered_cache_resources[$type]);
- }
-
- return $this;
- }
-
- /**
- * Registers object to be used in templates
- *
- * @param $object_name
- * @param object $object_impl the referenced PHP object to register
- * @param array $allowed list of allowed methods (empty = all)
- * @param boolean $smarty_args smarty argument format, else traditional
- * @param array $block_methods list of block-methods
- *
- * @throws SmartyException
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
- {
- // test if allowed methods callable
- if (!empty($allowed)) {
- foreach ((array) $allowed as $method) {
- if (!is_callable(array($object_impl, $method)) && !property_exists($object_impl, $method)) {
- throw new SmartyException("Undefined method or property '$method' in registered object");
- }
- }
- }
- // test if block methods callable
- if (!empty($block_methods)) {
- foreach ((array) $block_methods as $method) {
- if (!is_callable(array($object_impl, $method))) {
- throw new SmartyException("Undefined method '$method' in registered object");
- }
- }
- }
- // register the object
- $this->smarty->registered_objects[$object_name] =
- array($object_impl, (array) $allowed, (boolean) $smarty_args, (array) $block_methods);
-
- return $this;
- }
-
- /**
- * return a reference to a registered object
- *
- * @param string $name object name
- *
- * @return object
- * @throws SmartyException if no such object is found
- */
- public function getRegisteredObject($name)
- {
- if (!isset($this->smarty->registered_objects[$name])) {
- throw new SmartyException("'$name' is not a registered object");
- }
- if (!is_object($this->smarty->registered_objects[$name][0])) {
- throw new SmartyException("registered '$name' is not an object");
- }
-
- return $this->smarty->registered_objects[$name][0];
- }
-
- /**
- * unregister an object
- *
- * @param string $name object name
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function unregisterObject($name)
- {
- if (isset($this->smarty->registered_objects[$name])) {
- unset($this->smarty->registered_objects[$name]);
- }
-
- return $this;
- }
-
- /**
- * Registers static classes to be used in templates
- *
- * @param $class_name
- * @param string $class_impl the referenced PHP class to register
- *
- * @throws SmartyException
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function registerClass($class_name, $class_impl)
- {
- // test if exists
- if (!class_exists($class_impl)) {
- throw new SmartyException("Undefined class '$class_impl' in register template class");
- }
- // register the class
- $this->smarty->registered_classes[$class_name] = $class_impl;
-
- return $this;
- }
-
- /**
- * Registers a default plugin handler
- *
- * @param callable $callback class/method name
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- * @throws SmartyException if $callback is not callable
- */
- public function registerDefaultPluginHandler($callback)
- {
- if (is_callable($callback)) {
- $this->smarty->default_plugin_handler_func = $callback;
- } else {
- throw new SmartyException("Default plugin handler '$callback' not callable");
- }
-
- return $this;
- }
-
- /**
- * Registers a default template handler
- *
- * @param callable $callback class/method name
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- * @throws SmartyException if $callback is not callable
- */
- public function registerDefaultTemplateHandler($callback)
- {
- if (is_callable($callback)) {
- $this->smarty->default_template_handler_func = $callback;
- } else {
- throw new SmartyException("Default template handler '$callback' not callable");
- }
-
- return $this;
- }
-
- /**
- * Registers a default template handler
- *
- * @param callable $callback class/method name
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- * @throws SmartyException if $callback is not callable
- */
- public function registerDefaultConfigHandler($callback)
- {
- if (is_callable($callback)) {
- $this->smarty->default_config_handler_func = $callback;
- } else {
- throw new SmartyException("Default config handler '$callback' not callable");
- }
-
- return $this;
- }
-
- /**
- * Registers a filter function
- *
- * @param string $type filter type
- * @param callback $callback
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function registerFilter($type, $callback)
- {
- $this->smarty->registered_filters[$type][$this->_get_filter_name($callback)] = $callback;
-
- return $this;
- }
-
- /**
- * Unregisters a filter function
- *
- * @param string $type filter type
- * @param callback $callback
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function unregisterFilter($type, $callback)
- {
- $name = $this->_get_filter_name($callback);
- if (isset($this->smarty->registered_filters[$type][$name])) {
- unset($this->smarty->registered_filters[$type][$name]);
- }
-
- return $this;
- }
-
- /**
- * Return internal filter name
- *
- * @param callback $function_name
- *
- * @return string internal filter name
- */
- public function _get_filter_name($function_name)
- {
- if (is_array($function_name)) {
- $_class_name = (is_object($function_name[0]) ?
- get_class($function_name[0]) : $function_name[0]);
-
- return $_class_name . '_' . $function_name[1];
- } else {
- return $function_name;
- }
- }
-
- /**
- * load a filter of specified type and name
- *
- * @param string $type filter type
- * @param string $name filter name
- *
- * @throws SmartyException if filter could not be loaded
- */
- public function loadFilter($type, $name)
- {
- $_plugin = "smarty_{$type}filter_{$name}";
- $_filter_name = $_plugin;
- if ($this->smarty->loadPlugin($_plugin)) {
- if (class_exists($_plugin, false)) {
- $_plugin = array($_plugin, 'execute');
- }
- if (is_callable($_plugin)) {
- $this->smarty->registered_filters[$type][$_filter_name] = $_plugin;
-
- return true;
- }
- }
- throw new SmartyException("{$type}filter \"{$name}\" not callable");
- }
-
- /**
- * unload a filter of specified type and name
- *
- * @param string $type filter type
- * @param string $name filter name
- *
- * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
- */
- public function unloadFilter($type, $name)
- {
- $_filter_name = "smarty_{$type}filter_{$name}";
- if (isset($this->smarty->registered_filters[$type][$_filter_name])) {
- unset ($this->smarty->registered_filters[$type][$_filter_name]);
- }
-
- return $this;
- }
-
- /**
- * preg_replace callback to convert camelcase getter/setter to underscore property names
- *
- * @param string $match match string
- *
- * @return string replacemant
- */
- private function replaceCamelcase($match)
- {
- return "_" . strtolower($match[1]);
- }
-
- /**
- * Handle unknown class methods
- *
- * @param string $name unknown method-name
- * @param array $args argument array
- *
- * @throws SmartyException
- */
- public function __call($name, $args)
- {
- static $_prefixes = array('set' => true, 'get' => true);
- static $_resolved_property_name = array();
- static $_resolved_property_source = array();
-
- // method of Smarty object?
- if (method_exists($this->smarty, $name)) {
- return call_user_func_array(array($this->smarty, $name), $args);
- }
- // see if this is a set/get for a property
- $first3 = strtolower(substr($name, 0, 3));
- if (isset($_prefixes[$first3]) && isset($name[3]) && $name[3] !== '_') {
- if (isset($_resolved_property_name[$name])) {
- $property_name = $_resolved_property_name[$name];
- } else {
- // try to keep case correct for future PHP 6.0 case-sensitive class methods
- // lcfirst() not available < PHP 5.3.0, so improvise
- $property_name = strtolower(substr($name, 3, 1)) . substr($name, 4);
- // convert camel case to underscored name
- $property_name = preg_replace_callback('/([A-Z])/', array($this, 'replaceCamelcase'), $property_name);
- $_resolved_property_name[$name] = $property_name;
- }
- if (isset($_resolved_property_source[$property_name])) {
- $_is_this = $_resolved_property_source[$property_name];
- } else {
- $_is_this = null;
- if (property_exists($this, $property_name)) {
- $_is_this = true;
- } elseif (property_exists($this->smarty, $property_name)) {
- $_is_this = false;
- }
- $_resolved_property_source[$property_name] = $_is_this;
- }
- if ($_is_this) {
- if ($first3 == 'get') {
- return $this->$property_name;
- } else {
- return $this->$property_name = $args[0];
- }
- } elseif ($_is_this === false) {
- if ($first3 == 'get') {
- return $this->smarty->$property_name;
- } else {
- return $this->smarty->$property_name = $args[0];
- }
- } else {
- throw new SmartyException("property '$property_name' does not exist.");
- }
- }
- if ($name == 'Smarty') {
- throw new SmartyException("PHP5 requires you to call __construct() instead of Smarty()");
- }
- // must be unknown
- throw new SmartyException("Call of unknown method '$name'.");
- }
-}
+<?php
+/**
+ * Smarty Internal Plugin Smarty Template Base
+ * This file contains the basic shared methods for template handling
+ *
+ * @package Smarty
+ * @subpackage Template
+ * @author Uwe Tews
+ */
+
+/**
+ * Class with shared template methods
+ *
+ * @package Smarty
+ * @subpackage Template
+ */
+abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
+{
+ /**
+ * Set this if you want different sets of cache files for the same
+ * templates.
+ *
+ * @var string
+ */
+ public $cache_id = null;
+ /**
+ * Set this if you want different sets of compiled files for the same
+ * templates.
+ *
+ * @var string
+ */
+ public $compile_id = null;
+ /**
+ * caching enabled
+ *
+ * @var boolean
+ */
+ public $caching = false;
+ /**
+ * cache lifetime in seconds
+ *
+ * @var integer
+ */
+ public $cache_lifetime = 3600;
+
+ /**
+ * test if cache is valid
+ *
+ * @param string|object $template the resource handle of the template file or template object
+ * @param mixed $cache_id cache id to be used with this template
+ * @param mixed $compile_id compile id to be used with this template
+ * @param object $parent next higher level of Smarty variables
+ *
+ * @return boolean cache status
+ */
+ public function isCached($template = null, $cache_id = null, $compile_id = null, $parent = null)
+ {
+ if ($template === null && $this instanceof $this->template_class) {
+ $template = $this;
+ } else {
+ if (!($template instanceof $this->template_class)) {
+ if ($parent === null) {
+ $parent = $this;
+ }
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ $template = $smarty->createTemplate($template, $cache_id, $compile_id, $parent, false);
+ }
+ }
+ // return cache status of template
+ if (!isset($template->cached)) {
+ $template->loadCached();
+ }
+ return $template->cached->isCached($template);
+ }
+
+ /**
+ * creates a data object
+ *
+ * @param object $parent next higher level of Smarty variables
+ * @param string $name optional data block name
+ *
+ * @returns Smarty_Data data object
+ */
+ public function createData($parent = null, $name = null)
+ {
+ $dataObj = new Smarty_Data($parent, $this, $name);
+ if ($this->debugging) {
+ Smarty_Internal_Debug::register_data($dataObj);
+ }
+ return $dataObj;
+ }
+
+ /**
+ * Get unique template id
+ *
+ * @param string $template_name
+ * @param null|mixed $cache_id
+ * @param null|mixed $compile_id
+ *
+ * @return string
+ */
+ public function getTemplateId($template_name, $cache_id = null, $compile_id = null)
+ {
+ $cache_id = isset($cache_id) ? $cache_id : $this->cache_id;
+ $compile_id = isset($compile_id) ? $compile_id : $this->compile_id;
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if ($smarty->allow_ambiguous_resources) {
+ $_templateId = Smarty_Resource::getUniqueTemplateName($this, $template_name) . "#{$cache_id}#{$compile_id}";
+ } else {
+ $_templateId = $smarty->joined_template_dir . "#{$template_name}#{$cache_id}#{$compile_id}";
+ }
+ if (isset($_templateId[150])) {
+ $_templateId = sha1($_templateId);
+ }
+ return $_templateId;
+ }
+
+ /**
+ * Registers plugin to be used in templates
+ *
+ * @param string $type plugin type
+ * @param string $tag name of template tag
+ * @param callback $callback PHP callback to register
+ * @param boolean $cacheable if true (default) this fuction is cachable
+ * @param array $cache_attr caching attributes if any
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ * @throws SmartyException when the plugin tag is invalid
+ */
+ public function registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = null)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if (isset($smarty->registered_plugins[$type][$tag])) {
+ throw new SmartyException("Plugin tag \"{$tag}\" already registered");
+ } elseif (!is_callable($callback)) {
+ throw new SmartyException("Plugin \"{$tag}\" not callable");
+ } else {
+ $smarty->registered_plugins[$type][$tag] = array($callback, (bool) $cacheable, (array) $cache_attr);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Unregister Plugin
+ *
+ * @param string $type of plugin
+ * @param string $tag name of plugin
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function unregisterPlugin($type, $tag)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if (isset($smarty->registered_plugins[$type][$tag])) {
+ unset($smarty->registered_plugins[$type][$tag]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers a resource to fetch a template
+ *
+ * @param string $type name of resource type
+ * @param Smarty_Resource|array $callback or instance of Smarty_Resource, or array of callbacks to handle resource
+ * (deprecated)
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function registerResource($type, $callback)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ $smarty->registered_resources[$type] = $callback instanceof Smarty_Resource ? $callback : array($callback, false);
+
+ return $this;
+ }
+
+ /**
+ * Unregisters a resource
+ *
+ * @param string $type name of resource type
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function unregisterResource($type)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if (isset($smarty->registered_resources[$type])) {
+ unset($smarty->registered_resources[$type]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers a cache resource to cache a template's output
+ *
+ * @param string $type name of cache resource type
+ * @param Smarty_CacheResource $callback instance of Smarty_CacheResource to handle output caching
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function registerCacheResource($type, Smarty_CacheResource $callback)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ $smarty->registered_cache_resources[$type] = $callback;
+
+ return $this;
+ }
+
+ /**
+ * Unregisters a cache resource
+ *
+ * @param string $type name of cache resource type
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function unregisterCacheResource($type)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if (isset($smarty->registered_cache_resources[$type])) {
+ unset($smarty->registered_cache_resources[$type]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers object to be used in templates
+ *
+ * @param $object_name
+ * @param object $object_impl the referenced PHP object to register
+ * @param array $allowed list of allowed methods (empty = all)
+ * @param boolean $smarty_args smarty argument format, else traditional
+ * @param array $block_methods list of block-methods
+ *
+ * @throws SmartyException
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+ {
+ // test if allowed methods callable
+ if (!empty($allowed)) {
+ foreach ((array) $allowed as $method) {
+ if (!is_callable(array($object_impl, $method)) && !property_exists($object_impl, $method)) {
+ throw new SmartyException("Undefined method or property '$method' in registered object");
+ }
+ }
+ }
+ // test if block methods callable
+ if (!empty($block_methods)) {
+ foreach ((array) $block_methods as $method) {
+ if (!is_callable(array($object_impl, $method))) {
+ throw new SmartyException("Undefined method '$method' in registered object");
+ }
+ }
+ }
+ // register the object
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ $smarty->registered_objects[$object_name] =
+ array($object_impl, (array) $allowed, (boolean) $smarty_args, (array) $block_methods);
+
+ return $this;
+ }
+
+ /**
+ * return a reference to a registered object
+ *
+ * @param string $name object name
+ *
+ * @return object
+ * @throws SmartyException if no such object is found
+ */
+ public function getRegisteredObject($name)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if (!isset($smarty->registered_objects[$name])) {
+ throw new SmartyException("'$name' is not a registered object");
+ }
+ if (!is_object($smarty->registered_objects[$name][0])) {
+ throw new SmartyException("registered '$name' is not an object");
+ }
+
+ return $smarty->registered_objects[$name][0];
+ }
+
+ /**
+ * unregister an object
+ *
+ * @param string $name object name
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function unregisterObject($name)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if (isset($smarty->registered_objects[$name])) {
+ unset($smarty->registered_objects[$name]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers static classes to be used in templates
+ *
+ * @param $class_name
+ * @param string $class_impl the referenced PHP class to register
+ *
+ * @throws SmartyException
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function registerClass($class_name, $class_impl)
+ {
+ // test if exists
+ if (!class_exists($class_impl)) {
+ throw new SmartyException("Undefined class '$class_impl' in register template class");
+ }
+ // register the class
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ $smarty->registered_classes[$class_name] = $class_impl;
+
+ return $this;
+ }
+
+ /**
+ * Registers a default plugin handler
+ *
+ * @param callable $callback class/method name
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ * @throws SmartyException if $callback is not callable
+ */
+ public function registerDefaultPluginHandler($callback)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if (is_callable($callback)) {
+ $smarty->default_plugin_handler_func = $callback;
+ } else {
+ throw new SmartyException("Default plugin handler '$callback' not callable");
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers a default template handler
+ *
+ * @param callable $callback class/method name
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ * @throws SmartyException if $callback is not callable
+ */
+ public function registerDefaultTemplateHandler($callback)
+ {
+ Smarty_Internal_Extension_DefaultTemplateHandler::registerDefaultTemplateHandler($this, $callback);
+ return $this;
+ }
+
+ /**
+ * Registers a default template handler
+ *
+ * @param callable $callback class/method name
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ * @throws SmartyException if $callback is not callable
+ */
+ public function registerDefaultConfigHandler($callback)
+ {
+ Smarty_Internal_Extension_DefaultTemplateHandler::registerDefaultConfigHandler($this, $callback);
+ return $this;
+ }
+
+ /**
+ * Registers a filter function
+ *
+ * @param string $type filter type
+ * @param callback $callback
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function registerFilter($type, $callback)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ $smarty->registered_filters[$type][$this->_get_filter_name($callback)] = $callback;
+
+ return $this;
+ }
+
+ /**
+ * Unregisters a filter function
+ *
+ * @param string $type filter type
+ * @param callback $callback
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function unregisterFilter($type, $callback)
+ {
+ $name = $this->_get_filter_name($callback);
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ if (isset($smarty->registered_filters[$type][$name])) {
+ unset($smarty->registered_filters[$type][$name]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Return internal filter name
+ *
+ * @param callback $function_name
+ *
+ * @return string internal filter name
+ */
+ public function _get_filter_name($function_name)
+ {
+ if (is_array($function_name)) {
+ $_class_name = (is_object($function_name[0]) ?
+ get_class($function_name[0]) : $function_name[0]);
+
+ return $_class_name . '_' . $function_name[1];
+ } else {
+ return $function_name;
+ }
+ }
+
+ /**
+ * load a filter of specified type and name
+ *
+ * @param string $type filter type
+ * @param string $name filter name
+ *
+ * @throws SmartyException if filter could not be loaded
+ */
+ public function loadFilter($type, $name)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ $_plugin = "smarty_{$type}filter_{$name}";
+ $_filter_name = $_plugin;
+ if ($smarty->loadPlugin($_plugin)) {
+ if (class_exists($_plugin, false)) {
+ $_plugin = array($_plugin, 'execute');
+ }
+ if (is_callable($_plugin)) {
+ $smarty->registered_filters[$type][$_filter_name] = $_plugin;
+
+ return true;
+ }
+ }
+ throw new SmartyException("{$type}filter \"{$name}\" not callable");
+ }
+
+ /**
+ * unload a filter of specified type and name
+ *
+ * @param string $type filter type
+ * @param string $name filter name
+ *
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
+ * Smarty_Internal_Template) instance for chaining
+ */
+ public function unloadFilter($type, $name)
+ {
+ $smarty = isset($this->smarty) ? $this->smarty : $this;
+ $_filter_name = "smarty_{$type}filter_{$name}";
+ if (isset($smarty->registered_filters[$type][$_filter_name])) {
+ unset ($smarty->registered_filters[$type][$_filter_name]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * preg_replace callback to convert camelcase getter/setter to underscore property names
+ *
+ * @param string $match match string
+ *
+ * @return string replacemant
+ */
+ private function replaceCamelcase($match)
+ {
+ return "_" . strtolower($match[1]);
+ }
+
+ /**
+ * Handle unknown class methods
+ *
+ * @param string $name unknown method-name
+ * @param array $args argument array
+ *
+ * @throws SmartyException
+ */
+ public function __call($name, $args)
+ {
+ static $_prefixes = array('set' => true, 'get' => true);
+ static $_resolved_property_name = array();
+ static $_resolved_property_source = array();
+
+ // see if this is a set/get for a property
+ $first3 = strtolower(substr($name, 0, 3));
+ if (isset($_prefixes[$first3]) && isset($name[3]) && $name[3] !== '_') {
+ if (isset($_resolved_property_name[$name])) {
+ $property_name = $_resolved_property_name[$name];
+ } else {
+ // try to keep case correct for future PHP 6.0 case-sensitive class methods
+ // lcfirst() not available < PHP 5.3.0, so improvise
+ $property_name = strtolower(substr($name, 3, 1)) . substr($name, 4);
+ // convert camel case to underscored name
+ $property_name = preg_replace_callback('/([A-Z])/', array($this, 'replaceCamelcase'), $property_name);
+ $_resolved_property_name[$name] = $property_name;
+ }
+ if (isset($_resolved_property_source[$property_name])) {
+ $status = $_resolved_property_source[$property_name];
+ } else {
+ $status = null;
+ if (property_exists($this, $property_name)) {
+ $status = true;
+ } elseif (property_exists($this->smarty, $property_name)) {
+ $status = false;
+ }
+ $_resolved_property_source[$property_name] = $status;
+ }
+ $smarty = null;
+ if ($status === true) {
+ $smarty = $this;
+ } elseif ($status === false) {
+ $smarty = $this->smarty;
+ }
+ if ($smarty) {
+ if ($first3 == 'get') {
+ return $smarty->$property_name;
+ } else {
+ return $smarty->$property_name = $args[0];
+ }
+ }
+ throw new SmartyException("property '$property_name' does not exist.");
+ }
+ throw new SmartyException("Call of unknown method '$name'.");
+ }
+}
+
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php b/library/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
index d00bfb8f4..7fc6c3252 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
@@ -17,26 +17,27 @@
*/
abstract class Smarty_Internal_TemplateCompilerBase
{
+
/**
- * hash for nocache sections
+ * Smarty object
*
- * @var mixed
+ * @var Smarty
*/
- private $nocache_hash = null;
+ public $smarty = null;
/**
- * suppress generation of nocache code
+ * hash for nocache sections
*
- * @var bool
+ * @var mixed
*/
- public $suppressNocacheProcessing = false;
+ public $nocache_hash = null;
/**
- * suppress generation of merged template code
+ * suppress generation of nocache code
*
* @var bool
*/
- public $suppressMergedTemplates = false;
+ public $suppressNocacheProcessing = false;
/**
* compile tag objects
@@ -60,11 +61,25 @@ abstract class Smarty_Internal_TemplateCompilerBase
public $template = null;
/**
- * merged templates
+ * merged included sub template data
*
* @var array
*/
- public $merged_templates = array();
+ public $mergedSubTemplatesData = array();
+
+ /**
+ * merged sub template code
+ *
+ * @var array
+ */
+ public $mergedSubTemplatesCode = array();
+
+ /**
+ * collected template properties during compilation
+ *
+ * @var array
+ */
+ public $templateProperties = array();
/**
* sources which must be compiled
@@ -114,6 +129,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
* @var string
*/
public $trace_filepath = '';
+
/**
* stack for tracing file and line of nested {block} tags
*
@@ -178,13 +194,27 @@ abstract class Smarty_Internal_TemplateCompilerBase
public $compiles_template_function = false;
/**
- * called subfuntions from template function
+ * called sub functions from template function
*
* @var array
*/
public $called_functions = array();
/**
+ * compiled template function code
+ *
+ * @var string
+ */
+ public $templateFunctionCode = '';
+
+ /**
+ * php_handling setting either from Smarty or security
+ *
+ * @var int
+ */
+ public $php_handling = 0;
+
+ /**
* flags for used modifier plugins
*
* @var array
@@ -199,6 +229,76 @@ abstract class Smarty_Internal_TemplateCompilerBase
public $known_modifier_type = array();
/**
+ * parent compiler object for merged subtemplates and template functions
+ *
+ * @var Smarty_Internal_TemplateCompilerBase
+ */
+ public $parent_compiler = null;
+
+ /**
+ * Flag true when compiling nocache section
+ *
+ * @var bool
+ */
+ public $nocache = false;
+
+ /**
+ * Flag true when tag is compiled as nocache
+ *
+ * @var bool
+ */
+ public $tag_nocache = false;
+
+ /**
+ * Flag to restart parsing
+ *
+ * @var bool
+ */
+ public $abort_and_recompile = false;
+
+ /**
+ * Compiled tag prefix code
+ *
+ * @var array
+ */
+ public $prefix_code = array();
+
+ /**
+ * Prefix code stack
+ *
+ * @var array
+ */
+ public $prefixCodeStack = array();
+
+ /**
+ * Tag has compiled code
+ *
+ * @var bool
+ */
+ public $has_code = false;
+
+ /**
+ * A variable string was compiled
+ *
+ * @var bool
+ */
+ public $has_variable_string = false;
+
+ /**
+ * Tag creates output
+ *
+ * @var bool
+ */
+ public $has_output = false;
+
+ /**
+ * Strip preg pattern
+ *
+ * @var string
+ */
+ public $stripRegEx = '![\t ]*[\r\n]+[\t ]*!';
+
+ /**
* method to compile a Smarty template
*
* @param mixed $_content template source
@@ -212,31 +312,34 @@ abstract class Smarty_Internal_TemplateCompilerBase
*/
public function __construct()
{
- $this->nocache_hash = str_replace(array('.', ','), '-', uniqid(rand(), true));
+ $this->nocache_hash = str_replace(array('.', ','), '_', uniqid(rand(), true));
}
/**
* Method to compile a Smarty template
*
- * @param Smarty_Internal_Template $template template object to compile
- * @param bool $nocache true is shall be compiled in nocache mode
+ * @param Smarty_Internal_Template $template template object to compile
+ * @param bool $nocache true is shall be compiled in nocache mode
+ * @param null|Smarty_Internal_TemplateCompilerBase $parent_compiler
*
- * @return bool true if compiling succeeded, false if it failed
+ * @return bool true if compiling succeeded, false if it failed
*/
- public function compileTemplate(Smarty_Internal_Template $template, $nocache = false)
+ public function compileTemplate(Smarty_Internal_Template $template, $nocache = null, $parent_compiler = null)
{
+ // save template object in compiler class
+ $this->template = $template;
+ if (isset($this->template->smarty->security_policy)) {
+ $this->php_handling = $this->template->smarty->security_policy->php_handling;
+ } else {
+ $this->php_handling = $this->template->smarty->php_handling;
+ }
+ $this->parent_compiler = $parent_compiler ? $parent_compiler : $this;
+ $nocache = isset($nocache) ? $nocache : false;
if (empty($template->properties['nocache_hash'])) {
$template->properties['nocache_hash'] = $this->nocache_hash;
} else {
$this->nocache_hash = $template->properties['nocache_hash'];
}
- // flag for nochache sections
- $this->nocache = $nocache;
- $this->tag_nocache = false;
- // save template object in compiler class
- $this->template = $template;
- // reset has nocache code flag
- $this->template->has_nocache_code = false;
$save_source = $this->template->source;
// template header code
$template_header = '';
@@ -259,9 +362,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
Smarty_Internal_Debug::start_compile($this->template);
}
$no_sources = count($this->sources);
- if ($loop || $no_sources) {
- $this->template->properties['file_dependency'][$this->template->source->uid] = array($this->template->source->filepath, $this->template->source->timestamp, $this->template->source->type);
- }
+ $this->parent_compiler->template->properties['file_dependency'][$this->template->source->uid] = array($this->template->source->filepath, $this->template->source->timestamp, $this->template->source->type);
$loop ++;
if ($no_sources) {
$this->inheritance_child = true;
@@ -269,6 +370,13 @@ abstract class Smarty_Internal_TemplateCompilerBase
$this->inheritance_child = false;
}
do {
+ // flag for nochache sections
+ $this->nocache = $nocache;
+ $this->tag_nocache = false;
+ // reset has nocache code flag
+ $this->template->has_nocache_code = false;
+ $this->has_variable_string = false;
+ $this->prefix_code = array();
$_compiled_code = '';
// flag for aborting current and start recompile
$this->abort_and_recompile = false;
@@ -280,7 +388,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
$_content = Smarty_Internal_Filter_Handler::runFilter('pre', $_content, $template);
}
// call compiler
- $_compiled_code = $this->doCompile($_content);
+ $_compiled_code = $this->doCompile($_content, true);
}
} while ($this->abort_and_recompile);
if ($this->smarty->debugging) {
@@ -292,12 +400,12 @@ abstract class Smarty_Internal_TemplateCompilerBase
unset($save_source);
$this->smarty->_current_file = $this->template->source->filepath;
// free memory
- unset($this->parser->root_buffer, $this->parser->current_buffer, $this->parser, $this->lex, $this->template);
+ unset($this->parser->root_buffer, $this->parser->current_buffer, $this->parser, $this->lex);
self::$_tag_objects = array();
// return compiled code to template object
$merged_code = '';
- if (!$this->suppressMergedTemplates && !empty($this->merged_templates)) {
- foreach ($this->merged_templates as $code) {
+ if (!empty($this->mergedSubTemplatesCode)) {
+ foreach ($this->mergedSubTemplatesCode as $code) {
$merged_code .= $code;
}
}
@@ -306,20 +414,33 @@ abstract class Smarty_Internal_TemplateCompilerBase
$_compiled_code = Smarty_Internal_Filter_Handler::runFilter('post', $_compiled_code, $template);
}
if ($this->suppressTemplatePropertyHeader) {
- $code = $_compiled_code . $merged_code;
+ $_compiled_code .= $merged_code;
} else {
- $code = $template_header . $template->createTemplateCodeFrame($_compiled_code) . $merged_code;
+ $_compiled_code = $template_header . Smarty_Internal_Extension_CodeFrame::create($template, $_compiled_code) . $merged_code;
+ }
+ if (!empty($this->templateFunctionCode)) {
+ // run postfilter if required on compiled template code
+ if ((isset($this->smarty->autoload_filters['post']) || isset($this->smarty->registered_filters['post'])) && !$this->suppressFilter) {
+ $_compiled_code .= Smarty_Internal_Filter_Handler::runFilter('post', $this->templateFunctionCode, $template);
+ } else {
+ $_compiled_code .= $this->templateFunctionCode;
+ }
}
// unset content because template inheritance could have replace source with parent code
unset ($template->source->content);
-
- return $code;
+ $this->parent_compiler = null;
+ $this->template = null;
+ return $_compiled_code;
}
/**
* Compile Tag
* This is a call back from the lexer/parser
- * It executes the required compile plugin for the Smarty tag
+ *
+ * Save current prefix code
+ * Compile tag
+ * Merge tag prefix code with saved one
+ * (required nested tags in attributes)
*
* @param string $tag tag name
* @param array $args array with tag attributes
@@ -331,6 +452,27 @@ abstract class Smarty_Internal_TemplateCompilerBase
*/
public function compileTag($tag, $args, $parameter = array())
{
+ $this->prefixCodeStack[] = $this->prefix_code;
+ $this->prefix_code = array();
+ $result = $this->compileTag2($tag, $args, $parameter);
+ $this->prefix_code = array_merge($this->prefix_code, array_pop($this->prefixCodeStack));
+ return $result;
+ }
+
+ /**
+ * Compile Tag
+ *
+ * @param string $tag tag name
+ * @param array $args array with tag attributes
+ * @param array $parameter array with compilation parameter
+ *
+ * @throws SmartyCompilerException
+ * @throws SmartyException
+ * @return string compiled code
+ */
+ private function compileTag2($tag, $args, $parameter)
+ {
+ $plugin_type = '';
// $args contains the attributes parsed and compiled by the lexer/parser
// assume that tag does compile into code, but creates no HTML output
$this->has_code = true;
@@ -340,14 +482,13 @@ abstract class Smarty_Internal_TemplateCompilerBase
$this->template->used_tags[] = array($tag, $args);
}
// check nocache option flag
- if (in_array("'nocache'", $args) || in_array(array('nocache' => 'true'), $args)
- || in_array(array('nocache' => '"true"'), $args) || in_array(array('nocache' => "'true'"), $args)
+ if (in_array("'nocache'", $args) || in_array(array('nocache' => 'true'), $args) || in_array(array('nocache' => '"true"'), $args) || in_array(array('nocache' => "'true'"), $args)
) {
$this->tag_nocache = true;
}
// compile the smarty tag (required compile classes to compile the tag are autoloaded)
if (($_output = $this->callTagCompiler($tag, $args, $parameter)) === false) {
- if (isset($this->smarty->template_functions[$tag])) {
+ if (isset($this->parent_compiler->templateProperties['tpl_function'][$tag])) {
// template defined by {template} tag
$args['_attr']['name'] = "'" . $tag . "'";
$_output = $this->callTagCompiler('call', $args, $parameter);
@@ -381,8 +522,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
// check if tag is a registered object
if (isset($this->smarty->registered_objects[$tag]) && isset($parameter['object_method'])) {
$method = $parameter['object_method'];
- if (!in_array($method, $this->smarty->registered_objects[$tag][3]) &&
- (empty($this->smarty->registered_objects[$tag][1]) || in_array($method, $this->smarty->registered_objects[$tag][1]))
+ if (!in_array($method, $this->smarty->registered_objects[$tag][3]) && (empty($this->smarty->registered_objects[$tag][1]) || in_array($method, $this->smarty->registered_objects[$tag][1]))
) {
return $this->callTagCompiler('private_object_function', $args, $parameter, $tag, $method);
} elseif (in_array($method, $this->smarty->registered_objects[$tag][3])) {
@@ -549,6 +689,42 @@ abstract class Smarty_Internal_TemplateCompilerBase
}
/**
+ * compile variable
+ *
+ * @param string $variable
+ *
+ * @return string
+ */
+ public function compileVariable($variable)
+ {
+ if (strpos($variable, '(') == 0) {
+ // not a variable variable
+ $var = trim($variable, '\'');
+ $this->tag_nocache = $this->tag_nocache | $this->template->getVariable($var, null, true, false)->nocache;
+ $this->template->properties['variables'][$var] = $this->tag_nocache | $this->nocache;
+ }
+ return '$_smarty_tpl->tpl_vars[' . $variable . ']->value';
+ }
+
+ /**
+ * This method is called from parser to process a text content section
+ * - remove text from inheritance child templates as they may generate output
+ * - strip text if strip is enabled
+ *
+ * @param string $text
+ *
+ * @return null|\Smarty_Internal_ParseTree_Text
+ */
+ public function processText($text)
+ {
+ if ($this->parser->strip) {
+ return new Smarty_Internal_ParseTree_Text($this->parser, preg_replace($this->stripRegEx, '', $text));
+ } else {
+ return new Smarty_Internal_ParseTree_Text($this->parser, $text);
+ }
+ }
+
+ /**
* lazy loads internal compile plugin for tag and calls the compile method
* compile objects cached for reuse.
* class name format: Smarty_Internal_Compile_TagName
@@ -564,22 +740,21 @@ abstract class Smarty_Internal_TemplateCompilerBase
*/
public function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null)
{
- // re-use object if already exists
- if (isset(self::$_tag_objects[$tag])) {
+ // check if tag allowed by security
+ if (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) {
+ // re-use object if already exists
+ if (!isset(self::$_tag_objects[$tag])) {
+ // lazy load internal compiler plugin
+ $class_name = 'Smarty_Internal_Compile_' . $tag;
+ if ($this->smarty->loadPlugin($class_name)) {
+ self::$_tag_objects[$tag] = new $class_name;
+ } else {
+ return false;
+ }
+ }
// compile this tag
return self::$_tag_objects[$tag]->compile($args, $this, $param1, $param2, $param3);
}
- // lazy load internal compiler plugin
- $class_name = 'Smarty_Internal_Compile_' . $tag;
- if ($this->smarty->loadPlugin($class_name)) {
- // check if tag allowed by security
- if (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) {
- // use plugin if found
- self::$_tag_objects[$tag] = new $class_name;
- // compile this tag
- return self::$_tag_objects[$tag]->compile($args, $this, $param1, $param2, $param3);
- }
- }
// no internal compile plugin for this tag
return false;
}
@@ -656,9 +831,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
$callback = null;
$script = null;
$cacheable = true;
- $result = call_user_func_array(
- $this->smarty->default_plugin_handler_func, array($tag, $plugin_type, $this->template, &$callback, &$script, &$cacheable)
- );
+ $result = call_user_func_array($this->smarty->default_plugin_handler_func, array($tag, $plugin_type, $this->template, &$callback, &$script, &$cacheable));
if ($result) {
$this->tag_nocache = $this->tag_nocache || !$cacheable;
if ($script !== null) {
@@ -670,7 +843,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
$this->template->required_plugins['compiled'][$tag][$plugin_type]['file'] = $script;
$this->template->required_plugins['compiled'][$tag][$plugin_type]['function'] = $callback;
}
- include_once $script;
+ require_once $script;
} else {
$this->trigger_template_error("Default plugin handler: Returned script file \"{$script}\" for \"{$tag}\" not found");
}
@@ -691,6 +864,25 @@ abstract class Smarty_Internal_TemplateCompilerBase
}
/**
+ * Append code segments and remove unneeded ?> <?php transitions
+ *
+ * @param string $left
+ * @param string $right
+ *
+ * @return string
+ */
+ public function appendCode($left, $right)
+ {
+ if (preg_match('/\s*\?>\s*$/', $left) && preg_match('/^\s*<\?php\s+/', $right)) {
+ $left = preg_replace('/\s*\?>\s*$/', "\n", $left);
+ $left .= preg_replace('/^\s*<\?php\s+/', '', $right);
+ } else {
+ $left .= $right;
+ }
+ return $left;
+ }
+
+ /**
* Inject inline code for nocache template sections
* This method gets the content of each template element from the parser.
* If the content is compiled code and it should be not cached the code is injected
@@ -706,8 +898,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
// If the template is not evaluated and we have a nocache section and or a nocache tag
if ($is_code && !empty($content)) {
// generate replacement code
- if ((!($this->template->source->recompiled) || $this->forceNocache) && $this->template->caching && !$this->suppressNocacheProcessing &&
- ($this->nocache || $this->tag_nocache)
+ if ((!($this->template->source->recompiled) || $this->forceNocache) && $this->template->caching && !$this->suppressNocacheProcessing && ($this->nocache || $this->tag_nocache)
) {
$this->template->has_nocache_code = true;
$_output = addcslashes($content, '\'\\');
@@ -733,12 +924,24 @@ abstract class Smarty_Internal_TemplateCompilerBase
}
/**
+ * Generate nocache code string
+ *
+ * @param string $code PHP code
+ *
+ * @return string
+ */
+ public function makeNocacheCode($code)
+ {
+ return "echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/<?php " . str_replace("^#^", "'", addcslashes($code, '\'\\')) . "?>/*/%%SmartyNocache:{$this->nocache_hash}%%*/';\n";
+ }
+
+ /**
* push current file and line offset on stack for tracing {block} source lines
*
- * @param string $file new filename
- * @param string $uid uid of file
- * @param int $line line offset to source
- * @param bool $debug false debug end_compile shall not be called
+ * @param string $file new filename
+ * @param string $uid uid of file
+ * @param int $line line offset to source
+ * @param bool $debug false debug end_compile shall not be called
*/
public function pushTrace($file, $uid, $line, $debug = true)
{
@@ -756,7 +959,6 @@ abstract class Smarty_Internal_TemplateCompilerBase
/**
* restore file and line offset
-
*/
public function popTrace()
{
@@ -797,6 +999,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
// individual error message
$error_text .= $args;
} else {
+ $expect = array();
// expected token from parser
$error_text .= ' - Unexpected "' . $this->lex->value . '"';
if (count($this->parser->yy_get_expected_tokens($this->parser->yymajor)) <= 4) {
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_templatelexer.php b/library/Smarty/libs/sysplugins/smarty_internal_templatelexer.php
index 4de8a9c06..abf81d087 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_templatelexer.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_templatelexer.php
@@ -9,91 +9,212 @@
*/
/**
- * Smarty Internal Plugin Templatelexer
+ * 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;
- public $node;
+
+ /**
+ * current line
+ *
+ * @var int
+ */
public $line;
+
+ /**
+ * tag start line
+ *
+ * @var
+ */
public $taglineno;
- public $is_phpScript = false;
+
+ /**
+ * 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;
- public $smarty;
- public $literal_cnt = 0;
- private $heredoc_id_stack = Array();
+
+ /**
+ * 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;
- public $state_name = array(1 => 'TEXT', 2 => 'SMARTY', 3 => 'LITERAL', 4 => 'DOUBLEQUOTEDSTRING', 5 => 'CHILDBODY');
+
+ /**
+ * 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
- 'IDENTITY' => '===',
- 'NONEIDENTITY' => '!==',
- 'EQUALS' => '==',
- 'NOTEQUALS' => '!=',
- 'GREATEREQUAL' => '(>=,ge)',
- 'LESSEQUAL' => '(<=,le)',
- 'GREATERTHAN' => '(>,gt)',
- 'LESSTHAN' => '(<,lt)',
- 'MOD' => '(%,mod)',
- 'NOT' => '(!,not)',
- 'LAND' => '(&&,and)',
- 'LOR' => '(||,or)',
- 'LXOR' => 'xor',
- 'OPENP' => '(',
- 'CLOSEP' => ')',
- 'OPENB' => '[',
- 'CLOSEB' => ']',
- 'PTR' => '->',
- 'APTR' => '=>',
- 'EQUAL' => '=',
- 'NUMBER' => 'number',
- 'UNIMATH' => '+" , "-',
- 'MATH' => '*" , "/" , "%',
- 'INCDEC' => '++" , "--',
- 'SPACE' => ' ',
- 'DOLLAR' => '$',
- 'SEMICOLON' => ';',
- 'COLON' => ':',
- 'DOUBLECOLON' => '::',
- 'AT' => '@',
- 'HATCH' => '#',
- 'QUOTE' => '"',
- 'BACKTICK' => '`',
- 'VERT' => '|',
- 'DOT' => '.',
- 'COMMA' => '","',
- 'ANDSYM' => '"&"',
- 'QMARK' => '"?"',
- 'ID' => 'identifier',
- 'TEXT' => 'text',
- 'FAKEPHPSTARTTAG' => 'Fake PHP start tag',
- 'PHPSTARTTAG' => 'PHP start tag',
- 'PHPENDTAG' => 'PHP end tag',
- 'LITERALSTART' => 'Literal start',
- 'LITERALEND' => 'Literal end',
- 'LDELSLASH' => 'closing tag',
- 'COMMENT' => 'comment',
- 'AS' => 'as',
- 'TO' => 'to',
- );
-
- function __construct($data, $compiler)
- {
- // $this->data = preg_replace("/(\r\n|\r|\n)/", "\n", $data);
+ '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/', $this->data, $match)) {
+ 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 = preg_quote($this->smarty->left_delimiter, '~');
$this->ldel_length = strlen($this->smarty->left_delimiter);
- $this->rdel = preg_quote($this->smarty->right_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;
@@ -105,7 +226,16 @@ class Smarty_Internal_Templatelexer
$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()
@@ -146,51 +276,28 @@ class Smarty_Internal_Templatelexer
public function yylex1()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 1,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 1,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- 14 => 2,
- 17 => 0,
- 18 => 0,
- 19 => 0,
- 20 => 0,
- 21 => 0,
- 22 => 0,
- );
+ 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
}
- $yy_global_pattern = "/\G(\\{\\})|\G(" . $this->ldel . "\\*([\S\s]*?)\\*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*strip\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*\/strip\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\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*\/)|\G(" . $this->ldel . "\\s*)|\G((<script\\s+language\\s*=\\s*[\"']?\\s*php\\s*[\"']?\\s*>)|(<\\?(?:php\\w+|=|[a-zA-Z]+)?))|\G(\\?>)|\G(<\/script>)|\G(\\s*" . $this->rdel . ")|\G(<%)|\G(%>)|\G([\S\s])/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state TEXT');
+ 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
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r1_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r1_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -210,8 +317,7 @@ class Smarty_Internal_Templatelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
@@ -219,39 +325,33 @@ class Smarty_Internal_Templatelexer
const TEXT = 1;
- function yy_r1_1($yy_subpatterns)
+ function yy_r1_1()
{
$this->token = Smarty_Internal_Templateparser::TP_TEXT;
}
- function yy_r1_2($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_COMMENT;
- }
-
- function yy_r1_4($yy_subpatterns)
+ function yy_r1_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_TEXT;
+ 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->token = Smarty_Internal_Templateparser::TP_STRIPON;
+ $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_5($yy_subpatterns)
+ function yy_r1_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->token = Smarty_Internal_Templateparser::TP_STRIPOFF;
- }
+ $obj = new Smarty_Internal_Compile_Private_Php();
+ $obj->parsePhp($this);
}
- function yy_r1_6($yy_subpatterns)
+ 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) {
@@ -262,130 +362,28 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r1_7($yy_subpatterns)
- {
-
- 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_LDELIF;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
- }
-
- function yy_r1_9($yy_subpatterns)
- {
-
- 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_LDELFOR;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
- }
-
- function yy_r1_10($yy_subpatterns)
- {
-
- 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_LDELFOREACH;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
- }
-
- function yy_r1_11($yy_subpatterns)
- {
-
- 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_LDELSETFILTER;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
- }
-
- function yy_r1_12($yy_subpatterns)
- {
-
- 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_LDELSLASH;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
- }
-
- function yy_r1_13($yy_subpatterns)
+ 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->token = Smarty_Internal_Templateparser::TP_LDEL;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
- }
-
- function yy_r1_14($yy_subpatterns)
- {
-
- if (($script = strpos($this->value, '<s') === 0) || in_array($this->value, Array('<?', '<?=', '<?php'))) {
- if ($script) {
- $this->is_phpScript = true;
- }
- $this->token = Smarty_Internal_Templateparser::TP_PHPSTARTTAG;
- } elseif ($this->value == '<?xml') {
- $this->token = Smarty_Internal_Templateparser::TP_XMLTAG;
- } else {
- $this->token = Smarty_Internal_Templateparser::TP_TEXT;
- //$this->value = substr($this->value, 0, 2);
+ $this->yypushstate(self::TAG);
+ return true;
}
}
- function yy_r1_17($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_PHPENDTAG;
- }
-
- function yy_r1_18($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_PHPENDSCRIPT;
- }
-
- function yy_r1_19($yy_subpatterns)
+ function yy_r1_17()
{
$this->token = Smarty_Internal_Templateparser::TP_TEXT;
}
- function yy_r1_20($yy_subpatterns)
+ function yy_r1_18()
{
- $this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG;
- }
-
- function yy_r1_21($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG;
- }
-
- function yy_r1_22($yy_subpatterns)
- {
-
- $phpEndScript = $this->is_phpScript ? '|<\\/script>' : '';
$to = strlen($this->data);
- preg_match("/{$this->ldel}|<\?|<%|\?>|%>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>{$phpEndScript}/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
+ 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];
}
@@ -395,99 +393,28 @@ class Smarty_Internal_Templatelexer
public function yylex2()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 0,
- 3 => 1,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- 15 => 1,
- 17 => 1,
- 19 => 1,
- 21 => 0,
- 22 => 0,
- 23 => 0,
- 24 => 0,
- 25 => 0,
- 26 => 0,
- 27 => 0,
- 28 => 0,
- 29 => 0,
- 30 => 0,
- 31 => 0,
- 32 => 0,
- 33 => 0,
- 34 => 0,
- 35 => 0,
- 36 => 0,
- 37 => 0,
- 38 => 3,
- 42 => 0,
- 43 => 0,
- 44 => 0,
- 45 => 0,
- 46 => 0,
- 47 => 0,
- 48 => 0,
- 49 => 0,
- 50 => 1,
- 52 => 1,
- 54 => 0,
- 55 => 0,
- 56 => 0,
- 57 => 0,
- 58 => 0,
- 59 => 0,
- 60 => 0,
- 61 => 0,
- 62 => 0,
- 63 => 0,
- 64 => 0,
- 65 => 0,
- 66 => 0,
- 67 => 0,
- 68 => 0,
- 69 => 0,
- 70 => 1,
- 72 => 0,
- 73 => 0,
- 74 => 0,
- 75 => 0,
- 76 => 0,
- );
+ 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
}
- $yy_global_pattern = "/\G(\")|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$]smarty\\.block\\.(child|parent))|\G(\\$)|\G(\\s*" . $this->rdel . ")|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*===\\s*)|\G(\\s*!==\\s*)|\G(\\s*==\\s*|\\s+eq\\s+)|\G(\\s*!=\\s*|\\s*<>\\s*|\\s+(ne|neq)\\s+)|\G(\\s*>=\\s*|\\s+(ge|gte)\\s+)|\G(\\s*<=\\s*|\\s+(le|lte)\\s+)|\G(\\s*>\\s*|\\s+gt\\s+)|\G(\\s*<\\s*|\\s+lt\\s+)|\G(\\s+mod\\s+)|\G(!\\s*|not\\s+)|\G(\\s*&&\\s*|\\s*and\\s+)|\G(\\s*\\|\\|\\s*|\\s*or\\s+)|\G(\\s*xor\\s+)|\G(\\s+is\\s+odd\\s+by\\s+)|\G(\\s+is\\s+not\\s+odd\\s+by\\s+)|\G(\\s+is\\s+odd)|\G(\\s+is\\s+not\\s+odd)|\G(\\s+is\\s+even\\s+by\\s+)|\G(\\s+is\\s+not\\s+even\\s+by\\s+)|\G(\\s+is\\s+even)|\G(\\s+is\\s+not\\s+even)|\G(\\s+is\\s+div\\s+by\\s+)|\G(\\s+is\\s+not\\s+div\\s+by\\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(\\+\\+|--)|\G(\\s*(\\+|-)\\s*)|\G(\\s*(\\*|\/|%)\\s*)|\G(@)|\G(#)|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*=\\s*)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G(`)|\G(\\|)|\G(\\.)|\G(\\s*,\\s*)|\G(\\s*;)|\G(::)|\G(\\s*:\\s*)|\G(\\s*&\\s*)|\G(\\s*\\?\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\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*\/)|\G(" . $this->ldel . "\\s*)|\G([\S\s])/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state SMARTY');
+ 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
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r2_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r2_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -507,300 +434,321 @@ class Smarty_Internal_Templatelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
} // end function
- const SMARTY = 2;
+ const TAG = 2;
- function yy_r2_1($yy_subpatterns)
+ function yy_r2_1()
{
- $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
- $this->yypushstate(self::DOUBLEQUOTEDSTRING);
+ $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
+ $this->yybegin(self::TAGBODY);
+ $this->taglineno = $this->line;
}
- function yy_r2_2($yy_subpatterns)
+ function yy_r2_3()
{
- $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING;
+ $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
+ $this->yybegin(self::TAGBODY);
+ $this->taglineno = $this->line;
}
- function yy_r2_3($yy_subpatterns)
+ function yy_r2_4()
{
- $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT;
+ $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
+ $this->yybegin(self::TAGBODY);
$this->taglineno = $this->line;
}
- function yy_r2_5($yy_subpatterns)
+ function yy_r2_5()
{
- $this->token = Smarty_Internal_Templateparser::TP_DOLLAR;
+ $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER;
+ $this->yybegin(self::TAGBODY);
+ $this->taglineno = $this->line;
}
- function yy_r2_6($yy_subpatterns)
+ function yy_r2_6()
{
- $this->token = Smarty_Internal_Templateparser::TP_RDEL;
$this->yypopstate();
+ $this->token = Smarty_Internal_Templateparser::TP_SIMPLETAG;
+ $this->taglineno = $this->line;
}
- function yy_r2_7($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_ISIN;
- }
-
- function yy_r2_8($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_AS;
- }
-
- function yy_r2_9($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_TO;
- }
-
- function yy_r2_10($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_STEP;
- }
-
- function yy_r2_11($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF;
- }
-
- function yy_r2_12($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_IDENTITY;
- }
-
- function yy_r2_13($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_NONEIDENTITY;
- }
-
- function yy_r2_14($yy_subpatterns)
+ function yy_r2_8()
{
- $this->token = Smarty_Internal_Templateparser::TP_EQUALS;
+ $this->yypopstate();
+ $this->token = Smarty_Internal_Templateparser::TP_CLOSETAG;
+ $this->taglineno = $this->line;
}
- function yy_r2_15($yy_subpatterns)
+ function yy_r2_9()
{
- $this->token = Smarty_Internal_Templateparser::TP_NOTEQUALS;
+ 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_17($yy_subpatterns)
+ function yy_r2_11()
{
- $this->token = Smarty_Internal_Templateparser::TP_GREATEREQUAL;
+ $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
+ $this->yybegin(self::TAGBODY);
+ $this->taglineno = $this->line;
}
- function yy_r2_19($yy_subpatterns)
+ function yy_r2_12()
{
- $this->token = Smarty_Internal_Templateparser::TP_LESSEQUAL;
+ $this->token = Smarty_Internal_Templateparser::TP_LDEL;
+ $this->yybegin(self::TAGBODY);
+ $this->taglineno = $this->line;
}
- function yy_r2_21($yy_subpatterns)
+ 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
+ }
- $this->token = Smarty_Internal_Templateparser::TP_GREATERTHAN;
- }
-
- function yy_r2_22($yy_subpatterns)
- {
+ 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
- $this->token = Smarty_Internal_Templateparser::TP_LESSTHAN;
- }
+ const TAGBODY = 3;
- function yy_r2_23($yy_subpatterns)
+ function yy_r3_1()
{
- $this->token = Smarty_Internal_Templateparser::TP_MOD;
+ $this->token = Smarty_Internal_Templateparser::TP_RDEL;
+ $this->yypopstate();
}
- function yy_r2_24($yy_subpatterns)
+ function yy_r3_2()
{
- $this->token = Smarty_Internal_Templateparser::TP_NOT;
+ $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
+ $this->yypushstate(self::DOUBLEQUOTEDSTRING);
}
- function yy_r2_25($yy_subpatterns)
+ function yy_r3_3()
{
- $this->token = Smarty_Internal_Templateparser::TP_LAND;
+ $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING;
}
- function yy_r2_26($yy_subpatterns)
+ function yy_r3_4()
{
- $this->token = Smarty_Internal_Templateparser::TP_LOR;
+ $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT;
+ $this->taglineno = $this->line;
}
- function yy_r2_27($yy_subpatterns)
+ function yy_r3_6()
{
- $this->token = Smarty_Internal_Templateparser::TP_LXOR;
+ $this->token = Smarty_Internal_Templateparser::TP_DOLLARID;
}
- function yy_r2_28($yy_subpatterns)
+ function yy_r3_7()
{
- $this->token = Smarty_Internal_Templateparser::TP_ISODDBY;
+ $this->token = Smarty_Internal_Templateparser::TP_DOLLAR;
}
- function yy_r2_29($yy_subpatterns)
+ function yy_r3_8()
{
- $this->token = Smarty_Internal_Templateparser::TP_ISNOTODDBY;
+ $this->token = Smarty_Internal_Templateparser::TP_ISIN;
}
- function yy_r2_30($yy_subpatterns)
+ function yy_r3_9()
{
- $this->token = Smarty_Internal_Templateparser::TP_ISODD;
+ $this->token = Smarty_Internal_Templateparser::TP_AS;
}
- function yy_r2_31($yy_subpatterns)
+ function yy_r3_10()
{
- $this->token = Smarty_Internal_Templateparser::TP_ISNOTODD;
+ $this->token = Smarty_Internal_Templateparser::TP_TO;
}
- function yy_r2_32($yy_subpatterns)
+ function yy_r3_11()
{
- $this->token = Smarty_Internal_Templateparser::TP_ISEVENBY;
+ $this->token = Smarty_Internal_Templateparser::TP_STEP;
}
- function yy_r2_33($yy_subpatterns)
+ function yy_r3_12()
{
- $this->token = Smarty_Internal_Templateparser::TP_ISNOTEVENBY;
+ $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF;
}
- function yy_r2_34($yy_subpatterns)
+ function yy_r3_13()
{
- $this->token = Smarty_Internal_Templateparser::TP_ISEVEN;
+ $this->token = Smarty_Internal_Templateparser::TP_LOGOP;
}
- function yy_r2_35($yy_subpatterns)
+ function yy_r3_18()
{
- $this->token = Smarty_Internal_Templateparser::TP_ISNOTEVEN;
+ $this->token = Smarty_Internal_Templateparser::TP_TLOGOP;
}
- function yy_r2_36($yy_subpatterns)
+ function yy_r3_23()
{
- $this->token = Smarty_Internal_Templateparser::TP_ISDIVBY;
+ $this->token = Smarty_Internal_Templateparser::TP_SINGLECOND;
}
- function yy_r2_37($yy_subpatterns)
+ function yy_r3_26()
{
- $this->token = Smarty_Internal_Templateparser::TP_ISNOTDIVBY;
+ $this->token = Smarty_Internal_Templateparser::TP_NOT;
}
- function yy_r2_38($yy_subpatterns)
+ function yy_r3_29()
{
$this->token = Smarty_Internal_Templateparser::TP_TYPECAST;
}
- function yy_r2_42($yy_subpatterns)
+ function yy_r3_33()
{
$this->token = Smarty_Internal_Templateparser::TP_OPENP;
}
- function yy_r2_43($yy_subpatterns)
+ function yy_r3_34()
{
$this->token = Smarty_Internal_Templateparser::TP_CLOSEP;
}
- function yy_r2_44($yy_subpatterns)
+ function yy_r3_35()
{
$this->token = Smarty_Internal_Templateparser::TP_OPENB;
}
- function yy_r2_45($yy_subpatterns)
+ function yy_r3_36()
{
$this->token = Smarty_Internal_Templateparser::TP_CLOSEB;
}
- function yy_r2_46($yy_subpatterns)
+ function yy_r3_37()
{
$this->token = Smarty_Internal_Templateparser::TP_PTR;
}
- function yy_r2_47($yy_subpatterns)
+ function yy_r3_38()
{
$this->token = Smarty_Internal_Templateparser::TP_APTR;
}
- function yy_r2_48($yy_subpatterns)
+ function yy_r3_39()
{
$this->token = Smarty_Internal_Templateparser::TP_EQUAL;
}
- function yy_r2_49($yy_subpatterns)
+ function yy_r3_40()
{
$this->token = Smarty_Internal_Templateparser::TP_INCDEC;
}
- function yy_r2_50($yy_subpatterns)
+ function yy_r3_42()
{
$this->token = Smarty_Internal_Templateparser::TP_UNIMATH;
}
- function yy_r2_52($yy_subpatterns)
+ function yy_r3_44()
{
$this->token = Smarty_Internal_Templateparser::TP_MATH;
}
- function yy_r2_54($yy_subpatterns)
+ function yy_r3_46()
{
$this->token = Smarty_Internal_Templateparser::TP_AT;
}
- function yy_r2_55($yy_subpatterns)
+ function yy_r3_47()
{
$this->token = Smarty_Internal_Templateparser::TP_HATCH;
}
- function yy_r2_56($yy_subpatterns)
+ 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);
+ preg_match("~\s+~", $this->value, $match);
$this->value = $match[0];
$this->token = Smarty_Internal_Templateparser::TP_SPACE;
} else {
@@ -808,183 +756,126 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r2_57($yy_subpatterns)
+ function yy_r3_49()
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_NAMESPACE;
+ }
+
+ function yy_r3_52()
{
$this->token = Smarty_Internal_Templateparser::TP_ID;
}
- function yy_r2_58($yy_subpatterns)
+ function yy_r3_53()
{
$this->token = Smarty_Internal_Templateparser::TP_INTEGER;
}
- function yy_r2_59($yy_subpatterns)
+ function yy_r3_54()
{
$this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
$this->yypopstate();
}
- function yy_r2_60($yy_subpatterns)
+ function yy_r3_55()
{
$this->token = Smarty_Internal_Templateparser::TP_VERT;
}
- function yy_r2_61($yy_subpatterns)
+ function yy_r3_56()
{
$this->token = Smarty_Internal_Templateparser::TP_DOT;
}
- function yy_r2_62($yy_subpatterns)
+ function yy_r3_57()
{
$this->token = Smarty_Internal_Templateparser::TP_COMMA;
}
- function yy_r2_63($yy_subpatterns)
+ function yy_r3_58()
{
$this->token = Smarty_Internal_Templateparser::TP_SEMICOLON;
}
- function yy_r2_64($yy_subpatterns)
+ function yy_r3_59()
{
$this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON;
}
- function yy_r2_65($yy_subpatterns)
+ function yy_r3_60()
{
$this->token = Smarty_Internal_Templateparser::TP_COLON;
}
- function yy_r2_66($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_ANDSYM;
- }
-
- function yy_r2_67($yy_subpatterns)
+ function yy_r3_61()
{
$this->token = Smarty_Internal_Templateparser::TP_QMARK;
}
- function yy_r2_68($yy_subpatterns)
+ function yy_r3_62()
{
$this->token = Smarty_Internal_Templateparser::TP_HEX;
}
- function yy_r2_69($yy_subpatterns)
+ function yy_r3_63()
{
$this->token = Smarty_Internal_Templateparser::TP_SPACE;
}
- function yy_r2_70($yy_subpatterns)
+ 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->token = Smarty_Internal_Templateparser::TP_LDELIF;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
- }
-
- function yy_r2_72($yy_subpatterns)
- {
-
- 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_LDELFOR;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
- }
-
- function yy_r2_73($yy_subpatterns)
- {
-
- 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_LDELFOREACH;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
- }
-
- function yy_r2_74($yy_subpatterns)
- {
-
- 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_LDELSLASH;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
- }
-
- function yy_r2_75($yy_subpatterns)
- {
-
- 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->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
+ $this->yypushstate(self::TAG);
+ return true;
}
}
- function yy_r2_76($yy_subpatterns)
+ function yy_r3_65()
{
$this->token = Smarty_Internal_Templateparser::TP_TEXT;
}
- public function yylex3()
+ public function yylex4()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 0,
- 3 => 0,
- );
+ 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
}
- $yy_global_pattern = "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*\/literal\\s*" . $this->rdel . ")|\G([\S\s])/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state LITERAL');
+ 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
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r3_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r4_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -1004,23 +895,22 @@ class Smarty_Internal_Templatelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
} // end function
- const LITERAL = 3;
+ const LITERAL = 4;
- function yy_r3_1($yy_subpatterns)
+ function yy_r4_1()
{
$this->literal_cnt ++;
$this->token = Smarty_Internal_Templateparser::TP_LITERAL;
}
- function yy_r3_2($yy_subpatterns)
+ function yy_r4_2()
{
if ($this->literal_cnt) {
@@ -1032,11 +922,11 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r3_3($yy_subpatterns)
+ function yy_r4_3()
{
$to = strlen($this->data);
- preg_match("/{$this->ldel}\/?literal{$this->rdel}/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
+ 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 {
@@ -1046,48 +936,30 @@ class Smarty_Internal_Templatelexer
$this->token = Smarty_Internal_Templateparser::TP_LITERAL;
}
- public function yylex4()
+ public function yylex5()
{
- $tokenMap = array(
- 1 => 1,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 3,
- 17 => 0,
- );
+ 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
}
- $yy_global_pattern = "/\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*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*\/literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*\/)|\G(" . $this->ldel . "\\s*)|\G(\")|\G(`\\$)|\G(\\$[0-9]*[a-zA-Z_]\\w*)|\G(\\$)|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=(" . $this->ldel . "|\\$|`\\$|\")))|\G([\S\s])/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state DOUBLEQUOTEDSTRING');
+ 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
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r4_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r5_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -1107,122 +979,95 @@ class Smarty_Internal_Templatelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
} // end function
- const DOUBLEQUOTEDSTRING = 4;
+ const DOUBLEQUOTEDSTRING = 5;
- function yy_r4_1($yy_subpatterns)
+ function yy_r5_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_TEXT;
- } else {
- $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
}
- function yy_r4_3($yy_subpatterns)
+ function yy_r5_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_TEXT;
- } else {
- $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
- }
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
}
- function yy_r4_4($yy_subpatterns)
+ 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->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
+ $this->yypushstate(self::TAG);
+ return true;
}
}
- function yy_r4_5($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_TEXT;
- }
-
- function yy_r4_6($yy_subpatterns)
- {
-
- $this->token = Smarty_Internal_Templateparser::TP_TEXT;
- }
-
- function yy_r4_7($yy_subpatterns)
+ 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->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
- $this->yypushstate(self::SMARTY);
- $this->taglineno = $this->line;
+ $this->yypushstate(self::TAG);
+ return true;
}
}
- function yy_r4_8($yy_subpatterns)
+ 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->yypushstate(self::SMARTY);
$this->taglineno = $this->line;
+ $this->yypushstate(self::TAGBODY);
}
}
- function yy_r4_9($yy_subpatterns)
+ function yy_r5_6()
{
$this->token = Smarty_Internal_Templateparser::TP_QUOTE;
$this->yypopstate();
}
- function yy_r4_10($yy_subpatterns)
+ function yy_r5_7()
{
$this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
$this->value = substr($this->value, 0, - 1);
- $this->yypushstate(self::SMARTY);
+ $this->yypushstate(self::TAGBODY);
$this->taglineno = $this->line;
}
- function yy_r4_11($yy_subpatterns)
+ function yy_r5_8()
{
$this->token = Smarty_Internal_Templateparser::TP_DOLLARID;
}
- function yy_r4_12($yy_subpatterns)
+ function yy_r5_9()
{
$this->token = Smarty_Internal_Templateparser::TP_TEXT;
}
- function yy_r4_13($yy_subpatterns)
+ function yy_r5_10()
{
$this->token = Smarty_Internal_Templateparser::TP_TEXT;
}
- function yy_r4_17($yy_subpatterns)
+ function yy_r5_14()
{
$to = strlen($this->data);
@@ -1230,39 +1075,30 @@ class Smarty_Internal_Templatelexer
$this->token = Smarty_Internal_Templateparser::TP_TEXT;
}
- public function yylex5()
+ public function yylex6()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- );
+ 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
}
- $yy_global_pattern = "/\G(" . $this->ldel . "\\s*strip\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*\/strip\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*block)|\G([\S\s])/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern6, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state CHILDBODY');
+ 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
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r5_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r6_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -1282,16 +1118,15 @@ class Smarty_Internal_Templatelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
} // end function
- const CHILDBODY = 5;
+ const CHILDBODY = 6;
- function yy_r5_1($yy_subpatterns)
+ 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) {
@@ -1301,7 +1136,7 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r5_2($yy_subpatterns)
+ 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) {
@@ -1311,7 +1146,7 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r5_3($yy_subpatterns)
+ 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) {
@@ -1322,11 +1157,11 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r5_4($yy_subpatterns)
+ function yy_r6_4()
{
$to = strlen($this->data);
- preg_match("/" . $this->ldel . "\s*((\/)?strip\s*" . $this->rdel . "|block\s+)/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
+ 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];
}
@@ -1334,40 +1169,30 @@ class Smarty_Internal_Templatelexer
return false;
}
- public function yylex6()
+ public function yylex7()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 1,
- 6 => 0,
- );
+ 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
}
- $yy_global_pattern = "/\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])/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern7, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state CHILDBLOCK');
+ 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
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r6_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r7_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -1387,16 +1212,15 @@ class Smarty_Internal_Templatelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
} // end function
- const CHILDBLOCK = 6;
+ const CHILDBLOCK = 7;
- function yy_r6_1($yy_subpatterns)
+ 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) {
@@ -1407,7 +1231,7 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r6_2($yy_subpatterns)
+ 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) {
@@ -1418,7 +1242,7 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r6_3($yy_subpatterns)
+ 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) {
@@ -1429,7 +1253,7 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r6_4($yy_subpatterns)
+ 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) {
@@ -1440,11 +1264,11 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r6_6($yy_subpatterns)
+ 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))/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
+ 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];
}
@@ -1452,38 +1276,30 @@ class Smarty_Internal_Templatelexer
$this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE;
}
- public function yylex7()
+ public function yylex8()
{
- $tokenMap = array(
- 1 => 0,
- 2 => 0,
- 3 => 0,
- );
+ 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
}
- $yy_global_pattern = "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*\/literal\\s*" . $this->rdel . ")|\G([\S\s])/iS";
do {
- if (preg_match($yy_global_pattern, $this->data, $yymatches, null, $this->counter)) {
+ if (preg_match($this->yy_global_pattern8, $this->data, $yymatches, null, $this->counter)) {
$yysubmatches = $yymatches;
- $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
- if (!count($yymatches)) {
- throw new Exception('Error: lexing failed because a rule matched' .
- ' an empty string. Input "' . substr($this->data,
- $this->counter, 5) . '... state CHILDLITERAL');
+ 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
- if ($tokenMap[$this->token]) {
- // extract sub-patterns for passing to lex function
- $yysubmatches = array_slice($yysubmatches, $this->token + 1,
- $tokenMap[$this->token]);
- } else {
- $yysubmatches = array();
- }
$this->value = current($yymatches); // token value
- $r = $this->{'yy_r7_' . $this->token}($yysubmatches);
+ $r = $this->{'yy_r8_' . $this->token}();
if ($r === null) {
$this->counter += strlen($this->value);
$this->line += substr_count($this->value, "\n");
@@ -1503,16 +1319,15 @@ class Smarty_Internal_Templatelexer
continue;
}
} else {
- throw new Exception('Unexpected input at line' . $this->line .
- ': ' . $this->data[$this->counter]);
+ throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[$this->counter]);
}
break;
} while (true);
} // end function
- const CHILDLITERAL = 7;
+ const CHILDLITERAL = 8;
- function yy_r7_1($yy_subpatterns)
+ 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) {
@@ -1523,7 +1338,7 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r7_2($yy_subpatterns)
+ 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) {
@@ -1534,11 +1349,11 @@ class Smarty_Internal_Templatelexer
}
}
- function yy_r7_3($yy_subpatterns)
+ function yy_r8_3()
{
$to = strlen($this->data);
- preg_match("/{$this->ldel}\/?literal\s*{$this->rdel}/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
+ 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 {
@@ -1547,6 +1362,7 @@ class Smarty_Internal_Templatelexer
$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/library/Smarty/libs/sysplugins/smarty_internal_templateparser.php b/library/Smarty/libs/sysplugins/smarty_internal_templateparser.php
index 98b9fc7fb..871f7c0a7 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_templateparser.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_templateparser.php
@@ -1,17 +1,9 @@
<?php
-/**
- * Smarty Internal Plugin Templateparser
- * This is the template parser.
- * It is generated from the internal.templateparser.y file
- *
- * @package Smarty
- * @subpackage Compiler
- * @author Uwe Tews
- */
class TP_yyToken implements ArrayAccess
{
public $string = '';
+
public $metadata = array();
public function __construct($s, $m = array())
@@ -31,7 +23,7 @@ class TP_yyToken implements ArrayAccess
public function __toString()
{
- return $this->_string;
+ return $this->string;
}
public function offsetExists($offset)
@@ -48,8 +40,7 @@ class TP_yyToken implements ArrayAccess
{
if ($offset === null) {
if (isset($value[0])) {
- $x = ($value instanceof TP_yyToken) ?
- $value->metadata : $value;
+ $x = ($value instanceof TP_yyToken) ? $value->metadata : $value;
$this->metadata = array_merge($this->metadata, $x);
return;
@@ -85,2072 +76,625 @@ class TP_yyStackEntry
;
-#line 13 "smarty_internal_templateparser.y"
-class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php"
+#line 13 "../smarty/lexer/smarty_internal_templateparser.y"
+
+/**
+ * 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
{
- #line 15 "smarty_internal_templateparser.y"
+ #line 26 "../smarty/lexer/smarty_internal_templateparser.y"
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";
- // states whether the parse was successful or not
+
+ /**
+ * 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;
- private $_string;
+
+ /**
+ * @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;
- private $strip = false;
- function __construct($lex, $compiler)
+ /**
+ * {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->smarty = $this->compiler->smarty;
$this->template = $this->compiler->template;
- $this->compiler->has_variable_string = false;
- $this->compiler->prefix_code = array();
- $this->block_nesting_level = 0;
- if ($this->security = isset($this->smarty->security_policy)) {
- $this->php_handling = $this->smarty->security_policy->php_handling;
- } else {
- $this->php_handling = $this->smarty->php_handling;
- }
- $this->is_xml = false;
- $this->asp_tags = (ini_get('asp_tags') != '0');
- $this->current_buffer = $this->root_buffer = new _smarty_template_buffer($this);
+ $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);
}
- public function compileVariable($variable)
+ /**
+ * insert PHP code in current buffer
+ *
+ * @param string $code
+ */
+ public function insertPhpCode($code)
{
- if (strpos($variable, '(') == 0) {
- // not a variable variable
- $var = trim($variable, '\'');
- $this->compiler->tag_nocache = $this->compiler->tag_nocache | $this->template->getVariable($var, null, true, false)->nocache;
- $this->template->properties['variables'][$var] = $this->compiler->tag_nocache | $this->compiler->nocache;
- }
- // return '(isset($_smarty_tpl->tpl_vars['. $variable .'])?$_smarty_tpl->tpl_vars['. $variable .']->value:$_smarty_tpl->getVariable('. $variable .')->value)';
- return '$_smarty_tpl->tpl_vars[' . $variable . ']->value';
+ $this->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($this, $code));
}
- #line 130 "smarty_internal_templateparser.php"
+ /**
+ * 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));
+ }
const TP_VERT = 1;
+
const TP_COLON = 2;
- const TP_RDEL = 3;
- const TP_COMMENT = 4;
- const TP_PHPSTARTTAG = 5;
- const TP_PHPENDTAG = 6;
- const TP_PHPENDSCRIPT = 7;
- const TP_ASPSTARTTAG = 8;
- const TP_ASPENDTAG = 9;
- const TP_XMLTAG = 10;
- const TP_TEXT = 11;
- const TP_STRIPON = 12;
- const TP_STRIPOFF = 13;
- const TP_BLOCKSOURCE = 14;
- const TP_LITERALSTART = 15;
- const TP_LITERALEND = 16;
- const TP_LITERAL = 17;
- const TP_LDEL = 18;
- const TP_DOLLAR = 19;
- const TP_ID = 20;
- const TP_EQUAL = 21;
- const TP_PTR = 22;
- const TP_LDELIF = 23;
- const TP_LDELFOR = 24;
- const TP_SEMICOLON = 25;
- const TP_INCDEC = 26;
- const TP_TO = 27;
- const TP_STEP = 28;
- const TP_LDELFOREACH = 29;
- const TP_SPACE = 30;
- const TP_AS = 31;
- const TP_APTR = 32;
- const TP_LDELSETFILTER = 33;
- const TP_SMARTYBLOCKCHILDPARENT = 34;
- const TP_LDELSLASH = 35;
- const TP_ATTR = 36;
- const TP_INTEGER = 37;
- const TP_COMMA = 38;
- const TP_OPENP = 39;
- const TP_CLOSEP = 40;
- const TP_MATH = 41;
- const TP_UNIMATH = 42;
- const TP_ANDSYM = 43;
- const TP_ISIN = 44;
- const TP_ISDIVBY = 45;
- const TP_ISNOTDIVBY = 46;
- const TP_ISEVEN = 47;
- const TP_ISNOTEVEN = 48;
- const TP_ISEVENBY = 49;
- const TP_ISNOTEVENBY = 50;
- const TP_ISODD = 51;
- const TP_ISNOTODD = 52;
- const TP_ISODDBY = 53;
- const TP_ISNOTODDBY = 54;
- const TP_INSTANCEOF = 55;
- const TP_QMARK = 56;
- const TP_NOT = 57;
- const TP_TYPECAST = 58;
- const TP_HEX = 59;
- const TP_DOT = 60;
- const TP_SINGLEQUOTESTRING = 61;
- const TP_DOUBLECOLON = 62;
- const TP_AT = 63;
- const TP_HATCH = 64;
- const TP_OPENB = 65;
- const TP_CLOSEB = 66;
- const TP_EQUALS = 67;
- const TP_NOTEQUALS = 68;
- const TP_GREATERTHAN = 69;
- const TP_LESSTHAN = 70;
- const TP_GREATEREQUAL = 71;
- const TP_LESSEQUAL = 72;
- const TP_IDENTITY = 73;
- const TP_NONEIDENTITY = 74;
- const TP_MOD = 75;
- const TP_LAND = 76;
- const TP_LOR = 77;
- const TP_LXOR = 78;
- const TP_QUOTE = 79;
- const TP_BACKTICK = 80;
- const TP_DOLLARID = 81;
- const YY_NO_ACTION = 560;
- const YY_ACCEPT_ACTION = 559;
- const YY_ERROR_ACTION = 558;
-
- const YY_SZ_ACTTAB = 2541;
- static public $yy_action = array(
- /* 0 */
- 225, 35, 312, 333, 198, 272, 273, 275, 283, 292,
- /* 10 */
- 293, 294, 295, 287, 288, 267, 190, 43, 19, 8,
- /* 20 */
- 204, 14, 212, 299, 2, 108, 225, 9, 424, 41,
- /* 30 */
- 139, 208, 225, 41, 250, 32, 228, 13, 159, 32,
- /* 40 */
- 51, 52, 50, 44, 11, 12, 298, 300, 21, 23,
- /* 50 */
- 303, 302, 25, 17, 225, 424, 234, 225, 225, 381,
- /* 60 */
- 421, 424, 45, 38, 145, 357, 313, 323, 322, 324,
- /* 70 */
- 325, 326, 320, 315, 314, 316, 317, 319, 127, 41,
- /* 80 */
- 46, 42, 338, 41, 168, 32, 41, 421, 14, 32,
- /* 90 */
- 299, 34, 32, 421, 51, 52, 50, 44, 11, 12,
- /* 100 */
- 298, 300, 21, 23, 303, 302, 25, 17, 225, 104,
- /* 110 */
- 185, 46, 46, 559, 95, 279, 242, 271, 3, 321,
- /* 120 */
- 313, 323, 322, 324, 325, 326, 320, 315, 314, 316,
- /* 130 */
- 317, 319, 14, 241, 299, 34, 208, 41, 225, 14,
- /* 140 */
- 418, 299, 28, 32, 179, 7, 356, 285, 51, 52,
- /* 150 */
- 50, 44, 11, 12, 298, 300, 21, 23, 303, 302,
- /* 160 */
- 25, 17, 225, 225, 274, 424, 240, 41, 134, 190,
- /* 170 */
- 332, 343, 340, 32, 313, 323, 322, 324, 325, 326,
- /* 180 */
- 320, 315, 314, 316, 317, 319, 37, 122, 182, 31,
- /* 190 */
- 202, 225, 424, 352, 225, 14, 7, 299, 424, 225,
- /* 200 */
- 150, 386, 51, 52, 50, 44, 11, 12, 298, 300,
- /* 210 */
- 21, 23, 303, 302, 25, 17, 225, 46, 349, 134,
- /* 220 */
- 41, 278, 242, 271, 7, 29, 32, 341, 313, 323,
- /* 230 */
- 322, 324, 325, 326, 320, 315, 314, 316, 317, 319,
- /* 240 */
- 226, 227, 197, 304, 103, 184, 232, 134, 46, 14,
- /* 250 */
- 35, 299, 265, 46, 321, 18, 51, 52, 50, 44,
- /* 260 */
- 11, 12, 298, 300, 21, 23, 303, 302, 25, 17,
- /* 270 */
- 225, 208, 264, 259, 258, 218, 6, 109, 345, 35,
- /* 280 */
- 193, 263, 313, 323, 322, 324, 325, 326, 320, 315,
- /* 290 */
- 314, 316, 317, 319, 241, 192, 304, 107, 102, 175,
- /* 300 */
- 269, 201, 191, 304, 203, 142, 253, 208, 321, 335,
- /* 310 */
- 51, 52, 50, 44, 11, 12, 298, 300, 21, 23,
- /* 320 */
- 303, 302, 25, 17, 225, 208, 268, 196, 208, 305,
- /* 330 */
- 485, 208, 230, 200, 308, 485, 313, 323, 322, 324,
- /* 340 */
- 325, 326, 320, 315, 314, 316, 317, 319, 30, 159,
- /* 350 */
- 105, 20, 233, 161, 186, 305, 301, 274, 256, 247,
- /* 360 */
- 208, 225, 321, 36, 51, 52, 50, 44, 11, 12,
- /* 370 */
- 298, 300, 21, 23, 303, 302, 25, 17, 225, 204,
- /* 380 */
- 207, 14, 254, 299, 131, 259, 249, 225, 158, 127,
- /* 390 */
- 313, 323, 322, 324, 325, 326, 320, 315, 314, 316,
- /* 400 */
- 317, 319, 237, 262, 130, 225, 45, 183, 187, 14,
- /* 410 */
- 169, 223, 301, 342, 274, 334, 321, 321, 51, 52,
- /* 420 */
- 50, 44, 11, 12, 298, 300, 21, 23, 303, 302,
- /* 430 */
- 25, 17, 225, 204, 204, 14, 6, 244, 141, 259,
- /* 440 */
- 291, 46, 98, 194, 313, 323, 322, 324, 325, 326,
- /* 450 */
- 320, 315, 314, 316, 317, 319, 132, 262, 227, 166,
- /* 460 */
- 163, 189, 14, 284, 231, 26, 237, 27, 321, 321,
- /* 470 */
- 321, 32, 51, 52, 50, 44, 11, 12, 298, 300,
- /* 480 */
- 21, 23, 303, 302, 25, 17, 225, 204, 14, 276,
- /* 490 */
- 245, 206, 22, 4, 144, 328, 150, 120, 313, 323,
- /* 500 */
- 322, 324, 325, 326, 320, 315, 314, 316, 317, 319,
- /* 510 */
- 195, 348, 262, 176, 171, 39, 30, 199, 143, 180,
- /* 520 */
- 148, 281, 321, 260, 159, 230, 51, 52, 50, 44,
- /* 530 */
- 11, 12, 298, 300, 21, 23, 303, 302, 25, 17,
- /* 540 */
- 225, 296, 205, 129, 346, 289, 124, 329, 125, 339,
- /* 550 */
- 97, 119, 313, 323, 322, 324, 325, 326, 320, 315,
- /* 560 */
- 314, 316, 317, 319, 127, 262, 262, 239, 277, 282,
- /* 570 */
- 307, 94, 266, 351, 269, 170, 159, 181, 172, 106,
- /* 580 */
- 51, 52, 50, 44, 11, 12, 298, 300, 21, 23,
- /* 590 */
- 303, 302, 25, 17, 225, 330, 270, 301, 15, 115,
- /* 600 */
- 331, 310, 326, 255, 140, 126, 313, 323, 322, 324,
- /* 610 */
- 325, 326, 320, 315, 314, 316, 317, 319, 301, 326,
- /* 620 */
- 262, 326, 326, 326, 326, 326, 326, 326, 326, 326,
- /* 630 */
- 326, 326, 326, 243, 51, 52, 50, 44, 11, 12,
- /* 640 */
- 298, 300, 21, 23, 303, 302, 25, 17, 225, 40,
- /* 650 */
- 326, 326, 326, 326, 326, 326, 326, 113, 99, 100,
- /* 660 */
- 313, 323, 322, 324, 325, 326, 320, 315, 314, 316,
- /* 670 */
- 317, 319, 262, 262, 262, 326, 326, 326, 326, 326,
- /* 680 */
- 326, 326, 326, 326, 326, 326, 326, 326, 51, 52,
- /* 690 */
- 50, 44, 11, 12, 298, 300, 21, 23, 303, 302,
- /* 700 */
- 25, 17, 225, 326, 326, 326, 326, 326, 326, 326,
- /* 710 */
- 326, 114, 326, 326, 313, 323, 322, 324, 325, 326,
- /* 720 */
- 320, 315, 314, 316, 317, 319, 262, 326, 326, 326,
- /* 730 */
- 326, 326, 326, 326, 326, 326, 326, 326, 326, 326,
- /* 740 */
- 326, 286, 51, 52, 50, 44, 11, 12, 298, 300,
- /* 750 */
- 21, 23, 303, 302, 25, 17, 225, 326, 326, 326,
- /* 760 */
- 326, 326, 326, 326, 326, 326, 326, 326, 313, 323,
- /* 770 */
- 322, 324, 325, 326, 320, 315, 314, 316, 317, 319,
- /* 780 */
- 326, 326, 326, 326, 326, 326, 326, 326, 326, 326,
- /* 790 */
- 326, 326, 326, 326, 326, 326, 51, 52, 50, 44,
- /* 800 */
- 11, 12, 298, 300, 21, 23, 303, 302, 25, 17,
- /* 810 */
- 326, 326, 326, 326, 326, 326, 326, 326, 326, 326,
- /* 820 */
- 159, 326, 313, 323, 322, 324, 325, 326, 320, 315,
- /* 830 */
- 314, 316, 317, 319, 326, 326, 326, 326, 51, 52,
- /* 840 */
- 50, 44, 11, 12, 298, 300, 21, 23, 303, 302,
- /* 850 */
- 25, 17, 326, 326, 326, 326, 326, 326, 212, 326,
- /* 860 */
- 326, 326, 326, 9, 313, 323, 322, 324, 325, 326,
- /* 870 */
- 320, 315, 314, 316, 317, 319, 326, 326, 326, 326,
- /* 880 */
- 326, 326, 326, 8, 138, 211, 326, 326, 2, 108,
- /* 890 */
- 326, 235, 326, 326, 139, 157, 165, 326, 250, 128,
- /* 900 */
- 228, 326, 246, 326, 24, 321, 326, 48, 261, 326,
- /* 910 */
- 326, 251, 336, 353, 326, 311, 326, 301, 174, 173,
- /* 920 */
- 326, 326, 49, 47, 280, 238, 297, 321, 321, 105,
- /* 930 */
- 1, 337, 326, 147, 326, 326, 326, 326, 326, 301,
- /* 940 */
- 301, 8, 123, 92, 96, 257, 2, 108, 326, 311,
- /* 950 */
- 326, 326, 139, 326, 326, 235, 250, 309, 228, 146,
- /* 960 */
- 246, 326, 24, 128, 162, 48, 326, 326, 326, 326,
- /* 970 */
- 235, 326, 350, 321, 155, 251, 336, 353, 128, 311,
- /* 980 */
- 49, 47, 280, 238, 297, 301, 326, 105, 1, 326,
- /* 990 */
- 251, 336, 353, 326, 311, 14, 326, 299, 326, 8,
- /* 1000 */
- 138, 224, 96, 326, 2, 108, 326, 41, 326, 252,
- /* 1010 */
- 139, 235, 326, 32, 250, 153, 228, 326, 246, 128,
- /* 1020 */
- 24, 326, 326, 48, 326, 326, 326, 326, 326, 326,
- /* 1030 */
- 326, 251, 336, 353, 326, 311, 326, 326, 49, 47,
- /* 1040 */
- 280, 238, 297, 326, 326, 105, 1, 326, 326, 326,
- /* 1050 */
- 326, 326, 14, 326, 299, 326, 326, 8, 142, 224,
- /* 1060 */
- 96, 326, 2, 108, 41, 235, 248, 326, 139, 154,
- /* 1070 */
- 32, 235, 250, 128, 228, 156, 246, 326, 33, 128,
- /* 1080 */
- 326, 48, 326, 326, 326, 251, 336, 353, 326, 311,
- /* 1090 */
- 326, 251, 336, 353, 326, 311, 49, 47, 280, 238,
- /* 1100 */
- 297, 326, 326, 105, 1, 326, 326, 326, 326, 326,
- /* 1110 */
- 326, 326, 326, 326, 326, 8, 138, 213, 96, 326,
- /* 1120 */
- 2, 108, 326, 326, 326, 326, 139, 235, 326, 326,
- /* 1130 */
- 250, 149, 228, 326, 246, 128, 24, 326, 326, 48,
- /* 1140 */
- 326, 326, 326, 326, 326, 326, 326, 251, 336, 353,
- /* 1150 */
- 326, 311, 326, 326, 49, 47, 280, 238, 297, 326,
- /* 1160 */
- 326, 105, 1, 326, 326, 326, 326, 326, 326, 326,
- /* 1170 */
- 326, 326, 326, 8, 138, 210, 96, 326, 2, 108,
- /* 1180 */
- 326, 326, 326, 326, 139, 235, 326, 326, 250, 151,
- /* 1190 */
- 228, 326, 219, 128, 24, 326, 326, 48, 326, 326,
- /* 1200 */
- 326, 326, 326, 326, 326, 251, 336, 353, 326, 311,
- /* 1210 */
- 326, 326, 49, 47, 280, 238, 297, 326, 326, 105,
- /* 1220 */
- 1, 326, 326, 326, 326, 326, 326, 326, 326, 326,
- /* 1230 */
- 326, 8, 136, 224, 96, 326, 2, 108, 326, 326,
- /* 1240 */
- 326, 326, 139, 235, 326, 326, 250, 152, 228, 326,
- /* 1250 */
- 246, 128, 24, 326, 326, 48, 326, 326, 326, 326,
- /* 1260 */
- 326, 326, 326, 251, 336, 353, 326, 311, 326, 326,
- /* 1270 */
- 49, 47, 280, 238, 297, 326, 326, 105, 1, 326,
- /* 1280 */
- 225, 326, 391, 326, 422, 326, 326, 326, 326, 8,
- /* 1290 */
- 135, 224, 96, 326, 2, 108, 326, 326, 326, 326,
- /* 1300 */
- 139, 236, 229, 326, 250, 326, 228, 326, 246, 41,
- /* 1310 */
- 5, 422, 326, 48, 326, 32, 326, 422, 7, 326,
- /* 1320 */
- 7, 326, 326, 326, 198, 178, 326, 326, 49, 47,
- /* 1330 */
- 280, 238, 297, 326, 321, 105, 1, 43, 19, 326,
- /* 1340 */
- 326, 134, 326, 134, 326, 326, 326, 8, 138, 209,
- /* 1350 */
- 96, 208, 2, 108, 326, 326, 326, 326, 139, 326,
- /* 1360 */
- 326, 326, 250, 326, 228, 326, 246, 326, 24, 198,
- /* 1370 */
- 164, 48, 326, 326, 326, 326, 326, 326, 326, 321,
- /* 1380 */
- 326, 326, 43, 19, 326, 326, 49, 47, 280, 238,
- /* 1390 */
- 297, 326, 326, 105, 1, 326, 208, 326, 326, 326,
- /* 1400 */
- 326, 326, 326, 326, 326, 8, 142, 224, 96, 326,
- /* 1410 */
- 2, 108, 326, 326, 326, 326, 139, 326, 326, 326,
- /* 1420 */
- 250, 326, 228, 326, 246, 326, 33, 198, 177, 48,
- /* 1430 */
- 326, 326, 326, 326, 326, 326, 326, 321, 326, 326,
- /* 1440 */
- 43, 19, 326, 326, 49, 47, 280, 238, 297, 326,
- /* 1450 */
- 326, 105, 326, 326, 208, 326, 326, 326, 326, 326,
- /* 1460 */
- 326, 326, 326, 8, 142, 222, 96, 326, 2, 108,
- /* 1470 */
- 326, 326, 326, 326, 139, 326, 326, 326, 250, 326,
- /* 1480 */
- 228, 326, 246, 326, 33, 326, 467, 48, 326, 326,
- /* 1490 */
- 326, 326, 326, 326, 326, 326, 326, 326, 326, 326,
- /* 1500 */
- 326, 326, 49, 47, 280, 238, 297, 326, 467, 105,
- /* 1510 */
- 467, 467, 326, 467, 467, 326, 326, 326, 326, 467,
- /* 1520 */
- 326, 467, 7, 467, 96, 326, 326, 326, 326, 326,
- /* 1530 */
- 326, 326, 326, 326, 326, 235, 326, 326, 467, 121,
- /* 1540 */
- 326, 326, 86, 128, 326, 134, 326, 326, 326, 467,
- /* 1550 */
- 326, 290, 318, 326, 326, 251, 336, 353, 326, 311,
- /* 1560 */
- 326, 326, 326, 467, 326, 326, 326, 235, 326, 216,
- /* 1570 */
- 354, 133, 326, 326, 68, 117, 249, 326, 326, 326,
- /* 1580 */
- 326, 326, 326, 290, 318, 326, 326, 251, 336, 353,
- /* 1590 */
- 235, 311, 326, 326, 133, 326, 326, 76, 128, 326,
- /* 1600 */
- 326, 326, 326, 326, 326, 326, 290, 318, 326, 235,
- /* 1610 */
- 251, 336, 353, 133, 311, 326, 76, 128, 326, 326,
- /* 1620 */
- 326, 221, 326, 326, 326, 290, 318, 326, 326, 251,
- /* 1630 */
- 336, 353, 326, 311, 326, 326, 326, 326, 235, 326,
- /* 1640 */
- 215, 326, 121, 326, 326, 86, 128, 326, 326, 326,
- /* 1650 */
- 326, 326, 326, 326, 290, 318, 326, 326, 251, 336,
- /* 1660 */
- 353, 235, 311, 326, 326, 133, 326, 326, 59, 117,
- /* 1670 */
- 137, 326, 326, 355, 326, 326, 326, 290, 318, 326,
- /* 1680 */
- 326, 251, 336, 353, 235, 311, 326, 326, 133, 326,
- /* 1690 */
- 326, 76, 128, 326, 326, 326, 326, 326, 326, 326,
- /* 1700 */
- 290, 318, 326, 235, 251, 336, 353, 110, 311, 326,
- /* 1710 */
- 69, 128, 326, 326, 326, 217, 326, 326, 326, 290,
- /* 1720 */
- 318, 326, 326, 251, 336, 353, 326, 311, 326, 235,
- /* 1730 */
- 101, 160, 326, 133, 326, 326, 57, 128, 326, 326,
- /* 1740 */
- 321, 326, 326, 43, 19, 290, 318, 326, 235, 251,
- /* 1750 */
- 336, 353, 133, 311, 326, 73, 128, 208, 326, 326,
- /* 1760 */
- 326, 326, 326, 326, 290, 318, 326, 326, 251, 336,
- /* 1770 */
- 353, 235, 311, 326, 326, 133, 326, 326, 78, 128,
- /* 1780 */
- 326, 326, 326, 326, 326, 326, 326, 290, 318, 326,
- /* 1790 */
- 235, 251, 336, 353, 133, 311, 326, 70, 128, 326,
- /* 1800 */
- 326, 326, 326, 326, 326, 326, 290, 318, 326, 326,
- /* 1810 */
- 251, 336, 353, 326, 311, 326, 235, 198, 167, 326,
- /* 1820 */
- 133, 326, 326, 64, 128, 326, 326, 321, 326, 326,
- /* 1830 */
- 43, 19, 290, 318, 326, 235, 251, 336, 353, 133,
- /* 1840 */
- 311, 326, 67, 128, 208, 326, 326, 326, 326, 326,
- /* 1850 */
- 326, 290, 318, 326, 326, 251, 336, 353, 235, 311,
- /* 1860 */
- 326, 326, 133, 326, 326, 88, 128, 326, 326, 326,
- /* 1870 */
- 326, 326, 326, 326, 290, 318, 326, 235, 251, 336,
- /* 1880 */
- 353, 133, 311, 326, 82, 128, 326, 326, 326, 326,
- /* 1890 */
- 326, 326, 326, 290, 318, 326, 326, 251, 336, 353,
- /* 1900 */
- 326, 311, 326, 235, 198, 188, 326, 133, 326, 326,
- /* 1910 */
- 72, 128, 326, 326, 321, 326, 326, 43, 19, 290,
- /* 1920 */
- 318, 326, 235, 251, 336, 353, 93, 311, 326, 55,
- /* 1930 */
- 116, 208, 326, 326, 326, 326, 326, 326, 290, 318,
- /* 1940 */
- 326, 326, 251, 336, 353, 235, 311, 326, 326, 112,
- /* 1950 */
- 326, 326, 87, 128, 326, 326, 326, 326, 326, 326,
- /* 1960 */
- 326, 290, 318, 326, 235, 251, 336, 353, 133, 311,
- /* 1970 */
- 326, 77, 128, 326, 326, 326, 326, 326, 326, 326,
- /* 1980 */
- 290, 318, 326, 326, 251, 336, 353, 326, 311, 326,
- /* 1990 */
- 235, 326, 326, 326, 133, 326, 326, 89, 128, 326,
- /* 2000 */
- 326, 326, 326, 326, 326, 326, 290, 318, 326, 235,
- /* 2010 */
- 251, 336, 353, 133, 311, 326, 75, 128, 326, 326,
- /* 2020 */
- 326, 326, 326, 326, 326, 290, 318, 326, 326, 251,
- /* 2030 */
- 336, 353, 235, 311, 326, 326, 133, 326, 326, 91,
- /* 2040 */
- 128, 326, 326, 326, 326, 326, 326, 326, 290, 318,
- /* 2050 */
- 326, 235, 251, 336, 353, 133, 311, 326, 62, 128,
- /* 2060 */
- 326, 326, 326, 326, 326, 326, 326, 290, 318, 326,
- /* 2070 */
- 326, 251, 336, 353, 326, 311, 326, 235, 326, 326,
- /* 2080 */
- 326, 93, 326, 326, 53, 116, 326, 326, 326, 326,
- /* 2090 */
- 326, 326, 326, 290, 318, 326, 235, 220, 336, 353,
- /* 2100 */
- 133, 311, 326, 63, 128, 326, 326, 326, 326, 326,
- /* 2110 */
- 326, 326, 290, 318, 326, 326, 251, 336, 353, 235,
- /* 2120 */
- 311, 326, 326, 133, 326, 326, 61, 128, 326, 326,
- /* 2130 */
- 326, 326, 326, 326, 326, 290, 318, 326, 235, 214,
- /* 2140 */
- 336, 353, 133, 311, 326, 71, 128, 326, 326, 326,
- /* 2150 */
- 326, 326, 326, 326, 290, 318, 326, 326, 251, 336,
- /* 2160 */
- 353, 326, 311, 326, 235, 326, 326, 326, 133, 326,
- /* 2170 */
- 326, 85, 128, 326, 326, 326, 326, 326, 326, 326,
- /* 2180 */
- 290, 318, 326, 235, 251, 336, 353, 133, 311, 326,
- /* 2190 */
- 65, 128, 326, 326, 326, 326, 326, 326, 326, 290,
- /* 2200 */
- 318, 326, 326, 251, 336, 353, 235, 311, 326, 326,
- /* 2210 */
- 111, 326, 326, 74, 128, 326, 326, 326, 326, 326,
- /* 2220 */
- 326, 326, 290, 318, 326, 235, 251, 336, 353, 118,
- /* 2230 */
- 311, 326, 58, 128, 326, 326, 326, 326, 326, 326,
- /* 2240 */
- 326, 290, 318, 326, 326, 251, 336, 353, 326, 311,
- /* 2250 */
- 326, 235, 326, 326, 326, 133, 326, 326, 56, 128,
- /* 2260 */
- 326, 326, 326, 326, 326, 326, 326, 290, 318, 326,
- /* 2270 */
- 235, 251, 336, 353, 133, 311, 326, 79, 128, 326,
- /* 2280 */
- 326, 326, 326, 326, 326, 326, 290, 318, 326, 326,
- /* 2290 */
- 251, 336, 353, 235, 311, 326, 326, 133, 326, 326,
- /* 2300 */
- 80, 128, 326, 326, 326, 326, 326, 326, 326, 290,
- /* 2310 */
- 318, 326, 235, 251, 336, 353, 133, 311, 326, 84,
- /* 2320 */
- 128, 326, 326, 326, 326, 326, 326, 326, 290, 318,
- /* 2330 */
- 326, 326, 251, 336, 353, 326, 311, 326, 235, 326,
- /* 2340 */
- 326, 326, 133, 326, 326, 66, 128, 326, 326, 326,
- /* 2350 */
- 326, 326, 326, 326, 290, 318, 326, 344, 251, 336,
- /* 2360 */
- 353, 326, 311, 326, 10, 326, 326, 326, 326, 2,
- /* 2370 */
- 108, 344, 326, 326, 326, 139, 326, 326, 10, 250,
- /* 2380 */
- 326, 228, 326, 2, 108, 326, 326, 326, 326, 139,
- /* 2390 */
- 326, 326, 326, 250, 326, 228, 235, 326, 326, 326,
- /* 2400 */
- 133, 326, 326, 60, 128, 326, 326, 326, 326, 326,
- /* 2410 */
- 326, 326, 290, 318, 326, 326, 251, 336, 353, 326,
- /* 2420 */
- 311, 326, 326, 326, 326, 306, 16, 347, 326, 235,
- /* 2430 */
- 326, 326, 326, 133, 326, 326, 81, 128, 326, 327,
- /* 2440 */
- 16, 347, 326, 326, 326, 290, 318, 326, 326, 251,
- /* 2450 */
- 336, 353, 326, 311, 326, 326, 235, 326, 326, 326,
- /* 2460 */
- 133, 326, 326, 68, 128, 326, 326, 326, 326, 326,
- /* 2470 */
- 326, 326, 290, 318, 326, 326, 251, 336, 353, 326,
- /* 2480 */
- 311, 326, 235, 326, 326, 326, 133, 326, 326, 54,
- /* 2490 */
- 128, 326, 326, 326, 326, 326, 326, 326, 290, 318,
- /* 2500 */
- 326, 326, 251, 336, 353, 235, 311, 326, 326, 133,
- /* 2510 */
- 326, 326, 83, 128, 326, 326, 235, 326, 326, 326,
- /* 2520 */
- 133, 290, 318, 90, 128, 251, 336, 353, 326, 311,
- /* 2530 */
- 326, 326, 290, 318, 326, 326, 251, 336, 353, 326,
- /* 2540 */
- 311,
- );
- static public $yy_lookahead = array(
- /* 0 */
- 1, 38, 3, 40, 91, 4, 5, 6, 7, 8,
- /* 10 */
- 9, 10, 11, 12, 13, 14, 15, 104, 105, 18,
- /* 20 */
- 118, 18, 60, 20, 23, 24, 1, 65, 3, 30,
- /* 30 */
- 29, 118, 1, 30, 33, 36, 35, 21, 22, 36,
- /* 40 */
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
- /* 50 */
- 51, 52, 53, 54, 1, 30, 31, 1, 1, 3,
- /* 60 */
- 3, 36, 2, 18, 19, 20, 67, 68, 69, 70,
- /* 70 */
- 71, 72, 73, 74, 75, 76, 77, 78, 62, 30,
- /* 80 */
- 55, 28, 37, 30, 111, 36, 30, 30, 18, 36,
- /* 90 */
- 20, 21, 36, 36, 41, 42, 43, 44, 45, 46,
- /* 100 */
- 47, 48, 49, 50, 51, 52, 53, 54, 1, 91,
- /* 110 */
- 92, 55, 55, 83, 84, 85, 86, 87, 38, 101,
- /* 120 */
- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
- /* 130 */
- 77, 78, 18, 63, 20, 21, 118, 30, 1, 18,
- /* 140 */
- 3, 20, 21, 36, 111, 39, 66, 26, 41, 42,
- /* 150 */
- 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
- /* 160 */
- 53, 54, 1, 1, 26, 3, 60, 30, 62, 15,
- /* 170 */
- 16, 17, 66, 36, 67, 68, 69, 70, 71, 72,
- /* 180 */
- 73, 74, 75, 76, 77, 78, 18, 19, 20, 32,
- /* 190 */
- 100, 1, 30, 109, 1, 18, 39, 20, 36, 1,
- /* 200 */
- 116, 3, 41, 42, 43, 44, 45, 46, 47, 48,
- /* 210 */
- 49, 50, 51, 52, 53, 54, 1, 55, 80, 62,
- /* 220 */
- 30, 85, 86, 87, 39, 32, 36, 66, 67, 68,
- /* 230 */
- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
- /* 240 */
- 63, 86, 114, 115, 91, 92, 31, 62, 55, 18,
- /* 250 */
- 38, 20, 40, 55, 101, 18, 41, 42, 43, 44,
- /* 260 */
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- /* 270 */
- 1, 118, 3, 94, 95, 96, 39, 122, 123, 38,
- /* 280 */
- 91, 40, 67, 68, 69, 70, 71, 72, 73, 74,
- /* 290 */
- 75, 76, 77, 78, 63, 114, 115, 100, 91, 92,
- /* 300 */
- 112, 91, 114, 115, 91, 19, 20, 118, 101, 20,
- /* 310 */
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
- /* 320 */
- 51, 52, 53, 54, 1, 118, 3, 100, 118, 119,
- /* 330 */
- 60, 118, 2, 91, 3, 65, 67, 68, 69, 70,
- /* 340 */
- 71, 72, 73, 74, 75, 76, 77, 78, 21, 22,
- /* 350 */
- 64, 21, 63, 92, 111, 119, 113, 26, 19, 20,
- /* 360 */
- 118, 1, 101, 21, 41, 42, 43, 44, 45, 46,
- /* 370 */
- 47, 48, 49, 50, 51, 52, 53, 54, 1, 118,
- /* 380 */
- 3, 18, 22, 20, 19, 94, 95, 1, 98, 62,
- /* 390 */
- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
- /* 400 */
- 77, 78, 60, 113, 39, 1, 2, 92, 92, 18,
- /* 410 */
- 111, 20, 113, 87, 26, 89, 101, 101, 41, 42,
- /* 420 */
- 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
- /* 430 */
- 53, 54, 1, 118, 118, 18, 39, 20, 19, 94,
- /* 440 */
- 95, 55, 98, 25, 67, 68, 69, 70, 71, 72,
- /* 450 */
- 73, 74, 75, 76, 77, 78, 38, 113, 86, 92,
- /* 460 */
- 92, 92, 18, 40, 20, 30, 60, 2, 101, 101,
- /* 470 */
- 101, 36, 41, 42, 43, 44, 45, 46, 47, 48,
- /* 480 */
- 49, 50, 51, 52, 53, 54, 1, 118, 18, 109,
- /* 490 */
- 20, 20, 56, 39, 19, 123, 116, 98, 67, 68,
- /* 500 */
- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
- /* 510 */
- 25, 80, 113, 92, 64, 27, 21, 20, 19, 64,
- /* 520 */
- 20, 3, 101, 20, 22, 2, 41, 42, 43, 44,
- /* 530 */
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- /* 540 */
- 1, 20, 3, 19, 3, 20, 20, 20, 19, 66,
- /* 550 */
- 98, 98, 67, 68, 69, 70, 71, 72, 73, 74,
- /* 560 */
- 75, 76, 77, 78, 62, 113, 113, 20, 37, 37,
- /* 570 */
- 3, 20, 20, 101, 112, 111, 22, 111, 111, 111,
- /* 580 */
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
- /* 590 */
- 51, 52, 53, 54, 1, 116, 30, 113, 97, 88,
- /* 600 */
- 16, 115, 124, 97, 99, 98, 67, 68, 69, 70,
- /* 610 */
- 71, 72, 73, 74, 75, 76, 77, 78, 113, 124,
- /* 620 */
- 113, 124, 124, 124, 124, 124, 124, 124, 124, 124,
- /* 630 */
- 124, 124, 124, 40, 41, 42, 43, 44, 45, 46,
- /* 640 */
- 47, 48, 49, 50, 51, 52, 53, 54, 1, 2,
- /* 650 */
- 124, 124, 124, 124, 124, 124, 124, 98, 98, 98,
- /* 660 */
- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
- /* 670 */
- 77, 78, 113, 113, 113, 124, 124, 124, 124, 124,
- /* 680 */
- 124, 124, 124, 124, 124, 124, 124, 124, 41, 42,
- /* 690 */
- 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
- /* 700 */
- 53, 54, 1, 124, 124, 124, 124, 124, 124, 124,
- /* 710 */
- 124, 98, 124, 124, 67, 68, 69, 70, 71, 72,
- /* 720 */
- 73, 74, 75, 76, 77, 78, 113, 124, 124, 124,
- /* 730 */
- 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
- /* 740 */
- 124, 40, 41, 42, 43, 44, 45, 46, 47, 48,
- /* 750 */
- 49, 50, 51, 52, 53, 54, 1, 124, 124, 124,
- /* 760 */
- 124, 124, 124, 124, 124, 124, 124, 124, 67, 68,
- /* 770 */
- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
- /* 780 */
- 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
- /* 790 */
- 124, 124, 124, 124, 124, 124, 41, 42, 43, 44,
- /* 800 */
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- /* 810 */
- 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
- /* 820 */
- 22, 124, 67, 68, 69, 70, 71, 72, 73, 74,
- /* 830 */
- 75, 76, 77, 78, 124, 124, 124, 124, 41, 42,
- /* 840 */
- 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
- /* 850 */
- 53, 54, 124, 124, 124, 124, 124, 124, 60, 124,
- /* 860 */
- 124, 124, 124, 65, 67, 68, 69, 70, 71, 72,
- /* 870 */
- 73, 74, 75, 76, 77, 78, 124, 124, 124, 124,
- /* 880 */
- 124, 124, 124, 18, 19, 20, 124, 124, 23, 24,
- /* 890 */
- 124, 86, 124, 124, 29, 90, 92, 124, 33, 94,
- /* 900 */
- 35, 124, 37, 124, 39, 101, 124, 42, 103, 124,
- /* 910 */
- 124, 106, 107, 108, 124, 110, 124, 113, 92, 92,
- /* 920 */
- 124, 124, 57, 58, 59, 60, 61, 101, 101, 64,
- /* 930 */
- 65, 66, 124, 94, 124, 124, 124, 124, 124, 113,
- /* 940 */
- 113, 18, 19, 20, 79, 106, 23, 24, 124, 110,
- /* 950 */
- 124, 124, 29, 124, 124, 86, 33, 34, 35, 90,
- /* 960 */
- 37, 124, 39, 94, 92, 42, 124, 124, 124, 124,
- /* 970 */
- 86, 124, 103, 101, 90, 106, 107, 108, 94, 110,
- /* 980 */
- 57, 58, 59, 60, 61, 113, 124, 64, 65, 124,
- /* 990 */
- 106, 107, 108, 124, 110, 18, 124, 20, 124, 18,
- /* 1000 */
- 19, 20, 79, 124, 23, 24, 124, 30, 124, 32,
- /* 1010 */
- 29, 86, 124, 36, 33, 90, 35, 124, 37, 94,
- /* 1020 */
- 39, 124, 124, 42, 124, 124, 124, 124, 124, 124,
- /* 1030 */
- 124, 106, 107, 108, 124, 110, 124, 124, 57, 58,
- /* 1040 */
- 59, 60, 61, 124, 124, 64, 65, 124, 124, 124,
- /* 1050 */
- 124, 124, 18, 124, 20, 124, 124, 18, 19, 20,
- /* 1060 */
- 79, 124, 23, 24, 30, 86, 32, 124, 29, 90,
- /* 1070 */
- 36, 86, 33, 94, 35, 90, 37, 124, 39, 94,
- /* 1080 */
- 124, 42, 124, 124, 124, 106, 107, 108, 124, 110,
- /* 1090 */
- 124, 106, 107, 108, 124, 110, 57, 58, 59, 60,
- /* 1100 */
- 61, 124, 124, 64, 65, 124, 124, 124, 124, 124,
- /* 1110 */
- 124, 124, 124, 124, 124, 18, 19, 20, 79, 124,
- /* 1120 */
- 23, 24, 124, 124, 124, 124, 29, 86, 124, 124,
- /* 1130 */
- 33, 90, 35, 124, 37, 94, 39, 124, 124, 42,
- /* 1140 */
- 124, 124, 124, 124, 124, 124, 124, 106, 107, 108,
- /* 1150 */
- 124, 110, 124, 124, 57, 58, 59, 60, 61, 124,
- /* 1160 */
- 124, 64, 65, 124, 124, 124, 124, 124, 124, 124,
- /* 1170 */
- 124, 124, 124, 18, 19, 20, 79, 124, 23, 24,
- /* 1180 */
- 124, 124, 124, 124, 29, 86, 124, 124, 33, 90,
- /* 1190 */
- 35, 124, 37, 94, 39, 124, 124, 42, 124, 124,
- /* 1200 */
- 124, 124, 124, 124, 124, 106, 107, 108, 124, 110,
- /* 1210 */
- 124, 124, 57, 58, 59, 60, 61, 124, 124, 64,
- /* 1220 */
- 65, 124, 124, 124, 124, 124, 124, 124, 124, 124,
- /* 1230 */
- 124, 18, 19, 20, 79, 124, 23, 24, 124, 124,
- /* 1240 */
- 124, 124, 29, 86, 124, 124, 33, 90, 35, 124,
- /* 1250 */
- 37, 94, 39, 124, 124, 42, 124, 124, 124, 124,
- /* 1260 */
- 124, 124, 124, 106, 107, 108, 124, 110, 124, 124,
- /* 1270 */
- 57, 58, 59, 60, 61, 124, 124, 64, 65, 124,
- /* 1280 */
- 1, 124, 3, 124, 3, 124, 124, 124, 124, 18,
- /* 1290 */
- 19, 20, 79, 124, 23, 24, 124, 124, 124, 124,
- /* 1300 */
- 29, 22, 21, 124, 33, 124, 35, 124, 37, 30,
- /* 1310 */
- 39, 30, 124, 42, 124, 36, 124, 36, 39, 124,
- /* 1320 */
- 39, 124, 124, 124, 91, 92, 124, 124, 57, 58,
- /* 1330 */
- 59, 60, 61, 124, 101, 64, 65, 104, 105, 124,
- /* 1340 */
- 124, 62, 124, 62, 124, 124, 124, 18, 19, 20,
- /* 1350 */
- 79, 118, 23, 24, 124, 124, 124, 124, 29, 124,
- /* 1360 */
- 124, 124, 33, 124, 35, 124, 37, 124, 39, 91,
- /* 1370 */
- 92, 42, 124, 124, 124, 124, 124, 124, 124, 101,
- /* 1380 */
- 124, 124, 104, 105, 124, 124, 57, 58, 59, 60,
- /* 1390 */
- 61, 124, 124, 64, 65, 124, 118, 124, 124, 124,
- /* 1400 */
- 124, 124, 124, 124, 124, 18, 19, 20, 79, 124,
- /* 1410 */
- 23, 24, 124, 124, 124, 124, 29, 124, 124, 124,
- /* 1420 */
- 33, 124, 35, 124, 37, 124, 39, 91, 92, 42,
- /* 1430 */
- 124, 124, 124, 124, 124, 124, 124, 101, 124, 124,
- /* 1440 */
- 104, 105, 124, 124, 57, 58, 59, 60, 61, 124,
- /* 1450 */
- 124, 64, 124, 124, 118, 124, 124, 124, 124, 124,
- /* 1460 */
- 124, 124, 124, 18, 19, 20, 79, 124, 23, 24,
- /* 1470 */
- 124, 124, 124, 124, 29, 124, 124, 124, 33, 124,
- /* 1480 */
- 35, 124, 37, 124, 39, 124, 3, 42, 124, 124,
- /* 1490 */
- 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
- /* 1500 */
- 124, 124, 57, 58, 59, 60, 61, 124, 25, 64,
- /* 1510 */
- 27, 28, 124, 30, 31, 124, 124, 124, 124, 36,
- /* 1520 */
- 124, 38, 39, 40, 79, 124, 124, 124, 124, 124,
- /* 1530 */
- 124, 124, 124, 124, 124, 86, 124, 124, 55, 90,
- /* 1540 */
- 124, 124, 93, 94, 124, 62, 124, 124, 124, 66,
- /* 1550 */
- 124, 102, 103, 124, 124, 106, 107, 108, 124, 110,
- /* 1560 */
- 124, 124, 124, 80, 124, 124, 124, 86, 124, 120,
- /* 1570 */
- 121, 90, 124, 124, 93, 94, 95, 124, 124, 124,
- /* 1580 */
- 124, 124, 124, 102, 103, 124, 124, 106, 107, 108,
- /* 1590 */
- 86, 110, 124, 124, 90, 124, 124, 93, 94, 124,
- /* 1600 */
- 124, 124, 124, 124, 124, 124, 102, 103, 124, 86,
- /* 1610 */
- 106, 107, 108, 90, 110, 124, 93, 94, 124, 124,
- /* 1620 */
- 124, 117, 124, 124, 124, 102, 103, 124, 124, 106,
- /* 1630 */
- 107, 108, 124, 110, 124, 124, 124, 124, 86, 124,
- /* 1640 */
- 117, 124, 90, 124, 124, 93, 94, 124, 124, 124,
- /* 1650 */
- 124, 124, 124, 124, 102, 103, 124, 124, 106, 107,
- /* 1660 */
- 108, 86, 110, 124, 124, 90, 124, 124, 93, 94,
- /* 1670 */
- 95, 124, 124, 121, 124, 124, 124, 102, 103, 124,
- /* 1680 */
- 124, 106, 107, 108, 86, 110, 124, 124, 90, 124,
- /* 1690 */
- 124, 93, 94, 124, 124, 124, 124, 124, 124, 124,
- /* 1700 */
- 102, 103, 124, 86, 106, 107, 108, 90, 110, 124,
- /* 1710 */
- 93, 94, 124, 124, 124, 117, 124, 124, 124, 102,
- /* 1720 */
- 103, 124, 124, 106, 107, 108, 124, 110, 124, 86,
- /* 1730 */
- 91, 92, 124, 90, 124, 124, 93, 94, 124, 124,
- /* 1740 */
- 101, 124, 124, 104, 105, 102, 103, 124, 86, 106,
- /* 1750 */
- 107, 108, 90, 110, 124, 93, 94, 118, 124, 124,
- /* 1760 */
- 124, 124, 124, 124, 102, 103, 124, 124, 106, 107,
- /* 1770 */
- 108, 86, 110, 124, 124, 90, 124, 124, 93, 94,
- /* 1780 */
- 124, 124, 124, 124, 124, 124, 124, 102, 103, 124,
- /* 1790 */
- 86, 106, 107, 108, 90, 110, 124, 93, 94, 124,
- /* 1800 */
- 124, 124, 124, 124, 124, 124, 102, 103, 124, 124,
- /* 1810 */
- 106, 107, 108, 124, 110, 124, 86, 91, 92, 124,
- /* 1820 */
- 90, 124, 124, 93, 94, 124, 124, 101, 124, 124,
- /* 1830 */
- 104, 105, 102, 103, 124, 86, 106, 107, 108, 90,
- /* 1840 */
- 110, 124, 93, 94, 118, 124, 124, 124, 124, 124,
- /* 1850 */
- 124, 102, 103, 124, 124, 106, 107, 108, 86, 110,
- /* 1860 */
- 124, 124, 90, 124, 124, 93, 94, 124, 124, 124,
- /* 1870 */
- 124, 124, 124, 124, 102, 103, 124, 86, 106, 107,
- /* 1880 */
- 108, 90, 110, 124, 93, 94, 124, 124, 124, 124,
- /* 1890 */
- 124, 124, 124, 102, 103, 124, 124, 106, 107, 108,
- /* 1900 */
- 124, 110, 124, 86, 91, 92, 124, 90, 124, 124,
- /* 1910 */
- 93, 94, 124, 124, 101, 124, 124, 104, 105, 102,
- /* 1920 */
- 103, 124, 86, 106, 107, 108, 90, 110, 124, 93,
- /* 1930 */
- 94, 118, 124, 124, 124, 124, 124, 124, 102, 103,
- /* 1940 */
- 124, 124, 106, 107, 108, 86, 110, 124, 124, 90,
- /* 1950 */
- 124, 124, 93, 94, 124, 124, 124, 124, 124, 124,
- /* 1960 */
- 124, 102, 103, 124, 86, 106, 107, 108, 90, 110,
- /* 1970 */
- 124, 93, 94, 124, 124, 124, 124, 124, 124, 124,
- /* 1980 */
- 102, 103, 124, 124, 106, 107, 108, 124, 110, 124,
- /* 1990 */
- 86, 124, 124, 124, 90, 124, 124, 93, 94, 124,
- /* 2000 */
- 124, 124, 124, 124, 124, 124, 102, 103, 124, 86,
- /* 2010 */
- 106, 107, 108, 90, 110, 124, 93, 94, 124, 124,
- /* 2020 */
- 124, 124, 124, 124, 124, 102, 103, 124, 124, 106,
- /* 2030 */
- 107, 108, 86, 110, 124, 124, 90, 124, 124, 93,
- /* 2040 */
- 94, 124, 124, 124, 124, 124, 124, 124, 102, 103,
- /* 2050 */
- 124, 86, 106, 107, 108, 90, 110, 124, 93, 94,
- /* 2060 */
- 124, 124, 124, 124, 124, 124, 124, 102, 103, 124,
- /* 2070 */
- 124, 106, 107, 108, 124, 110, 124, 86, 124, 124,
- /* 2080 */
- 124, 90, 124, 124, 93, 94, 124, 124, 124, 124,
- /* 2090 */
- 124, 124, 124, 102, 103, 124, 86, 106, 107, 108,
- /* 2100 */
- 90, 110, 124, 93, 94, 124, 124, 124, 124, 124,
- /* 2110 */
- 124, 124, 102, 103, 124, 124, 106, 107, 108, 86,
- /* 2120 */
- 110, 124, 124, 90, 124, 124, 93, 94, 124, 124,
- /* 2130 */
- 124, 124, 124, 124, 124, 102, 103, 124, 86, 106,
- /* 2140 */
- 107, 108, 90, 110, 124, 93, 94, 124, 124, 124,
- /* 2150 */
- 124, 124, 124, 124, 102, 103, 124, 124, 106, 107,
- /* 2160 */
- 108, 124, 110, 124, 86, 124, 124, 124, 90, 124,
- /* 2170 */
- 124, 93, 94, 124, 124, 124, 124, 124, 124, 124,
- /* 2180 */
- 102, 103, 124, 86, 106, 107, 108, 90, 110, 124,
- /* 2190 */
- 93, 94, 124, 124, 124, 124, 124, 124, 124, 102,
- /* 2200 */
- 103, 124, 124, 106, 107, 108, 86, 110, 124, 124,
- /* 2210 */
- 90, 124, 124, 93, 94, 124, 124, 124, 124, 124,
- /* 2220 */
- 124, 124, 102, 103, 124, 86, 106, 107, 108, 90,
- /* 2230 */
- 110, 124, 93, 94, 124, 124, 124, 124, 124, 124,
- /* 2240 */
- 124, 102, 103, 124, 124, 106, 107, 108, 124, 110,
- /* 2250 */
- 124, 86, 124, 124, 124, 90, 124, 124, 93, 94,
- /* 2260 */
- 124, 124, 124, 124, 124, 124, 124, 102, 103, 124,
- /* 2270 */
- 86, 106, 107, 108, 90, 110, 124, 93, 94, 124,
- /* 2280 */
- 124, 124, 124, 124, 124, 124, 102, 103, 124, 124,
- /* 2290 */
- 106, 107, 108, 86, 110, 124, 124, 90, 124, 124,
- /* 2300 */
- 93, 94, 124, 124, 124, 124, 124, 124, 124, 102,
- /* 2310 */
- 103, 124, 86, 106, 107, 108, 90, 110, 124, 93,
- /* 2320 */
- 94, 124, 124, 124, 124, 124, 124, 124, 102, 103,
- /* 2330 */
- 124, 124, 106, 107, 108, 124, 110, 124, 86, 124,
- /* 2340 */
- 124, 124, 90, 124, 124, 93, 94, 124, 124, 124,
- /* 2350 */
- 124, 124, 124, 124, 102, 103, 124, 11, 106, 107,
- /* 2360 */
- 108, 124, 110, 124, 18, 124, 124, 124, 124, 23,
- /* 2370 */
- 24, 11, 124, 124, 124, 29, 124, 124, 18, 33,
- /* 2380 */
- 124, 35, 124, 23, 24, 124, 124, 124, 124, 29,
- /* 2390 */
- 124, 124, 124, 33, 124, 35, 86, 124, 124, 124,
- /* 2400 */
- 90, 124, 124, 93, 94, 124, 124, 124, 124, 124,
- /* 2410 */
- 124, 124, 102, 103, 124, 124, 106, 107, 108, 124,
- /* 2420 */
- 110, 124, 124, 124, 124, 79, 80, 81, 124, 86,
- /* 2430 */
- 124, 124, 124, 90, 124, 124, 93, 94, 124, 79,
- /* 2440 */
- 80, 81, 124, 124, 124, 102, 103, 124, 124, 106,
- /* 2450 */
- 107, 108, 124, 110, 124, 124, 86, 124, 124, 124,
- /* 2460 */
- 90, 124, 124, 93, 94, 124, 124, 124, 124, 124,
- /* 2470 */
- 124, 124, 102, 103, 124, 124, 106, 107, 108, 124,
- /* 2480 */
- 110, 124, 86, 124, 124, 124, 90, 124, 124, 93,
- /* 2490 */
- 94, 124, 124, 124, 124, 124, 124, 124, 102, 103,
- /* 2500 */
- 124, 124, 106, 107, 108, 86, 110, 124, 124, 90,
- /* 2510 */
- 124, 124, 93, 94, 124, 124, 86, 124, 124, 124,
- /* 2520 */
- 90, 102, 103, 93, 94, 106, 107, 108, 124, 110,
- /* 2530 */
- 124, 124, 102, 103, 124, 124, 106, 107, 108, 124,
- /* 2540 */
- 110,
- );
- const YY_SHIFT_USE_DFLT = - 39;
- const YY_SHIFT_MAX = 259;
- static public $yy_shift_ofst = array(
- /* 0 */
- 1, 1097, 1271, 1097, 981, 1271, 981, 981, 923, 865,
- /* 10 */
- 923, 981, 981, 981, 981, 981, 981, 981, 981, 981,
- /* 20 */
- 981, 981, 1213, 981, 981, 981, 1155, 1329, 981, 981,
- /* 30 */
- 981, 981, 981, 981, 981, 981, 981, 981, 981, 981,
- /* 40 */
- 981, 1155, 981, 981, 1039, 1039, 1445, 1387, 1387, 1387,
- /* 50 */
- 1387, 1387, 1387, - 1, 53, 107, 107, 107, 107, 107,
- /* 60 */
- 539, 431, 701, 161, 377, 269, 647, 485, 593, 215,
- /* 70 */
- 323, 755, 755, 755, 755, 755, 755, 755, 755, 755,
- /* 80 */
- 755, 755, 755, 755, 755, 755, 755, 755, 755, 755,
- /* 90 */
- 797, 797, 1279, 56, 190, 1, 2346, 977, 1034, 3,
- /* 100 */
- 3, 137, 137, 190, 190, 286, 798, 404, 365, 2360,
- /* 110 */
- 25, 162, 57, 121, 70, 154, 16, 327, 198, 231,
- /* 120 */
- 114, 193, 417, 391, 360, 363, 363, 339, 502, 363,
- /* 130 */
- 365, 363, 365, 386, 339, 444, 470, 49, 444, 435,
- /* 140 */
- 49, 363, 363, 363, 363, 363, 31, 554, 31, 31,
- /* 150 */
- 554, 31, 31, 31, 31, 31, 31, - 39, 177, 168,
- /* 160 */
- 49, 49, 49, 49, 49, 49, 49, 49, - 38, - 38,
- /* 170 */
- - 38, 270, - 38, 49, 49, 49, 49, 49, 49, - 38,
- /* 180 */
- 270, - 38, 237, 49, 49, 49, - 38, 49, 49, 49,
- /* 190 */
- 584, 554, 554, 31, 566, 566, 60, 554, 31, 454,
- /* 200 */
- 31, 31, 60, 31, - 39, - 39, - 39, - 39, - 39, 1483,
- /* 210 */
- 1281, 106, 45, 157, 138, - 37, 80, 241, 418, 342,
- /* 220 */
- 331, 212, 185, 330, 185, 289, 552, 541, 526, 525,
- /* 230 */
- 521, 523, 524, 527, 529, 567, 551, 532, 531, 483,
- /* 240 */
- 547, 503, 518, 436, 454, 465, 406, 397, 419, 423,
- /* 250 */
- 471, 388, 475, 455, 500, 499, 497, 450, 488, 495,
- );
- const YY_REDUCE_USE_DFLT = - 99;
- const YY_REDUCE_MAX = 208;
- static public $yy_reduce_ofst = array(
- /* 0 */
- 30, 1449, 1575, 1552, 1523, 1481, 1504, 1598, 1836, 2010,
- /* 10 */
- 1991, 1791, 1685, 1643, 1704, 1749, 2033, 2078, 2310, 2419,
- /* 20 */
- 2139, 2207, 2252, 2343, 2370, 1772, 1617, 1946, 1904, 2184,
- /* 30 */
- 1923, 1878, 1859, 1965, 2052, 1662, 1817, 1730, 2097, 2396,
- /* 40 */
- 2430, 2120, 2165, 2226, 869, 805, 985, 925, 884, 979,
- /* 50 */
- 1099, 1041, 1157, 1639, 1233, 1639, 1336, 1278, 1726, 1813,
- /* 60 */
- - 87, - 87, - 87, - 87, - 87, - 87, - 87, - 87, - 87, - 87,
- /* 70 */
- - 87, - 87, - 87, - 87, - 87, - 87, - 87, - 87, - 87, - 87,
- /* 80 */
- - 87, - 87, - 87, - 87, - 87, - 87, - 87, - 87, - 87, - 87,
- /* 90 */
- - 87, - 87, 18, 207, 153, 136, 155, 827, 872, 804,
- /* 100 */
- 826, 261, 316, 369, 315, 839, 188, 210, 179, 372,
- /* 110 */
- 189, 189, 189, 505, 299, 326, 128, 128, 189, 299,
- /* 120 */
- 299, 189, 507, 453, 242, 344, 243, 84, 128, 452,
- /* 130 */
- 291, 399, 345, 189, 380, 613, 453, 421, 453, 368,
- /* 140 */
- 367, 560, 453, 559, 561, 290, 189, 128, 213, 189,
- /* 150 */
- 181, 189, 189, 189, 189, 189, 189, 189, 484, 479,
- /* 160 */
- 472, 472, 472, 472, 472, 472, 472, 472, 462, 462,
- /* 170 */
- 462, 464, 462, 472, 472, 472, 472, 472, 472, 462,
- /* 180 */
- 467, 462, 466, 472, 472, 472, 462, 472, 472, 472,
- /* 190 */
- 511, 486, 486, - 98, 501, 506, 236, 486, - 98, 468,
- /* 200 */
- - 98, - 98, 236, - 98, 227, - 27, 197, 33, 90,
- );
- static public $yyExpectedTokens = array(
- /* 0 */
- array(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 23, 24, 29, 33, 35,),
- /* 1 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 2 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 3 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 4 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 5 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 6 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 7 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 8 */
- array(18, 19, 20, 23, 24, 29, 33, 34, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 9 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 66, 79,),
- /* 10 */
- array(18, 19, 20, 23, 24, 29, 33, 34, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 11 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 12 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 13 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 14 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 15 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 16 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 17 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 18 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 19 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 20 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 21 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 22 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 23 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 24 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 25 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 26 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 27 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 28 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 29 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 30 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 31 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 32 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 33 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 34 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 35 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 36 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 37 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 38 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 39 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 40 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 41 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 42 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 43 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 44 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 45 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 65, 79,),
- /* 46 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 79,),
- /* 47 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 79,),
- /* 48 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 79,),
- /* 49 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 79,),
- /* 50 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 79,),
- /* 51 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 79,),
- /* 52 */
- array(18, 19, 20, 23, 24, 29, 33, 35, 37, 39, 42, 57, 58, 59, 60, 61, 64, 79,),
- /* 53 */
- array(1, 3, 30, 36, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 54 */
- array(1, 28, 30, 36, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 55 */
- array(1, 30, 36, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 56 */
- array(1, 30, 36, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 57 */
- array(1, 30, 36, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 58 */
- array(1, 30, 36, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 59 */
- array(1, 30, 36, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 60 */
- array(1, 3, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 61 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 80,),
- /* 62 */
- array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 63 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 64 */
- array(1, 3, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 65 */
- array(1, 3, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 66 */
- array(1, 2, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 67 */
- array(1, 25, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 68 */
- array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 69 */
- array(1, 31, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 70 */
- array(1, 3, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 71 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 72 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 73 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 74 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 75 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 76 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 77 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 78 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 79 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 80 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 81 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 82 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 83 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 84 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 85 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 86 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 87 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 88 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 89 */
- array(1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 90 */
- array(41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 91 */
- array(41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,),
- /* 92 */
- array(1, 3, 22, 30, 36, 39, 62,),
- /* 93 */
- array(1, 3, 30, 36, 55,),
- /* 94 */
- array(1, 30, 36,),
- /* 95 */
- array(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 23, 24, 29, 33, 35,),
- /* 96 */
- array(11, 18, 23, 24, 29, 33, 35, 79, 80, 81,),
- /* 97 */
- array(18, 20, 30, 32, 36,),
- /* 98 */
- array(18, 20, 30, 32, 36,),
- /* 99 */
- array(18, 20, 30, 36,),
- /* 100 */
- array(18, 20, 30, 36,),
- /* 101 */
- array(1, 3, 30, 36,),
- /* 102 */
- array(1, 3, 30, 36,),
- /* 103 */
- array(1, 30, 36,),
- /* 104 */
- array(1, 30, 36,),
- /* 105 */
- array(19, 20, 64,),
- /* 106 */
- array(22, 60, 65,),
- /* 107 */
- array(1, 2,),
- /* 108 */
- array(19, 39,),
- /* 109 */
- array(11, 18, 23, 24, 29, 33, 35, 79, 80, 81,),
- /* 110 */
- array(1, 3, 30, 31, 36, 55,),
- /* 111 */
- array(1, 3, 30, 36, 55,),
- /* 112 */
- array(1, 3, 30, 36, 55,),
- /* 113 */
- array(18, 20, 21, 26,),
- /* 114 */
- array(18, 20, 21, 63,),
- /* 115 */
- array(15, 16, 17,),
- /* 116 */
- array(21, 22, 62,),
- /* 117 */
- array(21, 22, 62,),
- /* 118 */
- array(1, 3, 55,),
- /* 119 */
- array(18, 20, 63,),
- /* 120 */
- array(18, 20, 21,),
- /* 121 */
- array(1, 32, 55,),
- /* 122 */
- array(18, 20,),
- /* 123 */
- array(18, 20,),
- /* 124 */
- array(1, 22,),
- /* 125 */
- array(18, 20,),
- /* 126 */
- array(18, 20,),
- /* 127 */
- array(19, 20,),
- /* 128 */
- array(22, 62,),
- /* 129 */
- array(18, 20,),
- /* 130 */
- array(19, 39,),
- /* 131 */
- array(18, 20,),
- /* 132 */
- array(19, 39,),
- /* 133 */
- array(1, 55,),
- /* 134 */
- array(19, 20,),
- /* 135 */
- array(18, 20,),
- /* 136 */
- array(18, 20,),
- /* 137 */
- array(30, 36,),
- /* 138 */
- array(18, 20,),
- /* 139 */
- array(30, 36,),
- /* 140 */
- array(30, 36,),
- /* 141 */
- array(18, 20,),
- /* 142 */
- array(18, 20,),
- /* 143 */
- array(18, 20,),
- /* 144 */
- array(18, 20,),
- /* 145 */
- array(18, 20,),
- /* 146 */
- array(1,),
- /* 147 */
- array(22,),
- /* 148 */
- array(1,),
- /* 149 */
- array(1,),
- /* 150 */
- array(22,),
- /* 151 */
- array(1,),
- /* 152 */
- array(1,),
- /* 153 */
- array(1,),
- /* 154 */
- array(1,),
- /* 155 */
- array(1,),
- /* 156 */
- array(1,),
- /* 157 */
- array(),
- /* 158 */
- array(18, 20, 63,),
- /* 159 */
- array(18, 19, 20,),
- /* 160 */
- array(30, 36,),
- /* 161 */
- array(30, 36,),
- /* 162 */
- array(30, 36,),
- /* 163 */
- array(30, 36,),
- /* 164 */
- array(30, 36,),
- /* 165 */
- array(30, 36,),
- /* 166 */
- array(30, 36,),
- /* 167 */
- array(30, 36,),
- /* 168 */
- array(60, 65,),
- /* 169 */
- array(60, 65,),
- /* 170 */
- array(60, 65,),
- /* 171 */
- array(60, 65,),
- /* 172 */
- array(60, 65,),
- /* 173 */
- array(30, 36,),
- /* 174 */
- array(30, 36,),
- /* 175 */
- array(30, 36,),
- /* 176 */
- array(30, 36,),
- /* 177 */
- array(30, 36,),
- /* 178 */
- array(30, 36,),
- /* 179 */
- array(60, 65,),
- /* 180 */
- array(60, 65,),
- /* 181 */
- array(60, 65,),
- /* 182 */
- array(18, 39,),
- /* 183 */
- array(30, 36,),
- /* 184 */
- array(30, 36,),
- /* 185 */
- array(30, 36,),
- /* 186 */
- array(60, 65,),
- /* 187 */
- array(30, 36,),
- /* 188 */
- array(30, 36,),
- /* 189 */
- array(30, 36,),
- /* 190 */
- array(16,),
- /* 191 */
- array(22,),
- /* 192 */
- array(22,),
- /* 193 */
- array(1,),
- /* 194 */
- array(30,),
- /* 195 */
- array(30,),
- /* 196 */
- array(2,),
- /* 197 */
- array(22,),
- /* 198 */
- array(1,),
- /* 199 */
- array(39,),
- /* 200 */
- array(1,),
- /* 201 */
- array(1,),
- /* 202 */
- array(2,),
- /* 203 */
- array(1,),
- /* 204 */
- array(),
- /* 205 */
- array(),
- /* 206 */
- array(),
- /* 207 */
- array(),
- /* 208 */
- array(),
- /* 209 */
- array(3, 25, 27, 28, 30, 31, 36, 38, 39, 40, 55, 62, 66, 80,),
- /* 210 */
- array(3, 21, 30, 36, 39, 62,),
- /* 211 */
- array(39, 60, 62, 66,),
- /* 212 */
- array(18, 19, 20, 37,),
- /* 213 */
- array(32, 39, 62,),
- /* 214 */
- array(26, 80,),
- /* 215 */
- array(38, 40,),
- /* 216 */
- array(38, 66,),
- /* 217 */
- array(38, 40,),
- /* 218 */
- array(25, 38,),
- /* 219 */
- array(21, 60,),
- /* 220 */
- array(3, 26,),
- /* 221 */
- array(38, 40,),
- /* 222 */
- array(39, 62,),
- /* 223 */
- array(2, 21,),
- /* 224 */
- array(39, 62,),
- /* 225 */
- array(20, 63,),
- /* 226 */
- array(20,),
- /* 227 */
- array(3,),
- /* 228 */
- array(20,),
- /* 229 */
- array(20,),
- /* 230 */
- array(20,),
- /* 231 */
- array(2,),
- /* 232 */
- array(19,),
- /* 233 */
- array(20,),
- /* 234 */
- array(19,),
- /* 235 */
- array(3,),
- /* 236 */
- array(20,),
- /* 237 */
- array(37,),
- /* 238 */
- array(37,),
- /* 239 */
- array(66,),
- /* 240 */
- array(20,),
- /* 241 */
- array(20,),
- /* 242 */
- array(3,),
- /* 243 */
- array(56,),
- /* 244 */
- array(39,),
- /* 245 */
- array(2,),
- /* 246 */
- array(60,),
- /* 247 */
- array(39,),
- /* 248 */
- array(19,),
- /* 249 */
- array(40,),
- /* 250 */
- array(20,),
- /* 251 */
- array(26,),
- /* 252 */
- array(19,),
- /* 253 */
- array(64,),
- /* 254 */
- array(20,),
- /* 255 */
- array(19,),
- /* 256 */
- array(20,),
- /* 257 */
- array(64,),
- /* 258 */
- array(27,),
- /* 259 */
- array(21,),
- /* 260 */
- array(),
- /* 261 */
- array(),
- /* 262 */
- array(),
- /* 263 */
- array(),
- /* 264 */
- array(),
- /* 265 */
- array(),
- /* 266 */
- array(),
- /* 267 */
- array(),
- /* 268 */
- array(),
- /* 269 */
- array(),
- /* 270 */
- array(),
- /* 271 */
- array(),
- /* 272 */
- array(),
- /* 273 */
- array(),
- /* 274 */
- array(),
- /* 275 */
- array(),
- /* 276 */
- array(),
- /* 277 */
- array(),
- /* 278 */
- array(),
- /* 279 */
- array(),
- /* 280 */
- array(),
- /* 281 */
- array(),
- /* 282 */
- array(),
- /* 283 */
- array(),
- /* 284 */
- array(),
- /* 285 */
- array(),
- /* 286 */
- array(),
- /* 287 */
- array(),
- /* 288 */
- array(),
- /* 289 */
- array(),
- /* 290 */
- array(),
- /* 291 */
- array(),
- /* 292 */
- array(),
- /* 293 */
- array(),
- /* 294 */
- array(),
- /* 295 */
- array(),
- /* 296 */
- array(),
- /* 297 */
- array(),
- /* 298 */
- array(),
- /* 299 */
- array(),
- /* 300 */
- array(),
- /* 301 */
- array(),
- /* 302 */
- array(),
- /* 303 */
- array(),
- /* 304 */
- array(),
- /* 305 */
- array(),
- /* 306 */
- array(),
- /* 307 */
- array(),
- /* 308 */
- array(),
- /* 309 */
- array(),
- /* 310 */
- array(),
- /* 311 */
- array(),
- /* 312 */
- array(),
- /* 313 */
- array(),
- /* 314 */
- array(),
- /* 315 */
- array(),
- /* 316 */
- array(),
- /* 317 */
- array(),
- /* 318 */
- array(),
- /* 319 */
- array(),
- /* 320 */
- array(),
- /* 321 */
- array(),
- /* 322 */
- array(),
- /* 323 */
- array(),
- /* 324 */
- array(),
- /* 325 */
- array(),
- /* 326 */
- array(),
- /* 327 */
- array(),
- /* 328 */
- array(),
- /* 329 */
- array(),
- /* 330 */
- array(),
- /* 331 */
- array(),
- /* 332 */
- array(),
- /* 333 */
- array(),
- /* 334 */
- array(),
- /* 335 */
- array(),
- /* 336 */
- array(),
- /* 337 */
- array(),
- /* 338 */
- array(),
- /* 339 */
- array(),
- /* 340 */
- array(),
- /* 341 */
- array(),
- /* 342 */
- array(),
- /* 343 */
- array(),
- /* 344 */
- array(),
- /* 345 */
- array(),
- /* 346 */
- array(),
- /* 347 */
- array(),
- /* 348 */
- array(),
- /* 349 */
- array(),
- /* 350 */
- array(),
- /* 351 */
- array(),
- /* 352 */
- array(),
- /* 353 */
- array(),
- /* 354 */
- array(),
- /* 355 */
- array(),
- /* 356 */
- array(),
- /* 357 */
- array(),
- );
- static public $yy_default = array(
- /* 0 */
- 361, 541, 558, 558, 512, 558, 512, 512, 558, 558,
- /* 10 */
- 558, 558, 558, 558, 558, 558, 558, 558, 558, 558,
- /* 20 */
- 558, 558, 558, 558, 558, 558, 558, 558, 558, 558,
- /* 30 */
- 558, 558, 558, 558, 558, 558, 558, 558, 558, 558,
- /* 40 */
- 558, 558, 558, 558, 558, 558, 558, 558, 558, 558,
- /* 50 */
- 558, 558, 558, 558, 418, 418, 418, 418, 387, 395,
- /* 60 */
- 558, 558, 558, 558, 558, 558, 558, 558, 558, 423,
- /* 70 */
- 558, 428, 425, 510, 423, 429, 511, 543, 444, 542,
- /* 80 */
- 447, 448, 443, 442, 439, 452, 544, 420, 451, 400,
- /* 90 */
- 456, 455, 467, 431, 418, 358, 558, 418, 418, 418,
- /* 100 */
- 418, 438, 475, 418, 418, 558, 524, 409, 558, 558,
- /* 110 */
- 431, 431, 431, 558, 485, 558, 476, 476, 431, 485,
- /* 120 */
- 485, 431, 558, 558, 412, 558, 485, 558, 476, 558,
- /* 130 */
- 558, 558, 558, 431, 558, 558, 558, 397, 558, 418,
- /* 140 */
- 418, 558, 558, 558, 558, 558, 441, 476, 414, 434,
- /* 150 */
- 521, 436, 435, 460, 459, 458, 454, 519, 486, 558,
- /* 160 */
- 385, 384, 405, 404, 389, 406, 399, 388, 505, 483,
- /* 170 */
- 482, 481, 480, 407, 408, 383, 398, 403, 402, 504,
- /* 180 */
- 479, 502, 485, 393, 392, 390, 503, 382, 396, 394,
- /* 190 */
- 378, 525, 522, 475, 557, 557, 513, 499, 438, 485,
- /* 200 */
- 413, 410, 514, 415, 518, 485, 518, 485, 518, 433,
- /* 210 */
- 467, 467, 558, 467, 457, 558, 558, 558, 558, 463,
- /* 220 */
- 457, 558, 453, 497, 467, 558, 558, 558, 558, 558,
- /* 230 */
- 558, 497, 558, 558, 558, 558, 558, 465, 558, 558,
- /* 240 */
- 558, 558, 558, 469, 497, 497, 463, 523, 558, 558,
- /* 250 */
- 558, 457, 558, 558, 558, 558, 558, 558, 426, 558,
- /* 260 */
- 477, 520, 495, 507, 490, 508, 487, 374, 498, 484,
- /* 270 */
- 556, 364, 363, 365, 461, 366, 472, 466, 360, 359,
- /* 280 */
- 462, 362, 464, 367, 430, 401, 469, 372, 373, 419,
- /* 290 */
- 432, 427, 368, 369, 370, 371, 433, 470, 445, 497,
- /* 300 */
- 446, 496, 450, 449, 500, 517, 545, 474, 552, 411,
- /* 310 */
- 501, 478, 553, 526, 534, 533, 535, 536, 437, 537,
- /* 320 */
- 532, 417, 528, 527, 529, 530, 531, 546, 547, 515,
- /* 330 */
- 506, 375, 376, 509, 377, 516, 468, 494, 489, 492,
- /* 340 */
- 491, 493, 379, 380, 555, 548, 554, 551, 550, 549,
- /* 350 */
- 440, 416, 473, 471, 539, 540, 538, 488,
- );
- const YYNOCODE = 125;
+
+ const TP_PHP = 3;
+
+ const TP_NOCACHE = 4;
+
+ const TP_TEXT = 5;
+
+ const TP_STRIPON = 6;
+
+ const TP_STRIPOFF = 7;
+
+ const TP_BLOCKSOURCE = 8;
+
+ const TP_LITERALSTART = 9;
+
+ const TP_LITERALEND = 10;
+
+ const TP_LITERAL = 11;
+
+ const TP_RDEL = 12;
+
+ const TP_SIMPLEOUTPUT = 13;
+
+ const TP_LDEL = 14;
+
+ const TP_DOLLARID = 15;
+
+ const TP_EQUAL = 16;
+
+ const TP_SIMPLETAG = 17;
+
+ const TP_ID = 18;
+
+ const TP_PTR = 19;
+
+ const TP_LDELIF = 20;
+
+ const TP_LDELFOR = 21;
+
+ const TP_SEMICOLON = 22;
+
+ const TP_INCDEC = 23;
+
+ const TP_TO = 24;
+
+ const TP_STEP = 25;
+
+ const TP_LDELFOREACH = 26;
+
+ const TP_SPACE = 27;
+
+ const TP_AS = 28;
+
+ const TP_APTR = 29;
+
+ const TP_LDELSETFILTER = 30;
+
+ const TP_SMARTYBLOCKCHILDPARENT = 31;
+
+ const TP_CLOSETAG = 32;
+
+ const TP_LDELSLASH = 33;
+
+ const TP_ATTR = 34;
+
+ const TP_INTEGER = 35;
+
+ const TP_COMMA = 36;
+
+ const TP_OPENP = 37;
+
+ const TP_CLOSEP = 38;
+
+ const TP_MATH = 39;
+
+ const TP_UNIMATH = 40;
+
+ const TP_ISIN = 41;
+
+ const TP_INSTANCEOF = 42;
+
+ const TP_QMARK = 43;
+
+ const TP_NOT = 44;
+
+ const TP_TYPECAST = 45;
+
+ const TP_HEX = 46;
+
+ const TP_DOT = 47;
+
+ const TP_SINGLEQUOTESTRING = 48;
+
+ const TP_DOUBLECOLON = 49;
+
+ const TP_NAMESPACE = 50;
+
+ const TP_AT = 51;
+
+ const TP_HATCH = 52;
+
+ const TP_OPENB = 53;
+
+ const TP_CLOSEB = 54;
+
+ const TP_DOLLAR = 55;
+
+ const TP_LOGOP = 56;
+
+ const TP_TLOGOP = 57;
+
+ const TP_SINGLECOND = 58;
+
+ const TP_QUOTE = 59;
+
+ const TP_BACKTICK = 60;
+
+ const YY_NO_ACTION = 525;
+
+ const YY_ACCEPT_ACTION = 524;
+
+ const YY_ERROR_ACTION = 523;
+
+ const YY_SZ_ACTTAB = 1908;
+
+ static public $yy_action = array(287, 9, 129, 251, 273, 194, 441, 2, 82, 280, 281, 282, 216, 110, 353, 223, 212,
+ 229, 441, 258, 217, 12, 199, 240, 32, 257, 257, 39, 17, 12, 25, 43, 42, 263, 224, 233, 17, 206, 441, 80, 1, 244,
+ 311, 311, 172, 172, 52, 287, 9, 128, 441, 273, 65, 178, 2, 82, 268, 14, 184, 298, 110, 262, 13, 319, 229, 297,
+ 258, 217, 31, 225, 12, 32, 170, 257, 39, 239, 189, 17, 43, 42, 263, 224, 292, 214, 206, 249, 80, 1, 113, 311,
+ 164, 442, 172, 52, 287, 9, 132, 201, 273, 209, 260, 2, 82, 442, 14, 141, 256, 110, 262, 88, 303, 229, 261, 258,
+ 217, 260, 225, 12, 32, 168, 36, 39, 241, 12, 17, 43, 42, 263, 224, 292, 17, 206, 189, 80, 1, 7, 311, 180, 257,
+ 219, 52, 287, 9, 132, 134, 273, 193, 470, 2, 82, 10, 470, 156, 304, 110, 300, 89, 172, 229, 310, 258, 217, 260,
+ 205, 223, 32, 257, 14, 39, 324, 12, 262, 43, 42, 263, 224, 292, 17, 206, 189, 80, 1, 470, 311, 470, 172, 470,
+ 52, 287, 9, 131, 201, 273, 209, 257, 2, 82, 83, 307, 232, 201, 110, 399, 454, 230, 229, 237, 258, 217, 454, 225,
+ 355, 32, 133, 201, 39, 215, 399, 144, 43, 42, 263, 224, 292, 399, 206, 12, 80, 1, 326, 311, 157, 236, 17, 52,
+ 287, 9, 133, 201, 273, 209, 260, 2, 82, 214, 201, 235, 202, 110, 113, 80, 99, 229, 311, 258, 217, 396, 225, 187,
+ 19, 14, 323, 39, 18, 262, 28, 43, 42, 263, 224, 292, 396, 206, 12, 80, 1, 143, 311, 396, 134, 17, 52, 287, 9,
+ 132, 10, 273, 209, 4, 2, 82, 313, 14, 146, 454, 110, 262, 181, 158, 229, 454, 258, 217, 260, 192, 12, 32, 20,
+ 260, 39, 99, 441, 17, 43, 42, 263, 224, 292, 243, 206, 189, 80, 1, 441, 311, 187, 182, 298, 52, 287, 9, 130,
+ 201, 273, 209, 14, 2, 82, 93, 262, 104, 24, 110, 399, 99, 169, 229, 154, 258, 217, 220, 225, 113, 5, 124, 260,
+ 39, 135, 399, 100, 43, 42, 263, 224, 292, 399, 206, 261, 80, 1, 325, 311, 228, 112, 104, 52, 287, 9, 132, 92,
+ 273, 191, 173, 2, 82, 174, 291, 285, 16, 110, 330, 312, 260, 229, 310, 258, 217, 311, 225, 223, 32, 259, 90, 39,
+ 261, 6, 264, 43, 42, 263, 224, 292, 181, 206, 175, 80, 1, 116, 311, 171, 201, 21, 52, 287, 9, 132, 37, 273, 195,
+ 260, 2, 82, 36, 296, 238, 189, 110, 189, 259, 201, 229, 261, 258, 217, 214, 225, 218, 32, 35, 113, 39, 36, 232,
+ 299, 43, 42, 263, 224, 292, 15, 206, 183, 80, 1, 211, 311, 17, 91, 226, 52, 287, 9, 133, 177, 273, 209, 179, 2,
+ 82, 318, 470, 99, 18, 110, 470, 454, 121, 229, 288, 258, 217, 289, 225, 316, 19, 145, 189, 39, 187, 189, 121,
+ 43, 42, 263, 224, 292, 161, 206, 261, 80, 99, 104, 311, 454, 14, 454, 52, 470, 262, 454, 279, 278, 276, 277,
+ 283, 284, 174, 159, 470, 261, 287, 9, 470, 454, 273, 311, 317, 2, 82, 176, 298, 223, 204, 110, 115, 68, 107,
+ 229, 117, 258, 217, 100, 3, 201, 272, 329, 138, 29, 210, 271, 293, 454, 325, 454, 359, 470, 260, 454, 254, 317,
+ 139, 275, 200, 306, 223, 204, 111, 119, 72, 107, 260, 201, 37, 242, 100, 255, 151, 272, 329, 213, 4, 210, 271,
+ 293, 150, 325, 245, 167, 20, 152, 317, 81, 208, 149, 260, 223, 204, 260, 119, 60, 102, 186, 218, 185, 265, 100,
+ 269, 22, 272, 329, 286, 270, 210, 271, 293, 317, 325, 248, 147, 148, 223, 204, 178, 119, 72, 107, 153, 232, 260,
+ 274, 100, 13, 319, 272, 329, 261, 397, 210, 271, 293, 231, 325, 268, 136, 317, 189, 165, 106, 207, 223, 204,
+ 397, 115, 68, 107, 84, 327, 85, 397, 100, 103, 441, 272, 329, 290, 86, 210, 271, 293, 87, 325, 299, 299, 441,
+ 317, 299, 155, 299, 299, 223, 204, 305, 119, 50, 102, 299, 108, 299, 299, 100, 299, 299, 272, 329, 299, 299,
+ 210, 271, 293, 317, 325, 299, 299, 299, 223, 204, 299, 119, 72, 107, 299, 299, 299, 299, 100, 27, 227, 272, 329,
+ 160, 299, 210, 271, 293, 299, 325, 299, 299, 317, 299, 299, 299, 203, 223, 204, 299, 109, 46, 107, 299, 299,
+ 299, 299, 100, 299, 299, 272, 329, 299, 308, 210, 271, 293, 299, 325, 299, 311, 287, 8, 309, 299, 273, 299, 317,
+ 2, 82, 299, 299, 223, 204, 110, 119, 49, 107, 229, 299, 258, 217, 100, 299, 142, 272, 329, 299, 178, 210, 271,
+ 293, 299, 325, 260, 317, 299, 13, 319, 299, 223, 204, 299, 119, 70, 107, 299, 294, 23, 299, 100, 189, 299, 272,
+ 329, 299, 299, 210, 271, 293, 317, 325, 299, 299, 299, 223, 204, 299, 119, 77, 107, 299, 299, 299, 299, 100,
+ 299, 299, 272, 329, 299, 308, 210, 271, 293, 299, 325, 299, 299, 287, 8, 309, 299, 273, 299, 317, 2, 82, 299,
+ 299, 223, 204, 110, 119, 71, 107, 229, 299, 258, 217, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299,
+ 325, 299, 317, 299, 299, 299, 299, 223, 204, 299, 119, 60, 107, 299, 295, 23, 299, 100, 299, 299, 272, 329, 299,
+ 299, 210, 271, 293, 317, 325, 299, 140, 299, 223, 204, 178, 119, 73, 107, 299, 299, 260, 299, 100, 13, 319, 272,
+ 329, 299, 299, 210, 271, 293, 299, 325, 317, 201, 299, 189, 299, 223, 204, 299, 119, 62, 107, 299, 41, 40, 38,
+ 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 163, 321, 322, 328, 223, 204, 299, 119, 63,
+ 107, 299, 41, 40, 38, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 201, 321, 322, 328, 223,
+ 204, 299, 97, 69, 107, 299, 299, 299, 299, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 299,
+ 299, 299, 299, 223, 204, 299, 119, 75, 107, 222, 41, 40, 38, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293,
+ 299, 325, 317, 201, 321, 322, 328, 223, 204, 299, 119, 64, 107, 299, 247, 299, 299, 100, 299, 299, 272, 329,
+ 299, 299, 210, 271, 293, 299, 325, 317, 201, 26, 299, 299, 223, 204, 299, 98, 74, 107, 299, 41, 40, 38, 100,
+ 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 201, 321, 322, 328, 223, 198, 299, 105, 59, 107,
+ 299, 41, 40, 38, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 299, 321, 322, 328, 223, 204,
+ 299, 119, 45, 107, 246, 41, 40, 38, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 201, 321,
+ 322, 328, 223, 94, 299, 79, 48, 101, 299, 252, 299, 299, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299,
+ 325, 317, 299, 299, 299, 299, 223, 204, 299, 119, 56, 107, 299, 41, 40, 38, 100, 299, 299, 272, 329, 299, 299,
+ 210, 271, 293, 299, 325, 317, 201, 321, 322, 328, 223, 204, 299, 119, 61, 107, 299, 190, 299, 299, 100, 299,
+ 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 299, 299, 299, 299, 223, 204, 299, 96, 58, 107, 299, 41,
+ 40, 38, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 201, 321, 322, 328, 223, 204, 299, 119,
+ 66, 107, 299, 188, 299, 299, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 201, 299, 299,
+ 299, 223, 204, 299, 119, 47, 107, 299, 41, 40, 38, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325,
+ 317, 299, 321, 322, 328, 223, 204, 299, 119, 78, 107, 299, 41, 40, 38, 100, 299, 299, 272, 329, 299, 299, 210,
+ 271, 293, 299, 325, 317, 299, 321, 322, 328, 223, 204, 299, 119, 54, 107, 299, 299, 299, 299, 100, 299, 299,
+ 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 299, 299, 299, 299, 223, 204, 299, 119, 53, 107, 299, 299,
+ 299, 299, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 299, 299, 299, 299, 223, 95, 299, 79,
+ 44, 101, 299, 299, 299, 299, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 299, 299, 299,
+ 299, 223, 197, 299, 119, 57, 107, 299, 299, 299, 299, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299,
+ 325, 317, 299, 299, 299, 299, 223, 204, 299, 119, 76, 107, 299, 299, 299, 299, 100, 299, 299, 272, 329, 299,
+ 299, 210, 271, 293, 299, 325, 317, 299, 299, 299, 299, 223, 204, 299, 119, 55, 107, 299, 299, 299, 299, 100,
+ 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 299, 299, 299, 299, 223, 204, 299, 119, 67, 107,
+ 299, 299, 299, 299, 100, 299, 299, 272, 329, 299, 299, 210, 271, 293, 299, 325, 317, 299, 299, 299, 299, 223,
+ 234, 299, 122, 299, 107, 299, 299, 299, 299, 100, 299, 299, 299, 320, 299, 299, 210, 271, 293, 299, 325, 317,
+ 409, 409, 299, 299, 223, 234, 299, 127, 299, 107, 299, 299, 299, 299, 100, 299, 299, 299, 250, 299, 299, 210,
+ 271, 293, 299, 325, 524, 51, 253, 281, 282, 216, 299, 299, 223, 299, 441, 317, 409, 409, 409, 201, 223, 234,
+ 299, 126, 299, 107, 441, 299, 299, 299, 100, 299, 299, 409, 409, 409, 299, 210, 271, 293, 201, 325, 299, 33,
+ 299, 12, 299, 299, 299, 299, 299, 301, 17, 299, 299, 299, 299, 41, 40, 38, 299, 299, 317, 299, 299, 299, 12,
+ 223, 234, 299, 123, 299, 107, 17, 321, 322, 328, 100, 41, 40, 38, 299, 299, 299, 210, 271, 293, 299, 325, 299,
+ 299, 403, 299, 299, 299, 321, 322, 328, 299, 317, 299, 403, 299, 403, 223, 234, 403, 118, 299, 107, 299, 299,
+ 299, 403, 100, 403, 299, 403, 299, 299, 299, 210, 271, 293, 317, 325, 232, 299, 299, 223, 234, 299, 125, 299,
+ 107, 299, 299, 226, 299, 100, 299, 201, 299, 299, 299, 299, 210, 271, 293, 470, 325, 317, 201, 470, 454, 226,
+ 223, 234, 299, 120, 299, 107, 299, 299, 299, 299, 100, 470, 299, 30, 299, 470, 454, 210, 271, 293, 201, 325, 12,
+ 41, 40, 38, 454, 299, 454, 17, 470, 299, 454, 314, 41, 40, 38, 299, 315, 299, 321, 322, 328, 201, 454, 34, 454,
+ 299, 470, 299, 454, 321, 322, 328, 299, 299, 226, 470, 41, 40, 38, 470, 454, 299, 114, 299, 299, 299, 470, 299,
+ 299, 299, 470, 454, 299, 321, 322, 328, 299, 302, 299, 41, 40, 38, 201, 299, 299, 299, 299, 299, 454, 299, 454,
+ 299, 470, 365, 454, 299, 321, 322, 328, 454, 221, 454, 299, 470, 299, 454, 166, 299, 12, 299, 178, 299, 299,
+ 299, 299, 17, 260, 299, 441, 13, 319, 162, 299, 11, 196, 178, 299, 266, 137, 299, 441, 260, 178, 189, 13, 319,
+ 299, 299, 260, 299, 299, 13, 319, 299, 267, 299, 299, 299, 189, 299, 299, 299, 299, 299, 299, 189, 299, 299,
+ 299, 299, 299, 299, 299, 299, 311,);
+
+ static public $yy_lookahead = array(13, 14, 15, 15, 17, 18, 37, 20, 21, 64, 65, 66, 67, 26, 12, 70, 47, 30, 49, 32,
+ 33, 27, 35, 54, 37, 23, 23, 40, 34, 27, 29, 44, 45, 46, 47, 48, 34, 50, 37, 52, 53, 54, 55, 55, 42, 42, 59, 13,
+ 14, 15, 49, 17, 18, 76, 20, 21, 93, 14, 95, 96, 26, 18, 85, 86, 30, 31, 32, 33, 16, 35, 27, 37, 29, 23, 40, 23,
+ 99, 34, 44, 45, 46, 47, 48, 75, 50, 77, 52, 53, 80, 55, 72, 37, 42, 59, 13, 14, 15, 1, 17, 18, 82, 20, 21, 49,
+ 14, 72, 18, 26, 18, 76, 60, 30, 94, 32, 33, 82, 35, 27, 37, 29, 36, 40, 38, 27, 34, 44, 45, 46, 47, 48, 34, 50,
+ 99, 52, 53, 36, 55, 81, 23, 51, 59, 13, 14, 15, 47, 17, 18, 14, 20, 21, 53, 18, 72, 54, 26, 12, 76, 42, 30, 65,
+ 32, 33, 82, 35, 70, 37, 23, 14, 40, 54, 27, 18, 44, 45, 46, 47, 48, 34, 50, 99, 52, 53, 14, 55, 51, 42, 18, 59,
+ 13, 14, 15, 1, 17, 18, 23, 20, 21, 103, 104, 47, 1, 26, 12, 47, 51, 30, 54, 32, 33, 53, 35, 12, 37, 15, 1, 40,
+ 18, 27, 28, 44, 45, 46, 47, 48, 34, 50, 27, 52, 53, 18, 55, 72, 19, 34, 59, 13, 14, 15, 1, 17, 18, 82, 20, 21,
+ 75, 1, 77, 78, 26, 80, 52, 19, 30, 55, 32, 33, 12, 35, 99, 37, 14, 50, 40, 16, 18, 14, 44, 45, 46, 47, 48, 27,
+ 50, 27, 52, 53, 92, 55, 34, 47, 34, 59, 13, 14, 15, 53, 17, 18, 37, 20, 21, 54, 14, 72, 47, 26, 18, 76, 72, 30,
+ 53, 32, 33, 82, 35, 27, 37, 16, 82, 40, 19, 37, 34, 44, 45, 46, 47, 48, 54, 50, 99, 52, 53, 49, 55, 99, 95, 96,
+ 59, 13, 14, 15, 1, 17, 18, 14, 20, 21, 81, 18, 49, 16, 26, 12, 19, 72, 30, 75, 32, 33, 71, 35, 80, 37, 75, 82,
+ 40, 15, 27, 80, 44, 45, 46, 47, 48, 34, 50, 94, 52, 53, 91, 55, 51, 80, 49, 59, 13, 14, 15, 37, 17, 18, 72, 20,
+ 21, 9, 10, 11, 22, 26, 97, 96, 82, 30, 65, 32, 33, 55, 35, 70, 37, 100, 36, 40, 94, 37, 35, 44, 45, 46, 47, 48,
+ 76, 50, 76, 52, 53, 49, 55, 72, 1, 16, 59, 13, 14, 15, 2, 17, 18, 82, 20, 21, 36, 104, 38, 99, 26, 99, 100, 1,
+ 30, 94, 32, 33, 75, 35, 77, 37, 29, 80, 40, 36, 47, 38, 44, 45, 46, 47, 48, 27, 50, 15, 52, 53, 18, 55, 34, 92,
+ 2, 59, 13, 14, 15, 76, 17, 18, 76, 20, 21, 90, 14, 19, 16, 26, 18, 19, 97, 30, 66, 32, 33, 69, 35, 90, 37, 15,
+ 99, 40, 99, 99, 97, 44, 45, 46, 47, 48, 92, 50, 94, 52, 19, 49, 55, 47, 14, 49, 59, 51, 18, 53, 3, 4, 5, 6, 7,
+ 8, 9, 92, 14, 94, 13, 14, 18, 19, 17, 55, 65, 20, 21, 95, 96, 70, 71, 26, 73, 74, 75, 30, 18, 32, 33, 80, 37, 1,
+ 83, 84, 72, 24, 87, 88, 89, 47, 91, 49, 12, 51, 82, 53, 18, 65, 72, 5, 101, 102, 70, 71, 18, 73, 74, 75, 82, 1,
+ 2, 38, 80, 18, 52, 83, 84, 18, 37, 87, 88, 89, 72, 91, 54, 72, 16, 52, 65, 18, 98, 92, 82, 70, 71, 82, 73, 74,
+ 75, 18, 77, 81, 18, 80, 18, 43, 83, 84, 12, 35, 87, 88, 89, 65, 91, 18, 72, 92, 70, 71, 76, 73, 74, 75, 92, 47,
+ 82, 82, 80, 85, 86, 83, 84, 94, 12, 87, 88, 89, 16, 91, 93, 80, 65, 99, 92, 79, 98, 70, 71, 27, 73, 74, 75, 80,
+ 87, 80, 34, 80, 68, 37, 83, 84, 10, 80, 87, 88, 89, 80, 91, 105, 105, 49, 65, 105, 92, 105, 105, 70, 71, 102,
+ 73, 74, 75, 105, 77, 105, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 65, 91, 105, 105, 105, 70, 71, 105,
+ 73, 74, 75, 105, 105, 105, 105, 80, 14, 15, 83, 84, 18, 105, 87, 88, 89, 105, 91, 105, 105, 65, 105, 105, 105,
+ 98, 70, 71, 105, 73, 74, 75, 105, 105, 105, 105, 80, 105, 105, 83, 84, 105, 5, 87, 88, 89, 105, 91, 105, 55, 13,
+ 14, 15, 105, 17, 105, 65, 20, 21, 105, 105, 70, 71, 26, 73, 74, 75, 30, 105, 32, 33, 80, 105, 72, 83, 84, 105,
+ 76, 87, 88, 89, 105, 91, 82, 65, 105, 85, 86, 105, 70, 71, 105, 73, 74, 75, 105, 59, 60, 105, 80, 99, 105, 83,
+ 84, 105, 105, 87, 88, 89, 65, 91, 105, 105, 105, 70, 71, 105, 73, 74, 75, 105, 105, 105, 105, 80, 105, 105, 83,
+ 84, 105, 5, 87, 88, 89, 105, 91, 105, 105, 13, 14, 15, 105, 17, 105, 65, 20, 21, 105, 105, 70, 71, 26, 73, 74,
+ 75, 30, 105, 32, 33, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 105, 65, 105, 105, 105, 105, 70, 71,
+ 105, 73, 74, 75, 105, 59, 60, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 65, 91, 105, 72, 105, 70, 71, 76,
+ 73, 74, 75, 105, 105, 82, 105, 80, 85, 86, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 1, 105, 99, 105, 70, 71,
+ 105, 73, 74, 75, 105, 39, 40, 41, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 28, 56, 57, 58, 70,
+ 71, 105, 73, 74, 75, 105, 39, 40, 41, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 1, 56, 57, 58,
+ 70, 71, 105, 73, 74, 75, 105, 105, 105, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 105, 105,
+ 105, 105, 70, 71, 105, 73, 74, 75, 38, 39, 40, 41, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 1,
+ 56, 57, 58, 70, 71, 105, 73, 74, 75, 105, 12, 105, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65,
+ 1, 2, 105, 105, 70, 71, 105, 73, 74, 75, 105, 39, 40, 41, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91,
+ 65, 1, 56, 57, 58, 70, 71, 105, 73, 74, 75, 105, 39, 40, 41, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105,
+ 91, 65, 105, 56, 57, 58, 70, 71, 105, 73, 74, 75, 38, 39, 40, 41, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89,
+ 105, 91, 65, 1, 56, 57, 58, 70, 71, 105, 73, 74, 75, 105, 12, 105, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88,
+ 89, 105, 91, 65, 105, 105, 105, 105, 70, 71, 105, 73, 74, 75, 105, 39, 40, 41, 80, 105, 105, 83, 84, 105, 105,
+ 87, 88, 89, 105, 91, 65, 1, 56, 57, 58, 70, 71, 105, 73, 74, 75, 105, 12, 105, 105, 80, 105, 105, 83, 84, 105,
+ 105, 87, 88, 89, 105, 91, 65, 105, 105, 105, 105, 70, 71, 105, 73, 74, 75, 105, 39, 40, 41, 80, 105, 105, 83,
+ 84, 105, 105, 87, 88, 89, 105, 91, 65, 1, 56, 57, 58, 70, 71, 105, 73, 74, 75, 105, 12, 105, 105, 80, 105, 105,
+ 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 1, 105, 105, 105, 70, 71, 105, 73, 74, 75, 105, 39, 40, 41, 80, 105,
+ 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 105, 56, 57, 58, 70, 71, 105, 73, 74, 75, 105, 39, 40, 41, 80,
+ 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 105, 56, 57, 58, 70, 71, 105, 73, 74, 75, 105, 105, 105,
+ 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 105, 105, 105, 105, 70, 71, 105, 73, 74, 75, 105,
+ 105, 105, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 105, 105, 105, 105, 70, 71, 105, 73, 74,
+ 75, 105, 105, 105, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 105, 105, 105, 105, 70, 71,
+ 105, 73, 74, 75, 105, 105, 105, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 105, 105, 105,
+ 105, 70, 71, 105, 73, 74, 75, 105, 105, 105, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91, 65, 105,
+ 105, 105, 105, 70, 71, 105, 73, 74, 75, 105, 105, 105, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89, 105, 91,
+ 65, 105, 105, 105, 105, 70, 71, 105, 73, 74, 75, 105, 105, 105, 105, 80, 105, 105, 83, 84, 105, 105, 87, 88, 89,
+ 105, 91, 65, 105, 105, 105, 105, 70, 71, 105, 73, 105, 75, 105, 105, 105, 105, 80, 105, 105, 105, 84, 105, 105,
+ 87, 88, 89, 105, 91, 65, 1, 2, 105, 105, 70, 71, 105, 73, 105, 75, 105, 105, 105, 105, 80, 105, 105, 105, 84,
+ 105, 105, 87, 88, 89, 105, 91, 62, 63, 64, 65, 66, 67, 105, 105, 70, 105, 37, 65, 39, 40, 41, 1, 70, 71, 105,
+ 73, 105, 75, 49, 105, 105, 105, 80, 105, 105, 56, 57, 58, 105, 87, 88, 89, 1, 91, 105, 25, 105, 27, 105, 105,
+ 105, 105, 105, 12, 34, 105, 105, 105, 105, 39, 40, 41, 105, 105, 65, 105, 105, 105, 27, 70, 71, 105, 73, 105,
+ 75, 34, 56, 57, 58, 80, 39, 40, 41, 105, 105, 105, 87, 88, 89, 105, 91, 105, 105, 12, 105, 105, 105, 56, 57, 58,
+ 105, 65, 105, 22, 105, 24, 70, 71, 27, 73, 105, 75, 105, 105, 105, 34, 80, 36, 105, 38, 105, 105, 105, 87, 88,
+ 89, 65, 91, 47, 105, 105, 70, 71, 105, 73, 105, 75, 105, 105, 2, 105, 80, 105, 1, 105, 105, 105, 105, 87, 88,
+ 89, 14, 91, 65, 1, 18, 19, 2, 70, 71, 105, 73, 105, 75, 105, 105, 105, 105, 80, 14, 105, 16, 105, 18, 19, 87,
+ 88, 89, 1, 91, 27, 39, 40, 41, 47, 105, 49, 34, 51, 105, 53, 54, 39, 40, 41, 105, 54, 105, 56, 57, 58, 1, 47, 2,
+ 49, 105, 51, 105, 53, 56, 57, 58, 105, 105, 2, 14, 39, 40, 41, 18, 19, 105, 22, 105, 105, 105, 14, 105, 105,
+ 105, 18, 19, 105, 56, 57, 58, 105, 60, 105, 39, 40, 41, 1, 105, 105, 105, 105, 105, 47, 105, 49, 105, 51, 12,
+ 53, 105, 56, 57, 58, 47, 19, 49, 105, 51, 105, 53, 72, 105, 27, 105, 76, 105, 105, 105, 105, 34, 82, 105, 37,
+ 85, 86, 72, 105, 14, 15, 76, 105, 18, 72, 105, 49, 82, 76, 99, 85, 86, 105, 105, 82, 105, 105, 85, 86, 105, 35,
+ 105, 105, 105, 99, 105, 105, 105, 105, 105, 105, 99, 105, 105, 105, 105, 105, 105, 105, 105, 55,);
+
+ const YY_SHIFT_USE_DFLT = - 32;
+
+ const YY_SHIFT_MAX = 236;
+
+ static public $yy_shift_ofst = array(517, 410, 316, 81, 81, 316, 81, 410, 34, 34, - 13, 81, 128, 81, 81, 128, 81,
+ 81, 269, 81, 81, 81, 175, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 363, 81, 81, 222, 222, 457, 457, 457, 457,
+ 457, 1624, 1603, 1736, 1736, 1736, 1736, 1736, 517, 754, 1211, 1265, 1076, 1157, 1760, 941, 1725, 995, 1103,
+ 1049, 1783, 1292, 1824, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 914, 914, 199, 198,
+ 96, 342, 842, 90, 43, 278, 246, 96, 96, 342, 232, 342, 580, 2, 143, 190, 244, 331, 711, 321, 325, 291, 376, 446,
+ 237, - 6, 462, - 6, 552, 432, 213, 500, 500, 480, 419, 446, 438, 438, 438, 438, 491, 438, 438, 491, 438, 438,
+ - 32, 1738, 1720, 466, 1784, 1795, 514, 1852, 247, 153, - 6, - 6, - 6, - 6, - 6, - 6, 97, - 12, 168, - 6, - 6,
+ 97, 97, - 6, 156, 156, 97, 52, 97, - 6, - 6, - 6, 97, 251, 97, - 6, - 12, - 6, 97, - 6, - 6, - 12, - 6, - 12,
+ - 6, 211, - 6, 664, 438, 491, 438, 438, 438, 424, 438, 491, 515, 491, 424, - 32, - 32, - 32, - 32, - 32, 1562,
+ 1664, 634, - 31, 1, 133, 50, 115, 152, 99, 88, 366, 84, 3, 405, 54, 415, 396, 274, 368, 553, 571, 542, 582, 534,
+ 566, 558, 545, 567, 547, 583, 574, 608, 586, 590, 598, 515, 550, 593, 596, 609, 371, 264, 171, 533, 530,);
+
+ const YY_REDUCE_USE_DFLT = - 56;
+
+ const YY_REDUCE_MAX = 190;
+
+ static public $yy_reduce_ofst = array(1527, 471, 619, 560, 644, 535, 504, 589, 1335, 1092, 1038, 1119, 1011, 984,
+ 876, 1173, 903, 930, 957, 1146, 1200, 1443, 1416, 1362, 1227, 1389, 1254, 1281, 1308, 1065, 673, 849, 824, 708,
+ 761, 736, 796, 1497, 1470, 1619, 1535, 1671, 1644, 1582, 1792, 1777, 1799, 845, 1792, 718, 556, - 55, 94, - 23,
+ - 23, - 23, - 23, - 23, - 23, - 23, - 23, - 23, - 23, - 23, - 23, 33, - 23, - 23, - 23, - 23, - 23, - 23, - 23,
+ - 23, - 23, - 23, - 23, - 23, - 23, 221, 279, 80, 169, 329, 347, 310, 18, 273, 159, 226, 8, - 37, 369, 338, 525,
+ 525, 336, 336, 336, 293, 414, 231, 231, 422, 389, 336, 522, 231, 498, 336, 484, 400, 435, 414, 272, 336, 403,
+ 397, 336, 336, 336, 444, 336, 336, 231, 336, 336, 336, 184, 184, 184, 184, 184, 184, 573, 184, 551, 557, 557,
+ 557, 557, 557, 557, 559, 585, 184, 557, 557, 559, 559, 557, 544, 564, 559, 578, 559, 557, 557, 557, 559, 594,
+ 559, 557, 587, 557, 559, 557, 557, 595, 557, 599, 557, 579, 557, 602, 399, 295, 399, 399, 399, 301, 399, 295,
+ 375, 295, 301, 257, 56, 537, 532, 511,);
+
+ static public $yyExpectedTokens = array(array(3, 4, 5, 6, 7, 8, 9, 13, 14, 17, 20, 21, 26, 30, 32, 33,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 31, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 31, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 54, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 53, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 55, 59,),
+ array(13, 14, 15, 17, 18, 20, 21, 26, 30, 32, 33, 35, 37, 40, 44, 45, 46, 47, 48, 50, 52, 55, 59,),
+ array(1, 12, 27, 34, 39, 40, 41, 56, 57, 58,), array(1, 25, 27, 34, 39, 40, 41, 56, 57, 58,),
+ array(1, 27, 34, 39, 40, 41, 56, 57, 58,), array(1, 27, 34, 39, 40, 41, 56, 57, 58,),
+ array(1, 27, 34, 39, 40, 41, 56, 57, 58,), array(1, 27, 34, 39, 40, 41, 56, 57, 58,),
+ array(1, 27, 34, 39, 40, 41, 56, 57, 58,), array(3, 4, 5, 6, 7, 8, 9, 13, 14, 17, 20, 21, 26, 30, 32, 33,),
+ array(5, 13, 14, 15, 17, 20, 21, 26, 30, 32, 33, 59, 60,), array(1, 12, 39, 40, 41, 56, 57, 58,),
+ array(1, 12, 39, 40, 41, 56, 57, 58,), array(1, 2, 39, 40, 41, 56, 57, 58,),
+ array(1, 12, 39, 40, 41, 56, 57, 58,), array(1, 39, 40, 41, 56, 57, 58, 60,),
+ array(1, 28, 39, 40, 41, 56, 57, 58,), array(1, 39, 40, 41, 54, 56, 57, 58,),
+ array(1, 38, 39, 40, 41, 56, 57, 58,), array(1, 38, 39, 40, 41, 56, 57, 58,),
+ array(1, 12, 39, 40, 41, 56, 57, 58,), array(1, 22, 39, 40, 41, 56, 57, 58,), array(1, 39, 40, 41, 56, 57, 58,),
+ array(1, 12, 19, 27, 34, 37, 49,), array(1, 39, 40, 41, 56, 57, 58,), array(1, 39, 40, 41, 56, 57, 58,),
+ array(1, 39, 40, 41, 56, 57, 58,), array(1, 39, 40, 41, 56, 57, 58,), array(1, 39, 40, 41, 56, 57, 58,),
+ array(1, 39, 40, 41, 56, 57, 58,), array(1, 39, 40, 41, 56, 57, 58,), array(1, 39, 40, 41, 56, 57, 58,),
+ array(1, 39, 40, 41, 56, 57, 58,), array(1, 39, 40, 41, 56, 57, 58,), array(1, 39, 40, 41, 56, 57, 58,),
+ array(39, 40, 41, 56, 57, 58,), array(39, 40, 41, 56, 57, 58,), array(1, 12, 27, 34,), array(15, 18, 52, 55,),
+ array(1, 27, 34,), array(15, 37, 55,), array(5, 13, 14, 15, 17, 20, 21, 26, 30, 32, 33, 59, 60,),
+ array(14, 18, 27, 29, 34,), array(14, 18, 27, 29, 34,), array(14, 18, 27, 34,), array(14, 18, 27, 34,),
+ array(1, 27, 34,), array(1, 27, 34,), array(15, 37, 55,), array(19, 47, 53,), array(15, 37, 55,), array(1, 2,),
+ array(12, 23, 27, 34, 42,), array(12, 23, 27, 34, 42,), array(1, 12, 27, 28, 34,), array(1, 12, 27, 34,),
+ array(1, 12, 27, 34,), array(14, 15, 18, 55,), array(14, 18, 51,), array(16, 19, 49,), array(16, 19, 49,),
+ array(9, 10, 11,), array(15, 18,), array(1, 54,), array(27, 34,), array(19, 49,), array(27, 34,), array(1, 12,),
+ array(27, 34,), array(1, 19,), array(14, 18,), array(14, 18,), array(15, 55,), array(1, 29,), array(15, 18,),
+ array(1,), array(1,), array(1,), array(1,), array(19,), array(1,), array(1,), array(19,), array(1,), array(1,),
+ array(), array(2, 14, 16, 18, 19, 47, 49, 51, 53,), array(2, 14, 18, 19, 47, 49, 51, 53, 54,),
+ array(2, 14, 16, 18, 19, 47, 49, 51, 53,), array(2, 14, 18, 19, 47, 49, 51, 53,),
+ array(2, 14, 18, 19, 47, 49, 51, 53,), array(14, 18, 19, 47, 49, 51, 53,), array(14, 15, 18, 35, 55,),
+ array(16, 47, 53,), array(14, 18, 51,), array(27, 34,), array(27, 34,), array(27, 34,), array(27, 34,),
+ array(27, 34,), array(27, 34,), array(47, 53,), array(15, 55,), array(14, 18,), array(27, 34,), array(27, 34,),
+ array(47, 53,), array(47, 53,), array(27, 34,), array(47, 53,), array(47, 53,), array(47, 53,), array(16, 23,),
+ array(47, 53,), array(27, 34,), array(27, 34,), array(27, 34,), array(47, 53,), array(14, 37,), array(47, 53,),
+ array(27, 34,), array(15, 55,), array(27, 34,), array(47, 53,), array(27, 34,), array(27, 34,), array(15, 55,),
+ array(27, 34,), array(15, 55,), array(27, 34,), array(18, 50,), array(27, 34,), array(10,), array(1,),
+ array(19,), array(1,), array(1,), array(1,), array(2,), array(1,), array(19,), array(37,), array(19,),
+ array(2,), array(), array(), array(), array(), array(), array(1, 2, 37, 39, 40, 41, 49, 56, 57, 58,),
+ array(12, 22, 24, 27, 34, 36, 38, 47,), array(12, 16, 27, 34, 37, 49,), array(37, 47, 49, 54,),
+ array(29, 37, 49,), array(14, 18, 51,), array(23, 42, 60,), array(23, 42, 54,), array(47, 54,), array(36, 54,),
+ array(18, 51,), array(22, 36,), array(36, 38,), array(23, 42,), array(16, 47,), array(37, 49,), array(36, 38,),
+ array(36, 38,), array(37, 49,), array(37, 49,), array(37,), array(18,), array(54,), array(16,), array(52,),
+ array(5,), array(18,), array(38,), array(18,), array(52,), array(18,), array(43,), array(12,), array(35,),
+ array(47,), array(18,), array(37,), array(18,), array(18,), array(18,), array(18,), array(35,), array(54,),
+ array(23,), array(24,), array(18,), array(), array(), array(), array(), array(), array(), array(), array(),
+ array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(),
+ array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(),
+ array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(),
+ array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(),
+ array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(),
+ array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(),
+ array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(), array(),
+ array(), array(),);
+
+ static public $yy_default = array(334, 508, 523, 488, 488, 523, 488, 523, 523, 523, 523, 523, 523, 523, 523, 523,
+ 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523,
+ 523, 523, 523, 523, 523, 523, 523, 393, 360, 393, 357, 393, 369, 331, 523, 523, 523, 523, 523, 523, 398, 523,
+ 523, 523, 523, 523, 414, 431, 405, 400, 511, 395, 509, 486, 487, 374, 398, 404, 510, 419, 420, 407, 523, 393,
+ 523, 523, 393, 393, 393, 393, 393, 393, 523, 500, 523, 383, 421, 421, 407, 407, 407, 523, 454, 444, 444, 523,
+ 523, 407, 393, 444, 371, 407, 393, 387, 454, 454, 523, 407, 523, 389, 422, 407, 410, 497, 417, 423, 444, 424,
+ 411, 495, 443, 443, 443, 443, 443, 443, 523, 470, 456, 361, 378, 372, 362, 364, 377, 451, 523, 454, 356, 370,
+ 480, 481, 373, 447, 449, 448, 523, 478, 367, 366, 368, 479, 454, 452, 358, 523, 380, 450, 376, 354, 523, 382,
+ 523, 379, 523, 381, 348, 384, 498, 390, 413, 388, 489, 438, 475, 454, 501, 490, 494, 494, 454, 494, 454, 431,
+ 427, 431, 431, 431, 455, 421, 421, 427, 523, 523, 523, 523, 421, 427, 439, 523, 523, 431, 523, 499, 523, 523,
+ 523, 523, 339, 523, 523, 523, 523, 523, 433, 523, 523, 427, 523, 470, 523, 523, 523, 523, 429, 434, 421, 401,
+ 523, 464, 483, 375, 461, 484, 406, 463, 469, 462, 433, 474, 394, 402, 496, 470, 460, 332, 445, 491, 492, 425,
+ 386, 493, 392, 472, 473, 426, 428, 457, 458, 459, 453, 409, 430, 432, 408, 363, 391, 341, 340, 342, 338, 337,
+ 333, 335, 336, 343, 344, 350, 351, 352, 349, 347, 345, 346, 434, 435, 512, 513, 514, 385, 476, 485, 519, 520,
+ 517, 516, 505, 507, 506, 515, 522, 518, 521, 471, 477, 467, 465, 468, 440, 437, 436, 415, 416, 502, 503, 442,
+ 466, 446, 441, 418, 504, 412, 482,);
+
+ const YYNOCODE = 106;
+
const YYSTACKDEPTH = 500;
- const YYNSTATE = 358;
- const YYNRULE = 200;
- const YYERRORSYMBOL = 82;
+
+ const YYNSTATE = 331;
+
+ const YYNRULE = 192;
+
+ const YYERRORSYMBOL = 61;
+
const YYERRSYMDT = 'yy0';
+
const YYFALLBACK = 0;
+
public static $yyFallback = array();
public function Trace($TraceFILE, $zTracePrompt)
@@ -2171,447 +715,97 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
}
public $yyTraceFILE;
+
public $yyTracePrompt;
+
public $yyidx; /* Index of top element in stack */
public $yyerrcnt; /* Shifts left before out of the error */
public $yystack = array(); /* The parser's stack */
- public $yyTokenName = array(
- '$', 'VERT', 'COLON', 'RDEL',
- 'COMMENT', 'PHPSTARTTAG', 'PHPENDTAG', 'PHPENDSCRIPT',
- 'ASPSTARTTAG', 'ASPENDTAG', 'XMLTAG', 'TEXT',
- 'STRIPON', 'STRIPOFF', 'BLOCKSOURCE', 'LITERALSTART',
- 'LITERALEND', 'LITERAL', 'LDEL', 'DOLLAR',
- 'ID', 'EQUAL', 'PTR', 'LDELIF',
- 'LDELFOR', 'SEMICOLON', 'INCDEC', 'TO',
- 'STEP', 'LDELFOREACH', 'SPACE', 'AS',
- 'APTR', 'LDELSETFILTER', 'SMARTYBLOCKCHILDPARENT', 'LDELSLASH',
- 'ATTR', 'INTEGER', 'COMMA', 'OPENP',
- 'CLOSEP', 'MATH', 'UNIMATH', 'ANDSYM',
- 'ISIN', 'ISDIVBY', 'ISNOTDIVBY', 'ISEVEN',
- 'ISNOTEVEN', 'ISEVENBY', 'ISNOTEVENBY', 'ISODD',
- 'ISNOTODD', 'ISODDBY', 'ISNOTODDBY', 'INSTANCEOF',
- 'QMARK', 'NOT', 'TYPECAST', 'HEX',
- 'DOT', 'SINGLEQUOTESTRING', 'DOUBLECOLON', 'AT',
- 'HATCH', 'OPENB', 'CLOSEB', 'EQUALS',
- 'NOTEQUALS', 'GREATERTHAN', 'LESSTHAN', 'GREATEREQUAL',
- 'LESSEQUAL', 'IDENTITY', 'NONEIDENTITY', 'MOD',
- 'LAND', 'LOR', 'LXOR', 'QUOTE',
- 'BACKTICK', 'DOLLARID', 'error', 'start',
- 'template', 'template_element', 'smartytag', 'literal',
- 'literal_elements', 'literal_element', 'value', 'modifierlist',
- 'attributes', 'expr', 'varindexed', 'statement',
- 'statements', 'optspace', 'varvar', 'foraction',
- 'modparameters', 'attribute', 'ternary', 'array',
- 'ifcond', 'lop', 'variable', 'function',
- 'doublequoted_with_quotes', 'static_class_access', 'object', 'arrayindex',
- 'indexdef', 'varvarele', 'objectchain', 'objectelement',
- 'method', 'params', 'modifier', 'modparameter',
- 'arrayelements', 'arrayelement', 'doublequoted', 'doublequotedcontent',
- );
-
- public static $yyRuleName = array(
- /* 0 */
- "start ::= template",
- /* 1 */
- "template ::= template_element",
- /* 2 */
- "template ::= template template_element",
- /* 3 */
- "template ::=",
- /* 4 */
- "template_element ::= smartytag RDEL",
- /* 5 */
- "template_element ::= COMMENT",
- /* 6 */
- "template_element ::= literal",
- /* 7 */
- "template_element ::= PHPSTARTTAG",
- /* 8 */
- "template_element ::= PHPENDTAG",
- /* 9 */
- "template_element ::= PHPENDSCRIPT",
- /* 10 */
- "template_element ::= ASPSTARTTAG",
- /* 11 */
- "template_element ::= ASPENDTAG",
- /* 12 */
- "template_element ::= XMLTAG",
- /* 13 */
- "template_element ::= TEXT",
- /* 14 */
- "template_element ::= STRIPON",
- /* 15 */
- "template_element ::= STRIPOFF",
- /* 16 */
- "template_element ::= BLOCKSOURCE",
- /* 17 */
- "literal ::= LITERALSTART LITERALEND",
- /* 18 */
- "literal ::= LITERALSTART literal_elements LITERALEND",
- /* 19 */
- "literal_elements ::= literal_elements literal_element",
- /* 20 */
- "literal_elements ::=",
- /* 21 */
- "literal_element ::= literal",
- /* 22 */
- "literal_element ::= LITERAL",
- /* 23 */
- "smartytag ::= LDEL value",
- /* 24 */
- "smartytag ::= LDEL value modifierlist attributes",
- /* 25 */
- "smartytag ::= LDEL value attributes",
- /* 26 */
- "smartytag ::= LDEL expr modifierlist attributes",
- /* 27 */
- "smartytag ::= LDEL expr attributes",
- /* 28 */
- "smartytag ::= LDEL DOLLAR ID EQUAL value",
- /* 29 */
- "smartytag ::= LDEL DOLLAR ID EQUAL expr",
- /* 30 */
- "smartytag ::= LDEL DOLLAR ID EQUAL expr attributes",
- /* 31 */
- "smartytag ::= LDEL varindexed EQUAL expr attributes",
- /* 32 */
- "smartytag ::= LDEL ID attributes",
- /* 33 */
- "smartytag ::= LDEL ID",
- /* 34 */
- "smartytag ::= LDEL ID PTR ID attributes",
- /* 35 */
- "smartytag ::= LDEL ID modifierlist attributes",
- /* 36 */
- "smartytag ::= LDEL ID PTR ID modifierlist attributes",
- /* 37 */
- "smartytag ::= LDELIF expr",
- /* 38 */
- "smartytag ::= LDELIF expr attributes",
- /* 39 */
- "smartytag ::= LDELIF statement",
- /* 40 */
- "smartytag ::= LDELIF statement attributes",
- /* 41 */
- "smartytag ::= LDELFOR statements SEMICOLON optspace expr SEMICOLON optspace DOLLAR varvar foraction attributes",
- /* 42 */
- "foraction ::= EQUAL expr",
- /* 43 */
- "foraction ::= INCDEC",
- /* 44 */
- "smartytag ::= LDELFOR statement TO expr attributes",
- /* 45 */
- "smartytag ::= LDELFOR statement TO expr STEP expr attributes",
- /* 46 */
- "smartytag ::= LDELFOREACH attributes",
- /* 47 */
- "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar attributes",
- /* 48 */
- "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar APTR DOLLAR varvar attributes",
- /* 49 */
- "smartytag ::= LDELFOREACH SPACE expr AS DOLLAR varvar attributes",
- /* 50 */
- "smartytag ::= LDELFOREACH SPACE expr AS DOLLAR varvar APTR DOLLAR varvar attributes",
- /* 51 */
- "smartytag ::= LDELSETFILTER ID modparameters",
- /* 52 */
- "smartytag ::= LDELSETFILTER ID modparameters modifierlist",
- /* 53 */
- "smartytag ::= LDEL SMARTYBLOCKCHILDPARENT",
- /* 54 */
- "smartytag ::= LDELSLASH ID",
- /* 55 */
- "smartytag ::= LDELSLASH ID modifierlist",
- /* 56 */
- "smartytag ::= LDELSLASH ID PTR ID",
- /* 57 */
- "smartytag ::= LDELSLASH ID PTR ID modifierlist",
- /* 58 */
- "attributes ::= attributes attribute",
- /* 59 */
- "attributes ::= attribute",
- /* 60 */
- "attributes ::=",
- /* 61 */
- "attribute ::= SPACE ID EQUAL ID",
- /* 62 */
- "attribute ::= ATTR expr",
- /* 63 */
- "attribute ::= ATTR value",
- /* 64 */
- "attribute ::= SPACE ID",
- /* 65 */
- "attribute ::= SPACE expr",
- /* 66 */
- "attribute ::= SPACE value",
- /* 67 */
- "attribute ::= SPACE INTEGER EQUAL expr",
- /* 68 */
- "statements ::= statement",
- /* 69 */
- "statements ::= statements COMMA statement",
- /* 70 */
- "statement ::= DOLLAR varvar EQUAL expr",
- /* 71 */
- "statement ::= varindexed EQUAL expr",
- /* 72 */
- "statement ::= OPENP statement CLOSEP",
- /* 73 */
- "expr ::= value",
- /* 74 */
- "expr ::= ternary",
- /* 75 */
- "expr ::= DOLLAR ID COLON ID",
- /* 76 */
- "expr ::= expr MATH value",
- /* 77 */
- "expr ::= expr UNIMATH value",
- /* 78 */
- "expr ::= expr ANDSYM value",
- /* 79 */
- "expr ::= array",
- /* 80 */
- "expr ::= expr modifierlist",
- /* 81 */
- "expr ::= expr ifcond expr",
- /* 82 */
- "expr ::= expr ISIN array",
- /* 83 */
- "expr ::= expr ISIN value",
- /* 84 */
- "expr ::= expr lop expr",
- /* 85 */
- "expr ::= expr ISDIVBY expr",
- /* 86 */
- "expr ::= expr ISNOTDIVBY expr",
- /* 87 */
- "expr ::= expr ISEVEN",
- /* 88 */
- "expr ::= expr ISNOTEVEN",
- /* 89 */
- "expr ::= expr ISEVENBY expr",
- /* 90 */
- "expr ::= expr ISNOTEVENBY expr",
- /* 91 */
- "expr ::= expr ISODD",
- /* 92 */
- "expr ::= expr ISNOTODD",
- /* 93 */
- "expr ::= expr ISODDBY expr",
- /* 94 */
- "expr ::= expr ISNOTODDBY expr",
- /* 95 */
- "expr ::= value INSTANCEOF ID",
- /* 96 */
- "expr ::= value INSTANCEOF value",
- /* 97 */
- "ternary ::= OPENP expr CLOSEP QMARK DOLLAR ID COLON expr",
- /* 98 */
- "ternary ::= OPENP expr CLOSEP QMARK expr COLON expr",
- /* 99 */
- "value ::= variable",
- /* 100 */
- "value ::= UNIMATH value",
- /* 101 */
- "value ::= NOT value",
- /* 102 */
- "value ::= TYPECAST value",
- /* 103 */
- "value ::= variable INCDEC",
- /* 104 */
- "value ::= HEX",
- /* 105 */
- "value ::= INTEGER",
- /* 106 */
- "value ::= INTEGER DOT INTEGER",
- /* 107 */
- "value ::= INTEGER DOT",
- /* 108 */
- "value ::= DOT INTEGER",
- /* 109 */
- "value ::= ID",
- /* 110 */
- "value ::= function",
- /* 111 */
- "value ::= OPENP expr CLOSEP",
- /* 112 */
- "value ::= SINGLEQUOTESTRING",
- /* 113 */
- "value ::= doublequoted_with_quotes",
- /* 114 */
- "value ::= ID DOUBLECOLON static_class_access",
- /* 115 */
- "value ::= varindexed DOUBLECOLON static_class_access",
- /* 116 */
- "value ::= smartytag RDEL",
- /* 117 */
- "value ::= value modifierlist",
- /* 118 */
- "variable ::= varindexed",
- /* 119 */
- "variable ::= DOLLAR varvar AT ID",
- /* 120 */
- "variable ::= object",
- /* 121 */
- "variable ::= HATCH ID HATCH",
- /* 122 */
- "variable ::= HATCH ID HATCH arrayindex",
- /* 123 */
- "variable ::= HATCH variable HATCH",
- /* 124 */
- "variable ::= HATCH variable HATCH arrayindex",
- /* 125 */
- "varindexed ::= DOLLAR varvar arrayindex",
- /* 126 */
- "arrayindex ::= arrayindex indexdef",
- /* 127 */
- "arrayindex ::=",
- /* 128 */
- "indexdef ::= DOT DOLLAR varvar",
- /* 129 */
- "indexdef ::= DOT DOLLAR varvar AT ID",
- /* 130 */
- "indexdef ::= DOT ID",
- /* 131 */
- "indexdef ::= DOT INTEGER",
- /* 132 */
- "indexdef ::= DOT LDEL expr RDEL",
- /* 133 */
- "indexdef ::= OPENB ID CLOSEB",
- /* 134 */
- "indexdef ::= OPENB ID DOT ID CLOSEB",
- /* 135 */
- "indexdef ::= OPENB expr CLOSEB",
- /* 136 */
- "indexdef ::= OPENB CLOSEB",
- /* 137 */
- "varvar ::= varvarele",
- /* 138 */
- "varvar ::= varvar varvarele",
- /* 139 */
- "varvarele ::= ID",
- /* 140 */
- "varvarele ::= LDEL expr RDEL",
- /* 141 */
- "object ::= varindexed objectchain",
- /* 142 */
- "objectchain ::= objectelement",
- /* 143 */
- "objectchain ::= objectchain objectelement",
- /* 144 */
- "objectelement ::= PTR ID arrayindex",
- /* 145 */
- "objectelement ::= PTR DOLLAR varvar arrayindex",
- /* 146 */
- "objectelement ::= PTR LDEL expr RDEL arrayindex",
- /* 147 */
- "objectelement ::= PTR ID LDEL expr RDEL arrayindex",
- /* 148 */
- "objectelement ::= PTR method",
- /* 149 */
- "function ::= ID OPENP params CLOSEP",
- /* 150 */
- "method ::= ID OPENP params CLOSEP",
- /* 151 */
- "method ::= DOLLAR ID OPENP params CLOSEP",
- /* 152 */
- "params ::= params COMMA expr",
- /* 153 */
- "params ::= expr",
- /* 154 */
- "params ::=",
- /* 155 */
- "modifierlist ::= modifierlist modifier modparameters",
- /* 156 */
- "modifierlist ::= modifier modparameters",
- /* 157 */
- "modifier ::= VERT AT ID",
- /* 158 */
- "modifier ::= VERT ID",
- /* 159 */
- "modparameters ::= modparameters modparameter",
- /* 160 */
- "modparameters ::=",
- /* 161 */
- "modparameter ::= COLON value",
- /* 162 */
- "modparameter ::= COLON array",
- /* 163 */
- "static_class_access ::= method",
- /* 164 */
- "static_class_access ::= method objectchain",
- /* 165 */
- "static_class_access ::= ID",
- /* 166 */
- "static_class_access ::= DOLLAR ID arrayindex",
- /* 167 */
- "static_class_access ::= DOLLAR ID arrayindex objectchain",
- /* 168 */
- "ifcond ::= EQUALS",
- /* 169 */
- "ifcond ::= NOTEQUALS",
- /* 170 */
- "ifcond ::= GREATERTHAN",
- /* 171 */
- "ifcond ::= LESSTHAN",
- /* 172 */
- "ifcond ::= GREATEREQUAL",
- /* 173 */
- "ifcond ::= LESSEQUAL",
- /* 174 */
- "ifcond ::= IDENTITY",
- /* 175 */
- "ifcond ::= NONEIDENTITY",
- /* 176 */
- "ifcond ::= MOD",
- /* 177 */
- "lop ::= LAND",
- /* 178 */
- "lop ::= LOR",
- /* 179 */
- "lop ::= LXOR",
- /* 180 */
- "array ::= OPENB arrayelements CLOSEB",
- /* 181 */
- "arrayelements ::= arrayelement",
- /* 182 */
- "arrayelements ::= arrayelements COMMA arrayelement",
- /* 183 */
- "arrayelements ::=",
- /* 184 */
- "arrayelement ::= value APTR expr",
- /* 185 */
- "arrayelement ::= ID APTR expr",
- /* 186 */
- "arrayelement ::= expr",
- /* 187 */
- "doublequoted_with_quotes ::= QUOTE QUOTE",
- /* 188 */
- "doublequoted_with_quotes ::= QUOTE doublequoted QUOTE",
- /* 189 */
- "doublequoted ::= doublequoted doublequotedcontent",
- /* 190 */
- "doublequoted ::= doublequotedcontent",
- /* 191 */
- "doublequotedcontent ::= BACKTICK variable BACKTICK",
- /* 192 */
- "doublequotedcontent ::= BACKTICK expr BACKTICK",
- /* 193 */
- "doublequotedcontent ::= DOLLARID",
- /* 194 */
- "doublequotedcontent ::= LDEL variable RDEL",
- /* 195 */
- "doublequotedcontent ::= LDEL expr RDEL",
- /* 196 */
- "doublequotedcontent ::= smartytag RDEL",
- /* 197 */
- "doublequotedcontent ::= TEXT",
- /* 198 */
- "optspace ::= SPACE",
- /* 199 */
- "optspace ::=",
- );
+ public $yyTokenName = array('$', 'VERT', 'COLON', 'PHP', 'NOCACHE', 'TEXT', 'STRIPON', 'STRIPOFF', 'BLOCKSOURCE',
+ 'LITERALSTART', 'LITERALEND', 'LITERAL', 'RDEL', 'SIMPLEOUTPUT', 'LDEL', 'DOLLARID', 'EQUAL', 'SIMPLETAG', 'ID',
+ 'PTR', 'LDELIF', 'LDELFOR', 'SEMICOLON', 'INCDEC', 'TO', 'STEP', 'LDELFOREACH', 'SPACE', 'AS', 'APTR',
+ 'LDELSETFILTER', 'SMARTYBLOCKCHILDPARENT', 'CLOSETAG', 'LDELSLASH', 'ATTR', 'INTEGER', 'COMMA', 'OPENP',
+ 'CLOSEP', 'MATH', 'UNIMATH', 'ISIN', 'INSTANCEOF', 'QMARK', 'NOT', 'TYPECAST', 'HEX', 'DOT',
+ 'SINGLEQUOTESTRING', 'DOUBLECOLON', 'NAMESPACE', 'AT', 'HATCH', 'OPENB', 'CLOSEB', 'DOLLAR', 'LOGOP', 'TLOGOP',
+ 'SINGLECOND', 'QUOTE', 'BACKTICK', 'error', 'start', 'template', 'template_element', 'smartytag', 'literal',
+ 'text_content', 'literal_elements', 'literal_element', 'tag', 'variable', 'attributes', 'value', 'expr',
+ 'varindexed', 'modifierlist', 'statement', 'statements', 'foraction', 'varvar', 'modparameters', 'attribute',
+ 'ternary', 'array', 'lop', 'scond', 'ns1', 'function', 'doublequoted_with_quotes', 'static_class_access',
+ 'object', 'arrayindex', 'indexdef', 'varvarele', 'objectchain', 'objectelement', 'method', 'params', 'modifier',
+ 'modparameter', 'arrayelements', 'arrayelement', 'doublequoted', 'doublequotedcontent',);
+
+ public static $yyRuleName = array('start ::= template', 'template ::= template_element',
+ 'template ::= template template_element', 'template ::=', 'template_element ::= smartytag',
+ 'template_element ::= literal', 'template_element ::= PHP', 'template_element ::= NOCACHE',
+ 'template_element ::= text_content', 'text_content ::= TEXT', 'text_content ::= text_content TEXT',
+ 'template_element ::= STRIPON', 'template_element ::= STRIPOFF', 'template_element ::= BLOCKSOURCE',
+ 'literal ::= LITERALSTART LITERALEND', 'literal ::= LITERALSTART literal_elements LITERALEND',
+ 'literal_elements ::= literal_elements literal_element', 'literal_elements ::=', 'literal_element ::= literal',
+ 'literal_element ::= LITERAL', 'smartytag ::= tag RDEL', 'smartytag ::= SIMPLEOUTPUT', 'tag ::= LDEL variable',
+ 'tag ::= LDEL variable attributes', 'tag ::= LDEL value', 'tag ::= LDEL value attributes', 'tag ::= LDEL expr',
+ 'tag ::= LDEL expr attributes', 'tag ::= LDEL DOLLARID EQUAL value', 'tag ::= LDEL DOLLARID EQUAL expr',
+ 'tag ::= LDEL DOLLARID EQUAL expr attributes', 'tag ::= LDEL varindexed EQUAL expr attributes',
+ 'smartytag ::= SIMPLETAG', 'tag ::= LDEL ID attributes', 'tag ::= LDEL ID',
+ 'tag ::= LDEL ID modifierlist attributes', 'tag ::= LDEL ID PTR ID attributes',
+ 'tag ::= LDEL ID PTR ID modifierlist attributes', 'tag ::= LDELIF expr', 'tag ::= LDELIF expr attributes',
+ 'tag ::= LDELIF statement', 'tag ::= LDELIF statement attributes',
+ 'tag ::= LDELFOR statements SEMICOLON expr SEMICOLON varindexed foraction attributes',
+ 'foraction ::= EQUAL expr', 'foraction ::= INCDEC', 'tag ::= LDELFOR statement TO expr attributes',
+ 'tag ::= LDELFOR statement TO expr STEP expr attributes', 'tag ::= LDELFOREACH attributes',
+ 'tag ::= LDELFOREACH SPACE value AS varvar attributes',
+ 'tag ::= LDELFOREACH SPACE value AS varvar APTR varvar attributes',
+ 'tag ::= LDELFOREACH SPACE expr AS varvar attributes',
+ 'tag ::= LDELFOREACH SPACE expr AS varvar APTR varvar attributes', 'tag ::= LDELSETFILTER ID modparameters',
+ 'tag ::= LDELSETFILTER ID modparameters modifierlist', 'tag ::= LDEL SMARTYBLOCKCHILDPARENT',
+ 'smartytag ::= CLOSETAG', 'tag ::= LDELSLASH ID', 'tag ::= LDELSLASH ID modifierlist',
+ 'tag ::= LDELSLASH ID PTR ID', 'tag ::= LDELSLASH ID PTR ID modifierlist',
+ 'attributes ::= attributes attribute', 'attributes ::= attribute', 'attributes ::=',
+ 'attribute ::= SPACE ID EQUAL ID', 'attribute ::= ATTR expr', 'attribute ::= ATTR value',
+ 'attribute ::= SPACE ID', 'attribute ::= SPACE expr', 'attribute ::= SPACE value',
+ 'attribute ::= SPACE INTEGER EQUAL expr', 'statements ::= statement',
+ 'statements ::= statements COMMA statement', 'statement ::= DOLLARID EQUAL INTEGER',
+ 'statement ::= DOLLARID EQUAL expr', 'statement ::= varindexed EQUAL expr',
+ 'statement ::= OPENP statement CLOSEP', 'expr ::= value', 'expr ::= ternary', 'expr ::= DOLLARID COLON ID',
+ 'expr ::= expr MATH value', 'expr ::= expr UNIMATH value', 'expr ::= array', 'expr ::= expr modifierlist',
+ 'expr ::= expr lop expr', 'expr ::= expr scond', 'expr ::= expr ISIN array', 'expr ::= expr ISIN value',
+ 'expr ::= variable INSTANCEOF ns1', 'ternary ::= OPENP expr CLOSEP QMARK DOLLARID COLON expr',
+ 'ternary ::= OPENP expr CLOSEP QMARK expr COLON expr', 'value ::= variable', 'value ::= UNIMATH value',
+ 'value ::= NOT value', 'value ::= TYPECAST value', 'value ::= variable INCDEC', 'value ::= HEX',
+ 'value ::= INTEGER', 'value ::= INTEGER DOT INTEGER', 'value ::= INTEGER DOT', 'value ::= DOT INTEGER',
+ 'value ::= ID', 'value ::= function', 'value ::= OPENP expr CLOSEP', 'value ::= SINGLEQUOTESTRING',
+ 'value ::= doublequoted_with_quotes', 'value ::= varindexed DOUBLECOLON static_class_access',
+ 'value ::= smartytag', 'value ::= value modifierlist', 'value ::= NAMESPACE',
+ 'value ::= ns1 DOUBLECOLON static_class_access', 'ns1 ::= ID', 'ns1 ::= NAMESPACE', 'variable ::= DOLLARID',
+ 'variable ::= varindexed', 'variable ::= varvar AT ID', 'variable ::= object', 'variable ::= HATCH ID HATCH',
+ 'variable ::= HATCH ID HATCH arrayindex', 'variable ::= HATCH variable HATCH',
+ 'variable ::= HATCH variable HATCH arrayindex', 'varindexed ::= DOLLARID arrayindex',
+ 'varindexed ::= varvar arrayindex', 'arrayindex ::= arrayindex indexdef', 'arrayindex ::=',
+ 'indexdef ::= DOT DOLLARID', 'indexdef ::= DOT varvar', 'indexdef ::= DOT varvar AT ID', 'indexdef ::= DOT ID',
+ 'indexdef ::= DOT INTEGER', 'indexdef ::= DOT LDEL expr RDEL', 'indexdef ::= OPENB ID CLOSEB',
+ 'indexdef ::= OPENB ID DOT ID CLOSEB', 'indexdef ::= OPENB SINGLEQUOTESTRING CLOSEB',
+ 'indexdef ::= OPENB INTEGER CLOSEB', 'indexdef ::= OPENB DOLLARID CLOSEB', 'indexdef ::= OPENB variable CLOSEB',
+ 'indexdef ::= OPENB value CLOSEB', 'indexdef ::= OPENB expr CLOSEB', 'indexdef ::= OPENB CLOSEB',
+ 'varvar ::= DOLLARID', 'varvar ::= DOLLAR', 'varvar ::= varvar varvarele', 'varvarele ::= ID',
+ 'varvarele ::= LDEL expr RDEL', 'object ::= varindexed objectchain', 'objectchain ::= objectelement',
+ 'objectchain ::= objectchain objectelement', 'objectelement ::= PTR ID arrayindex',
+ 'objectelement ::= PTR varvar arrayindex', 'objectelement ::= PTR LDEL expr RDEL arrayindex',
+ 'objectelement ::= PTR ID LDEL expr RDEL arrayindex', 'objectelement ::= PTR method',
+ 'function ::= ns1 OPENP params CLOSEP', 'method ::= ID OPENP params CLOSEP',
+ 'method ::= DOLLARID OPENP params CLOSEP', 'params ::= params COMMA expr', 'params ::= expr', 'params ::=',
+ 'modifierlist ::= modifierlist modifier modparameters', 'modifierlist ::= modifier modparameters',
+ 'modifier ::= VERT AT ID', 'modifier ::= VERT ID', 'modparameters ::= modparameters modparameter',
+ 'modparameters ::=', 'modparameter ::= COLON value', 'modparameter ::= COLON array',
+ 'static_class_access ::= method', 'static_class_access ::= method objectchain', 'static_class_access ::= ID',
+ 'static_class_access ::= DOLLARID arrayindex', 'static_class_access ::= DOLLARID arrayindex objectchain',
+ 'lop ::= LOGOP', 'lop ::= TLOGOP', 'scond ::= SINGLECOND', 'array ::= OPENB arrayelements CLOSEB',
+ 'arrayelements ::= arrayelement', 'arrayelements ::= arrayelements COMMA arrayelement', 'arrayelements ::=',
+ 'arrayelement ::= value APTR expr', 'arrayelement ::= ID APTR expr', 'arrayelement ::= expr',
+ 'doublequoted_with_quotes ::= QUOTE QUOTE', 'doublequoted_with_quotes ::= QUOTE doublequoted QUOTE',
+ 'doublequoted ::= doublequoted doublequotedcontent', 'doublequoted ::= doublequotedcontent',
+ 'doublequotedcontent ::= BACKTICK variable BACKTICK', 'doublequotedcontent ::= BACKTICK expr BACKTICK',
+ 'doublequotedcontent ::= DOLLARID', 'doublequotedcontent ::= LDEL variable RDEL',
+ 'doublequotedcontent ::= LDEL expr RDEL', 'doublequotedcontent ::= smartytag', 'doublequotedcontent ::= TEXT',);
public function tokenName($tokenType)
{
@@ -2635,14 +829,12 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
public function yy_pop_parser_stack()
{
- if (!count($this->yystack)) {
+ if (empty($this->yystack)) {
return;
}
$yytos = array_pop($this->yystack);
if ($this->yyTraceFILE && $this->yyidx >= 0) {
- fwrite($this->yyTraceFILE,
- $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
- "\n");
+ fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] . "\n");
}
$yymajor = $yytos->major;
self::yy_destructor($yymajor, $yytos->minor);
@@ -2663,10 +855,18 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
public function yy_get_expected_tokens($token)
{
+ static $res3 = array();
+ static $res4 = array();
$state = $this->yystack[$this->yyidx]->stateno;
$expected = self::$yyExpectedTokens[$state];
- if (in_array($token, self::$yyExpectedTokens[$state], true)) {
- return $expected;
+ if (isset($res3[$state][$token])) {
+ if ($res3[$state][$token]) {
+ return $expected;
+ }
+ } else {
+ if ($res3[$state][$token] = in_array($token, self::$yyExpectedTokens[$state], true)) {
+ return $expected;
+ }
}
$stack = $this->yystack;
$yyidx = $this->yyidx;
@@ -2684,18 +884,22 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
return array_unique($expected);
}
$yyruleno = $yyact - self::YYNSTATE;
- $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
- $nextstate = $this->yy_find_reduce_action(
- $this->yystack[$this->yyidx]->stateno,
- self::$yyRuleInfo[$yyruleno]['lhs']);
+ $this->yyidx -= self::$yyRuleInfo[$yyruleno][1];
+ $nextstate = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, self::$yyRuleInfo[$yyruleno][0]);
if (isset(self::$yyExpectedTokens[$nextstate])) {
$expected = array_merge($expected, self::$yyExpectedTokens[$nextstate]);
- if (in_array($token,
- self::$yyExpectedTokens[$nextstate], true)) {
- $this->yyidx = $yyidx;
- $this->yystack = $stack;
-
- return array_unique($expected);
+ if (isset($res4[$nextstate][$token])) {
+ if ($res4[$nextstate][$token]) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return array_unique($expected);
+ }
+ } else {
+ if ($res4[$nextstate][$token] = in_array($token, self::$yyExpectedTokens[$nextstate], true)) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return array_unique($expected);
+ }
}
}
if ($nextstate < self::YYNSTATE) {
@@ -2703,7 +907,7 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
$this->yyidx ++;
$x = new TP_yyStackEntry;
$x->stateno = $nextstate;
- $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
+ $x->major = self::$yyRuleInfo[$yyruleno][0];
$this->yystack[$this->yyidx] = $x;
continue 2;
} elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
@@ -2733,12 +937,20 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
public function yy_is_expected_token($token)
{
+ static $res = array();
+ static $res2 = array();
if ($token === 0) {
return true; // 0 is not part of this
}
$state = $this->yystack[$this->yyidx]->stateno;
- if (in_array($token, self::$yyExpectedTokens[$state], true)) {
- return true;
+ if (isset($res[$state][$token])) {
+ if ($res[$state][$token]) {
+ return true;
+ }
+ } else {
+ if ($res[$state][$token] = in_array($token, self::$yyExpectedTokens[$state], true)) {
+ return true;
+ }
}
$stack = $this->yystack;
$yyidx = $this->yyidx;
@@ -2756,24 +968,27 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
return true;
}
$yyruleno = $yyact - self::YYNSTATE;
- $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
- $nextstate = $this->yy_find_reduce_action(
- $this->yystack[$this->yyidx]->stateno,
- self::$yyRuleInfo[$yyruleno]['lhs']);
- if (isset(self::$yyExpectedTokens[$nextstate]) &&
- in_array($token, self::$yyExpectedTokens[$nextstate], true)
- ) {
- $this->yyidx = $yyidx;
- $this->yystack = $stack;
-
- return true;
+ $this->yyidx -= self::$yyRuleInfo[$yyruleno][1];
+ $nextstate = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, self::$yyRuleInfo[$yyruleno][0]);
+ if (isset($res2[$nextstate][$token])) {
+ if ($res2[$nextstate][$token]) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return true;
+ }
+ } else {
+ if ($res2[$nextstate][$token] = (isset(self::$yyExpectedTokens[$nextstate]) && in_array($token, self::$yyExpectedTokens[$nextstate], true))) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return true;
+ }
}
if ($nextstate < self::YYNSTATE) {
// we need to shift a non-terminal
$this->yyidx ++;
$x = new TP_yyStackEntry;
$x->stateno = $nextstate;
- $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
+ $x->major = self::$yyRuleInfo[$yyruleno][0];
$this->yystack[$this->yyidx] = $x;
continue 2;
} elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
@@ -2822,16 +1037,10 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
return self::YY_NO_ACTION;
}
$i += $iLookAhead;
- if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
- self::$yy_lookahead[$i] != $iLookAhead
- ) {
- if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
- && ($iFallback = self::$yyFallback[$iLookAhead]) != 0
- ) {
+ if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[$i] != $iLookAhead) {
+ if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) && ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
if ($this->yyTraceFILE) {
- fwrite($this->yyTraceFILE, $this->yyTracePrompt . "FALLBACK " .
- $this->yyTokenName[$iLookAhead] . " => " .
- $this->yyTokenName[$iFallback] . "\n");
+ fwrite($this->yyTraceFILE, $this->yyTracePrompt . "FALLBACK " . $this->yyTokenName[$iLookAhead] . " => " . $this->yyTokenName[$iFallback] . "\n");
}
return $this->yy_find_shift_action($iFallback);
@@ -2858,9 +1067,7 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
return self::YY_NO_ACTION;
}
$i += $iLookAhead;
- if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
- self::$yy_lookahead[$i] != $iLookAhead
- ) {
+ if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[$i] != $iLookAhead) {
return self::$yy_default[$stateno];
} else {
return self::$yy_action[$i];
@@ -2878,11 +1085,10 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
while ($this->yyidx >= 0) {
$this->yy_pop_parser_stack();
}
- #line 82 "smarty_internal_templateparser.y"
+ #line 190 "../smarty/lexer/smarty_internal_templateparser.y"
$this->internalError = true;
$this->compiler->trigger_template_error("Stack overflow in template parser");
- #line 1721 "smarty_internal_templateparser.php"
return;
}
@@ -2890,439 +1096,110 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
$yytos->stateno = $yyNewState;
$yytos->major = $yyMajor;
$yytos->minor = $yypMinor;
- array_push($this->yystack, $yytos);
+ $this->yystack[] = $yytos;
if ($this->yyTraceFILE && $this->yyidx > 0) {
- fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt,
- $yyNewState);
+ fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt, $yyNewState);
fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt);
for ($i = 1; $i <= $this->yyidx; $i ++) {
- fprintf($this->yyTraceFILE, " %s",
- $this->yyTokenName[$this->yystack[$i]->major]);
+ fprintf($this->yyTraceFILE, " %s", $this->yyTokenName[$this->yystack[$i]->major]);
}
fwrite($this->yyTraceFILE, "\n");
}
}
- public static $yyRuleInfo = array(
- array('lhs' => 83, 'rhs' => 1),
- array('lhs' => 84, 'rhs' => 1),
- array('lhs' => 84, 'rhs' => 2),
- array('lhs' => 84, 'rhs' => 0),
- array('lhs' => 85, 'rhs' => 2),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 85, 'rhs' => 1),
- array('lhs' => 87, 'rhs' => 2),
- array('lhs' => 87, 'rhs' => 3),
- array('lhs' => 88, 'rhs' => 2),
- array('lhs' => 88, 'rhs' => 0),
- array('lhs' => 89, 'rhs' => 1),
- array('lhs' => 89, 'rhs' => 1),
- array('lhs' => 86, 'rhs' => 2),
- array('lhs' => 86, 'rhs' => 4),
- array('lhs' => 86, 'rhs' => 3),
- array('lhs' => 86, 'rhs' => 4),
- array('lhs' => 86, 'rhs' => 3),
- array('lhs' => 86, 'rhs' => 5),
- array('lhs' => 86, 'rhs' => 5),
- array('lhs' => 86, 'rhs' => 6),
- array('lhs' => 86, 'rhs' => 5),
- array('lhs' => 86, 'rhs' => 3),
- array('lhs' => 86, 'rhs' => 2),
- array('lhs' => 86, 'rhs' => 5),
- array('lhs' => 86, 'rhs' => 4),
- array('lhs' => 86, 'rhs' => 6),
- array('lhs' => 86, 'rhs' => 2),
- array('lhs' => 86, 'rhs' => 3),
- array('lhs' => 86, 'rhs' => 2),
- array('lhs' => 86, 'rhs' => 3),
- array('lhs' => 86, 'rhs' => 11),
- array('lhs' => 99, 'rhs' => 2),
- array('lhs' => 99, 'rhs' => 1),
- array('lhs' => 86, 'rhs' => 5),
- array('lhs' => 86, 'rhs' => 7),
- array('lhs' => 86, 'rhs' => 2),
- array('lhs' => 86, 'rhs' => 7),
- array('lhs' => 86, 'rhs' => 10),
- array('lhs' => 86, 'rhs' => 7),
- array('lhs' => 86, 'rhs' => 10),
- array('lhs' => 86, 'rhs' => 3),
- array('lhs' => 86, 'rhs' => 4),
- array('lhs' => 86, 'rhs' => 2),
- array('lhs' => 86, 'rhs' => 2),
- array('lhs' => 86, 'rhs' => 3),
- array('lhs' => 86, 'rhs' => 4),
- array('lhs' => 86, 'rhs' => 5),
- array('lhs' => 92, 'rhs' => 2),
- array('lhs' => 92, 'rhs' => 1),
- array('lhs' => 92, 'rhs' => 0),
- array('lhs' => 101, 'rhs' => 4),
- array('lhs' => 101, 'rhs' => 2),
- array('lhs' => 101, 'rhs' => 2),
- array('lhs' => 101, 'rhs' => 2),
- array('lhs' => 101, 'rhs' => 2),
- array('lhs' => 101, 'rhs' => 2),
- array('lhs' => 101, 'rhs' => 4),
- array('lhs' => 96, 'rhs' => 1),
- array('lhs' => 96, 'rhs' => 3),
- array('lhs' => 95, 'rhs' => 4),
- array('lhs' => 95, 'rhs' => 3),
- array('lhs' => 95, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 1),
- array('lhs' => 93, 'rhs' => 1),
- array('lhs' => 93, 'rhs' => 4),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 1),
- array('lhs' => 93, 'rhs' => 2),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 2),
- array('lhs' => 93, 'rhs' => 2),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 2),
- array('lhs' => 93, 'rhs' => 2),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 93, 'rhs' => 3),
- array('lhs' => 102, 'rhs' => 8),
- array('lhs' => 102, 'rhs' => 7),
- array('lhs' => 90, 'rhs' => 1),
- array('lhs' => 90, 'rhs' => 2),
- array('lhs' => 90, 'rhs' => 2),
- array('lhs' => 90, 'rhs' => 2),
- array('lhs' => 90, 'rhs' => 2),
- array('lhs' => 90, 'rhs' => 1),
- array('lhs' => 90, 'rhs' => 1),
- array('lhs' => 90, 'rhs' => 3),
- array('lhs' => 90, 'rhs' => 2),
- array('lhs' => 90, 'rhs' => 2),
- array('lhs' => 90, 'rhs' => 1),
- array('lhs' => 90, 'rhs' => 1),
- array('lhs' => 90, 'rhs' => 3),
- array('lhs' => 90, 'rhs' => 1),
- array('lhs' => 90, 'rhs' => 1),
- array('lhs' => 90, 'rhs' => 3),
- array('lhs' => 90, 'rhs' => 3),
- array('lhs' => 90, 'rhs' => 2),
- array('lhs' => 90, 'rhs' => 2),
- array('lhs' => 106, 'rhs' => 1),
- array('lhs' => 106, 'rhs' => 4),
- array('lhs' => 106, 'rhs' => 1),
- array('lhs' => 106, 'rhs' => 3),
- array('lhs' => 106, 'rhs' => 4),
- array('lhs' => 106, 'rhs' => 3),
- array('lhs' => 106, 'rhs' => 4),
- array('lhs' => 94, 'rhs' => 3),
- array('lhs' => 111, 'rhs' => 2),
- array('lhs' => 111, 'rhs' => 0),
- array('lhs' => 112, 'rhs' => 3),
- array('lhs' => 112, 'rhs' => 5),
- array('lhs' => 112, 'rhs' => 2),
- array('lhs' => 112, 'rhs' => 2),
- array('lhs' => 112, 'rhs' => 4),
- array('lhs' => 112, 'rhs' => 3),
- array('lhs' => 112, 'rhs' => 5),
- array('lhs' => 112, 'rhs' => 3),
- array('lhs' => 112, 'rhs' => 2),
- array('lhs' => 98, 'rhs' => 1),
- array('lhs' => 98, 'rhs' => 2),
- array('lhs' => 113, 'rhs' => 1),
- array('lhs' => 113, 'rhs' => 3),
- array('lhs' => 110, 'rhs' => 2),
- array('lhs' => 114, 'rhs' => 1),
- array('lhs' => 114, 'rhs' => 2),
- array('lhs' => 115, 'rhs' => 3),
- array('lhs' => 115, 'rhs' => 4),
- array('lhs' => 115, 'rhs' => 5),
- array('lhs' => 115, 'rhs' => 6),
- array('lhs' => 115, 'rhs' => 2),
- array('lhs' => 107, 'rhs' => 4),
- array('lhs' => 116, 'rhs' => 4),
- array('lhs' => 116, 'rhs' => 5),
- array('lhs' => 117, 'rhs' => 3),
- array('lhs' => 117, 'rhs' => 1),
- array('lhs' => 117, 'rhs' => 0),
- array('lhs' => 91, 'rhs' => 3),
- array('lhs' => 91, 'rhs' => 2),
- array('lhs' => 118, 'rhs' => 3),
- array('lhs' => 118, 'rhs' => 2),
- array('lhs' => 100, 'rhs' => 2),
- array('lhs' => 100, 'rhs' => 0),
- array('lhs' => 119, 'rhs' => 2),
- array('lhs' => 119, 'rhs' => 2),
- array('lhs' => 109, 'rhs' => 1),
- array('lhs' => 109, 'rhs' => 2),
- array('lhs' => 109, 'rhs' => 1),
- array('lhs' => 109, 'rhs' => 3),
- array('lhs' => 109, 'rhs' => 4),
- array('lhs' => 104, 'rhs' => 1),
- array('lhs' => 104, 'rhs' => 1),
- array('lhs' => 104, 'rhs' => 1),
- array('lhs' => 104, 'rhs' => 1),
- array('lhs' => 104, 'rhs' => 1),
- array('lhs' => 104, 'rhs' => 1),
- array('lhs' => 104, 'rhs' => 1),
- array('lhs' => 104, 'rhs' => 1),
- array('lhs' => 104, 'rhs' => 1),
- array('lhs' => 105, 'rhs' => 1),
- array('lhs' => 105, 'rhs' => 1),
- array('lhs' => 105, 'rhs' => 1),
- array('lhs' => 103, 'rhs' => 3),
- array('lhs' => 120, 'rhs' => 1),
- array('lhs' => 120, 'rhs' => 3),
- array('lhs' => 120, 'rhs' => 0),
- array('lhs' => 121, 'rhs' => 3),
- array('lhs' => 121, 'rhs' => 3),
- array('lhs' => 121, 'rhs' => 1),
- array('lhs' => 108, 'rhs' => 2),
- array('lhs' => 108, 'rhs' => 3),
- array('lhs' => 122, 'rhs' => 2),
- array('lhs' => 122, 'rhs' => 1),
- array('lhs' => 123, 'rhs' => 3),
- array('lhs' => 123, 'rhs' => 3),
- array('lhs' => 123, 'rhs' => 1),
- array('lhs' => 123, 'rhs' => 3),
- array('lhs' => 123, 'rhs' => 3),
- array('lhs' => 123, 'rhs' => 2),
- array('lhs' => 123, 'rhs' => 1),
- array('lhs' => 97, 'rhs' => 1),
- array('lhs' => 97, 'rhs' => 0),
- );
-
- public static $yyReduceMap = array(
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 4 => 4,
- 5 => 5,
- 6 => 6,
- 7 => 7,
- 8 => 8,
- 9 => 9,
- 10 => 10,
- 11 => 11,
- 12 => 12,
- 13 => 13,
- 14 => 14,
- 15 => 15,
- 16 => 16,
- 17 => 17,
- 20 => 17,
- 199 => 17,
- 18 => 18,
- 72 => 18,
- 19 => 19,
- 100 => 19,
- 102 => 19,
- 103 => 19,
- 126 => 19,
- 164 => 19,
- 21 => 21,
- 22 => 21,
- 43 => 21,
- 65 => 21,
- 66 => 21,
- 73 => 21,
- 74 => 21,
- 79 => 21,
- 99 => 21,
- 104 => 21,
- 105 => 21,
- 110 => 21,
- 112 => 21,
- 113 => 21,
- 120 => 21,
- 137 => 21,
- 163 => 21,
- 165 => 21,
- 181 => 21,
- 186 => 21,
- 198 => 21,
- 23 => 23,
- 24 => 24,
- 25 => 25,
- 27 => 25,
- 26 => 26,
- 28 => 28,
- 29 => 28,
- 30 => 30,
- 31 => 31,
- 32 => 32,
- 33 => 33,
- 34 => 34,
- 35 => 35,
- 36 => 36,
- 37 => 37,
- 38 => 38,
- 40 => 38,
- 39 => 39,
- 41 => 41,
- 42 => 42,
- 44 => 44,
- 45 => 45,
- 46 => 46,
- 47 => 47,
- 49 => 47,
- 48 => 48,
- 50 => 48,
- 51 => 51,
- 52 => 52,
- 53 => 53,
- 54 => 54,
- 55 => 55,
- 56 => 56,
- 57 => 57,
- 58 => 58,
- 59 => 59,
- 68 => 59,
- 153 => 59,
- 157 => 59,
- 161 => 59,
- 162 => 59,
- 60 => 60,
- 154 => 60,
- 160 => 60,
- 61 => 61,
- 62 => 62,
- 63 => 62,
- 64 => 64,
- 67 => 67,
- 69 => 69,
- 70 => 70,
- 71 => 70,
- 75 => 75,
- 76 => 76,
- 77 => 76,
- 78 => 76,
- 80 => 80,
- 117 => 80,
- 81 => 81,
- 84 => 81,
- 95 => 81,
- 82 => 82,
- 83 => 83,
- 85 => 85,
- 86 => 86,
- 87 => 87,
- 92 => 87,
- 88 => 88,
- 91 => 88,
- 89 => 89,
- 94 => 89,
- 90 => 90,
- 93 => 90,
- 96 => 96,
- 97 => 97,
- 98 => 98,
- 101 => 101,
- 106 => 106,
- 107 => 107,
- 108 => 108,
- 109 => 109,
- 111 => 111,
- 114 => 114,
- 115 => 115,
- 116 => 116,
- 118 => 118,
- 119 => 119,
- 121 => 121,
- 122 => 122,
- 123 => 123,
- 124 => 124,
- 125 => 125,
- 127 => 127,
- 183 => 127,
- 128 => 128,
- 129 => 129,
- 130 => 130,
- 131 => 131,
- 132 => 132,
- 135 => 132,
- 133 => 133,
- 134 => 134,
- 136 => 136,
- 138 => 138,
- 139 => 139,
- 140 => 140,
- 141 => 141,
- 142 => 142,
- 143 => 143,
- 144 => 144,
- 145 => 145,
- 146 => 146,
- 147 => 147,
- 148 => 148,
- 149 => 149,
- 150 => 150,
- 151 => 151,
- 152 => 152,
- 155 => 155,
- 156 => 156,
- 158 => 158,
- 159 => 159,
- 166 => 166,
- 167 => 167,
- 168 => 168,
- 169 => 169,
- 170 => 170,
- 171 => 171,
- 172 => 172,
- 173 => 173,
- 174 => 174,
- 175 => 175,
- 176 => 176,
- 177 => 177,
- 178 => 178,
- 179 => 179,
- 180 => 180,
- 182 => 182,
- 184 => 184,
- 185 => 185,
- 187 => 187,
- 188 => 188,
- 189 => 189,
- 190 => 190,
- 191 => 191,
- 192 => 191,
- 194 => 191,
- 193 => 193,
- 195 => 195,
- 196 => 196,
- 197 => 197,
- );
-
- #line 93 "smarty_internal_templateparser.y"
+ public static $yyRuleInfo = array(array(0 => 62, 1 => 1), array(0 => 63, 1 => 1), array(0 => 63, 1 => 2),
+ array(0 => 63, 1 => 0), array(0 => 64, 1 => 1), array(0 => 64, 1 => 1), array(0 => 64, 1 => 1),
+ array(0 => 64, 1 => 1), array(0 => 64, 1 => 1), array(0 => 67, 1 => 1), array(0 => 67, 1 => 2),
+ array(0 => 64, 1 => 1), array(0 => 64, 1 => 1), array(0 => 64, 1 => 1), array(0 => 66, 1 => 2),
+ array(0 => 66, 1 => 3), array(0 => 68, 1 => 2), array(0 => 68, 1 => 0), array(0 => 69, 1 => 1),
+ array(0 => 69, 1 => 1), array(0 => 65, 1 => 2), array(0 => 65, 1 => 1), array(0 => 70, 1 => 2),
+ array(0 => 70, 1 => 3), array(0 => 70, 1 => 2), array(0 => 70, 1 => 3), array(0 => 70, 1 => 2),
+ array(0 => 70, 1 => 3), array(0 => 70, 1 => 4), array(0 => 70, 1 => 4), array(0 => 70, 1 => 5),
+ array(0 => 70, 1 => 5), array(0 => 65, 1 => 1), array(0 => 70, 1 => 3), array(0 => 70, 1 => 2),
+ array(0 => 70, 1 => 4), array(0 => 70, 1 => 5), array(0 => 70, 1 => 6), array(0 => 70, 1 => 2),
+ array(0 => 70, 1 => 3), array(0 => 70, 1 => 2), array(0 => 70, 1 => 3), array(0 => 70, 1 => 8),
+ array(0 => 79, 1 => 2), array(0 => 79, 1 => 1), array(0 => 70, 1 => 5), array(0 => 70, 1 => 7),
+ array(0 => 70, 1 => 2), array(0 => 70, 1 => 6), array(0 => 70, 1 => 8), array(0 => 70, 1 => 6),
+ array(0 => 70, 1 => 8), array(0 => 70, 1 => 3), array(0 => 70, 1 => 4), array(0 => 70, 1 => 2),
+ array(0 => 65, 1 => 1), array(0 => 70, 1 => 2), array(0 => 70, 1 => 3), array(0 => 70, 1 => 4),
+ array(0 => 70, 1 => 5), array(0 => 72, 1 => 2), array(0 => 72, 1 => 1), array(0 => 72, 1 => 0),
+ array(0 => 82, 1 => 4), array(0 => 82, 1 => 2), array(0 => 82, 1 => 2), array(0 => 82, 1 => 2),
+ array(0 => 82, 1 => 2), array(0 => 82, 1 => 2), array(0 => 82, 1 => 4), array(0 => 78, 1 => 1),
+ array(0 => 78, 1 => 3), array(0 => 77, 1 => 3), array(0 => 77, 1 => 3), array(0 => 77, 1 => 3),
+ array(0 => 77, 1 => 3), array(0 => 74, 1 => 1), array(0 => 74, 1 => 1), array(0 => 74, 1 => 3),
+ array(0 => 74, 1 => 3), array(0 => 74, 1 => 3), array(0 => 74, 1 => 1), array(0 => 74, 1 => 2),
+ array(0 => 74, 1 => 3), array(0 => 74, 1 => 2), array(0 => 74, 1 => 3), array(0 => 74, 1 => 3),
+ array(0 => 74, 1 => 3), array(0 => 83, 1 => 7), array(0 => 83, 1 => 7), array(0 => 73, 1 => 1),
+ array(0 => 73, 1 => 2), array(0 => 73, 1 => 2), array(0 => 73, 1 => 2), array(0 => 73, 1 => 2),
+ array(0 => 73, 1 => 1), array(0 => 73, 1 => 1), array(0 => 73, 1 => 3), array(0 => 73, 1 => 2),
+ array(0 => 73, 1 => 2), array(0 => 73, 1 => 1), array(0 => 73, 1 => 1), array(0 => 73, 1 => 3),
+ array(0 => 73, 1 => 1), array(0 => 73, 1 => 1), array(0 => 73, 1 => 3), array(0 => 73, 1 => 1),
+ array(0 => 73, 1 => 2), array(0 => 73, 1 => 1), array(0 => 73, 1 => 3), array(0 => 87, 1 => 1),
+ array(0 => 87, 1 => 1), array(0 => 71, 1 => 1), array(0 => 71, 1 => 1), array(0 => 71, 1 => 3),
+ array(0 => 71, 1 => 1), array(0 => 71, 1 => 3), array(0 => 71, 1 => 4), array(0 => 71, 1 => 3),
+ array(0 => 71, 1 => 4), array(0 => 75, 1 => 2), array(0 => 75, 1 => 2), array(0 => 92, 1 => 2),
+ array(0 => 92, 1 => 0), array(0 => 93, 1 => 2), array(0 => 93, 1 => 2), array(0 => 93, 1 => 4),
+ array(0 => 93, 1 => 2), array(0 => 93, 1 => 2), array(0 => 93, 1 => 4), array(0 => 93, 1 => 3),
+ array(0 => 93, 1 => 5), array(0 => 93, 1 => 3), array(0 => 93, 1 => 3), array(0 => 93, 1 => 3),
+ array(0 => 93, 1 => 3), array(0 => 93, 1 => 3), array(0 => 93, 1 => 3), array(0 => 93, 1 => 2),
+ array(0 => 80, 1 => 1), array(0 => 80, 1 => 1), array(0 => 80, 1 => 2), array(0 => 94, 1 => 1),
+ array(0 => 94, 1 => 3), array(0 => 91, 1 => 2), array(0 => 95, 1 => 1), array(0 => 95, 1 => 2),
+ array(0 => 96, 1 => 3), array(0 => 96, 1 => 3), array(0 => 96, 1 => 5), array(0 => 96, 1 => 6),
+ array(0 => 96, 1 => 2), array(0 => 88, 1 => 4), array(0 => 97, 1 => 4), array(0 => 97, 1 => 4),
+ array(0 => 98, 1 => 3), array(0 => 98, 1 => 1), array(0 => 98, 1 => 0), array(0 => 76, 1 => 3),
+ array(0 => 76, 1 => 2), array(0 => 99, 1 => 3), array(0 => 99, 1 => 2), array(0 => 81, 1 => 2),
+ array(0 => 81, 1 => 0), array(0 => 100, 1 => 2), array(0 => 100, 1 => 2), array(0 => 90, 1 => 1),
+ array(0 => 90, 1 => 2), array(0 => 90, 1 => 1), array(0 => 90, 1 => 2), array(0 => 90, 1 => 3),
+ array(0 => 85, 1 => 1), array(0 => 85, 1 => 1), array(0 => 86, 1 => 1), array(0 => 84, 1 => 3),
+ array(0 => 101, 1 => 1), array(0 => 101, 1 => 3), array(0 => 101, 1 => 0), array(0 => 102, 1 => 3),
+ array(0 => 102, 1 => 3), array(0 => 102, 1 => 1), array(0 => 89, 1 => 2), array(0 => 89, 1 => 3),
+ array(0 => 103, 1 => 2), array(0 => 103, 1 => 1), array(0 => 104, 1 => 3), array(0 => 104, 1 => 3),
+ array(0 => 104, 1 => 1), array(0 => 104, 1 => 3), array(0 => 104, 1 => 3), array(0 => 104, 1 => 1),
+ array(0 => 104, 1 => 1),);
+
+ public static $yyReduceMap = array(0 => 0, 1 => 1, 2 => 2, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9,
+ 18 => 9, 19 => 9, 44 => 9, 67 => 9, 68 => 9, 76 => 9, 77 => 9, 81 => 9, 90 => 9,
+ 95 => 9, 96 => 9, 101 => 9, 103 => 9, 104 => 9, 108 => 9, 110 => 9, 111 => 9,
+ 115 => 9, 175 => 9, 180 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13, 14 => 14,
+ 17 => 14, 15 => 15, 75 => 15, 16 => 16, 91 => 16, 93 => 16, 94 => 16, 122 => 16,
+ 20 => 20, 21 => 21, 22 => 22, 24 => 22, 26 => 22, 23 => 23, 25 => 23, 27 => 23,
+ 28 => 28, 29 => 28, 30 => 30, 31 => 31, 32 => 32, 33 => 33, 34 => 34, 35 => 35,
+ 36 => 36, 37 => 37, 38 => 38, 39 => 39, 41 => 39, 40 => 40, 42 => 42, 43 => 43,
+ 45 => 45, 46 => 46, 47 => 47, 48 => 48, 50 => 48, 49 => 49, 51 => 49, 52 => 52,
+ 53 => 53, 54 => 54, 55 => 55, 56 => 56, 57 => 57, 58 => 58, 59 => 59, 60 => 60,
+ 61 => 61, 70 => 61, 156 => 61, 160 => 61, 164 => 61, 165 => 61, 62 => 62,
+ 157 => 62, 163 => 62, 63 => 63, 64 => 64, 65 => 64, 66 => 66, 142 => 66,
+ 69 => 69, 71 => 71, 72 => 72, 73 => 72, 74 => 74, 78 => 78, 79 => 79, 80 => 79,
+ 82 => 82, 107 => 82, 83 => 83, 84 => 84, 85 => 85, 86 => 86, 87 => 87, 88 => 88,
+ 89 => 89, 92 => 92, 97 => 97, 98 => 98, 99 => 99, 100 => 100, 102 => 102,
+ 105 => 105, 106 => 106, 109 => 109, 112 => 112, 113 => 113, 114 => 114,
+ 116 => 116, 117 => 117, 118 => 118, 119 => 119, 120 => 120, 121 => 121,
+ 123 => 123, 177 => 123, 124 => 124, 125 => 125, 126 => 126, 127 => 127,
+ 128 => 128, 129 => 129, 137 => 129, 130 => 130, 131 => 131, 132 => 132,
+ 133 => 132, 135 => 132, 136 => 132, 134 => 134, 138 => 138, 139 => 139,
+ 140 => 140, 181 => 140, 141 => 141, 143 => 143, 144 => 144, 145 => 145,
+ 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151,
+ 152 => 152, 153 => 153, 154 => 154, 155 => 155, 158 => 158, 159 => 159,
+ 161 => 161, 162 => 162, 166 => 166, 167 => 167, 168 => 168, 169 => 169,
+ 170 => 170, 171 => 171, 172 => 172, 173 => 173, 174 => 174, 176 => 176,
+ 178 => 178, 179 => 179, 182 => 182, 183 => 183, 184 => 184, 185 => 185,
+ 186 => 185, 188 => 185, 187 => 187, 189 => 189, 190 => 190, 191 => 191,);
+
+ #line 201 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r0()
{
$this->_retvalue = $this->root_buffer->to_smarty_php();
}
- #line 2150 "smarty_internal_templateparser.php"
- #line 101 "smarty_internal_templateparser.y"
+
+ #line 209 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r1()
{
if ($this->yystack[$this->yyidx + 0]->minor != null) {
$this->current_buffer->append_subtree($this->yystack[$this->yyidx + 0]->minor);
}
}
- #line 2157 "smarty_internal_templateparser.php"
- #line 108 "smarty_internal_templateparser.y"
+
+ #line 216 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r2()
{
if ($this->yystack[$this->yyidx + 0]->minor != null) {
@@ -3330,365 +1207,325 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
$this->current_buffer->append_subtree($this->yystack[$this->yyidx + 0]->minor);
}
}
- #line 2165 "smarty_internal_templateparser.php"
- #line 122 "smarty_internal_templateparser.y"
+
+ #line 230 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r4()
{
if ($this->compiler->has_code) {
- $tmp = '';
- foreach ($this->compiler->prefix_code as $code) {
- $tmp .= $code;
- }
- $this->compiler->prefix_code = array();
- $this->_retvalue = new _smarty_tag($this, $this->compiler->processNocacheCode($tmp . $this->yystack[$this->yyidx + - 1]->minor, true));
+ $this->_retvalue = $this->mergePrefixCode($this->yystack[$this->yyidx + 0]->minor);
} else {
$this->_retvalue = null;
}
$this->compiler->has_variable_string = false;
$this->block_nesting_level = count($this->compiler->_tag_stack);
}
- #line 2177 "smarty_internal_templateparser.php"
- #line 134 "smarty_internal_templateparser.y"
+
+ #line 241 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r5()
{
- $this->_retvalue = null;
+ $this->_retvalue = new Smarty_Internal_ParseTree_Text($this, $this->yystack[$this->yyidx + 0]->minor);
}
- #line 2182 "smarty_internal_templateparser.php"
- #line 139 "smarty_internal_templateparser.y"
+
+ #line 245 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r6()
{
- $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
- }
- #line 2187 "smarty_internal_templateparser.php"
- #line 144 "smarty_internal_templateparser.y"
- function yy_r7()
- {
- if (strpos($this->yystack[$this->yyidx + 0]->minor, '<s') === 0) {
- $this->lex->is_phpScript = true;
- }
- if ($this->php_handling == Smarty::PHP_PASSTHRU) {
- if ($this->lex->is_phpScript) {
- $s = addcslashes($this->yystack[$this->yyidx + 0]->minor, "'");
- $this->_retvalue = new _smarty_text($this, $s);
- } else {
- $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
- }
- } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
- $this->_retvalue = new _smarty_text($this, htmlspecialchars($this->yystack[$this->yyidx + 0]->minor, ENT_QUOTES));
- } elseif ($this->php_handling == Smarty::PHP_ALLOW) {
- if (!($this->smarty instanceof SmartyBC)) {
- $this->compiler->trigger_template_error(self::Err3);
+ $code = $this->compiler->compileTag('private_php', array(array('code' => $this->yystack[$this->yyidx + 0]->minor),
+ array('type' => $this->lex->phpType)), array());
+ if ($this->compiler->has_code && !empty($code)) {
+ $tmp = '';
+ foreach ($this->compiler->prefix_code as $code) {
+ $tmp .= $code;
}
- $this->_retvalue = new _smarty_tag($this, $this->compiler->processNocacheCode('<?php ', true));
- } elseif ($this->php_handling == Smarty::PHP_REMOVE) {
+ $this->compiler->prefix_code = array();
+ $this->_retvalue = new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode($tmp . $code, true));
+ } else {
$this->_retvalue = null;
}
}
- #line 2211 "smarty_internal_templateparser.php"
- #line 168 "smarty_internal_templateparser.y"
+
+ #line 256 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r7()
+ {
+ $this->compiler->tag_nocache = true;
+ $save = $this->template->has_nocache_code;
+ $this->_retvalue = new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode("<?php echo '{$this->yystack[$this->yyidx + 0]->minor}';?>\n", $this->compiler, true));
+ $this->template->has_nocache_code = $save;
+ }
+
+ #line 263 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r8()
{
- if ($this->is_xml) {
- $this->compiler->tag_nocache = true;
- $this->is_xml = false;
- $save = $this->template->has_nocache_code;
- $this->_retvalue = new _smarty_tag($this, $this->compiler->processNocacheCode("<?php echo '?>';?>\n", $this->compiler, true));
- $this->template->has_nocache_code = $save;
- } elseif ($this->php_handling == Smarty::PHP_PASSTHRU) {
- $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
- } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
- $this->_retvalue = new _smarty_text($this, htmlspecialchars('?>', ENT_QUOTES));
- } elseif ($this->php_handling == Smarty::PHP_ALLOW) {
- $this->_retvalue = new _smarty_tag($this, $this->compiler->processNocacheCode('?>', true));
- } elseif ($this->php_handling == Smarty::PHP_REMOVE) {
- $this->_retvalue = null;
- }
+ $this->_retvalue = $this->compiler->processText($this->yystack[$this->yyidx + 0]->minor);
}
- #line 2230 "smarty_internal_templateparser.php"
- #line 186 "smarty_internal_templateparser.y"
+
+ #line 267 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r9()
{
- if (!$this->lex->is_phpScript) {
- $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
- } else {
- $this->lex->is_phpScript = false;
- if ($this->php_handling == Smarty::PHP_PASSTHRU) {
- $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
- } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
- $this->_retvalue = new _smarty_text($this, htmlspecialchars($this->yystack[$this->yyidx + 0]->minor, ENT_QUOTES));
- } elseif ($this->php_handling == Smarty::PHP_ALLOW) {
- $this->_retvalue = new _smarty_tag($this, $this->compiler->processNocacheCode('?>', true));
- } elseif ($this->php_handling == Smarty::PHP_REMOVE) {
- $this->_retvalue = null;
- }
- }
+ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2248 "smarty_internal_templateparser.php"
- #line 204 "smarty_internal_templateparser.y"
+
+ #line 271 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r10()
{
- if ($this->php_handling == Smarty::PHP_PASSTHRU) {
- $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
- } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
- $this->_retvalue = new _smarty_text($this, htmlspecialchars($this->yystack[$this->yyidx + 0]->minor, ENT_QUOTES));
- } elseif ($this->php_handling == Smarty::PHP_ALLOW) {
- if ($this->asp_tags) {
- if (!($this->smarty instanceof SmartyBC)) {
- $this->compiler->trigger_template_error(self::Err3);
- }
- $this->_retvalue = new _smarty_tag($this, $this->compiler->processNocacheCode('<%', true));
- } else {
- $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
- }
- } elseif ($this->php_handling == Smarty::PHP_REMOVE) {
- if ($this->asp_tags) {
- $this->_retvalue = null;
- } else {
- $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
- }
- }
+ $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2272 "smarty_internal_templateparser.php"
- #line 228 "smarty_internal_templateparser.y"
+
+ #line 276 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r11()
{
- if ($this->php_handling == Smarty::PHP_PASSTHRU) {
- $this->_retvalue = new _smarty_text($this, st);
- } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
- $this->_retvalue = new _smarty_text($this, htmlspecialchars('%>', ENT_QUOTES));
- } elseif ($this->php_handling == Smarty::PHP_ALLOW) {
- if ($this->asp_tags) {
- $this->_retvalue = new _smarty_tag($this, $this->compiler->processNocacheCode('%>', true));
- } else {
- $this->_retvalue = new _smarty_text($this, st);
- }
- } elseif ($this->php_handling == Smarty::PHP_REMOVE) {
- if ($this->asp_tags) {
- $this->_retvalue = null;
- } else {
- $this->_retvalue = new _smarty_text($this, st);
- }
- }
+ $this->strip = true;
}
- #line 2293 "smarty_internal_templateparser.php"
- #line 250 "smarty_internal_templateparser.y"
+
+ #line 280 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r12()
{
- $this->compiler->tag_nocache = true;
- $this->is_xml = true;
- $save = $this->template->has_nocache_code;
- $this->_retvalue = new _smarty_tag($this, $this->compiler->processNocacheCode("<?php echo '<?xml';?>", $this->compiler, true));
- $this->template->has_nocache_code = $save;
+ $this->strip = false;
}
- #line 2302 "smarty_internal_templateparser.php"
- #line 259 "smarty_internal_templateparser.y"
+
+ #line 284 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r13()
{
if ($this->strip) {
- $this->_retvalue = new _smarty_text($this, preg_replace('![\t ]*[\r\n]+[\t ]*!', '', $this->yystack[$this->yyidx + 0]->minor));
+ SMARTY_INTERNAL_COMPILE_BLOCK::blockSource($this->compiler, preg_replace('![\t ]*[\r\n]+[\t ]*!', '', $this->yystack[$this->yyidx + 0]->minor));
} else {
- $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
+ SMARTY_INTERNAL_COMPILE_BLOCK::blockSource($this->compiler, $this->yystack[$this->yyidx + 0]->minor);
}
}
- #line 2311 "smarty_internal_templateparser.php"
- #line 268 "smarty_internal_templateparser.y"
+
+ #line 293 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r14()
{
- $this->strip = true;
+ $this->_retvalue = '';
}
- #line 2316 "smarty_internal_templateparser.php"
- #line 272 "smarty_internal_templateparser.y"
+
+ #line 297 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r15()
{
- $this->strip = false;
+ $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor;
}
- #line 2321 "smarty_internal_templateparser.php"
- #line 276 "smarty_internal_templateparser.y"
+
+ #line 301 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r16()
{
- if ($this->strip) {
- SMARTY_INTERNAL_COMPILE_BLOCK::blockSource($this->compiler, preg_replace('![\t ]*[\r\n]+[\t ]*!', '', $this->yystack[$this->yyidx + 0]->minor));
- } else {
- SMARTY_INTERNAL_COMPILE_BLOCK::blockSource($this->compiler, $this->yystack[$this->yyidx + 0]->minor);
- }
- }
- #line 2330 "smarty_internal_templateparser.php"
- #line 285 "smarty_internal_templateparser.y"
- function yy_r17()
- {
- $this->_retvalue = '';
+ $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2335 "smarty_internal_templateparser.php"
- #line 289 "smarty_internal_templateparser.y"
- function yy_r18()
+
+ #line 317 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r20()
{
$this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor;
}
- #line 2340 "smarty_internal_templateparser.php"
- #line 293 "smarty_internal_templateparser.y"
- function yy_r19()
- {
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
- }
- #line 2345 "smarty_internal_templateparser.php"
- #line 301 "smarty_internal_templateparser.y"
+
+ #line 323 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r21()
{
- $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
+ $var = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->lex->ldel_length, - $this->lex->rdel_length), ' $');
+ if (preg_match('/^(.*)(\s+nocache)$/', $var, $match)) {
+ $this->_retvalue = $this->compiler->compileTag('private_print_expression', array('nocache'), array('value' => $this->compiler->compileVariable('\'' . $match[1] . '\'')));
+ } else {
+ $this->_retvalue = $this->compiler->compileTag('private_print_expression', array(), array('value' => $this->compiler->compileVariable('\'' . $var . '\'')));
+ }
}
- #line 2350 "smarty_internal_templateparser.php"
- #line 314 "smarty_internal_templateparser.y"
- function yy_r23()
+
+ #line 333 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r22()
{
$this->_retvalue = $this->compiler->compileTag('private_print_expression', array(), array('value' => $this->yystack[$this->yyidx + 0]->minor));
}
- #line 2355 "smarty_internal_templateparser.php"
- #line 318 "smarty_internal_templateparser.y"
- function yy_r24()
- {
- $this->_retvalue = $this->compiler->compileTag('private_print_expression', $this->yystack[$this->yyidx + 0]->minor, array('value' => $this->yystack[$this->yyidx + - 2]->minor, 'modifierlist' => $this->yystack[$this->yyidx + - 1]->minor));
- }
- #line 2360 "smarty_internal_templateparser.php"
- #line 322 "smarty_internal_templateparser.y"
- function yy_r25()
+
+ #line 337 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r23()
{
$this->_retvalue = $this->compiler->compileTag('private_print_expression', $this->yystack[$this->yyidx + 0]->minor, array('value' => $this->yystack[$this->yyidx + - 1]->minor));
}
- #line 2365 "smarty_internal_templateparser.php"
- #line 326 "smarty_internal_templateparser.y"
- function yy_r26()
- {
- $this->_retvalue = $this->compiler->compileTag('private_print_expression', $this->yystack[$this->yyidx + 0]->minor, array('value' => $this->yystack[$this->yyidx + - 2]->minor, 'modifierlist' => $this->yystack[$this->yyidx + - 1]->minor));
- }
- #line 2370 "smarty_internal_templateparser.php"
- #line 339 "smarty_internal_templateparser.y"
+
+ #line 360 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r28()
{
- $this->_retvalue = $this->compiler->compileTag('assign', array(array('value' => $this->yystack[$this->yyidx + 0]->minor), array('var' => "'" . $this->yystack[$this->yyidx + - 2]->minor . "'")));
+ $this->_retvalue = $this->compiler->compileTag('assign', array(array('value' => $this->yystack[$this->yyidx + 0]->minor),
+ array('var' => '\'' . substr($this->yystack[$this->yyidx + - 2]->minor, 1) . '\'')));
}
- #line 2375 "smarty_internal_templateparser.php"
- #line 347 "smarty_internal_templateparser.y"
+
+ #line 368 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r30()
{
- $this->_retvalue = $this->compiler->compileTag('assign', array_merge(array(array('value' => $this->yystack[$this->yyidx + - 1]->minor), array('var' => "'" . $this->yystack[$this->yyidx + - 3]->minor . "'")), $this->yystack[$this->yyidx + 0]->minor));
+ $this->_retvalue = $this->compiler->compileTag('assign', array_merge(array(array('value' => $this->yystack[$this->yyidx + - 1]->minor),
+ array('var' => '\'' . substr($this->yystack[$this->yyidx + - 3]->minor, 1) . '\'')), $this->yystack[$this->yyidx + 0]->minor));
}
- #line 2380 "smarty_internal_templateparser.php"
- #line 351 "smarty_internal_templateparser.y"
+
+ #line 372 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r31()
{
- $this->_retvalue = $this->compiler->compileTag('assign', array_merge(array(array('value' => $this->yystack[$this->yyidx + - 1]->minor), array('var' => $this->yystack[$this->yyidx + - 3]->minor['var'])), $this->yystack[$this->yyidx + 0]->minor), array('smarty_internal_index' => $this->yystack[$this->yyidx + - 3]->minor['smarty_internal_index']));
+ $this->_retvalue = $this->compiler->compileTag('assign', array_merge(array(array('value' => $this->yystack[$this->yyidx + - 1]->minor),
+ array('var' => $this->yystack[$this->yyidx + - 3]->minor['var'])), $this->yystack[$this->yyidx + 0]->minor), array('smarty_internal_index' => $this->yystack[$this->yyidx + - 3]->minor['smarty_internal_index']));
}
- #line 2385 "smarty_internal_templateparser.php"
- #line 356 "smarty_internal_templateparser.y"
+
+ #line 377 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r32()
{
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor);
+ $tag = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->lex->ldel_length, - $this->lex->rdel_length));
+ if ($tag == 'strip') {
+ $this->strip = true;
+ $this->_retvalue = null;;
+ } else {
+ if (defined($tag)) {
+ if ($this->security) {
+ $this->security->isTrustedConstant($tag, $this->compiler);
+ }
+ $this->_retvalue = $this->compiler->compileTag('private_print_expression', array(), array('value' => $tag));
+ } else {
+ if (preg_match('/^(.*)(\s+nocache)$/', $tag, $match)) {
+ $this->_retvalue = $this->compiler->compileTag($match[1], array("'nocache'"));
+ } else {
+ $this->_retvalue = $this->compiler->compileTag($tag, array());
+ }
+ }
+ }
}
- #line 2390 "smarty_internal_templateparser.php"
- #line 360 "smarty_internal_templateparser.y"
+
+ #line 399 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r33()
{
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + 0]->minor, array());
+ if (defined($this->yystack[$this->yyidx + - 1]->minor)) {
+ if ($this->security) {
+ $this->security->isTrustedConstant($this->yystack[$this->yyidx + - 1]->minor, $this->compiler);
+ }
+ $this->_retvalue = $this->compiler->compileTag('private_print_expression', $this->yystack[$this->yyidx + 0]->minor, array('value' => $this->yystack[$this->yyidx + - 1]->minor));
+ } else {
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor);
+ }
}
- #line 2395 "smarty_internal_templateparser.php"
- #line 365 "smarty_internal_templateparser.y"
+
+ #line 409 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r34()
{
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 3]->minor, $this->yystack[$this->yyidx + 0]->minor, array('object_method' => $this->yystack[$this->yyidx + - 1]->minor));
+ if (defined($this->yystack[$this->yyidx + 0]->minor)) {
+ if ($this->security) {
+ $this->security->isTrustedConstant($this->yystack[$this->yyidx + 0]->minor, $this->compiler);
+ }
+ $this->_retvalue = $this->compiler->compileTag('private_print_expression', array(), array('value' => $this->yystack[$this->yyidx + 0]->minor));
+ } else {
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + 0]->minor, array());
+ }
}
- #line 2400 "smarty_internal_templateparser.php"
- #line 370 "smarty_internal_templateparser.y"
+
+ #line 422 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r35()
{
- $this->_retvalue = '<?php ob_start();?>' . $this->compiler->compileTag($this->yystack[$this->yyidx + - 2]->minor, $this->yystack[$this->yyidx + 0]->minor) . '<?php echo ';
- $this->_retvalue .= $this->compiler->compileTag('private_modifier', array(), array('modifierlist' => $this->yystack[$this->yyidx + - 1]->minor, 'value' => 'ob_get_clean()')) . '?>';
+ if (defined($this->yystack[$this->yyidx + - 2]->minor)) {
+ if ($this->security) {
+ $this->security->isTrustedConstant($this->yystack[$this->yyidx + - 2]->minor, $this->compiler);
+ }
+ $this->_retvalue = $this->compiler->compileTag('private_print_expression', $this->yystack[$this->yyidx + 0]->minor, array('value' => $this->yystack[$this->yyidx + - 2]->minor,
+ 'modifierlist' => $this->yystack[$this->yyidx + - 1]->minor));
+ } else {
+ $this->_retvalue = '<?php ob_start();?>' . $this->compiler->compileTag($this->yystack[$this->yyidx + - 2]->minor, $this->yystack[$this->yyidx + 0]->minor) . '<?php echo ';
+ $this->_retvalue .= $this->compiler->compileTag('private_modifier', array(), array('modifierlist' => $this->yystack[$this->yyidx + - 1]->minor,
+ 'value' => 'ob_get_clean()')) . ';?>';
+ }
}
- #line 2406 "smarty_internal_templateparser.php"
- #line 376 "smarty_internal_templateparser.y"
+
+ #line 435 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r36()
{
- $this->_retvalue = '<?php ob_start();?>' . $this->compiler->compileTag($this->yystack[$this->yyidx + - 4]->minor, $this->yystack[$this->yyidx + 0]->minor, array('object_method' => $this->yystack[$this->yyidx + - 2]->minor)) . '<?php echo ';
- $this->_retvalue .= $this->compiler->compileTag('private_modifier', array(), array('modifierlist' => $this->yystack[$this->yyidx + - 1]->minor, 'value' => 'ob_get_clean()')) . '?>';
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 3]->minor, $this->yystack[$this->yyidx + 0]->minor, array('object_method' => $this->yystack[$this->yyidx + - 1]->minor));
}
- #line 2412 "smarty_internal_templateparser.php"
- #line 382 "smarty_internal_templateparser.y"
+
+ #line 440 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r37()
{
+ $this->_retvalue = '<?php ob_start();?>' . $this->compiler->compileTag($this->yystack[$this->yyidx + - 4]->minor, $this->yystack[$this->yyidx + 0]->minor, array('object_method' => $this->yystack[$this->yyidx + - 2]->minor)) . '<?php echo ';
+ $this->_retvalue .= $this->compiler->compileTag('private_modifier', array(), array('modifierlist' => $this->yystack[$this->yyidx + - 1]->minor,
+ 'value' => 'ob_get_clean()')) . ';?>';
+ }
+
+ #line 446 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r38()
+ {
$tag = trim(substr($this->yystack[$this->yyidx + - 1]->minor, $this->lex->ldel_length));
$this->_retvalue = $this->compiler->compileTag(($tag == 'else if') ? 'elseif' : $tag, array(), array('if condition' => $this->yystack[$this->yyidx + 0]->minor));
}
- #line 2418 "smarty_internal_templateparser.php"
- #line 387 "smarty_internal_templateparser.y"
- function yy_r38()
+
+ #line 451 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r39()
{
$tag = trim(substr($this->yystack[$this->yyidx + - 2]->minor, $this->lex->ldel_length));
$this->_retvalue = $this->compiler->compileTag(($tag == 'else if') ? 'elseif' : $tag, $this->yystack[$this->yyidx + 0]->minor, array('if condition' => $this->yystack[$this->yyidx + - 1]->minor));
}
- #line 2424 "smarty_internal_templateparser.php"
- #line 392 "smarty_internal_templateparser.y"
- function yy_r39()
+
+ #line 456 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r40()
{
$tag = trim(substr($this->yystack[$this->yyidx + - 1]->minor, $this->lex->ldel_length));
$this->_retvalue = $this->compiler->compileTag(($tag == 'else if') ? 'elseif' : $tag, array(), array('if condition' => $this->yystack[$this->yyidx + 0]->minor));
}
- #line 2430 "smarty_internal_templateparser.php"
- #line 403 "smarty_internal_templateparser.y"
- function yy_r41()
- {
- $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[$this->yyidx + 0]->minor, array(array('start' => $this->yystack[$this->yyidx + - 9]->minor), array('ifexp' => $this->yystack[$this->yyidx + - 6]->minor), array('var' => $this->yystack[$this->yyidx + - 2]->minor), array('step' => $this->yystack[$this->yyidx + - 1]->minor))), 1);
- }
- #line 2435 "smarty_internal_templateparser.php"
- #line 407 "smarty_internal_templateparser.y"
+
+ #line 467 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r42()
{
- $this->_retvalue = '=' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[$this->yyidx + 0]->minor, array(array('start' => $this->yystack[$this->yyidx + - 6]->minor),
+ array('ifexp' => $this->yystack[$this->yyidx + - 4]->minor),
+ array('var' => $this->yystack[$this->yyidx + - 2]->minor),
+ array('step' => $this->yystack[$this->yyidx + - 1]->minor))), 1);
}
- #line 2440 "smarty_internal_templateparser.php"
- #line 415 "smarty_internal_templateparser.y"
- function yy_r44()
+
+ #line 471 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r43()
{
- $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[$this->yyidx + 0]->minor, array(array('start' => $this->yystack[$this->yyidx + - 3]->minor), array('to' => $this->yystack[$this->yyidx + - 1]->minor))), 0);
+ $this->_retvalue = '=' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2445 "smarty_internal_templateparser.php"
- #line 419 "smarty_internal_templateparser.y"
+
+ #line 479 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r45()
{
- $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[$this->yyidx + 0]->minor, array(array('start' => $this->yystack[$this->yyidx + - 5]->minor), array('to' => $this->yystack[$this->yyidx + - 3]->minor), array('step' => $this->yystack[$this->yyidx + - 1]->minor))), 0);
+ $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[$this->yyidx + 0]->minor, array(array('start' => $this->yystack[$this->yyidx + - 3]->minor),
+ array('to' => $this->yystack[$this->yyidx + - 1]->minor))), 0);
}
- #line 2450 "smarty_internal_templateparser.php"
- #line 424 "smarty_internal_templateparser.y"
+
+ #line 483 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r46()
{
- $this->_retvalue = $this->compiler->compileTag('foreach', $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[$this->yyidx + 0]->minor, array(array('start' => $this->yystack[$this->yyidx + - 5]->minor),
+ array('to' => $this->yystack[$this->yyidx + - 3]->minor),
+ array('step' => $this->yystack[$this->yyidx + - 1]->minor))), 0);
}
- #line 2455 "smarty_internal_templateparser.php"
- #line 429 "smarty_internal_templateparser.y"
+
+ #line 488 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r47()
{
- $this->_retvalue = $this->compiler->compileTag('foreach', array_merge($this->yystack[$this->yyidx + 0]->minor, array(array('from' => $this->yystack[$this->yyidx + - 4]->minor), array('item' => $this->yystack[$this->yyidx + - 1]->minor))));
+ $this->_retvalue = $this->compiler->compileTag('foreach', $this->yystack[$this->yyidx + 0]->minor);
}
- #line 2460 "smarty_internal_templateparser.php"
- #line 433 "smarty_internal_templateparser.y"
+
+ #line 493 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r48()
{
- $this->_retvalue = $this->compiler->compileTag('foreach', array_merge($this->yystack[$this->yyidx + 0]->minor, array(array('from' => $this->yystack[$this->yyidx + - 7]->minor), array('item' => $this->yystack[$this->yyidx + - 1]->minor), array('key' => $this->yystack[$this->yyidx + - 4]->minor))));
+ $this->_retvalue = $this->compiler->compileTag('foreach', array_merge($this->yystack[$this->yyidx + 0]->minor, array(array('from' => $this->yystack[$this->yyidx + - 3]->minor),
+ array('item' => $this->yystack[$this->yyidx + - 1]->minor))));
}
- #line 2465 "smarty_internal_templateparser.php"
- #line 446 "smarty_internal_templateparser.y"
- function yy_r51()
+
+ #line 497 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r49()
{
- $this->_retvalue = $this->compiler->compileTag('setfilter', array(), array('modifier_list' => array(array_merge(array($this->yystack[$this->yyidx + - 1]->minor), $this->yystack[$this->yyidx + 0]->minor))));
+ $this->_retvalue = $this->compiler->compileTag('foreach', array_merge($this->yystack[$this->yyidx + 0]->minor, array(array('from' => $this->yystack[$this->yyidx + - 5]->minor),
+ array('item' => $this->yystack[$this->yyidx + - 1]->minor),
+ array('key' => $this->yystack[$this->yyidx + - 3]->minor))));
}
- #line 2470 "smarty_internal_templateparser.php"
- #line 450 "smarty_internal_templateparser.y"
+
+ #line 510 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r52()
{
- $this->_retvalue = $this->compiler->compileTag('setfilter', array(), array('modifier_list' => array_merge(array(array_merge(array($this->yystack[$this->yyidx + - 2]->minor), $this->yystack[$this->yyidx + - 1]->minor)), $this->yystack[$this->yyidx + 0]->minor)));
+ $this->_retvalue = $this->compiler->compileTag('setfilter', array(), array('modifier_list' => array(array_merge(array($this->yystack[$this->yyidx + - 1]->minor), $this->yystack[$this->yyidx + 0]->minor))));
}
- #line 2475 "smarty_internal_templateparser.php"
- #line 455 "smarty_internal_templateparser.y"
+
+ #line 514 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r53()
{
+ $this->_retvalue = $this->compiler->compileTag('setfilter', array(), array('modifier_list' => array_merge(array(array_merge(array($this->yystack[$this->yyidx + - 2]->minor), $this->yystack[$this->yyidx + - 1]->minor)), $this->yystack[$this->yyidx + 0]->minor)));
+ }
+
+ #line 519 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r54()
+ {
$j = strrpos($this->yystack[$this->yyidx + 0]->minor, '.');
if ($this->yystack[$this->yyidx + 0]->minor[$j + 1] == 'c') {
// {$smarty.block.child}
@@ -3698,265 +1535,264 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
$this->_retvalue = SMARTY_INTERNAL_COMPILE_BLOCK::compileParentBlock($this->compiler);
}
}
- #line 2487 "smarty_internal_templateparser.php"
- #line 468 "smarty_internal_templateparser.y"
- function yy_r54()
+
+ #line 532 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r55()
+ {
+ $tag = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->lex->ldel_length, - $this->lex->rdel_length), ' /');
+ if ($tag == 'strip') {
+ $this->strip = false;
+ $this->_retvalue = null;
+ } else {
+ $this->_retvalue = $this->compiler->compileTag($tag . 'close', array());
+ }
+ }
+
+ #line 541 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r56()
{
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + 0]->minor . 'close', array());
}
- #line 2492 "smarty_internal_templateparser.php"
- #line 472 "smarty_internal_templateparser.y"
- function yy_r55()
+
+ #line 545 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r57()
{
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 1]->minor . 'close', array(), array('modifier_list' => $this->yystack[$this->yyidx + 0]->minor));
}
- #line 2497 "smarty_internal_templateparser.php"
- #line 477 "smarty_internal_templateparser.y"
- function yy_r56()
+
+ #line 550 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r58()
{
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 2]->minor . 'close', array(), array('object_method' => $this->yystack[$this->yyidx + 0]->minor));
}
- #line 2502 "smarty_internal_templateparser.php"
- #line 481 "smarty_internal_templateparser.y"
- function yy_r57()
+
+ #line 554 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r59()
{
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 3]->minor . 'close', array(), array('object_method' => $this->yystack[$this->yyidx + - 1]->minor, 'modifier_list' => $this->yystack[$this->yyidx + 0]->minor));
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 3]->minor . 'close', array(), array('object_method' => $this->yystack[$this->yyidx + - 1]->minor,
+ 'modifier_list' => $this->yystack[$this->yyidx + 0]->minor));
}
- #line 2507 "smarty_internal_templateparser.php"
- #line 489 "smarty_internal_templateparser.y"
- function yy_r58()
+
+ #line 562 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r60()
{
$this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor;
$this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2513 "smarty_internal_templateparser.php"
- #line 495 "smarty_internal_templateparser.y"
- function yy_r59()
+
+ #line 568 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r61()
{
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
}
- #line 2518 "smarty_internal_templateparser.php"
- #line 500 "smarty_internal_templateparser.y"
- function yy_r60()
+
+ #line 573 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r62()
{
$this->_retvalue = array();
}
- #line 2523 "smarty_internal_templateparser.php"
- #line 505 "smarty_internal_templateparser.y"
- function yy_r61()
+
+ #line 578 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r63()
{
- if (preg_match('~^true$~i', $this->yystack[$this->yyidx + 0]->minor)) {
- $this->_retvalue = array($this->yystack[$this->yyidx + - 2]->minor => 'true');
- } elseif (preg_match('~^false$~i', $this->yystack[$this->yyidx + 0]->minor)) {
- $this->_retvalue = array($this->yystack[$this->yyidx + - 2]->minor => 'false');
- } elseif (preg_match('~^null$~i', $this->yystack[$this->yyidx + 0]->minor)) {
- $this->_retvalue = array($this->yystack[$this->yyidx + - 2]->minor => 'null');
+ if (defined($this->yystack[$this->yyidx + 0]->minor)) {
+ if ($this->security) {
+ $this->security->isTrustedConstant($this->yystack[$this->yyidx + 0]->minor, $this->compiler);
+ }
+ $this->_retvalue = array($this->yystack[$this->yyidx + - 2]->minor => $this->yystack[$this->yyidx + 0]->minor);
} else {
- $this->_retvalue = array($this->yystack[$this->yyidx + - 2]->minor => "'" . $this->yystack[$this->yyidx + 0]->minor . "'");
+ $this->_retvalue = array($this->yystack[$this->yyidx + - 2]->minor => '\'' . $this->yystack[$this->yyidx + 0]->minor . '\'');
}
}
- #line 2536 "smarty_internal_templateparser.php"
- #line 517 "smarty_internal_templateparser.y"
- function yy_r62()
+
+ #line 589 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r64()
{
$this->_retvalue = array(trim($this->yystack[$this->yyidx + - 1]->minor, " =\n\r\t") => $this->yystack[$this->yyidx + 0]->minor);
}
- #line 2541 "smarty_internal_templateparser.php"
- #line 525 "smarty_internal_templateparser.y"
- function yy_r64()
+
+ #line 597 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r66()
{
- $this->_retvalue = "'" . $this->yystack[$this->yyidx + 0]->minor . "'";
+ $this->_retvalue = '\'' . $this->yystack[$this->yyidx + 0]->minor . '\'';
}
- #line 2546 "smarty_internal_templateparser.php"
- #line 537 "smarty_internal_templateparser.y"
- function yy_r67()
+
+ #line 609 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r69()
{
$this->_retvalue = array($this->yystack[$this->yyidx + - 2]->minor => $this->yystack[$this->yyidx + 0]->minor);
}
- #line 2551 "smarty_internal_templateparser.php"
- #line 550 "smarty_internal_templateparser.y"
- function yy_r69()
+
+ #line 622 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r71()
{
$this->yystack[$this->yyidx + - 2]->minor[] = $this->yystack[$this->yyidx + 0]->minor;
$this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor;
}
- #line 2557 "smarty_internal_templateparser.php"
- #line 555 "smarty_internal_templateparser.y"
- function yy_r70()
- {
- $this->_retvalue = array('var' => $this->yystack[$this->yyidx + - 2]->minor, 'value' => $this->yystack[$this->yyidx + 0]->minor);
- }
- #line 2562 "smarty_internal_templateparser.php"
- #line 583 "smarty_internal_templateparser.y"
- function yy_r75()
+
+ #line 627 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r72()
{
- $this->_retvalue = '$_smarty_tpl->getStreamVariable(\'' . $this->yystack[$this->yyidx + - 2]->minor . '://' . $this->yystack[$this->yyidx + 0]->minor . '\')';
+ $this->_retvalue = array('var' => '\'' . substr($this->yystack[$this->yyidx + - 2]->minor, 1) . '\'',
+ 'value' => $this->yystack[$this->yyidx + 0]->minor);
}
- #line 2567 "smarty_internal_templateparser.php"
- #line 588 "smarty_internal_templateparser.y"
- function yy_r76()
+
+ #line 634 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r74()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . trim($this->yystack[$this->yyidx + - 1]->minor) . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = array('var' => $this->yystack[$this->yyidx + - 2]->minor,
+ 'value' => $this->yystack[$this->yyidx + 0]->minor);
}
- #line 2572 "smarty_internal_templateparser.php"
- #line 607 "smarty_internal_templateparser.y"
- function yy_r80()
+
+ #line 658 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r78()
{
- $this->_retvalue = $this->compiler->compileTag('private_modifier', array(), array('value' => $this->yystack[$this->yyidx + - 1]->minor, 'modifierlist' => $this->yystack[$this->yyidx + 0]->minor));
+ $this->_retvalue = '$_smarty_tpl->getStreamVariable(\'' . substr($this->yystack[$this->yyidx + - 2]->minor, 1) . '://' . $this->yystack[$this->yyidx + 0]->minor . '\')';
}
- #line 2577 "smarty_internal_templateparser.php"
- #line 613 "smarty_internal_templateparser.y"
- function yy_r81()
+
+ #line 663 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r79()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . trim($this->yystack[$this->yyidx + - 1]->minor) . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2582 "smarty_internal_templateparser.php"
- #line 617 "smarty_internal_templateparser.y"
+
+ #line 677 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r82()
{
- $this->_retvalue = 'in_array(' . $this->yystack[$this->yyidx + - 2]->minor . ',' . $this->yystack[$this->yyidx + 0]->minor . ')';
+ $this->_retvalue = $this->compiler->compileTag('private_modifier', array(), array('value' => $this->yystack[$this->yyidx + - 1]->minor,
+ 'modifierlist' => $this->yystack[$this->yyidx + 0]->minor));
}
- #line 2587 "smarty_internal_templateparser.php"
- #line 621 "smarty_internal_templateparser.y"
+
+ #line 683 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r83()
{
- $this->_retvalue = 'in_array(' . $this->yystack[$this->yyidx + - 2]->minor . ',(array)' . $this->yystack[$this->yyidx + 0]->minor . ')';
+ $this->_retvalue = (isset($this->yystack[$this->yyidx + - 1]->minor['pre']) ? $this->yystack[$this->yyidx + - 1]->minor['pre'] : '') . $this->yystack[$this->yyidx + - 2]->minor . $this->yystack[$this->yyidx + - 1]->minor['op'] . $this->yystack[$this->yyidx + 0]->minor . (isset($this->yystack[$this->yyidx + - 1]->minor['pre']) ? ')' : '');
}
- #line 2592 "smarty_internal_templateparser.php"
- #line 629 "smarty_internal_templateparser.y"
+
+ #line 686 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r84()
+ {
+ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ }
+
+ #line 690 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r85()
{
- $this->_retvalue = '!(' . $this->yystack[$this->yyidx + - 2]->minor . ' % ' . $this->yystack[$this->yyidx + 0]->minor . ')';
+ $this->_retvalue = 'in_array(' . $this->yystack[$this->yyidx + - 2]->minor . ',' . $this->yystack[$this->yyidx + 0]->minor . ')';
}
- #line 2597 "smarty_internal_templateparser.php"
- #line 633 "smarty_internal_templateparser.y"
+
+ #line 694 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r86()
{
- $this->_retvalue = '(' . $this->yystack[$this->yyidx + - 2]->minor . ' % ' . $this->yystack[$this->yyidx + 0]->minor . ')';
+ $this->_retvalue = 'in_array(' . $this->yystack[$this->yyidx + - 2]->minor . ',(array)' . $this->yystack[$this->yyidx + 0]->minor . ')';
}
- #line 2602 "smarty_internal_templateparser.php"
- #line 637 "smarty_internal_templateparser.y"
+
+ #line 698 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r87()
{
- $this->_retvalue = '!(1 & ' . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2607 "smarty_internal_templateparser.php"
- #line 641 "smarty_internal_templateparser.y"
+
+ #line 706 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r88()
{
- $this->_retvalue = '(1 & ' . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ $this->_retvalue = $this->yystack[$this->yyidx + - 5]->minor . ' ? ' . $this->compiler->compileVariable('\'' . substr($this->yystack[$this->yyidx + - 2]->minor, 1) . '\'') . ' : ' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2612 "smarty_internal_templateparser.php"
- #line 645 "smarty_internal_templateparser.y"
+
+ #line 710 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r89()
{
- $this->_retvalue = '!(1 & ' . $this->yystack[$this->yyidx + - 2]->minor . ' / ' . $this->yystack[$this->yyidx + 0]->minor . ')';
- }
- #line 2617 "smarty_internal_templateparser.php"
- #line 649 "smarty_internal_templateparser.y"
- function yy_r90()
- {
- $this->_retvalue = '(1 & ' . $this->yystack[$this->yyidx + - 2]->minor . ' / ' . $this->yystack[$this->yyidx + 0]->minor . ')';
- }
- #line 2622 "smarty_internal_templateparser.php"
- #line 673 "smarty_internal_templateparser.y"
- function yy_r96()
- {
- self::$prefix_number ++;
- $this->compiler->prefix_code[] = '<?php $_tmp' . self::$prefix_number . '=' . $this->yystack[$this->yyidx + 0]->minor . ';?>';
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . $this->yystack[$this->yyidx + - 1]->minor . '$_tmp' . self::$prefix_number;
- }
- #line 2629 "smarty_internal_templateparser.php"
- #line 682 "smarty_internal_templateparser.y"
- function yy_r97()
- {
- $this->_retvalue = $this->yystack[$this->yyidx + - 6]->minor . ' ? ' . $this->compileVariable("'" . $this->yystack[$this->yyidx + - 2]->minor . "'") . ' : ' . $this->yystack[$this->yyidx + 0]->minor;
- }
- #line 2634 "smarty_internal_templateparser.php"
- #line 686 "smarty_internal_templateparser.y"
- function yy_r98()
- {
$this->_retvalue = $this->yystack[$this->yyidx + - 5]->minor . ' ? ' . $this->yystack[$this->yyidx + - 2]->minor . ' : ' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2639 "smarty_internal_templateparser.php"
- #line 701 "smarty_internal_templateparser.y"
- function yy_r101()
+
+ #line 725 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r92()
{
$this->_retvalue = '!' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2644 "smarty_internal_templateparser.php"
- #line 722 "smarty_internal_templateparser.y"
- function yy_r106()
+
+ #line 746 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r97()
{
$this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . '.' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2649 "smarty_internal_templateparser.php"
- #line 726 "smarty_internal_templateparser.y"
- function yy_r107()
+
+ #line 750 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r98()
{
$this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . '.';
}
- #line 2654 "smarty_internal_templateparser.php"
- #line 730 "smarty_internal_templateparser.y"
- function yy_r108()
+
+ #line 754 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r99()
{
$this->_retvalue = '.' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2659 "smarty_internal_templateparser.php"
- #line 735 "smarty_internal_templateparser.y"
- function yy_r109()
+
+ #line 759 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r100()
{
- if (preg_match('~^true$~i', $this->yystack[$this->yyidx + 0]->minor)) {
- $this->_retvalue = 'true';
- } elseif (preg_match('~^false$~i', $this->yystack[$this->yyidx + 0]->minor)) {
- $this->_retvalue = 'false';
- } elseif (preg_match('~^null$~i', $this->yystack[$this->yyidx + 0]->minor)) {
- $this->_retvalue = 'null';
+ if (defined($this->yystack[$this->yyidx + 0]->minor)) {
+ if ($this->security) {
+ $this->security->isTrustedConstant($this->yystack[$this->yyidx + 0]->minor, $this->compiler);
+ }
+ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
} else {
- $this->_retvalue = "'" . $this->yystack[$this->yyidx + 0]->minor . "'";
+ $this->_retvalue = '\'' . $this->yystack[$this->yyidx + 0]->minor . '\'';
}
}
- #line 2672 "smarty_internal_templateparser.php"
- #line 753 "smarty_internal_templateparser.y"
- function yy_r111()
+
+ #line 776 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r102()
{
$this->_retvalue = "(" . $this->yystack[$this->yyidx + - 1]->minor . ")";
}
- #line 2677 "smarty_internal_templateparser.php"
- #line 768 "smarty_internal_templateparser.y"
- function yy_r114()
+
+ #line 791 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r105()
{
- if (!$this->security || isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + - 2]->minor]) || $this->smarty->security_policy->isTrustedStaticClass($this->yystack[$this->yyidx + - 2]->minor, $this->compiler)) {
- if (isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + - 2]->minor])) {
- $this->_retvalue = $this->smarty->registered_classes[$this->yystack[$this->yyidx + - 2]->minor] . '::' . $this->yystack[$this->yyidx + 0]->minor;
- } else {
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . '::' . $this->yystack[$this->yyidx + 0]->minor;
- }
+ self::$prefix_number ++;
+ if ($this->yystack[$this->yyidx + - 2]->minor['var'] == '\'smarty\'') {
+ $this->compiler->prefix_code[] = '<?php $_tmp' . self::$prefix_number . ' = ' . $this->compiler->compileTag('private_special_variable', array(), $this->yystack[$this->yyidx + - 2]->minor['smarty_internal_index']) . ';?>';
} else {
- $this->compiler->trigger_template_error("static class '" . $this->yystack[$this->yyidx + - 2]->minor . "' is undefined or not allowed by security setting");
+ $this->compiler->prefix_code[] = '<?php $_tmp' . self::$prefix_number . ' = ' . $this->compiler->compileVariable($this->yystack[$this->yyidx + - 2]->minor['var']) . $this->yystack[$this->yyidx + - 2]->minor['smarty_internal_index'] . ';?>';
}
+ $this->_retvalue = '$_tmp' . self::$prefix_number . '::' . $this->yystack[$this->yyidx + 0]->minor[0] . $this->yystack[$this->yyidx + 0]->minor[1];
}
- #line 2690 "smarty_internal_templateparser.php"
- #line 780 "smarty_internal_templateparser.y"
- function yy_r115()
+
+ #line 802 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r106()
{
- if ($this->yystack[$this->yyidx + - 2]->minor['var'] == '\'smarty\'') {
- $this->_retvalue = $this->compiler->compileTag('private_special_variable', array(), $this->yystack[$this->yyidx + - 2]->minor['smarty_internal_index']) . '::' . $this->yystack[$this->yyidx + 0]->minor;
+ self::$prefix_number ++;
+ $tmp = $this->compiler->appendCode('<?php ob_start();?>', $this->yystack[$this->yyidx + 0]->minor);
+ $this->compiler->prefix_code[] = $this->compiler->appendCode($tmp, '<?php $_tmp' . self::$prefix_number . '=ob_get_clean();?>');
+ $this->_retvalue = '$_tmp' . self::$prefix_number;
+ }
+
+ #line 819 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r109()
+ {
+ if (!in_array(strtolower($this->yystack[$this->yyidx + - 2]->minor), array('self',
+ 'parent')) && (!$this->security || $this->security->isTrustedStaticClassAccess($this->yystack[$this->yyidx + - 2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->compiler))
+ ) {
+ if (isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + - 2]->minor])) {
+ $this->_retvalue = $this->smarty->registered_classes[$this->yystack[$this->yyidx + - 2]->minor] . '::' . $this->yystack[$this->yyidx + 0]->minor[0] . $this->yystack[$this->yyidx + 0]->minor[1];
+ } else {
+ $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . '::' . $this->yystack[$this->yyidx + 0]->minor[0] . $this->yystack[$this->yyidx + 0]->minor[1];
+ }
} else {
- $this->_retvalue = $this->compileVariable($this->yystack[$this->yyidx + - 2]->minor['var']) . $this->yystack[$this->yyidx + - 2]->minor['smarty_internal_index'] . '::' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->compiler->trigger_template_error("static class '" . $this->yystack[$this->yyidx + - 2]->minor . "' is undefined or not allowed by security setting");
}
}
- #line 2699 "smarty_internal_templateparser.php"
- #line 789 "smarty_internal_templateparser.y"
- function yy_r116()
+
+ #line 853 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r112()
{
- self::$prefix_number ++;
- $this->compiler->prefix_code[] = '<?php ob_start();?>' . $this->yystack[$this->yyidx + - 1]->minor . '<?php $_tmp' . self::$prefix_number . '=ob_get_clean();?>';
- $this->_retvalue = '$_tmp' . self::$prefix_number;
+ $this->_retvalue = $this->compiler->compileVariable('\'' . substr($this->yystack[$this->yyidx + 0]->minor, 1) . '\'');
}
- #line 2706 "smarty_internal_templateparser.php"
- #line 804 "smarty_internal_templateparser.y"
- function yy_r118()
+
+ #line 856 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r113()
{
if ($this->yystack[$this->yyidx + 0]->minor['var'] == '\'smarty\'') {
$smarty_var = $this->compiler->compileTag('private_special_variable', array(), $this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']);
@@ -3965,186 +1801,225 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
// used for array reset,next,prev,end,current
$this->last_variable = $this->yystack[$this->yyidx + 0]->minor['var'];
$this->last_index = $this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
- $this->_retvalue = $this->compileVariable($this->yystack[$this->yyidx + 0]->minor['var']) . $this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
+ $this->_retvalue = $this->compiler->compileVariable($this->yystack[$this->yyidx + 0]->minor['var']) . $this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
}
}
- #line 2719 "smarty_internal_templateparser.php"
- #line 817 "smarty_internal_templateparser.y"
- function yy_r119()
+
+ #line 869 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r114()
{
$this->_retvalue = '$_smarty_tpl->tpl_vars[' . $this->yystack[$this->yyidx + - 2]->minor . ']->' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2724 "smarty_internal_templateparser.php"
- #line 827 "smarty_internal_templateparser.y"
- function yy_r121()
+
+ #line 879 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r116()
+ {
+ $this->_retvalue = '$_smarty_tpl->getConfigVariable( \'' . $this->yystack[$this->yyidx + - 1]->minor . '\')';
+ }
+
+ #line 883 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r117()
+ {
+ $this->_retvalue = '(is_array($tmp = $_smarty_tpl->getConfigVariable( \'' . $this->yystack[$this->yyidx + - 2]->minor . '\')) ? $tmp' . $this->yystack[$this->yyidx + 0]->minor . ' :null)';
+ }
+
+ #line 887 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r118()
+ {
+ $this->_retvalue = '$_smarty_tpl->getConfigVariable( ' . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ }
+
+ #line 891 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r119()
{
- $this->_retvalue = '$_smarty_tpl->getConfigVariable(\'' . $this->yystack[$this->yyidx + - 1]->minor . '\')';
+ $this->_retvalue = '(is_array($tmp = $_smarty_tpl->getConfigVariable( ' . $this->yystack[$this->yyidx + - 2]->minor . ')) ? $tmp' . $this->yystack[$this->yyidx + 0]->minor . ' : null)';
}
- #line 2729 "smarty_internal_templateparser.php"
- #line 831 "smarty_internal_templateparser.y"
- function yy_r122()
+
+ #line 895 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r120()
+ {
+ $this->_retvalue = array('var' => '\'' . substr($this->yystack[$this->yyidx + - 1]->minor, 1) . '\'',
+ 'smarty_internal_index' => $this->yystack[$this->yyidx + 0]->minor);
+ }
+
+ #line 898 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r121()
{
- $this->_retvalue = '(is_array($tmp = $_smarty_tpl->getConfigVariable(\'' . $this->yystack[$this->yyidx + - 2]->minor . '\')) ? $tmp' . $this->yystack[$this->yyidx + 0]->minor . ' :null)';
+ $this->_retvalue = array('var' => $this->yystack[$this->yyidx + - 1]->minor,
+ 'smarty_internal_index' => $this->yystack[$this->yyidx + 0]->minor);
}
- #line 2734 "smarty_internal_templateparser.php"
- #line 835 "smarty_internal_templateparser.y"
+
+ #line 911 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r123()
{
- $this->_retvalue = '$_smarty_tpl->getConfigVariable(' . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ return;
}
- #line 2739 "smarty_internal_templateparser.php"
- #line 839 "smarty_internal_templateparser.y"
+
+ #line 917 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r124()
{
- $this->_retvalue = '(is_array($tmp = $_smarty_tpl->getConfigVariable(' . $this->yystack[$this->yyidx + - 2]->minor . ')) ? $tmp' . $this->yystack[$this->yyidx + 0]->minor . ' : null)';
+ $this->_retvalue = '[' . $this->compiler->compileVariable('\'' . substr($this->yystack[$this->yyidx + 0]->minor, 1) . '\'') . ']';
}
- #line 2744 "smarty_internal_templateparser.php"
- #line 843 "smarty_internal_templateparser.y"
+
+ #line 920 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r125()
{
- $this->_retvalue = array('var' => $this->yystack[$this->yyidx + - 1]->minor, 'smarty_internal_index' => $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[$this->yyidx + 0]->minor) . ']';
}
- #line 2749 "smarty_internal_templateparser.php"
- #line 856 "smarty_internal_templateparser.y"
+
+ #line 924 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r126()
+ {
+ $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[$this->yyidx + - 2]->minor) . '->' . $this->yystack[$this->yyidx + 0]->minor . ']';
+ }
+
+ #line 928 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r127()
{
- return;
+ if (defined($this->yystack[$this->yyidx + 0]->minor)) {
+ if ($this->security) {
+ $this->security->isTrustedConstant($this->yystack[$this->yyidx + 0]->minor, $this->compiler);
+ }
+ $this->_retvalue = '[' . $this->yystack[$this->yyidx + 0]->minor . ']';
+ } else {
+ $this->_retvalue = "['" . $this->yystack[$this->yyidx + 0]->minor . "']";
+ }
}
- #line 2754 "smarty_internal_templateparser.php"
- #line 862 "smarty_internal_templateparser.y"
+
+ #line 939 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r128()
{
- $this->_retvalue = '[' . $this->compileVariable($this->yystack[$this->yyidx + 0]->minor) . ']';
+ $this->_retvalue = '[' . $this->yystack[$this->yyidx + 0]->minor . ']';
}
- #line 2759 "smarty_internal_templateparser.php"
- #line 866 "smarty_internal_templateparser.y"
+
+ #line 943 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r129()
{
- $this->_retvalue = '[' . $this->compileVariable($this->yystack[$this->yyidx + - 2]->minor) . '->' . $this->yystack[$this->yyidx + 0]->minor . ']';
+ $this->_retvalue = '[' . $this->yystack[$this->yyidx + - 1]->minor . ']';
}
- #line 2764 "smarty_internal_templateparser.php"
- #line 870 "smarty_internal_templateparser.y"
+
+ #line 948 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r130()
{
- $this->_retvalue = "['" . $this->yystack[$this->yyidx + 0]->minor . "']";
+ $this->_retvalue = '[' . $this->compiler->compileTag('private_special_variable', array(), '[\'section\'][\'' . $this->yystack[$this->yyidx + - 1]->minor . '\'][\'index\']') . ']';
}
- #line 2769 "smarty_internal_templateparser.php"
- #line 874 "smarty_internal_templateparser.y"
+
+ #line 952 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r131()
{
- $this->_retvalue = "[" . $this->yystack[$this->yyidx + 0]->minor . "]";
+ $this->_retvalue = '[' . $this->compiler->compileTag('private_special_variable', array(), '[\'section\'][\'' . $this->yystack[$this->yyidx + - 3]->minor . '\'][\'' . $this->yystack[$this->yyidx + - 1]->minor . '\']') . ']';
}
- #line 2774 "smarty_internal_templateparser.php"
- #line 878 "smarty_internal_templateparser.y"
+
+ #line 955 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r132()
{
- $this->_retvalue = "[" . $this->yystack[$this->yyidx + - 1]->minor . "]";
+ $this->_retvalue = '[' . $this->yystack[$this->yyidx + - 1]->minor . ']';
}
- #line 2779 "smarty_internal_templateparser.php"
- #line 883 "smarty_internal_templateparser.y"
- function yy_r133()
- {
- $this->_retvalue = '[' . $this->compiler->compileTag('private_special_variable', array(), '[\'section\'][\'' . $this->yystack[$this->yyidx + - 1]->minor . '\'][\'index\']') . ']';
- }
- #line 2784 "smarty_internal_templateparser.php"
- #line 887 "smarty_internal_templateparser.y"
+
+ #line 961 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r134()
{
- $this->_retvalue = '[' . $this->compiler->compileTag('private_special_variable', array(), '[\'section\'][\'' . $this->yystack[$this->yyidx + - 3]->minor . '\'][\'' . $this->yystack[$this->yyidx + - 1]->minor . '\']') . ']';
+ $this->_retvalue = '[' . $this->compiler->compileVariable('\'' . substr($this->yystack[$this->yyidx + - 1]->minor, 1) . '\'') . ']';;
}
- #line 2789 "smarty_internal_templateparser.php"
- #line 897 "smarty_internal_templateparser.y"
- function yy_r136()
- {
- $this->_retvalue = '[]';
- }
- #line 2794 "smarty_internal_templateparser.php"
- #line 910 "smarty_internal_templateparser.y"
+
+ #line 977 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r138()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . '.' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = '[]';
}
- #line 2799 "smarty_internal_templateparser.php"
- #line 915 "smarty_internal_templateparser.y"
+
+ #line 987 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r139()
{
- $this->_retvalue = '\'' . $this->yystack[$this->yyidx + 0]->minor . '\'';
+ $this->_retvalue = '\'' . substr($this->yystack[$this->yyidx + 0]->minor, 1) . '\'';
}
- #line 2804 "smarty_internal_templateparser.php"
- #line 920 "smarty_internal_templateparser.y"
+
+ #line 991 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r140()
{
- $this->_retvalue = '(' . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ $this->_retvalue = "''";
}
- #line 2809 "smarty_internal_templateparser.php"
- #line 927 "smarty_internal_templateparser.y"
+
+ #line 996 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r141()
{
+ $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . '.' . $this->yystack[$this->yyidx + 0]->minor;
+ }
+
+ #line 1006 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r143()
+ {
+ $this->_retvalue = '(' . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ }
+
+ #line 1013 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r144()
+ {
if ($this->yystack[$this->yyidx + - 1]->minor['var'] == '\'smarty\'') {
$this->_retvalue = $this->compiler->compileTag('private_special_variable', array(), $this->yystack[$this->yyidx + - 1]->minor['smarty_internal_index']) . $this->yystack[$this->yyidx + 0]->minor;
} else {
- $this->_retvalue = $this->compileVariable($this->yystack[$this->yyidx + - 1]->minor['var']) . $this->yystack[$this->yyidx + - 1]->minor['smarty_internal_index'] . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->compiler->compileVariable($this->yystack[$this->yyidx + - 1]->minor['var']) . $this->yystack[$this->yyidx + - 1]->minor['smarty_internal_index'] . $this->yystack[$this->yyidx + 0]->minor;
}
}
- #line 2818 "smarty_internal_templateparser.php"
- #line 936 "smarty_internal_templateparser.y"
- function yy_r142()
+
+ #line 1022 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r145()
{
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2823 "smarty_internal_templateparser.php"
- #line 941 "smarty_internal_templateparser.y"
- function yy_r143()
+
+ #line 1027 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r146()
{
$this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2828 "smarty_internal_templateparser.php"
- #line 946 "smarty_internal_templateparser.y"
- function yy_r144()
+
+ #line 1032 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r147()
{
if ($this->security && substr($this->yystack[$this->yyidx + - 1]->minor, 0, 1) == '_') {
$this->compiler->trigger_template_error(self::Err1);
}
$this->_retvalue = '->' . $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2836 "smarty_internal_templateparser.php"
- #line 953 "smarty_internal_templateparser.y"
- function yy_r145()
+
+ #line 1039 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r148()
{
if ($this->security) {
$this->compiler->trigger_template_error(self::Err2);
}
- $this->_retvalue = '->{' . $this->compileVariable($this->yystack[$this->yyidx + - 1]->minor) . $this->yystack[$this->yyidx + 0]->minor . '}';
+ $this->_retvalue = '->{' . $this->compiler->compileVariable($this->yystack[$this->yyidx + - 1]->minor) . $this->yystack[$this->yyidx + 0]->minor . '}';
}
- #line 2844 "smarty_internal_templateparser.php"
- #line 960 "smarty_internal_templateparser.y"
- function yy_r146()
+
+ #line 1046 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r149()
{
if ($this->security) {
$this->compiler->trigger_template_error(self::Err2);
}
$this->_retvalue = '->{' . $this->yystack[$this->yyidx + - 2]->minor . $this->yystack[$this->yyidx + 0]->minor . '}';
}
- #line 2852 "smarty_internal_templateparser.php"
- #line 967 "smarty_internal_templateparser.y"
- function yy_r147()
+
+ #line 1053 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r150()
{
if ($this->security) {
$this->compiler->trigger_template_error(self::Err2);
}
$this->_retvalue = '->{\'' . $this->yystack[$this->yyidx + - 4]->minor . '\'.' . $this->yystack[$this->yyidx + - 2]->minor . $this->yystack[$this->yyidx + 0]->minor . '}';
}
- #line 2860 "smarty_internal_templateparser.php"
- #line 975 "smarty_internal_templateparser.y"
- function yy_r148()
+
+ #line 1061 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r151()
{
$this->_retvalue = '->' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 2865 "smarty_internal_templateparser.php"
- #line 983 "smarty_internal_templateparser.y"
- function yy_r149()
+
+ #line 1069 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r152()
{
- if (!$this->security || $this->smarty->security_policy->isTrustedPhpFunction($this->yystack[$this->yyidx + - 3]->minor, $this->compiler)) {
+ if (!$this->security || $this->security->isTrustedPhpFunction($this->yystack[$this->yyidx + - 3]->minor, $this->compiler)) {
if (strcasecmp($this->yystack[$this->yyidx + - 3]->minor, 'isset') === 0 || strcasecmp($this->yystack[$this->yyidx + - 3]->minor, 'empty') === 0 || strcasecmp($this->yystack[$this->yyidx + - 3]->minor, 'array') === 0 || is_callable($this->yystack[$this->yyidx + - 3]->minor)) {
$func_name = strtolower($this->yystack[$this->yyidx + - 3]->minor);
if ($func_name == 'isset') {
@@ -4177,244 +2052,221 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
}
}
}
- #line 2901 "smarty_internal_templateparser.php"
- #line 1021 "smarty_internal_templateparser.y"
- function yy_r150()
+
+ #line 1108 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r153()
{
if ($this->security && substr($this->yystack[$this->yyidx + - 3]->minor, 0, 1) == '_') {
$this->compiler->trigger_template_error(self::Err1);
}
$this->_retvalue = $this->yystack[$this->yyidx + - 3]->minor . "(" . implode(',', $this->yystack[$this->yyidx + - 1]->minor) . ")";
}
- #line 2909 "smarty_internal_templateparser.php"
- #line 1028 "smarty_internal_templateparser.y"
- function yy_r151()
+
+ #line 1115 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r154()
{
if ($this->security) {
$this->compiler->trigger_template_error(self::Err2);
}
self::$prefix_number ++;
- $this->compiler->prefix_code[] = '<?php $_tmp' . self::$prefix_number . '=' . $this->compileVariable("'" . $this->yystack[$this->yyidx + - 3]->minor . "'") . ';?>';
+ $this->compiler->prefix_code[] = '<?php $_tmp' . self::$prefix_number . '=' . $this->compiler->compileVariable('\'' . substr($this->yystack[$this->yyidx + - 3]->minor, 1) . '\'') . ';?>';
$this->_retvalue = '$_tmp' . self::$prefix_number . '(' . implode(',', $this->yystack[$this->yyidx + - 1]->minor) . ')';
}
- #line 2919 "smarty_internal_templateparser.php"
- #line 1039 "smarty_internal_templateparser.y"
- function yy_r152()
+
+ #line 1126 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r155()
{
$this->_retvalue = array_merge($this->yystack[$this->yyidx + - 2]->minor, array($this->yystack[$this->yyidx + 0]->minor));
}
- #line 2924 "smarty_internal_templateparser.php"
- #line 1056 "smarty_internal_templateparser.y"
- function yy_r155()
+
+ #line 1143 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r158()
{
$this->_retvalue = array_merge($this->yystack[$this->yyidx + - 2]->minor, array(array_merge($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor)));
}
- #line 2929 "smarty_internal_templateparser.php"
- #line 1060 "smarty_internal_templateparser.y"
- function yy_r156()
+
+ #line 1147 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r159()
{
$this->_retvalue = array(array_merge($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor));
}
- #line 2934 "smarty_internal_templateparser.php"
- #line 1068 "smarty_internal_templateparser.y"
- function yy_r158()
+
+ #line 1155 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r161()
{
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
}
- #line 2939 "smarty_internal_templateparser.php"
- #line 1076 "smarty_internal_templateparser.y"
- function yy_r159()
+
+ #line 1163 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r162()
{
$this->_retvalue = array_merge($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor);
}
- #line 2944 "smarty_internal_templateparser.php"
- #line 1110 "smarty_internal_templateparser.y"
+
+ #line 1182 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r166()
{
- $this->_retvalue = '$' . $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '', 'method');
}
- #line 2949 "smarty_internal_templateparser.php"
- #line 1115 "smarty_internal_templateparser.y"
+
+ #line 1187 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r167()
{
- $this->_retvalue = '$' . $this->yystack[$this->yyidx + - 2]->minor . $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = array($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor,
+ 'method');
}
- #line 2954 "smarty_internal_templateparser.php"
- #line 1121 "smarty_internal_templateparser.y"
+
+ #line 1192 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r168()
{
- $this->_retvalue = '==';
+ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '');
}
- #line 2959 "smarty_internal_templateparser.php"
- #line 1125 "smarty_internal_templateparser.y"
+
+ #line 1197 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r169()
{
- $this->_retvalue = '!=';
+ $this->_retvalue = array($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor,
+ 'property');
}
- #line 2964 "smarty_internal_templateparser.php"
- #line 1129 "smarty_internal_templateparser.y"
+
+ #line 1202 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r170()
{
- $this->_retvalue = '>';
+ $this->_retvalue = array($this->yystack[$this->yyidx + - 2]->minor,
+ $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor, 'property');
}
- #line 2969 "smarty_internal_templateparser.php"
- #line 1133 "smarty_internal_templateparser.y"
+
+ #line 1208 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r171()
{
- $this->_retvalue = '<';
+ $this->_retvalue['op'] = ' ' . trim($this->yystack[$this->yyidx + 0]->minor) . ' ';
}
- #line 2974 "smarty_internal_templateparser.php"
- #line 1137 "smarty_internal_templateparser.y"
+
+ #line 1212 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r172()
{
- $this->_retvalue = '>=';
+ 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*/', '', $this->yystack[$this->yyidx + 0]->minor));
+ $this->_retvalue = $lops[$op];
}
- #line 2979 "smarty_internal_templateparser.php"
- #line 1141 "smarty_internal_templateparser.y"
+
+ #line 1238 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r173()
{
- $this->_retvalue = '<=';
+ static $scond = array('iseven' => '!(1 & ', 'isnoteven' => '(1 & ', 'isodd' => '(1 & ',
+ 'isnotodd' => '!(1 & ',);
+ $op = strtolower(str_replace(' ', '', $this->yystack[$this->yyidx + 0]->minor));
+ $this->_retvalue = $scond[$op];
}
- #line 2984 "smarty_internal_templateparser.php"
- #line 1145 "smarty_internal_templateparser.y"
+
+ #line 1252 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r174()
{
- $this->_retvalue = '===';
- }
- #line 2989 "smarty_internal_templateparser.php"
- #line 1149 "smarty_internal_templateparser.y"
- function yy_r175()
- {
- $this->_retvalue = '!==';
+ $this->_retvalue = 'array(' . $this->yystack[$this->yyidx + - 1]->minor . ')';
}
- #line 2994 "smarty_internal_templateparser.php"
- #line 1153 "smarty_internal_templateparser.y"
+
+ #line 1260 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r176()
{
- $this->_retvalue = '%';
- }
- #line 2999 "smarty_internal_templateparser.php"
- #line 1157 "smarty_internal_templateparser.y"
- function yy_r177()
- {
- $this->_retvalue = '&&';
+ $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . ',' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 3004 "smarty_internal_templateparser.php"
- #line 1161 "smarty_internal_templateparser.y"
+
+ #line 1268 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r178()
{
- $this->_retvalue = '||';
+ $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . '=>' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 3009 "smarty_internal_templateparser.php"
- #line 1165 "smarty_internal_templateparser.y"
+
+ #line 1272 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r179()
{
- $this->_retvalue = ' XOR ';
+ $this->_retvalue = '\'' . $this->yystack[$this->yyidx + - 2]->minor . '\'=>' . $this->yystack[$this->yyidx + 0]->minor;
}
- #line 3014 "smarty_internal_templateparser.php"
- #line 1172 "smarty_internal_templateparser.y"
- function yy_r180()
+
+ #line 1288 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r182()
{
- $this->_retvalue = 'array(' . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor->to_smarty_php();
}
- #line 3019 "smarty_internal_templateparser.php"
- #line 1180 "smarty_internal_templateparser.y"
- function yy_r182()
+
+ #line 1293 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r183()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . ',' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->yystack[$this->yyidx + - 1]->minor->append_subtree($this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor;
}
- #line 3024 "smarty_internal_templateparser.php"
- #line 1188 "smarty_internal_templateparser.y"
+
+ #line 1298 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r184()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . '=>' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = new Smarty_Internal_ParseTree_Dq($this, $this->yystack[$this->yyidx + 0]->minor);
}
- #line 3029 "smarty_internal_templateparser.php"
- #line 1192 "smarty_internal_templateparser.y"
+
+ #line 1302 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r185()
{
- $this->_retvalue = '\'' . $this->yystack[$this->yyidx + - 2]->minor . '\'=>' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = new Smarty_Internal_ParseTree_Code($this, '(string)' . $this->yystack[$this->yyidx + - 1]->minor);
}
- #line 3034 "smarty_internal_templateparser.php"
- #line 1204 "smarty_internal_templateparser.y"
+
+ #line 1310 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r187()
{
- $this->_retvalue = "''";
- }
- #line 3039 "smarty_internal_templateparser.php"
- #line 1208 "smarty_internal_templateparser.y"
- function yy_r188()
- {
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor->to_smarty_php();
+ $this->_retvalue = new Smarty_Internal_ParseTree_Code($this, '(string)$_smarty_tpl->tpl_vars[\'' . substr($this->yystack[$this->yyidx + 0]->minor, 1) . '\']->value');
}
- #line 3044 "smarty_internal_templateparser.php"
- #line 1213 "smarty_internal_templateparser.y"
+
+ #line 1318 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r189()
{
- $this->yystack[$this->yyidx + - 1]->minor->append_subtree($this->yystack[$this->yyidx + 0]->minor);
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor;
+ $this->_retvalue = new Smarty_Internal_ParseTree_Code($this, '(string)(' . $this->yystack[$this->yyidx + - 1]->minor . ')');
}
- #line 3050 "smarty_internal_templateparser.php"
- #line 1218 "smarty_internal_templateparser.y"
+
+ #line 1322 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r190()
{
- $this->_retvalue = new _smarty_doublequoted($this, $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = new Smarty_Internal_ParseTree_Tag($this, $this->yystack[$this->yyidx + 0]->minor);
}
- #line 3055 "smarty_internal_templateparser.php"
- #line 1222 "smarty_internal_templateparser.y"
+
+ #line 1326 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r191()
{
- $this->_retvalue = new _smarty_code($this, '(string)' . $this->yystack[$this->yyidx + - 1]->minor);
- }
- #line 3060 "smarty_internal_templateparser.php"
- #line 1230 "smarty_internal_templateparser.y"
- function yy_r193()
- {
- $this->_retvalue = new _smarty_code($this, '(string)$_smarty_tpl->tpl_vars[\'' . substr($this->yystack[$this->yyidx + 0]->minor, 1) . '\']->value');
- }
- #line 3065 "smarty_internal_templateparser.php"
- #line 1238 "smarty_internal_templateparser.y"
- function yy_r195()
- {
- $this->_retvalue = new _smarty_code($this, '(string)(' . $this->yystack[$this->yyidx + - 1]->minor . ')');
+ $this->_retvalue = new Smarty_Internal_ParseTree_DqContent($this, $this->yystack[$this->yyidx + 0]->minor);
}
- #line 3070 "smarty_internal_templateparser.php"
- #line 1242 "smarty_internal_templateparser.y"
- function yy_r196()
- {
- $this->_retvalue = new _smarty_tag($this, $this->yystack[$this->yyidx + - 1]->minor);
- }
- #line 3075 "smarty_internal_templateparser.php"
- #line 1246 "smarty_internal_templateparser.y"
- function yy_r197()
- {
- $this->_retvalue = new _smarty_dq_content($this, $this->yystack[$this->yyidx + 0]->minor);
- }
-
- #line 3080 "smarty_internal_templateparser.php"
private $_retvalue;
public function yy_reduce($yyruleno)
{
- $yymsp = $this->yystack[$this->yyidx];
- if ($this->yyTraceFILE && $yyruleno >= 0
- && $yyruleno < count(self::$yyRuleName)
- ) {
- fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n",
- $this->yyTracePrompt, $yyruleno,
- self::$yyRuleName[$yyruleno]);
+ if ($this->yyTraceFILE && $yyruleno >= 0 && $yyruleno < count(self::$yyRuleName)) {
+ fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n", $this->yyTracePrompt, $yyruleno, self::$yyRuleName[$yyruleno]);
}
$this->_retvalue = $yy_lefthand_side = null;
- if (array_key_exists($yyruleno, self::$yyReduceMap)) {
+ if (isset(self::$yyReduceMap[$yyruleno])) {
// call the action
$this->_retvalue = null;
$this->{'yy_r' . self::$yyReduceMap[$yyruleno]}();
$yy_lefthand_side = $this->_retvalue;
}
- $yygoto = self::$yyRuleInfo[$yyruleno]['lhs'];
- $yysize = self::$yyRuleInfo[$yyruleno]['rhs'];
+ $yygoto = self::$yyRuleInfo[$yyruleno][0];
+ $yysize = self::$yyRuleInfo[$yyruleno][1];
$this->yyidx -= $yysize;
for ($i = $yysize; $i; $i --) {
// pop all of the right-hand side parameters
@@ -4449,12 +2301,11 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
public function yy_syntax_error($yymajor, $TOKEN)
{
- #line 75 "smarty_internal_templateparser.y"
+ #line 183 "../smarty/lexer/smarty_internal_templateparser.y"
$this->internalError = true;
$this->yymajor = $yymajor;
$this->compiler->trigger_template_error();
- #line 3142 "smarty_internal_templateparser.php"
}
public function yy_accept()
@@ -4463,16 +2314,13 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt);
}
while ($this->yyidx >= 0) {
- $stack = $this->yy_pop_parser_stack();
+ $this->yy_pop_parser_stack();
}
- #line 66 "smarty_internal_templateparser.y"
+ #line 176 "../smarty/lexer/smarty_internal_templateparser.y"
$this->successful = !$this->internalError;
$this->internalError = false;
$this->retvalue = $this->_retvalue;
- //echo $this->retvalue."\n\n";
-
- #line 3160 "smarty_internal_templateparser.php"
}
public function doParse($yymajor, $yytokenvalue)
@@ -4486,20 +2334,17 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
$x->stateno = 0;
$x->major = 0;
$this->yystack = array();
- array_push($this->yystack, $x);
+ $this->yystack[] = $x;
}
$yyendofinput = ($yymajor == 0);
if ($this->yyTraceFILE) {
- fprintf($this->yyTraceFILE, "%sInput %s\n",
- $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
+ fprintf($this->yyTraceFILE, "%sInput %s\n", $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
}
do {
$yyact = $this->yy_find_shift_action($yymajor);
- if ($yymajor < self::YYERRORSYMBOL &&
- !$this->yy_is_expected_token($yymajor)
- ) {
+ if ($yymajor < self::YYERRORSYMBOL && !$this->yy_is_expected_token($yymajor)) {
// force a syntax error
$yyact = self::YY_ERROR_ACTION;
}
@@ -4515,8 +2360,7 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
$this->yy_reduce($yyact - self::YYNSTATE);
} elseif ($yyact == self::YY_ERROR_ACTION) {
if ($this->yyTraceFILE) {
- fprintf($this->yyTraceFILE, "%sSyntax Error!\n",
- $this->yyTracePrompt);
+ fprintf($this->yyTraceFILE, "%sSyntax Error!\n", $this->yyTracePrompt);
}
if (self::YYERRORSYMBOL) {
if ($this->yyerrcnt < 0) {
@@ -4525,16 +2369,12 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
$yymx = $this->yystack[$this->yyidx]->major;
if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) {
if ($this->yyTraceFILE) {
- fprintf($this->yyTraceFILE, "%sDiscard input token %s\n",
- $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
+ fprintf($this->yyTraceFILE, "%sDiscard input token %s\n", $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
}
$this->yy_destructor($yymajor, $yytokenvalue);
$yymajor = self::YYNOCODE;
} else {
- while ($this->yyidx >= 0 &&
- $yymx != self::YYERRORSYMBOL &&
- ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE
- ) {
+ while ($this->yyidx >= 0 && $yymx != self::YYERRORSYMBOL && ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE) {
$this->yy_pop_parser_stack();
}
if ($this->yyidx < 0 || $yymajor == 0) {
@@ -4566,3 +2406,4 @@ class Smarty_Internal_Templateparser#line 80 "smarty_internal_templateparser.php
} while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
}
}
+
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_testinstall.php b/library/Smarty/libs/sysplugins/smarty_internal_testinstall.php
new file mode 100644
index 000000000..1ba31638f
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_internal_testinstall.php
@@ -0,0 +1,571 @@
+<?php
+/**
+ * Smarty Internal TestInstall
+ * Test Smarty installation
+ *
+ * @package Smarty
+ * @subpackage Utilities
+ * @author Uwe Tews
+ */
+/**
+ * TestInstall class
+ *
+ * @package Smarty
+ * @subpackage Utilities
+ */
+class Smarty_Internal_TestInstall
+{
+ /**
+ * diagnose Smarty setup
+ * If $errors is secified, the diagnostic report will be appended to the array, rather than being output.
+ *
+ * @param Smarty $smarty Smarty instance to test
+ * @param array $errors array to push results into rather than outputting them
+ *
+ * @return bool status, true if everything is fine, false else
+ */
+ public static function testInstall(Smarty $smarty, &$errors = null)
+ {
+ $status = true;
+
+ if ($errors === null) {
+ echo "<PRE>\n";
+ echo "Smarty Installation test...\n";
+ echo "Testing template directory...\n";
+ }
+
+ $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
+
+ // test if all registered template_dir are accessible
+ foreach ($smarty->getTemplateDir() as $template_dir) {
+ $_template_dir = $template_dir;
+ $template_dir = realpath($template_dir);
+ // resolve include_path or fail existence
+ if (!$template_dir) {
+ if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_template_dir)) {
+ // try PHP include_path
+ if ($_stream_resolve_include_path) {
+ $template_dir = stream_resolve_include_path($_template_dir);
+ } else {
+ $template_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_template_dir);
+ }
+
+ if ($template_dir !== false) {
+ if ($errors === null) {
+ echo "$template_dir is OK.\n";
+ }
+
+ continue;
+ } else {
+ $status = false;
+ $message = "FAILED: $_template_dir does not exist (and couldn't be found in include_path either)";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['template_dir'] = $message;
+ }
+
+ continue;
+ }
+ } else {
+ $status = false;
+ $message = "FAILED: $_template_dir does not exist";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['template_dir'] = $message;
+ }
+
+ continue;
+ }
+ }
+
+ if (!is_dir($template_dir)) {
+ $status = false;
+ $message = "FAILED: $template_dir is not a directory";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['template_dir'] = $message;
+ }
+ } elseif (!is_readable($template_dir)) {
+ $status = false;
+ $message = "FAILED: $template_dir is not readable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['template_dir'] = $message;
+ }
+ } else {
+ if ($errors === null) {
+ echo "$template_dir is OK.\n";
+ }
+ }
+ }
+
+ if ($errors === null) {
+ echo "Testing compile directory...\n";
+ }
+
+ // test if registered compile_dir is accessible
+ $__compile_dir = $smarty->getCompileDir();
+ $_compile_dir = realpath($__compile_dir);
+ if (!$_compile_dir) {
+ $status = false;
+ $message = "FAILED: {$__compile_dir} does not exist";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['compile_dir'] = $message;
+ }
+ } elseif (!is_dir($_compile_dir)) {
+ $status = false;
+ $message = "FAILED: {$_compile_dir} is not a directory";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['compile_dir'] = $message;
+ }
+ } elseif (!is_readable($_compile_dir)) {
+ $status = false;
+ $message = "FAILED: {$_compile_dir} is not readable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['compile_dir'] = $message;
+ }
+ } elseif (!is_writable($_compile_dir)) {
+ $status = false;
+ $message = "FAILED: {$_compile_dir} is not writable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['compile_dir'] = $message;
+ }
+ } else {
+ if ($errors === null) {
+ echo "{$_compile_dir} is OK.\n";
+ }
+ }
+
+ if ($errors === null) {
+ echo "Testing plugins directory...\n";
+ }
+
+ // test if all registered plugins_dir are accessible
+ // and if core plugins directory is still registered
+ $_core_plugins_dir = realpath(dirname(__FILE__) . '/../plugins');
+ $_core_plugins_available = false;
+ foreach ($smarty->getPluginsDir() as $plugin_dir) {
+ $_plugin_dir = $plugin_dir;
+ $plugin_dir = realpath($plugin_dir);
+ // resolve include_path or fail existence
+ if (!$plugin_dir) {
+ if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) {
+ // try PHP include_path
+ if ($_stream_resolve_include_path) {
+ $plugin_dir = stream_resolve_include_path($_plugin_dir);
+ } else {
+ $plugin_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_plugin_dir);
+ }
+
+ if ($plugin_dir !== false) {
+ if ($errors === null) {
+ echo "$plugin_dir is OK.\n";
+ }
+
+ continue;
+ } else {
+ $status = false;
+ $message = "FAILED: $_plugin_dir does not exist (and couldn't be found in include_path either)";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins_dir'] = $message;
+ }
+
+ continue;
+ }
+ } else {
+ $status = false;
+ $message = "FAILED: $_plugin_dir does not exist";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins_dir'] = $message;
+ }
+
+ continue;
+ }
+ }
+
+ if (!is_dir($plugin_dir)) {
+ $status = false;
+ $message = "FAILED: $plugin_dir is not a directory";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins_dir'] = $message;
+ }
+ } elseif (!is_readable($plugin_dir)) {
+ $status = false;
+ $message = "FAILED: $plugin_dir is not readable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins_dir'] = $message;
+ }
+ } elseif ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) {
+ $_core_plugins_available = true;
+ if ($errors === null) {
+ echo "$plugin_dir is OK.\n";
+ }
+ } else {
+ if ($errors === null) {
+ echo "$plugin_dir is OK.\n";
+ }
+ }
+ }
+ if (!$_core_plugins_available) {
+ $status = false;
+ $message = "WARNING: Smarty's own libs/plugins is not available";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } elseif (!isset($errors['plugins_dir'])) {
+ $errors['plugins_dir'] = $message;
+ }
+ }
+
+ if ($errors === null) {
+ echo "Testing cache directory...\n";
+ }
+
+ // test if all registered cache_dir is accessible
+ $__cache_dir = $smarty->getCacheDir();
+ $_cache_dir = realpath($__cache_dir);
+ if (!$_cache_dir) {
+ $status = false;
+ $message = "FAILED: {$__cache_dir} does not exist";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['cache_dir'] = $message;
+ }
+ } elseif (!is_dir($_cache_dir)) {
+ $status = false;
+ $message = "FAILED: {$_cache_dir} is not a directory";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['cache_dir'] = $message;
+ }
+ } elseif (!is_readable($_cache_dir)) {
+ $status = false;
+ $message = "FAILED: {$_cache_dir} is not readable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['cache_dir'] = $message;
+ }
+ } elseif (!is_writable($_cache_dir)) {
+ $status = false;
+ $message = "FAILED: {$_cache_dir} is not writable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['cache_dir'] = $message;
+ }
+ } else {
+ if ($errors === null) {
+ echo "{$_cache_dir} is OK.\n";
+ }
+ }
+
+ if ($errors === null) {
+ echo "Testing configs directory...\n";
+ }
+
+ // test if all registered config_dir are accessible
+ foreach ($smarty->getConfigDir() as $config_dir) {
+ $_config_dir = $config_dir;
+ $config_dir = realpath($config_dir);
+ // resolve include_path or fail existence
+ if (!$config_dir) {
+ if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_config_dir)) {
+ // try PHP include_path
+ if ($_stream_resolve_include_path) {
+ $config_dir = stream_resolve_include_path($_config_dir);
+ } else {
+ $config_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_config_dir);
+ }
+
+ if ($config_dir !== false) {
+ if ($errors === null) {
+ echo "$config_dir is OK.\n";
+ }
+
+ continue;
+ } else {
+ $status = false;
+ $message = "FAILED: $_config_dir does not exist (and couldn't be found in include_path either)";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['config_dir'] = $message;
+ }
+
+ continue;
+ }
+ } else {
+ $status = false;
+ $message = "FAILED: $_config_dir does not exist";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['config_dir'] = $message;
+ }
+
+ continue;
+ }
+ }
+
+ if (!is_dir($config_dir)) {
+ $status = false;
+ $message = "FAILED: $config_dir is not a directory";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['config_dir'] = $message;
+ }
+ } elseif (!is_readable($config_dir)) {
+ $status = false;
+ $message = "FAILED: $config_dir is not readable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['config_dir'] = $message;
+ }
+ } else {
+ if ($errors === null) {
+ echo "$config_dir is OK.\n";
+ }
+ }
+ }
+
+ if ($errors === null) {
+ echo "Testing sysplugin files...\n";
+ }
+ // test if sysplugins are available
+ $source = SMARTY_SYSPLUGINS_DIR;
+ if (is_dir($source)) {
+ $expected = array(
+ "smarty_cacheresource.php" => true,
+ "smarty_cacheresource_custom.php" => true,
+ "smarty_cacheresource_keyvaluestore.php" => true,
+ "smarty_data.php" => true,
+ "smarty_internal_cacheresource_file.php" => true,
+ "smarty_internal_compile_append.php" => true,
+ "smarty_internal_compile_assign.php" => true,
+ "smarty_internal_compile_block.php" => true,
+ "smarty_internal_compile_break.php" => true,
+ "smarty_internal_compile_call.php" => true,
+ "smarty_internal_compile_capture.php" => true,
+ "smarty_internal_compile_config_load.php" => true,
+ "smarty_internal_compile_continue.php" => true,
+ "smarty_internal_compile_debug.php" => true,
+ "smarty_internal_compile_eval.php" => true,
+ "smarty_internal_compile_extends.php" => true,
+ "smarty_internal_compile_for.php" => true,
+ "smarty_internal_compile_foreach.php" => true,
+ "smarty_internal_compile_function.php" => true,
+ "smarty_internal_compile_if.php" => true,
+ "smarty_internal_compile_include.php" => true,
+ "smarty_internal_compile_include_php.php" => true,
+ "smarty_internal_compile_insert.php" => true,
+ "smarty_internal_compile_ldelim.php" => true,
+ "smarty_internal_compile_nocache.php" => true,
+ "smarty_internal_compile_private_block_plugin.php" => true,
+ "smarty_internal_compile_private_function_plugin.php" => true,
+ "smarty_internal_compile_private_modifier.php" => true,
+ "smarty_internal_compile_private_object_block_function.php" => true,
+ "smarty_internal_compile_private_object_function.php" => true,
+ "smarty_internal_compile_private_print_expression.php" => true,
+ "smarty_internal_compile_private_registered_block.php" => true,
+ "smarty_internal_compile_private_registered_function.php" => true,
+ "smarty_internal_compile_private_special_variable.php" => true,
+ "smarty_internal_compile_rdelim.php" => true,
+ "smarty_internal_compile_section.php" => true,
+ "smarty_internal_compile_setfilter.php" => true,
+ "smarty_internal_compile_while.php" => true,
+ "smarty_internal_compilebase.php" => true,
+ "smarty_internal_config_file_compiler.php" => true,
+ "smarty_internal_configfilelexer.php" => true,
+ "smarty_internal_configfileparser.php" => true,
+ "smarty_internal_data.php" => true,
+ "smarty_internal_debug.php" => true,
+ "smarty_internal_extension_codeframe.php" => true,
+ "smarty_internal_extension_config.php" => true,
+ "smarty_internal_extension_defaulttemplatehandler.php" => true,
+ "smarty_internal_filter_handler.php" => true,
+ "smarty_internal_function_call_handler.php" => true,
+ "smarty_internal_get_include_path.php" => true,
+ "smarty_internal_nocache_insert.php" => true,
+ "smarty_internal_parsetree.php" => true,
+ "smarty_internal_parsetree_code.php" => true,
+ "smarty_internal_parsetree_dq.php" => true,
+ "smarty_internal_parsetree_dqcontent.php" => true,
+ "smarty_internal_parsetree_tag.php" => true,
+ "smarty_internal_parsetree_template.php" => true,
+ "smarty_internal_parsetree_text.php" => true,
+ "smarty_internal_resource_eval.php" => true,
+ "smarty_internal_resource_extends.php" => true,
+ "smarty_internal_resource_file.php" => true,
+ "smarty_internal_resource_php.php" => true,
+ "smarty_internal_resource_registered.php" => true,
+ "smarty_internal_resource_stream.php" => true,
+ "smarty_internal_resource_string.php" => true,
+ "smarty_internal_smartytemplatecompiler.php" => true,
+ "smarty_internal_template.php" => true,
+ "smarty_internal_templatebase.php" => true,
+ "smarty_internal_templatecompilerbase.php" => true,
+ "smarty_internal_templatelexer.php" => true,
+ "smarty_internal_templateparser.php" => true,
+ "smarty_internal_utility.php" => true,
+ "smarty_internal_write_file.php" => true,
+ "smarty_resource.php" => true,
+ "smarty_resource_custom.php" => true,
+ "smarty_resource_recompiled.php" => true,
+ "smarty_resource_uncompiled.php" => true,
+ "smarty_security.php" => true,
+ "smarty_template_cached.php" => true,
+ "smarty_template_compiled.php" => true,
+ "smarty_template_config.php" => true,
+ "smarty_template_source.php" => true,
+ "smarty_undefined_variable.php" => true,
+ "smarty_variable.php" => true,
+ "smartycompilerexception.php" => true,
+ "smartyexception.php" => true,
+ );
+ $iterator = new DirectoryIterator($source);
+ foreach ($iterator as $file) {
+ if (!$file->isDot()) {
+ $filename = $file->getFilename();
+ if (isset($expected[$filename])) {
+ unset($expected[$filename]);
+ }
+ }
+ }
+ if ($expected) {
+ $status = false;
+ $message = "FAILED: files missing from libs/sysplugins: " . join(', ', array_keys($expected));
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['sysplugins'] = $message;
+ }
+ } elseif ($errors === null) {
+ echo "... OK\n";
+ }
+ } else {
+ $status = false;
+ $message = "FAILED: " . SMARTY_SYSPLUGINS_DIR . ' is not a directory';
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['sysplugins_dir_constant'] = $message;
+ }
+ }
+
+ if ($errors === null) {
+ echo "Testing plugin files...\n";
+ }
+ // test if core plugins are available
+ $source = SMARTY_PLUGINS_DIR;
+ if (is_dir($source)) {
+ $expected = array(
+ "block.textformat.php" => true,
+ "function.counter.php" => true,
+ "function.cycle.php" => true,
+ "function.fetch.php" => true,
+ "function.html_checkboxes.php" => true,
+ "function.html_image.php" => true,
+ "function.html_options.php" => true,
+ "function.html_radios.php" => true,
+ "function.html_select_date.php" => true,
+ "function.html_select_time.php" => true,
+ "function.html_table.php" => true,
+ "function.mailto.php" => true,
+ "function.math.php" => true,
+ "modifier.capitalize.php" => true,
+ "modifier.date_format.php" => true,
+ "modifier.debug_print_var.php" => true,
+ "modifier.escape.php" => true,
+ "modifier.regex_replace.php" => true,
+ "modifier.replace.php" => true,
+ "modifier.spacify.php" => true,
+ "modifier.truncate.php" => true,
+ "modifiercompiler.cat.php" => true,
+ "modifiercompiler.count_characters.php" => true,
+ "modifiercompiler.count_paragraphs.php" => true,
+ "modifiercompiler.count_sentences.php" => true,
+ "modifiercompiler.count_words.php" => true,
+ "modifiercompiler.default.php" => true,
+ "modifiercompiler.escape.php" => true,
+ "modifiercompiler.from_charset.php" => true,
+ "modifiercompiler.indent.php" => true,
+ "modifiercompiler.lower.php" => true,
+ "modifiercompiler.noprint.php" => true,
+ "modifiercompiler.string_format.php" => true,
+ "modifiercompiler.strip.php" => true,
+ "modifiercompiler.strip_tags.php" => true,
+ "modifiercompiler.to_charset.php" => true,
+ "modifiercompiler.unescape.php" => true,
+ "modifiercompiler.upper.php" => true,
+ "modifiercompiler.wordwrap.php" => true,
+ "outputfilter.trimwhitespace.php" => true,
+ "shared.escape_special_chars.php" => true,
+ "shared.literal_compiler_param.php" => true,
+ "shared.make_timestamp.php" => true,
+ "shared.mb_str_replace.php" => true,
+ "shared.mb_unicode.php" => true,
+ "shared.mb_wordwrap.php" => true,
+ "variablefilter.htmlspecialchars.php" => true,
+ );
+ $iterator = new DirectoryIterator($source);
+ foreach ($iterator as $file) {
+ if (!$file->isDot()) {
+ $filename = $file->getFilename();
+ if (isset($expected[$filename])) {
+ unset($expected[$filename]);
+ }
+ }
+ }
+ if ($expected) {
+ $status = false;
+ $message = "FAILED: files missing from libs/plugins: " . join(', ', array_keys($expected));
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins'] = $message;
+ }
+ } elseif ($errors === null) {
+ echo "... OK\n";
+ }
+ } else {
+ $status = false;
+ $message = "FAILED: " . SMARTY_PLUGINS_DIR . ' is not a directory';
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins_dir_constant'] = $message;
+ }
+ }
+
+ if ($errors === null) {
+ echo "Tests complete.\n";
+ echo "</PRE>\n";
+ }
+
+ return $status;
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_utility.php b/library/Smarty/libs/sysplugins/smarty_internal_utility.php
index 0a5975bba..cd027dec7 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_utility.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_utility.php
@@ -192,6 +192,9 @@ class Smarty_Internal_Utility
public static function clearCompiledTemplate($resource_name, $compile_id, $exp_time, Smarty $smarty)
{
$_compile_dir = realpath($smarty->getCompileDir()) . '/';
+ if ($_compile_dir == '/') { //We should never want to delete this!
+ return 0;
+ }
$_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
$_dir_sep = $smarty->use_sub_dirs ? '/' : '^';
if (isset($resource_name)) {
@@ -297,541 +300,4 @@ class Smarty_Internal_Utility
return $template->used_tags;
}
-
- /**
- * diagnose Smarty setup
- * If $errors is secified, the diagnostic report will be appended to the array, rather than being output.
- *
- * @param Smarty $smarty Smarty instance to test
- * @param array $errors array to push results into rather than outputting them
- *
- * @return bool status, true if everything is fine, false else
- */
- public static function testInstall(Smarty $smarty, &$errors = null)
- {
- $status = true;
-
- if ($errors === null) {
- echo "<PRE>\n";
- echo "Smarty Installation test...\n";
- echo "Testing template directory...\n";
- }
-
- $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
-
- // test if all registered template_dir are accessible
- foreach ($smarty->getTemplateDir() as $template_dir) {
- $_template_dir = $template_dir;
- $template_dir = realpath($template_dir);
- // resolve include_path or fail existence
- if (!$template_dir) {
- if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_template_dir)) {
- // try PHP include_path
- if ($_stream_resolve_include_path) {
- $template_dir = stream_resolve_include_path($_template_dir);
- } else {
- $template_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_template_dir);
- }
-
- if ($template_dir !== false) {
- if ($errors === null) {
- echo "$template_dir is OK.\n";
- }
-
- continue;
- } else {
- $status = false;
- $message = "FAILED: $_template_dir does not exist (and couldn't be found in include_path either)";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['template_dir'] = $message;
- }
-
- continue;
- }
- } else {
- $status = false;
- $message = "FAILED: $_template_dir does not exist";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['template_dir'] = $message;
- }
-
- continue;
- }
- }
-
- if (!is_dir($template_dir)) {
- $status = false;
- $message = "FAILED: $template_dir is not a directory";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['template_dir'] = $message;
- }
- } elseif (!is_readable($template_dir)) {
- $status = false;
- $message = "FAILED: $template_dir is not readable";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['template_dir'] = $message;
- }
- } else {
- if ($errors === null) {
- echo "$template_dir is OK.\n";
- }
- }
- }
-
- if ($errors === null) {
- echo "Testing compile directory...\n";
- }
-
- // test if registered compile_dir is accessible
- $__compile_dir = $smarty->getCompileDir();
- $_compile_dir = realpath($__compile_dir);
- if (!$_compile_dir) {
- $status = false;
- $message = "FAILED: {$__compile_dir} does not exist";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['compile_dir'] = $message;
- }
- } elseif (!is_dir($_compile_dir)) {
- $status = false;
- $message = "FAILED: {$_compile_dir} is not a directory";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['compile_dir'] = $message;
- }
- } elseif (!is_readable($_compile_dir)) {
- $status = false;
- $message = "FAILED: {$_compile_dir} is not readable";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['compile_dir'] = $message;
- }
- } elseif (!is_writable($_compile_dir)) {
- $status = false;
- $message = "FAILED: {$_compile_dir} is not writable";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['compile_dir'] = $message;
- }
- } else {
- if ($errors === null) {
- echo "{$_compile_dir} is OK.\n";
- }
- }
-
- if ($errors === null) {
- echo "Testing plugins directory...\n";
- }
-
- // test if all registered plugins_dir are accessible
- // and if core plugins directory is still registered
- $_core_plugins_dir = realpath(dirname(__FILE__) . '/../plugins');
- $_core_plugins_available = false;
- foreach ($smarty->getPluginsDir() as $plugin_dir) {
- $_plugin_dir = $plugin_dir;
- $plugin_dir = realpath($plugin_dir);
- // resolve include_path or fail existence
- if (!$plugin_dir) {
- if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) {
- // try PHP include_path
- if ($_stream_resolve_include_path) {
- $plugin_dir = stream_resolve_include_path($_plugin_dir);
- } else {
- $plugin_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_plugin_dir);
- }
-
- if ($plugin_dir !== false) {
- if ($errors === null) {
- echo "$plugin_dir is OK.\n";
- }
-
- continue;
- } else {
- $status = false;
- $message = "FAILED: $_plugin_dir does not exist (and couldn't be found in include_path either)";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['plugins_dir'] = $message;
- }
-
- continue;
- }
- } else {
- $status = false;
- $message = "FAILED: $_plugin_dir does not exist";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['plugins_dir'] = $message;
- }
-
- continue;
- }
- }
-
- if (!is_dir($plugin_dir)) {
- $status = false;
- $message = "FAILED: $plugin_dir is not a directory";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['plugins_dir'] = $message;
- }
- } elseif (!is_readable($plugin_dir)) {
- $status = false;
- $message = "FAILED: $plugin_dir is not readable";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['plugins_dir'] = $message;
- }
- } elseif ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) {
- $_core_plugins_available = true;
- if ($errors === null) {
- echo "$plugin_dir is OK.\n";
- }
- } else {
- if ($errors === null) {
- echo "$plugin_dir is OK.\n";
- }
- }
- }
- if (!$_core_plugins_available) {
- $status = false;
- $message = "WARNING: Smarty's own libs/plugins is not available";
- if ($errors === null) {
- echo $message . ".\n";
- } elseif (!isset($errors['plugins_dir'])) {
- $errors['plugins_dir'] = $message;
- }
- }
-
- if ($errors === null) {
- echo "Testing cache directory...\n";
- }
-
- // test if all registered cache_dir is accessible
- $__cache_dir = $smarty->getCacheDir();
- $_cache_dir = realpath($__cache_dir);
- if (!$_cache_dir) {
- $status = false;
- $message = "FAILED: {$__cache_dir} does not exist";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['cache_dir'] = $message;
- }
- } elseif (!is_dir($_cache_dir)) {
- $status = false;
- $message = "FAILED: {$_cache_dir} is not a directory";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['cache_dir'] = $message;
- }
- } elseif (!is_readable($_cache_dir)) {
- $status = false;
- $message = "FAILED: {$_cache_dir} is not readable";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['cache_dir'] = $message;
- }
- } elseif (!is_writable($_cache_dir)) {
- $status = false;
- $message = "FAILED: {$_cache_dir} is not writable";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['cache_dir'] = $message;
- }
- } else {
- if ($errors === null) {
- echo "{$_cache_dir} is OK.\n";
- }
- }
-
- if ($errors === null) {
- echo "Testing configs directory...\n";
- }
-
- // test if all registered config_dir are accessible
- foreach ($smarty->getConfigDir() as $config_dir) {
- $_config_dir = $config_dir;
- $config_dir = realpath($config_dir);
- // resolve include_path or fail existence
- if (!$config_dir) {
- if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_config_dir)) {
- // try PHP include_path
- if ($_stream_resolve_include_path) {
- $config_dir = stream_resolve_include_path($_config_dir);
- } else {
- $config_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_config_dir);
- }
-
- if ($config_dir !== false) {
- if ($errors === null) {
- echo "$config_dir is OK.\n";
- }
-
- continue;
- } else {
- $status = false;
- $message = "FAILED: $_config_dir does not exist (and couldn't be found in include_path either)";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['config_dir'] = $message;
- }
-
- continue;
- }
- } else {
- $status = false;
- $message = "FAILED: $_config_dir does not exist";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['config_dir'] = $message;
- }
-
- continue;
- }
- }
-
- if (!is_dir($config_dir)) {
- $status = false;
- $message = "FAILED: $config_dir is not a directory";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['config_dir'] = $message;
- }
- } elseif (!is_readable($config_dir)) {
- $status = false;
- $message = "FAILED: $config_dir is not readable";
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['config_dir'] = $message;
- }
- } else {
- if ($errors === null) {
- echo "$config_dir is OK.\n";
- }
- }
- }
-
- if ($errors === null) {
- echo "Testing sysplugin files...\n";
- }
- // test if sysplugins are available
- $source = SMARTY_SYSPLUGINS_DIR;
- if (is_dir($source)) {
- $expected = array(
- "smarty_cacheresource.php" => true,
- "smarty_cacheresource_custom.php" => true,
- "smarty_cacheresource_keyvaluestore.php" => true,
- "smarty_config_source.php" => true,
- "smarty_internal_cacheresource_file.php" => true,
- "smarty_internal_compile_append.php" => true,
- "smarty_internal_compile_assign.php" => true,
- "smarty_internal_compile_block.php" => true,
- "smarty_internal_compile_break.php" => true,
- "smarty_internal_compile_call.php" => true,
- "smarty_internal_compile_capture.php" => true,
- "smarty_internal_compile_config_load.php" => true,
- "smarty_internal_compile_continue.php" => true,
- "smarty_internal_compile_debug.php" => true,
- "smarty_internal_compile_eval.php" => true,
- "smarty_internal_compile_extends.php" => true,
- "smarty_internal_compile_for.php" => true,
- "smarty_internal_compile_foreach.php" => true,
- "smarty_internal_compile_function.php" => true,
- "smarty_internal_compile_if.php" => true,
- "smarty_internal_compile_include.php" => true,
- "smarty_internal_compile_include_php.php" => true,
- "smarty_internal_compile_insert.php" => true,
- "smarty_internal_compile_ldelim.php" => true,
- "smarty_internal_compile_nocache.php" => true,
- "smarty_internal_compile_private_block_plugin.php" => true,
- "smarty_internal_compile_private_function_plugin.php" => true,
- "smarty_internal_compile_private_modifier.php" => true,
- "smarty_internal_compile_private_object_block_function.php" => true,
- "smarty_internal_compile_private_object_function.php" => true,
- "smarty_internal_compile_private_print_expression.php" => true,
- "smarty_internal_compile_private_registered_block.php" => true,
- "smarty_internal_compile_private_registered_function.php" => true,
- "smarty_internal_compile_private_special_variable.php" => true,
- "smarty_internal_compile_rdelim.php" => true,
- "smarty_internal_compile_section.php" => true,
- "smarty_internal_compile_setfilter.php" => true,
- "smarty_internal_compile_while.php" => true,
- "smarty_internal_compilebase.php" => true,
- "smarty_internal_config.php" => true,
- "smarty_internal_config_file_compiler.php" => true,
- "smarty_internal_configfilelexer.php" => true,
- "smarty_internal_configfileparser.php" => true,
- "smarty_internal_data.php" => true,
- "smarty_internal_debug.php" => true,
- "smarty_internal_filter_handler.php" => true,
- "smarty_internal_function_call_handler.php" => true,
- "smarty_internal_get_include_path.php" => true,
- "smarty_internal_nocache_insert.php" => true,
- "smarty_internal_parsetree.php" => true,
- "smarty_internal_resource_eval.php" => true,
- "smarty_internal_resource_extends.php" => true,
- "smarty_internal_resource_file.php" => true,
- "smarty_internal_resource_registered.php" => true,
- "smarty_internal_resource_stream.php" => true,
- "smarty_internal_resource_string.php" => true,
- "smarty_internal_smartytemplatecompiler.php" => true,
- "smarty_internal_template.php" => true,
- "smarty_internal_templatebase.php" => true,
- "smarty_internal_templatecompilerbase.php" => true,
- "smarty_internal_templatelexer.php" => true,
- "smarty_internal_templateparser.php" => true,
- "smarty_internal_utility.php" => true,
- "smarty_internal_write_file.php" => true,
- "smarty_resource.php" => true,
- "smarty_resource_custom.php" => true,
- "smarty_resource_recompiled.php" => true,
- "smarty_resource_uncompiled.php" => true,
- "smarty_security.php" => true,
- );
- $iterator = new DirectoryIterator($source);
- foreach ($iterator as $file) {
- if (!$file->isDot()) {
- $filename = $file->getFilename();
- if (isset($expected[$filename])) {
- unset($expected[$filename]);
- }
- }
- }
- if ($expected) {
- $status = false;
- $message = "FAILED: files missing from libs/sysplugins: " . join(', ', array_keys($expected));
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['sysplugins'] = $message;
- }
- } elseif ($errors === null) {
- echo "... OK\n";
- }
- } else {
- $status = false;
- $message = "FAILED: " . SMARTY_SYSPLUGINS_DIR . ' is not a directory';
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['sysplugins_dir_constant'] = $message;
- }
- }
-
- if ($errors === null) {
- echo "Testing plugin files...\n";
- }
- // test if core plugins are available
- $source = SMARTY_PLUGINS_DIR;
- if (is_dir($source)) {
- $expected = array(
- "block.textformat.php" => true,
- "function.counter.php" => true,
- "function.cycle.php" => true,
- "function.fetch.php" => true,
- "function.html_checkboxes.php" => true,
- "function.html_image.php" => true,
- "function.html_options.php" => true,
- "function.html_radios.php" => true,
- "function.html_select_date.php" => true,
- "function.html_select_time.php" => true,
- "function.html_table.php" => true,
- "function.mailto.php" => true,
- "function.math.php" => true,
- "modifier.capitalize.php" => true,
- "modifier.date_format.php" => true,
- "modifier.debug_print_var.php" => true,
- "modifier.escape.php" => true,
- "modifier.regex_replace.php" => true,
- "modifier.replace.php" => true,
- "modifier.spacify.php" => true,
- "modifier.truncate.php" => true,
- "modifiercompiler.cat.php" => true,
- "modifiercompiler.count_characters.php" => true,
- "modifiercompiler.count_paragraphs.php" => true,
- "modifiercompiler.count_sentences.php" => true,
- "modifiercompiler.count_words.php" => true,
- "modifiercompiler.default.php" => true,
- "modifiercompiler.escape.php" => true,
- "modifiercompiler.from_charset.php" => true,
- "modifiercompiler.indent.php" => true,
- "modifiercompiler.lower.php" => true,
- "modifiercompiler.noprint.php" => true,
- "modifiercompiler.string_format.php" => true,
- "modifiercompiler.strip.php" => true,
- "modifiercompiler.strip_tags.php" => true,
- "modifiercompiler.to_charset.php" => true,
- "modifiercompiler.unescape.php" => true,
- "modifiercompiler.upper.php" => true,
- "modifiercompiler.wordwrap.php" => true,
- "outputfilter.trimwhitespace.php" => true,
- "shared.escape_special_chars.php" => true,
- "shared.literal_compiler_param.php" => true,
- "shared.make_timestamp.php" => true,
- "shared.mb_str_replace.php" => true,
- "shared.mb_unicode.php" => true,
- "shared.mb_wordwrap.php" => true,
- "variablefilter.htmlspecialchars.php" => true,
- );
- $iterator = new DirectoryIterator($source);
- foreach ($iterator as $file) {
- if (!$file->isDot()) {
- $filename = $file->getFilename();
- if (isset($expected[$filename])) {
- unset($expected[$filename]);
- }
- }
- }
- if ($expected) {
- $status = false;
- $message = "FAILED: files missing from libs/plugins: " . join(', ', array_keys($expected));
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['plugins'] = $message;
- }
- } elseif ($errors === null) {
- echo "... OK\n";
- }
- } else {
- $status = false;
- $message = "FAILED: " . SMARTY_PLUGINS_DIR . ' is not a directory';
- if ($errors === null) {
- echo $message . ".\n";
- } else {
- $errors['plugins_dir_constant'] = $message;
- }
- }
-
- if ($errors === null) {
- echo "Tests complete.\n";
- echo "</PRE>\n";
- }
-
- return $status;
- }
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_write_file.php b/library/Smarty/libs/sysplugins/smarty_internal_write_file.php
index f46fe2b6c..9ecc7c0c8 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_write_file.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_write_file.php
@@ -25,7 +25,7 @@ class Smarty_Internal_Write_File
* @throws SmartyException
* @return boolean true
*/
- public static function writeFile($_filepath, $_contents, Smarty $smarty)
+ public function writeFile($_filepath, $_contents, Smarty $smarty)
{
$_error_reporting = error_reporting();
error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING);
@@ -55,7 +55,9 @@ class Smarty_Internal_Write_File
*/
if (Smarty::$_IS_WINDOWS) {
// remove original file
- @unlink($_filepath);
+ if (is_file($_filepath)) {
+ @unlink($_filepath);
+ }
// rename tmp file
$success = @rename($_tmp_file, $_filepath);
} else {
@@ -63,17 +65,17 @@ class Smarty_Internal_Write_File
$success = @rename($_tmp_file, $_filepath);
if (!$success) {
// remove original file
- @unlink($_filepath);
+ if (is_file($_filepath)) {
+ @unlink($_filepath);
+ }
// rename tmp file
$success = @rename($_tmp_file, $_filepath);
}
}
-
if (!$success) {
error_reporting($_error_reporting);
throw new SmartyException("unable to write file {$_filepath}");
}
-
if ($smarty->_file_perms !== null) {
// set file permissions
chmod($_filepath, $smarty->_file_perms);
diff --git a/library/Smarty/libs/sysplugins/smarty_resource.php b/library/Smarty/libs/sysplugins/smarty_resource.php
index f478a533d..5d5e368d9 100644
--- a/library/Smarty/libs/sysplugins/smarty_resource.php
+++ b/library/Smarty/libs/sysplugins/smarty_resource.php
@@ -17,6 +17,25 @@
abstract class Smarty_Resource
{
/**
+ * Source is bypassing compiler
+ *
+ * @var boolean
+ */
+ public $uncompiled = false;
+
+ /**
+ * Source must be recompiled on every occasion
+ *
+ * @var boolean
+ */
+ public $recompiled = false;
+ /**
+ * resource handler object
+ *
+ * @var Smarty_Resource
+ */
+ public $handler = null;
+ /**
* cache for Smarty_Template_Source instances
*
* @var array
@@ -29,23 +48,17 @@ abstract class Smarty_Resource
*/
public static $compileds = array();
/**
- * cache for Smarty_Resource instances
- *
- * @var array
- */
- public static $resources = array();
- /**
* resource types provided by the core
*
* @var array
*/
protected static $sysplugins = array(
- 'file' => true,
- 'string' => true,
- 'extends' => true,
- 'stream' => true,
- 'eval' => true,
- 'php' => true
+ 'file' => 'smarty_internal_resource_file.php',
+ 'string' => 'smarty_internal_resource_string.php',
+ 'extends' => 'smarty_internal_resource_extends.php',
+ 'stream' => 'smarty_internal_resource_stream.php',
+ 'eval' => 'smarty_internal_resource_eval.php',
+ 'php' => 'smarty_internal_resource_php.php'
);
/**
@@ -103,13 +116,13 @@ abstract class Smarty_Resource
*
* @param Smarty $smarty Smarty instance
* @param string $resource_name resource_name to make unique
- * @param boolean $is_config flag for config resource
+ * @param boolean $isConfig flag for config resource
*
* @return string unique resource name
*/
- protected function buildUniqueResourceName(Smarty $smarty, $resource_name, $is_config = false)
+ public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
{
- if ($is_config) {
+ if ($isConfig) {
return get_class($this) . '#' . $smarty->joined_config_dir . '#' . $resource_name;
} else {
return get_class($this) . '#' . $smarty->joined_template_dir . '#' . $resource_name;
@@ -117,264 +130,13 @@ abstract class Smarty_Resource
}
/**
- * populate Compiled Object with compiled filepath
- *
- * @param Smarty_Template_Compiled $compiled compiled object
- * @param Smarty_Internal_Template $_template template object
- */
- public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template)
- {
- $_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null;
- $_filepath = $compiled->source->uid;
- // if use_sub_dirs, break file into directories
- if ($_template->smarty->use_sub_dirs) {
- $_filepath = substr($_filepath, 0, 2) . DS
- . substr($_filepath, 2, 2) . DS
- . substr($_filepath, 4, 2) . DS
- . $_filepath;
- }
- $_compile_dir_sep = $_template->smarty->use_sub_dirs ? DS : '^';
- if (isset($_compile_id)) {
- $_filepath = $_compile_id . $_compile_dir_sep . $_filepath;
- }
- // caching token
- if ($_template->caching) {
- $_cache = '.cache';
- } else {
- $_cache = '';
- }
- $_compile_dir = $_template->smarty->getCompileDir();
- // set basename if not specified
- $_basename = $this->getBasename($compiled->source);
- if ($_basename === null) {
- $_basename = basename(preg_replace('![^\w\/]+!', '_', $compiled->source->name));
- }
- // separate (optional) basename by dot
- if ($_basename) {
- $_basename = '.' . $_basename;
- }
-
- $compiled->filepath = $_compile_dir . $_filepath . '.' . $compiled->source->type . $_basename . $_cache . '.php';
- }
-
- /**
- * Normalize Paths "foo/../bar" to "bar"
- *
- * @param string $_path path to normalize
- * @param boolean $ds respect windows directory separator
- *
- * @return string normalized path
- */
- protected function normalizePath($_path, $ds = true)
- {
- if ($ds) {
- // don't we all just love windows?
- $_path = str_replace('\\', '/', $_path);
- }
-
- $offset = 0;
-
- // resolve simples
- $_path = preg_replace('#/\./(\./)*#', '/', $_path);
- // resolve parents
- while (true) {
- $_parent = strpos($_path, '/../', $offset);
- if (!$_parent) {
- break;
- } elseif ($_path[$_parent - 1] === '.') {
- $offset = $_parent + 3;
- continue;
- }
-
- $_pos = strrpos($_path, '/', $_parent - strlen($_path) - 1);
- if ($_pos === false) {
- // don't we all just love windows?
- $_pos = $_parent;
- }
-
- $_path = substr_replace($_path, '', $_pos, $_parent + 3 - $_pos);
- }
-
- if ($ds && DS != '/') {
- // don't we all just love windows?
- $_path = str_replace('/', '\\', $_path);
- }
-
- return $_path;
- }
-
- /**
- * build template filepath by traversing the template_dir array
- *
- * @param Smarty_Template_Source $source source object
- * @param Smarty_Internal_Template $_template template object
- *
- * @return string fully qualified filepath
- * @throws SmartyException if default template handler is registered but not callable
- */
- protected function buildFilepath(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
- {
- $file = $source->name;
- if ($source instanceof Smarty_Config_Source) {
- $_directories = $source->smarty->getConfigDir();
- $_default_handler = $source->smarty->default_config_handler_func;
- } else {
- $_directories = $source->smarty->getTemplateDir();
- $_default_handler = $source->smarty->default_template_handler_func;
- }
-
- // go relative to a given template?
- $_file_is_dotted = $file[0] == '.' && ($file[1] == '.' || $file[1] == '/' || $file[1] == "\\");
- if ($_template && $_template->parent instanceof Smarty_Internal_Template && $_file_is_dotted) {
- if ($_template->parent->source->type != 'file' && $_template->parent->source->type != 'extends' && !$_template->parent->allow_relative_path) {
- throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'");
- }
- $file = dirname($_template->parent->source->filepath) . DS . $file;
- $_file_exact_match = true;
- if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) {
- // the path gained from the parent template is relative to the current working directory
- // as expansions (like include_path) have already been done
- $file = getcwd() . DS . $file;
- }
- }
-
- // resolve relative path
- if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) {
- // don't we all just love windows?
- $_path = DS . trim($file, '/');
- $_was_relative = true;
- } else {
- // don't we all just love windows?
- $_path = str_replace('\\', '/', $file);
- }
- $_path = $this->normalizePath($_path, false);
- if (DS != '/') {
- // don't we all just love windows?
- $_path = str_replace('/', '\\', $_path);
- }
- // revert to relative
- if (isset($_was_relative)) {
- $_path = substr($_path, 1);
- }
-
- // this is only required for directories
- $file = rtrim($_path, '/\\');
-
- // files relative to a template only get one shot
- if (isset($_file_exact_match)) {
- return $this->fileExists($source, $file) ? $file : false;
- }
-
- // template_dir index?
- if (preg_match('#^\[(?P<key>[^\]]+)\](?P<file>.+)$#', $file, $match)) {
- $_directory = null;
- // try string indexes
- if (isset($_directories[$match['key']])) {
- $_directory = $_directories[$match['key']];
- } elseif (is_numeric($match['key'])) {
- // try numeric index
- $match['key'] = (int) $match['key'];
- if (isset($_directories[$match['key']])) {
- $_directory = $_directories[$match['key']];
- } else {
- // try at location index
- $keys = array_keys($_directories);
- $_directory = $_directories[$keys[$match['key']]];
- }
- }
-
- if ($_directory) {
- $_file = substr($file, strpos($file, ']') + 1);
- $_filepath = $_directory . $_file;
- if ($this->fileExists($source, $_filepath)) {
- return $_filepath;
- }
- }
- }
-
- $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
-
- // relative file name?
- if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) {
- foreach ($_directories as $_directory) {
- $_filepath = $_directory . $file;
- if ($this->fileExists($source, $_filepath)) {
- return $this->normalizePath($_filepath);
- }
- if ($source->smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_directory)) {
- // try PHP include_path
- if ($_stream_resolve_include_path) {
- $_filepath = stream_resolve_include_path($_filepath);
- } else {
- $_filepath = Smarty_Internal_Get_Include_Path::getIncludePath($_filepath);
- }
-
- if ($_filepath !== false) {
- if ($this->fileExists($source, $_filepath)) {
- return $this->normalizePath($_filepath);
- }
- }
- }
- }
- }
-
- // try absolute filepath
- if ($this->fileExists($source, $file)) {
- return $file;
- }
-
- // no tpl file found
- if ($_default_handler) {
- if (!is_callable($_default_handler)) {
- if ($source instanceof Smarty_Config_Source) {
- throw new SmartyException("Default config handler not callable");
- } else {
- throw new SmartyException("Default template handler not callable");
- }
- }
- $_return = call_user_func_array($_default_handler,
- array($source->type, $source->name, &$_content, &$_timestamp, $source->smarty));
- if (is_string($_return)) {
- $source->timestamp = @filemtime($_return);
- $source->exists = !!$source->timestamp;
-
- return $_return;
- } elseif ($_return === true) {
- $source->content = $_content;
- $source->timestamp = $_timestamp;
- $source->exists = true;
-
- return $_filepath;
- }
- }
-
- // give up
- return false;
- }
-
- /**
- * test is file exists and save timestamp
- *
- * @param Smarty_Template_Source $source source object
- * @param string $file file name
- *
- * @return bool true if file exists
- */
- protected function fileExists(Smarty_Template_Source $source, $file)
- {
- $source->timestamp = is_file($file) ? @filemtime($file) : false;
-
- return $source->exists = !!$source->timestamp;
- }
-
- /**
* Determine basename for compiled filename
*
* @param Smarty_Template_Source $source source object
*
* @return string resource's basename
*/
- protected function getBasename(Smarty_Template_Source $source)
+ public function getBasename(Smarty_Template_Source $source)
{
return null;
}
@@ -399,15 +161,8 @@ abstract class Smarty_Resource
if (isset($smarty->registered_resources[$type])) {
if ($smarty->registered_resources[$type] instanceof Smarty_Resource) {
$smarty->_resource_handlers[$type] = $smarty->registered_resources[$type];
- // note registered to smarty is not kept unique!
- return $smarty->_resource_handlers[$type];
- }
-
- if (!isset(self::$resources['registered'])) {
- self::$resources['registered'] = new Smarty_Internal_Resource_Registered();
- }
- if (!isset($smarty->_resource_handlers[$type])) {
- $smarty->_resource_handlers[$type] = self::$resources['registered'];
+ } else {
+ $smarty->_resource_handlers[$type] = new Smarty_Internal_Resource_Registered();
}
return $smarty->_resource_handlers[$type];
@@ -415,25 +170,18 @@ abstract class Smarty_Resource
// try sysplugins dir
if (isset(self::$sysplugins[$type])) {
- if (!isset(self::$resources[$type])) {
- $_resource_class = 'Smarty_Internal_Resource_' . ucfirst($type);
- self::$resources[$type] = new $_resource_class();
+ $_resource_class = 'Smarty_Internal_Resource_' . ucfirst($type);
+ if (!class_exists($_resource_class, false)) {
+ require SMARTY_SYSPLUGINS_DIR . self::$sysplugins[$type];
}
-
- return $smarty->_resource_handlers[$type] = self::$resources[$type];
+ return $smarty->_resource_handlers[$type] = new $_resource_class();
}
// try plugins dir
$_resource_class = 'Smarty_Resource_' . ucfirst($type);
if ($smarty->loadPlugin($_resource_class)) {
- if (isset(self::$resources[$type])) {
- return $smarty->_resource_handlers[$type] = self::$resources[$type];
- }
-
if (class_exists($_resource_class, false)) {
- self::$resources[$type] = new $_resource_class();
-
- return $smarty->_resource_handlers[$type] = self::$resources[$type];
+ return $smarty->_resource_handlers[$type] = new $_resource_class();
} else {
$smarty->registerResource($type, array(
"smarty_resource_{$type}_source",
@@ -441,7 +189,6 @@ abstract class Smarty_Resource
"smarty_resource_{$type}_secure",
"smarty_resource_{$type}_trusted"
));
-
// give it another try, now that the resource is registered properly
return self::load($smarty, $type);
}
@@ -454,11 +201,7 @@ abstract class Smarty_Resource
if (is_object($smarty->security_policy)) {
$smarty->security_policy->isTrustedStream($type);
}
- if (!isset(self::$resources['stream'])) {
- self::$resources['stream'] = new Smarty_Internal_Resource_Stream();
- }
-
- return $smarty->_resource_handlers[$type] = self::$resources['stream'];
+ return $smarty->_resource_handlers[$type] = new Smarty_Internal_Resource_Stream();;
}
// TODO: try default_(template|config)_handler
@@ -473,23 +216,22 @@ abstract class Smarty_Resource
*
* @param string $resource_name template_resource or config_resource to parse
* @param string $default_resource the default resource_type defined in $smarty
- * @param string &$name the parsed resource name
- * @param string &$type the parsed resource type
*
- * @return void
+ * @return array with parsed resource name and type
*/
- protected static function parseResourceName($resource_name, $default_resource, &$name, &$type)
+ public static function parseResourceName($resource_name, $default_resource)
{
- $parts = explode(':', $resource_name, 2);
- if (!isset($parts[1]) || !isset($parts[0][1])) {
+ if (preg_match('/^([A-Za-z0-9_\-]{2,})[:]/', $resource_name, $match)) {
+ $type = $match[1];
+ $name = substr($resource_name, strlen($match[0]));
+ } else {
// no resource given, use default
// or single character before the colon is not a resource type, but part of the filepath
$type = $default_resource;
$name = $resource_name;
- } else {
- $type = $parts[0];
- $name = $parts[1];
+
}
+ return array($name, $type);
}
/**
@@ -511,19 +253,21 @@ abstract class Smarty_Resource
*/
public static function getUniqueTemplateName($template, $template_resource)
{
- self::parseResourceName($template_resource, $template->smarty->default_resource_type, $name, $type);
+ $smarty = isset($template->smarty) ? $template->smarty : $template;
+ list($name, $type) = self::parseResourceName($template_resource, $smarty->default_resource_type);
// TODO: optimize for Smarty's internal resource types
- $resource = Smarty_Resource::load($template->smarty, $type);
+ $resource = Smarty_Resource::load($smarty, $type);
// go relative to a given template?
- $_file_is_dotted = $name[0] == '.' && ($name[1] == '.' || $name[1] == '/' || $name[1] == "\\");
+ $_file_is_dotted = $name[0] == '.' && ($name[1] == '.' || $name[1] == '/');
if ($template instanceof Smarty_Internal_Template && $_file_is_dotted && ($template->source->type == 'file' || $template->parent->source->type == 'extends')) {
$name = dirname($template->source->filepath) . DS . $name;
}
- return $resource->buildUniqueResourceName($template->smarty, $name);
+ return $resource->buildUniqueResourceName($smarty, $name);
}
/**
* initialize Source Object for given resource
+ * wrapper for backward compatibility to versions < 3.1.22
* Either [$_template] or [$smarty, $template_resource] must be specified
*
* @param Smarty_Internal_Template $_template template object
@@ -534,379 +278,7 @@ abstract class Smarty_Resource
*/
public static function source(Smarty_Internal_Template $_template = null, Smarty $smarty = null, $template_resource = null)
{
- if ($_template) {
- $smarty = $_template->smarty;
- $template_resource = $_template->template_resource;
- }
-
- // parse resource_name, load resource handler, identify unique resource name
- self::parseResourceName($template_resource, $smarty->default_resource_type, $name, $type);
- $resource = Smarty_Resource::load($smarty, $type);
- // go relative to a given template?
- $_file_is_dotted = isset($name[0]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/' || $name[1] == "\\");
- if ($_file_is_dotted && isset($_template) && $_template->parent instanceof Smarty_Internal_Template && ($_template->parent->source->type == 'file' || $_template->parent->source->type == 'extends')) {
- $name2 = dirname($_template->parent->source->filepath) . DS . $name;
- } else {
- $name2 = $name;
- }
- $unique_resource_name = $resource->buildUniqueResourceName($smarty, $name2);
-
- // check runtime cache
- $_cache_key = 'template|' . $unique_resource_name;
- if ($smarty->compile_id) {
- $_cache_key .= '|' . $smarty->compile_id;
- }
- if (isset(self::$sources[$_cache_key])) {
- return self::$sources[$_cache_key];
- }
-
- // create source
- $source = new Smarty_Template_Source($resource, $smarty, $template_resource, $type, $name, $unique_resource_name);
- $resource->populate($source, $_template);
-
- // runtime cache
- self::$sources[$_cache_key] = $source;
-
- return $source;
- }
-
- /**
- * initialize Config Source Object for given resource
- *
- * @param Smarty_Internal_Config $_config config object
- *
- * @throws SmartyException
- * @return Smarty_Config_Source Source Object
- */
- public static function config(Smarty_Internal_Config $_config)
- {
- static $_incompatible_resources = array('eval' => true, 'string' => true, 'extends' => true, 'php' => true);
- $config_resource = $_config->config_resource;
- $smarty = $_config->smarty;
-
- // parse resource_name
- self::parseResourceName($config_resource, $smarty->default_config_type, $name, $type);
-
- // make sure configs are not loaded via anything smarty can't handle
- if (isset($_incompatible_resources[$type])) {
- throw new SmartyException ("Unable to use resource '{$type}' for config");
- }
-
- // load resource handler, identify unique resource name
- $resource = Smarty_Resource::load($smarty, $type);
- $unique_resource_name = $resource->buildUniqueResourceName($smarty, $name, true);
-
- // check runtime cache
- $_cache_key = 'config|' . $unique_resource_name;
- if (isset(self::$sources[$_cache_key])) {
- return self::$sources[$_cache_key];
- }
-
- // create source
- $source = new Smarty_Config_Source($resource, $smarty, $config_resource, $type, $name, $unique_resource_name);
- $resource->populate($source, null);
-
- // runtime cache
- self::$sources[$_cache_key] = $source;
-
- return $source;
+ return Smarty_Template_Source::load($_template, $smarty, $template_resource);
}
}
-/**
- * Smarty Resource Data Object
- * Meta Data Container for Template Files
- *
- * @package Smarty
- * @subpackage TemplateResources
- * @author Rodney Rehm
- * @property integer $timestamp Source Timestamp
- * @property boolean $exists Source Existence
- * @property boolean $template Extended Template reference
- * @property string $content Source Content
- */
-class Smarty_Template_Source
-{
- /**
- * Name of the Class to compile this resource's contents with
- *
- * @var string
- */
- public $compiler_class = null;
-
- /**
- * Name of the Class to tokenize this resource's contents with
- *
- * @var string
- */
- public $template_lexer_class = null;
-
- /**
- * Name of the Class to parse this resource's contents with
- *
- * @var string
- */
- public $template_parser_class = null;
-
- /**
- * Unique Template ID
- *
- * @var string
- */
- public $uid = null;
-
- /**
- * Template Resource (Smarty_Internal_Template::$template_resource)
- *
- * @var string
- */
- public $resource = null;
-
- /**
- * Resource Type
- *
- * @var string
- */
- public $type = null;
-
- /**
- * Resource Name
- *
- * @var string
- */
- public $name = null;
-
- /**
- * Unique Resource Name
- *
- * @var string
- */
- public $unique_resource = null;
-
- /**
- * Source Filepath
- *
- * @var string
- */
- public $filepath = null;
-
- /**
- * Source is bypassing compiler
- *
- * @var boolean
- */
- public $uncompiled = null;
-
- /**
- * Source must be recompiled on every occasion
- *
- * @var boolean
- */
- public $recompiled = null;
-
- /**
- * The Components an extended template is made of
- *
- * @var array
- */
- public $components = null;
-
- /**
- * Resource Handler
- *
- * @var Smarty_Resource
- */
- public $handler = null;
-
- /**
- * Smarty instance
- *
- * @var Smarty
- */
- public $smarty = null;
-
- /**
- * create Source Object container
- *
- * @param Smarty_Resource $handler Resource Handler this source object communicates with
- * @param Smarty $smarty Smarty instance this source object belongs to
- * @param string $resource full template_resource
- * @param string $type type of resource
- * @param string $name resource name
- * @param string $unique_resource unique resource name
- */
- public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name, $unique_resource)
- {
- $this->handler = $handler; // Note: prone to circular references
-
- $this->compiler_class = $handler->compiler_class;
- $this->template_lexer_class = $handler->template_lexer_class;
- $this->template_parser_class = $handler->template_parser_class;
- $this->uncompiled = $this->handler instanceof Smarty_Resource_Uncompiled;
- $this->recompiled = $this->handler instanceof Smarty_Resource_Recompiled;
-
- $this->smarty = $smarty;
- $this->resource = $resource;
- $this->type = $type;
- $this->name = $name;
- $this->unique_resource = $unique_resource;
- }
-
- /**
- * get a Compiled Object of this source
- *
- * @param Smarty_Internal_Template|Smarty_Internal_Config $_template template object
- *
- * @return Smarty_Template_Compiled compiled object
- */
- public function getCompiled($_template)
- {
- // check runtime cache
- $_cache_key = $this->unique_resource . '#' . $_template->compile_id;
- if (isset(Smarty_Resource::$compileds[$_cache_key])) {
- return Smarty_Resource::$compileds[$_cache_key];
- }
-
- $compiled = new Smarty_Template_Compiled($this);
- $this->handler->populateCompiledFilepath($compiled, $_template);
- $compiled->timestamp = @filemtime($compiled->filepath);
- $compiled->exists = !!$compiled->timestamp;
-
- // runtime cache
- Smarty_Resource::$compileds[$_cache_key] = $compiled;
-
- return $compiled;
- }
-
- /**
- * render the uncompiled source
- *
- * @param Smarty_Internal_Template $_template template object
- */
- public function renderUncompiled(Smarty_Internal_Template $_template)
- {
- return $this->handler->renderUncompiled($this, $_template);
- }
-
- /**
- * <<magic>> Generic Setter.
- *
- * @param string $property_name valid: timestamp, exists, content, template
- * @param mixed $value new value (is not checked)
- *
- * @throws SmartyException if $property_name is not valid
- */
- public function __set($property_name, $value)
- {
- switch ($property_name) {
- // regular attributes
- case 'timestamp':
- case 'exists':
- case 'content':
- // required for extends: only
- case 'template':
- $this->$property_name = $value;
- break;
-
- default:
- throw new SmartyException("invalid source property '$property_name'.");
- }
- }
-
- /**
- * <<magic>> Generic getter.
- *
- * @param string $property_name valid: timestamp, exists, content
- *
- * @return mixed
- * @throws SmartyException if $property_name is not valid
- */
- public function __get($property_name)
- {
- switch ($property_name) {
- case 'timestamp':
- case 'exists':
- $this->handler->populateTimestamp($this);
-
- return $this->$property_name;
-
- case 'content':
- return $this->content = $this->handler->getContent($this);
-
- default:
- throw new SmartyException("source property '$property_name' does not exist.");
- }
- }
-}
-
-/**
- * Smarty Resource Data Object
- * Meta Data Container for Template Files
- *
- * @package Smarty
- * @subpackage TemplateResources
- * @author Rodney Rehm
- * @property string $content compiled content
- */
-class Smarty_Template_Compiled
-{
- /**
- * Compiled Filepath
- *
- * @var string
- */
- public $filepath = null;
-
- /**
- * Compiled Timestamp
- *
- * @var integer
- */
- public $timestamp = null;
-
- /**
- * Compiled Existence
- *
- * @var boolean
- */
- public $exists = false;
-
- /**
- * Compiled Content Loaded
- *
- * @var boolean
- */
- public $loaded = false;
-
- /**
- * Template was compiled
- *
- * @var boolean
- */
- public $isCompiled = false;
-
- /**
- * Source Object
- *
- * @var Smarty_Template_Source
- */
- public $source = null;
-
- /**
- * Metadata properties
- * populated by Smarty_Internal_Template::decodeProperties()
- *
- * @var array
- */
- public $_properties = null;
-
- /**
- * create Compiled Object container
- *
- * @param Smarty_Template_Source $source source object this compiled object belongs to
- */
- public function __construct(Smarty_Template_Source $source)
- {
- $this->source = $source;
- }
-}
diff --git a/library/Smarty/libs/sysplugins/smarty_resource_custom.php b/library/Smarty/libs/sysplugins/smarty_resource_custom.php
index 7c11bd8c7..619f2d6f0 100644
--- a/library/Smarty/libs/sysplugins/smarty_resource_custom.php
+++ b/library/Smarty/libs/sysplugins/smarty_resource_custom.php
@@ -88,7 +88,7 @@ abstract class Smarty_Resource_Custom extends Smarty_Resource
*
* @return string resource's basename
*/
- protected function getBasename(Smarty_Template_Source $source)
+ public function getBasename(Smarty_Template_Source $source)
{
return basename($source->name);
}
diff --git a/library/Smarty/libs/sysplugins/smarty_resource_recompiled.php b/library/Smarty/libs/sysplugins/smarty_resource_recompiled.php
index 66b36e17a..c823387ba 100644
--- a/library/Smarty/libs/sysplugins/smarty_resource_recompiled.php
+++ b/library/Smarty/libs/sysplugins/smarty_resource_recompiled.php
@@ -17,6 +17,13 @@
abstract class Smarty_Resource_Recompiled extends Smarty_Resource
{
/**
+ * Flag that it's an recompiled resource
+ *
+ * @var bool
+ */
+ public $recompiled = true;
+
+ /**
* populate Compiled Object with compiled filepath
*
* @param Smarty_Template_Compiled $compiled compiled object
diff --git a/library/Smarty/libs/sysplugins/smarty_resource_uncompiled.php b/library/Smarty/libs/sysplugins/smarty_resource_uncompiled.php
index 4ee5d7908..a52d86e87 100644
--- a/library/Smarty/libs/sysplugins/smarty_resource_uncompiled.php
+++ b/library/Smarty/libs/sysplugins/smarty_resource_uncompiled.php
@@ -17,6 +17,13 @@
abstract class Smarty_Resource_Uncompiled extends Smarty_Resource
{
/**
+ * Flag that it's an uncompiled resource
+ *
+ * @var bool
+ */
+ public $uncompiled = true;
+
+ /**
* Render and output the template (without using the compiler)
*
* @param Smarty_Template_Source $source source object
@@ -38,4 +45,28 @@ abstract class Smarty_Resource_Uncompiled extends Smarty_Resource
$compiled->timestamp = false;
$compiled->exists = false;
}
+
+ /**
+ * render compiled template code
+ *
+ * @param Smarty_Internal_Template $_template
+ *
+ * @return string
+ * @throws Exception
+ */
+ public function render($_template)
+ {
+ $level = ob_get_level();
+ ob_start();
+ try {
+ $this->renderUncompiled($_template->source, $_template);
+ return ob_get_clean();
+ }
+ catch (Exception $e) {
+ while (ob_get_level() > $level) {
+ ob_end_clean();
+ }
+ throw $e;
+ }
+ }
}
diff --git a/library/Smarty/libs/sysplugins/smarty_security.php b/library/Smarty/libs/sysplugins/smarty_security.php
index 9f7183bd0..af1ca5531 100644
--- a/library/Smarty/libs/sysplugins/smarty_security.php
+++ b/library/Smarty/libs/sysplugins/smarty_security.php
@@ -55,6 +55,12 @@ class Smarty_Security
*/
public $trusted_uri = array();
/**
+ * List of trusted constants names
+ *
+ * @var array
+ */
+ public $trusted_constants = array();
+ /**
* This is an array of trusted static classes.
* If empty access to all static classes is allowed.
* If set to 'none' none is allowed.
@@ -62,6 +68,34 @@ class Smarty_Security
* @var array
*/
public $static_classes = array();
+
+ /**
+ * This is an nested array of trusted classes and static methods.
+ * If empty access to all static classes and methods is allowed.
+ * Format:
+ * array (
+ * 'class_1' => array('method_1', 'method_2'), // allowed methods listed
+ * 'class_2' => array(), // all methods of class allowed
+ * )
+ * If set to null none is allowed.
+ *
+ * @var array
+ */
+ public $trusted_static_methods = array();
+
+ /**
+ * This is an array of trusted static properties.
+ * If empty access to all static classes and properties is allowed.
+ * Format:
+ * array (
+ * 'class_1' => array('prop_1', 'prop_2'), // allowed properties listed
+ * 'class_2' => array(), // all properties of class allowed
+ * )
+ * If set to null none is allowed.
+ *
+ * @var array
+ */
+ public $trusted_static_properties = array();
/**
* This is an array of trusted PHP functions.
* If empty all functions are allowed.
@@ -74,7 +108,6 @@ class Smarty_Security
'count', 'sizeof',
'in_array', 'is_array',
'time',
- 'nl2br',
);
/**
* This is an array of trusted PHP modifiers.
@@ -85,7 +118,8 @@ class Smarty_Security
*/
public $php_modifiers = array(
'escape',
- 'count'
+ 'count',
+ 'nl2br',
);
/**
* This is an array of allowed tags.
@@ -116,6 +150,12 @@ class Smarty_Security
*/
public $disabled_modifiers = array();
/**
+ * This is an array of disabled special $smarty variables.
+ *
+ * @var array
+ */
+ public $disabled_special_smarty_vars = array();
+ /**
* This is an array of trusted streams.
* If empty all streams are allowed.
* To disable all streams set $streams = null.
@@ -135,7 +175,18 @@ class Smarty_Security
* @var boolean
*/
public $allow_super_globals = true;
-
+ /**
+ * max template nesting level
+ *
+ * @var int
+ */
+ public $max_template_nesting = 0;
+ /**
+ * current template nesting level
+ *
+ * @var int
+ */
+ private $_current_template_nesting = 0;
/**
* Cache for $resource_dir lookup
*
@@ -222,6 +273,46 @@ class Smarty_Security
}
/**
+ * Check if static class method/property is trusted.
+ *
+ * @param string $class_name
+ * @param string $params
+ * @param object $compiler compiler object
+ *
+ * @return boolean true if class method is trusted
+ * @throws SmartyCompilerException if static class method is not trusted
+ */
+ public function isTrustedStaticClassAccess($class_name, $params, $compiler)
+ {
+ if (!isset($params[2])) {
+ // fall back
+ return $this->isTrustedStaticClass($class_name, $compiler);
+ }
+ if ($params[2] == 'method') {
+ $allowed = $this->trusted_static_methods;
+ $name = substr($params[0], 0, strpos($params[0], '('));
+ } else {
+ $allowed = $this->trusted_static_properties;
+ // strip '$'
+ $name = substr($params[0], 1);
+ }
+ if (isset($allowed)) {
+ if (empty($allowed)) {
+ // fall back
+ return $this->isTrustedStaticClass($class_name, $compiler);
+ }
+ if (isset($allowed[$class_name])
+ && (empty($allowed[$class_name])
+ || in_array($name, $allowed[$class_name]))
+ ) {
+ return true;
+ }
+ }
+ $compiler->trigger_template_error("access to static class '{$class_name}' {$params[2]} '{$name}' not allowed by security setting");
+ return false; // should not, but who knows what happens to the compiler in the future?
+ }
+
+ /**
* Check if PHP modifier is trusted.
*
* @param string $modifier_name
@@ -275,6 +366,26 @@ class Smarty_Security
}
/**
+ * Check if special $smarty variable is trusted.
+ *
+ * @param string $var_name
+ * @param object $compiler compiler object
+ *
+ * @return boolean true if tag is trusted
+ * @throws SmartyCompilerException if modifier is not trusted
+ */
+ public function isTrustedSpecialSmartyVar($var_name, $compiler)
+ {
+ if (!in_array($var_name, $this->disabled_special_smarty_vars)) {
+ return true;
+ } else {
+ $compiler->trigger_template_error("special variable '\$smarty.{$var_name}' not allowed by security setting", $compiler->lex->taglineno);
+ }
+
+ return false; // should not, but who knows what happens to the compiler in the future?
+ }
+
+ /**
* Check if modifier plugin is trusted.
*
* @param string $modifier_name
@@ -306,6 +417,33 @@ class Smarty_Security
}
/**
+ * Check if constants are enabled or trusted
+ *
+ * @param string $const contant name
+ * @param object $compiler compiler object
+ *
+ * @return bool
+ */
+ public function isTrustedConstant($const, $compiler)
+ {
+ if (in_array($const, array('true', 'false', 'null'))) {
+ return true;
+ }
+ if (!empty($this->trusted_constants)) {
+ if (!in_array($const, $this->trusted_constants)) {
+ $compiler->trigger_template_error("Security: access to constant '{$const}' not permitted");
+ return false;
+ }
+ return true;
+ }
+ if ($this->allow_constants) {
+ return true;
+ }
+ $compiler->trigger_template_error("Security: access to constants not permitted");
+ return false;
+ }
+
+ /**
* Check if stream is trusted.
*
* @param string $stream_name
@@ -477,4 +615,30 @@ class Smarty_Security
throw new SmartyException("directory '{$_filepath}' not allowed by security setting");
}
+
+ /**
+ * Start template processing
+ *
+ * @param $template
+ *
+ * @throws SmartyException
+ */
+ public function startTemplate($template)
+ {
+ if ($this->max_template_nesting > 0 && $this->_current_template_nesting ++ >= $this->max_template_nesting) {
+ throw new SmartyException("maximum template nesting level of '{$this->max_template_nesting}' exceeded when calling '{$template->template_resource}'");
+ }
+ }
+
+ /**
+ * Exit template processing
+ *
+ * @param $template
+ */
+ public function exitTemplate($template)
+ {
+ if ($this->max_template_nesting > 0) {
+ $this->_current_template_nesting --;
+ }
+ }
}
diff --git a/library/Smarty/libs/sysplugins/smarty_template_cached.php b/library/Smarty/libs/sysplugins/smarty_template_cached.php
new file mode 100644
index 000000000..5b9043958
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_template_cached.php
@@ -0,0 +1,403 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Uwe Tews
+ * Date: 04.12.2014
+ * Time: 06:08
+ */
+
+/**
+ * Smarty Resource Data Object
+ * Cache Data Container for Template Files
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Rodney Rehm
+ */
+class Smarty_Template_Cached
+{
+ /**
+ * Source Filepath
+ *
+ * @var string
+ */
+ public $filepath = false;
+
+ /**
+ * Source Content
+ *
+ * @var string
+ */
+ public $content = null;
+
+ /**
+ * Source Timestamp
+ *
+ * @var integer
+ */
+ public $timestamp = false;
+
+ /**
+ * Source Existence
+ *
+ * @var boolean
+ */
+ public $exists = false;
+
+ /**
+ * Cache Is Valid
+ *
+ * @var boolean
+ */
+ public $valid = null;
+
+ /**
+ * Cache was processed
+ *
+ * @var boolean
+ */
+ public $processed = false;
+
+ /**
+ * CacheResource Handler
+ *
+ * @var Smarty_CacheResource
+ */
+ public $handler = null;
+
+ /**
+ * Template Compile Id (Smarty_Internal_Template::$compile_id)
+ *
+ * @var string
+ */
+ public $compile_id = null;
+
+ /**
+ * Template Cache Id (Smarty_Internal_Template::$cache_id)
+ *
+ * @var string
+ */
+ public $cache_id = null;
+
+ /**
+ * Id for cache locking
+ *
+ * @var string
+ */
+ public $lock_id = null;
+
+ /**
+ * flag that cache is locked by this instance
+ *
+ * @var bool
+ */
+ public $is_locked = false;
+
+ /**
+ * Source Object
+ *
+ * @var Smarty_Template_Source
+ */
+ public $source = null;
+
+ /**
+ * create Cached Object container
+ *
+ * @param Smarty_Internal_Template $_template template object
+ */
+ public function __construct(Smarty_Internal_Template $_template)
+ {
+ $this->compile_id = $_template->compile_id;
+ $this->cache_id = $_template->cache_id;
+ if (!isset($_template->source)) {
+ $_template->loadSource();
+ }
+ $this->source = $_template->source;
+ if (!class_exists('Smarty_CacheResource', false)) {
+ require SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php';
+ }
+ $this->handler = Smarty_CacheResource::load($_template->smarty);
+ }
+
+ /**
+ * @param Smarty_Internal_Template $_template
+ *
+ * @return Smarty_Template_Cached
+ */
+ static function load(Smarty_Internal_Template $_template)
+ {
+ $_template->cached = $cached = new Smarty_Template_Cached($_template);
+ $cached->handler->populate($cached, $_template);
+ // caching enabled ?
+ if (!($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED) || $_template->source->recompiled) {
+ $cached->valid = false;
+ }
+ return $cached;
+ }
+
+ /**
+ * Check if cache is valid, lock cache if required
+ *
+ * @param \Smarty_Internal_Template $_template
+ *
+ * @return bool flag true if cache is valid
+ */
+ public function isCached(Smarty_Internal_Template $_template)
+ {
+ if ($this->valid !== null) {
+ return $this->valid;
+ }
+ while (true) {
+ while (true) {
+ if ($this->exists === false || $_template->smarty->force_compile || $_template->smarty->force_cache) {
+ $this->valid = false;
+ } else {
+ $this->valid = true;
+ }
+ if ($this->valid && $_template->caching == Smarty::CACHING_LIFETIME_CURRENT && $_template->cache_lifetime >= 0 && time() > ($this->timestamp + $_template->cache_lifetime)) {
+ // lifetime expired
+ $this->valid = false;
+ }
+ if ($this->valid && $_template->source->timestamp > $this->timestamp) {
+ $this->valid = false;
+ }
+ if ($this->valid || !$_template->smarty->cache_locking) {
+ break;
+ }
+ if (!$this->handler->locked($_template->smarty, $this)) {
+ $this->handler->acquireLock($_template->smarty, $this);
+ break 2;
+ }
+ $this->handler->populate($this, $_template);
+ }
+ if ($this->valid) {
+ if (!$_template->smarty->cache_locking || $this->handler->locked($_template->smarty, $this) === null) {
+ // load cache file for the following checks
+ if ($_template->smarty->debugging) {
+ Smarty_Internal_Debug::start_cache($_template);
+ }
+ if ($this->handler->process($_template, $this) === false) {
+ $this->valid = false;
+ } else {
+ $this->processed = true;
+ }
+ if ($_template->smarty->debugging) {
+ Smarty_Internal_Debug::end_cache($_template);
+ }
+ } else {
+ $this->is_locked = true;
+ continue;
+ }
+ } else {
+ return $this->valid;
+ }
+ if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_SAVED && $_template->properties['cache_lifetime'] >= 0 && (time() > ($_template->cached->timestamp + $_template->properties['cache_lifetime']))) {
+ $this->valid = false;
+ }
+ if ($_template->smarty->cache_locking) {
+ if (!$this->valid) {
+ $this->handler->acquireLock($_template->smarty, $this);
+ } elseif ($this->is_locked) {
+ $this->handler->releaseLock($_template->smarty, $this);
+ }
+ }
+ return $this->valid;
+ }
+ return $this->valid;
+ }
+
+ /**
+ * Process cached template
+ *
+ * @param Smarty_Internal_Template $_template template object
+ */
+ public function process(Smarty_Internal_Template $_template)
+ {
+ if ($this->handler->process($_template, $this) === false) {
+ $this->valid = false;
+ }
+ if ($this->valid) {
+ $this->processed = true;
+ } else {
+ $this->processed = false;
+ }
+ }
+
+ /**
+ * Render cached template
+ *
+ * @param Smarty_Internal_Template $_template
+ *
+ * @return string
+ * @throws Exception
+ */
+ public function render(Smarty_Internal_Template $_template)
+ {
+ if (!$this->processed) {
+ $this->process($_template);
+ }
+ return $_template->getRenderedTemplateCode();
+ }
+
+ /**
+ * Write this cache object to handler
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param string $content content to cache
+ *
+ * @return boolean success
+ */
+ public function write(Smarty_Internal_Template $_template, $content)
+ {
+ if (!$_template->source->recompiled) {
+ if ($this->handler->writeCachedContent($_template, $content)) {
+ $this->content = null;
+ $this->timestamp = time();
+ $this->exists = true;
+ $this->valid = true;
+ $this->processed = false;
+ if ($_template->smarty->cache_locking) {
+ $this->handler->releaseLock($_template->smarty, $this);
+ }
+
+ return true;
+ }
+ $this->content = null;
+ $this->timestamp = false;
+ $this->exists = false;
+ $this->valid = false;
+ $this->processed = false;
+ }
+
+ return false;
+ }
+
+ /**
+ * Read cache content from handler
+ *
+ * @param Smarty_Internal_Template $_template template object
+ *
+ * @return string content
+ */
+ public function read(Smarty_Internal_Template $_template)
+ {
+ if (!$_template->source->recompiled) {
+ return $this->handler->readCachedContent($_template);
+ }
+ return false;
+ }
+
+ /**
+ * Sanitize content and write it to cache resource
+ *
+ * @param Smarty_Internal_Template $_template
+ * @param string $content
+ * @param bool $no_output_filter
+ *
+ * @throws SmartyException
+ */
+ public function updateCache(Smarty_Internal_Template $_template, $content, $no_output_filter)
+ {
+ $_template->properties['has_nocache_code'] = false;
+ // get text between non-cached items
+ $cache_split = preg_split("!/\*%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!s", $content);
+ // get non-cached items
+ preg_match_all("!/\*%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!s", $content, $cache_parts);
+ $output = '';
+ // loop over items, stitch back together
+ foreach ($cache_split as $curr_idx => $curr_split) {
+ // escape PHP tags in template content
+ $output .= preg_replace('/(<%|%>|<\?php|<\?|\?>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>)/', "<?php echo '\$1'; ?>\n", $curr_split);
+ if (isset($cache_parts[0][$curr_idx])) {
+ $_template->properties['has_nocache_code'] = true;
+ $output .= $cache_parts[1][$curr_idx];
+ }
+ }
+ if (!$no_output_filter && !$_template->has_nocache_code && (isset($_template->smarty->autoload_filters['output']) || isset($_template->smarty->registered_filters['output']))) {
+ $output = Smarty_Internal_Filter_Handler::runFilter('output', $output, $_template);
+ }
+ // write cache file content
+ $this->writeCachedContent($_template, $output);
+ }
+
+ /**
+ * Writes the content to cache resource
+ *
+ * @param Smarty_Internal_Template $_template
+ * @param string $content
+ *
+ * @return bool
+ */
+ public function writeCachedContent(Smarty_Internal_Template $_template, $content)
+ {
+ if ($_template->source->recompiled || !($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED)) {
+ // don't write cache file
+ return false;
+ }
+ $_template->properties['cache_lifetime'] = $_template->cache_lifetime;
+ $_template->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
+ $content = Smarty_Internal_Extension_CodeFrame::create($_template, $content, true);
+ if (!empty($_template->properties['tpl_function'])) {
+ foreach ($_template->properties['tpl_function'] as $funcParam) {
+ if (is_file($funcParam['compiled_filepath'])) {
+ // read compiled file
+ $code = file_get_contents($funcParam['compiled_filepath']);
+ // grab template function
+ if (preg_match("/\/\* {$funcParam['call_name']} \*\/([\S\s]*?)\/\*\/ {$funcParam['call_name']} \*\//", $code, $match)) {
+ unset($code);
+ $content .= "<?php " . $match[0] . "?>\n";
+ }
+ }
+ }
+ }
+ return $this->write($_template, $content);
+ }
+
+ /**
+ * check client side cache
+ *
+ * @param Smarty_Internal_Template $_template
+ * @param string $content
+ */
+ public function cacheModifiedCheck(Smarty_Internal_Template $_template, $content)
+ {
+ $_isCached = $_template->isCached() && !$_template->has_nocache_code;
+ $_last_modified_date = @substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
+ if ($_isCached && $this->timestamp <= strtotime($_last_modified_date)) {
+ switch (PHP_SAPI) {
+ case 'cgi': // php-cgi < 5.3
+ case 'cgi-fcgi': // php-cgi >= 5.3
+ case 'fpm-fcgi': // php-fpm >= 5.3.3
+ header('Status: 304 Not Modified');
+ break;
+
+ case 'cli':
+ if ( /* ^phpunit */
+ !empty($_SERVER['SMARTY_PHPUNIT_DISABLE_HEADERS']) /* phpunit$ */
+ ) {
+ $_SERVER['SMARTY_PHPUNIT_HEADERS'][] = '304 Not Modified';
+ }
+ break;
+
+ default:
+ header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
+ break;
+ }
+ } else {
+ switch (PHP_SAPI) {
+ case 'cli':
+ if ( /* ^phpunit */
+ !empty($_SERVER['SMARTY_PHPUNIT_DISABLE_HEADERS']) /* phpunit$ */
+ ) {
+ $_SERVER['SMARTY_PHPUNIT_HEADERS'][] = 'Last-Modified: ' . gmdate('D, d M Y H:i:s', $this->timestamp) . ' GMT';
+ }
+ break;
+
+ default:
+ header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $this->timestamp) . ' GMT');
+ break;
+ }
+ echo $content;
+ }
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_template_compiled.php b/library/Smarty/libs/sysplugins/smarty_template_compiled.php
new file mode 100644
index 000000000..3ff8fa897
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_template_compiled.php
@@ -0,0 +1,288 @@
+<?php
+
+/**
+ * Smarty Resource Data Object
+ * Meta Data Container for Template Files
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Rodney Rehm
+ * @property string $content compiled content
+ */
+class Smarty_Template_Compiled
+{
+ /**
+ * Compiled Filepath
+ *
+ * @var string
+ */
+ public $filepath = null;
+
+ /**
+ * Compiled Timestamp
+ *
+ * @var integer
+ */
+ public $timestamp = null;
+
+ /**
+ * Compiled Existence
+ *
+ * @var boolean
+ */
+ public $exists = false;
+
+ /**
+ * Compiled Content Loaded
+ *
+ * @var boolean
+ */
+ public $processed = false;
+ /**
+ * Code of recompiled template resource
+ *
+ * @var string|null
+ */
+ public $code = null;
+
+ /**
+ * create Compiled Object container
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * get a Compiled Object of this source
+ *
+ * @param Smarty_Internal_Template $_template template object
+ *
+ * @return Smarty_Template_Compiled compiled object
+ */
+ static function load($_template)
+ {
+ if (!isset($_template->source)) {
+ $_template->loadSource();
+ }
+ // check runtime cache
+ if (!$_template->source->recompiled && $_template->smarty->resource_caching) {
+ $_cache_key = $_template->source->unique_resource . '#';
+ if ($_template->caching) {
+ $_cache_key .= 'caching#';
+ }
+ $_cache_key .= $_template->compile_id;
+ if (isset($_template->source->compileds[$_cache_key])) {
+ return $_template->source->compileds[$_cache_key];
+ }
+ }
+ $compiled = new Smarty_Template_Compiled();
+ if (method_exists($_template->source->handler, 'populateCompiledFilepath')) {
+ $_template->source->handler->populateCompiledFilepath($compiled, $_template);
+ } else {
+ $compiled->populateCompiledFilepath($_template);
+ }
+ // runtime cache
+ if (!$_template->source->recompiled && $_template->smarty->resource_caching) {
+ $_template->source->compileds[$_cache_key] = $compiled;
+ }
+ return $compiled;
+ }
+
+ /**
+ * populate Compiled Object with compiled filepath
+ *
+ * @param Smarty_Internal_Template $_template template object
+ **/
+ public function populateCompiledFilepath(Smarty_Internal_Template $_template)
+ {
+ $_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null;
+ if ($_template->source->isConfig) {
+ $_flag = '_' . ((int) $_template->smarty->config_read_hidden + (int) $_template->smarty->config_booleanize * 2
+ + (int) $_template->smarty->config_overwrite * 4);
+ } else {
+ $_flag = '_' . ((int) $_template->smarty->merge_compiled_includes + (int) $_template->smarty->escape_html * 2);
+ }
+ $_filepath = $_template->source->uid . $_flag;
+ // if use_sub_dirs, break file into directories
+ if ($_template->smarty->use_sub_dirs) {
+ $_filepath = substr($_filepath, 0, 2) . DS
+ . substr($_filepath, 2, 2) . DS
+ . substr($_filepath, 4, 2) . DS
+ . $_filepath;
+ }
+ $_compile_dir_sep = $_template->smarty->use_sub_dirs ? DS : '^';
+ if (isset($_compile_id)) {
+ $_filepath = $_compile_id . $_compile_dir_sep . $_filepath;
+ }
+ // caching token
+ if ($_template->caching) {
+ $_cache = '.cache';
+ } else {
+ $_cache = '';
+ }
+ $_compile_dir = $_template->smarty->getCompileDir();
+ // set basename if not specified
+ $_basename = $_template->source->handler->getBasename($_template->source);
+ if ($_basename === null) {
+ $_basename = basename(preg_replace('![^\w\/]+!', '_', $_template->source->name));
+ }
+ // separate (optional) basename by dot
+ if ($_basename) {
+ $_basename = '.' . $_basename;
+ }
+
+ $this->filepath = $_compile_dir . $_filepath . '.' . $_template->source->type . $_basename . $_cache . '.php';
+ $this->timestamp = $this->exists = is_file($this->filepath);
+ if ($this->exists) {
+ $this->timestamp = @filemtime($this->filepath);
+ }
+ }
+
+ /**
+ * load compiled template or compile from source
+ *
+ * @param Smarty_Internal_Template $_template
+ *
+ * @throws Exception
+ */
+ public function process(Smarty_Internal_Template $_template)
+ {
+ $_smarty_tpl = $_template;
+ if ($_template->source->recompiled || !$_template->compiled->exists || $_template->smarty->force_compile) {
+ $this->compileTemplateSource($_template);
+ $compileCheck = $_template->smarty->compile_check;
+ $_template->smarty->compile_check = false;
+ if ($_template->source->recompiled) {
+ $level = ob_get_level();
+ ob_start();
+ try {
+ eval("?>" . $this->code);
+ }
+ catch (Exception $e) {
+ while (ob_get_level() > $level) {
+ ob_end_clean();
+ }
+ throw $e;
+ }
+ ob_get_clean();
+ $this->code = null;
+ } else {
+ include($_template->compiled->filepath);
+ }
+ $_template->smarty->compile_check = $compileCheck;
+ } else {
+ include($_template->compiled->filepath);
+ if ($_template->mustCompile) {
+ $this->compileTemplateSource($_template);
+ $compileCheck = $_template->smarty->compile_check;
+ $_template->smarty->compile_check = false;
+ include($_template->compiled->filepath);
+ $_template->smarty->compile_check = $compileCheck;
+ }
+ }
+ $this->unifunc = $_template->properties['unifunc'];
+ $this->processed = true;
+ }
+
+ /**
+ * render compiled template code
+ *
+ * @param Smarty_Internal_Template $_template
+ *
+ * @return string
+ * @throws Exception
+ */
+ public function render(Smarty_Internal_Template $_template)
+ {
+
+ if (!$this->processed) {
+ $this->process($_template);
+ }
+ $_template->properties['unifunc'] = $this->unifunc;
+ return $_template->getRenderedTemplateCode();
+ }
+
+ /**
+ * compile template from source
+ *
+ * @param Smarty_Internal_Template $_template
+ *
+ * @return string
+ * @throws Exception
+ */
+ public function compileTemplateSource(Smarty_Internal_Template $_template)
+ {
+ if (!$_template->source->recompiled) {
+ $_template->properties['file_dependency'] = array();
+ }
+ // compile locking
+ if (!$_template->source->recompiled) {
+ if ($saved_timestamp = $_template->compiled->timestamp) {
+ touch($_template->compiled->filepath);
+ }
+ }
+ // call compiler
+ try {
+ $code = $_template->compiler->compileTemplate($_template);
+ }
+ catch (Exception $e) {
+ // restore old timestamp in case of error
+ if (!$_template->source->recompiled && $saved_timestamp) {
+ touch($_template->compiled->filepath, $saved_timestamp);
+ }
+ throw $e;
+ }
+ // compiling succeeded
+ if ($_template->compiler->write_compiled_code) {
+ // write compiled template
+ $this->write($_template, $code);
+ $code = '';
+ }
+ // release compiler object to free memory
+ unset($_template->compiler);
+ return $code;
+ }
+
+ /**
+ * Write compiled code by handler
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param string $code compiled code
+ *
+ * @return boolean success
+ */
+ public function write(Smarty_Internal_Template $_template, $code)
+ {
+ if (!$_template->source->recompiled) {
+ $obj = new Smarty_Internal_Write_File();
+ if ($obj->writeFile($this->filepath, $code, $_template->smarty) === true) {
+ $this->timestamp = $this->exists = is_file($this->filepath);
+ if ($this->exists) {
+ $this->timestamp = @filemtime($this->filepath);
+ return true;
+ }
+ }
+ return false;
+ } else {
+ $this->code = $code;
+ }
+ $this->timestamp = time();
+ $this->exists = true;
+ return true;
+ }
+
+ /**
+ * Read compiled content from handler
+ *
+ * @param Smarty_Internal_Template $_template template object
+ *
+ * @return string content
+ */
+ public function read(Smarty_Internal_Template $_template)
+ {
+ if (!$_template->source->recompiled) {
+ return file_get_contents($this->filepath);
+ }
+ return isset($this->content) ? $this->content : false;
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_template_config.php b/library/Smarty/libs/sysplugins/smarty_template_config.php
new file mode 100644
index 000000000..f48d4711d
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_template_config.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Smarty Config Source Plugin
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Connfig Resource Data Object
+ * Meta Data Container for Template Files
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Uwe Tews
+ * @property integer $timestamp Source Timestamp
+ * @property boolean $exists Source Existence
+ * @property boolean $template Extended Template reference
+ * @property string $content Source Content
+ */
+class Smarty_Template_Config extends Smarty_Template_Source
+{
+ /**
+ * Name of the Class to compile this resource's contents with
+ *
+ * @var string
+ */
+ public $compiler_class = 'Smarty_Internal_Config_File_Compiler';
+
+ /**
+ * Name of the Class to tokenize this resource's contents with
+ *
+ * @var string
+ */
+ public $template_lexer_class = 'Smarty_Internal_Configfilelexer';
+
+ /**
+ * Name of the Class to parse this resource's contents with
+ *
+ * @var string
+ */
+ public $template_parser_class = 'Smarty_Internal_Configfileparser';
+
+ /**
+ * array of section names, single section or null
+ *
+ * @var null|string|array
+ */
+ public $config_sections = null;
+
+ /**
+ * scope into which the config variables shall be loaded
+ *
+ * @var string
+ */
+ public $scope = 'local';
+
+ /**
+ * Flag that source is a config file
+ *
+ * @var bool
+ */
+ public $isConfig = true;
+
+ /**
+ * create Source Object container
+ *
+ * @param Smarty_Resource $handler Resource Handler this source object communicates with
+ * @param Smarty $smarty Smarty instance this source object belongs to
+ * @param string $resource full template_resource
+ * @param string $type type of resource
+ * @param string $name resource name
+ */
+ public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name)
+ {
+ $this->handler = clone $handler; // Note: prone to circular references
+ $this->resource = $resource;
+ $this->type = $type;
+ $this->name = $name;
+ $this->smarty = $smarty;
+ }
+
+ /**
+ * initialize Source Object for given resource
+ * Either [$_template] or [$smarty, $template_resource] must be specified
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param Smarty $smarty smarty object
+ * @param string $template_resource resource identifier
+ *
+ * @return Smarty_Template_Source Source Object
+ * @throws SmartyException
+ */
+ public static function load(Smarty_Internal_Template $_template = null, Smarty $smarty = null, $template_resource = null)
+ {
+ static $_incompatible_resources = array('extends' => true, 'php' => true);
+ $smarty = $_template->smarty;
+ $template_resource = $_template->template_resource;
+ if (empty($template_resource)) {
+ throw new SmartyException('Missing config name');
+ }
+ // parse resource_name, load resource handler
+ list($name, $type) = Smarty_Resource::parseResourceName($template_resource, $smarty->default_config_type);
+ // make sure configs are not loaded via anything smarty can't handle
+ if (isset($_incompatible_resources[$type])) {
+ throw new SmartyException ("Unable to use resource '{$type}' for config");
+ }
+ $resource = Smarty_Resource::load($smarty, $type);
+ $source = new Smarty_Template_Config($resource, $smarty, $template_resource, $type, $name);
+ $resource->populate($source, $_template);
+ if ((!isset($source->exists) || !$source->exists) && isset($_template->smarty->default_config_handler_func)) {
+ Smarty_Internal_Extension_DefaultTemplateHandler::_getDefault($_template, $source, $resource);
+ }
+ $source->unique_resource = $resource->buildUniqueResourceName($smarty, $name, true);
+ return $source;
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_template_source.php b/library/Smarty/libs/sysplugins/smarty_template_source.php
new file mode 100644
index 000000000..dd537f0e9
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_template_source.php
@@ -0,0 +1,285 @@
+<?php
+
+/**
+ * Smarty Resource Data Object
+ * Meta Data Container for Template Files
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Rodney Rehm
+ * @property integer $timestamp Source Timestamp
+ * @property boolean $exists Source Existence
+ * @property boolean $template Extended Template reference
+ * @property string $content Source Content
+ */
+class Smarty_Template_Source
+{
+ /**
+ * Name of the Class to compile this resource's contents with
+ *
+ * @var string
+ */
+ public $compiler_class = null;
+
+ /**
+ * Name of the Class to tokenize this resource's contents with
+ *
+ * @var string
+ */
+ public $template_lexer_class = null;
+
+ /**
+ * Name of the Class to parse this resource's contents with
+ *
+ * @var string
+ */
+ public $template_parser_class = null;
+
+ /**
+ * Unique Template ID
+ *
+ * @var string
+ */
+ public $uid = null;
+
+ /**
+ * Template Resource (Smarty_Internal_Template::$template_resource)
+ *
+ * @var string
+ */
+ public $resource = null;
+
+ /**
+ * Resource Type
+ *
+ * @var string
+ */
+ public $type = null;
+
+ /**
+ * Resource Name
+ *
+ * @var string
+ */
+ public $name = null;
+
+ /**
+ * Unique Resource Name
+ *
+ * @var string
+ */
+ public $unique_resource = null;
+
+ /**
+ * Source Filepath
+ *
+ * @var string
+ */
+ public $filepath = null;
+ /**
+ * Source File Base name
+ *
+ * @var string
+ */
+ public $basename = null;
+
+ /**
+ * The Components an extended template is made of
+ *
+ * @var array
+ */
+ public $components = null;
+
+ /**
+ * Resource Handler
+ *
+ * @var Smarty_Resource
+ */
+ public $handler = null;
+
+ /**
+ * Smarty instance
+ *
+ * @var Smarty
+ */
+ public $smarty = null;
+ /**
+ * Resource is source
+ *
+ * @var bool
+ */
+ public $isConfig = false;
+ /**
+ * Source is bypassing compiler
+ *
+ * @var boolean
+ */
+ public $uncompiled = false;
+
+ /**
+ * Source must be recompiled on every occasion
+ *
+ * @var boolean
+ */
+ public $recompiled = false;
+ /**
+ * cache for Smarty_Template_Compiled instances
+ *
+ * @var array
+ */
+ public $compileds = array();
+
+ /**
+ * create Source Object container
+ *
+ * @param Smarty_Resource $handler Resource Handler this source object communicates with
+ * @param Smarty $smarty Smarty instance this source object belongs to
+ * @param string $resource full template_resource
+ * @param string $type type of resource
+ * @param string $name resource name
+ *
+ * @internal param string $unique_resource unique resource name
+ */
+ public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name)
+ {
+ $this->handler = $handler; // Note: prone to circular references
+
+ $this->recompiled = $handler->recompiled;
+ $this->uncompiled = $handler->uncompiled;
+ $this->compiler_class = $handler->compiler_class;
+ $this->template_lexer_class = $handler->template_lexer_class;
+ $this->template_parser_class = $handler->template_parser_class;
+
+ $this->smarty = $smarty;
+ $this->resource = $resource;
+ $this->type = $type;
+ $this->name = $name;
+ }
+
+ /**
+ * initialize Source Object for given resource
+ * Either [$_template] or [$smarty, $template_resource] must be specified
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param Smarty $smarty smarty object
+ * @param string $template_resource resource identifier
+ *
+ * @return Smarty_Template_Source Source Object
+ * @throws SmartyException
+ */
+ public static function load(Smarty_Internal_Template $_template = null, Smarty $smarty = null, $template_resource = null)
+ {
+ if ($_template) {
+ $smarty = $_template->smarty;
+ $template_resource = $_template->template_resource;
+ }
+ if (empty($template_resource)) {
+ throw new SmartyException('Missing template name');
+ }
+ // parse resource_name, load resource handler, identify unique resource name
+ list($name, $type) = Smarty_Resource::parseResourceName($template_resource, $smarty->default_resource_type);
+ $resource = Smarty_Resource::load($smarty, $type);
+ // if resource is not recompiling and resource name is not dotted we can check the source cache
+ if ($smarty->resource_caching && !$resource->recompiled && !(isset($name[1]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/'))) {
+ $unique_resource = $resource->buildUniqueResourceName($smarty, $name);
+ if (isset($smarty->source_objects[$unique_resource])) {
+ return $smarty->source_objects[$unique_resource];
+ }
+ } else {
+ $unique_resource = null;
+ }
+ // create new source object
+ $source = new Smarty_Template_Source($resource, $smarty, $template_resource, $type, $name);
+ $resource->populate($source, $_template);
+ if ((!isset($source->exists) || !$source->exists) && isset($_template->smarty->default_template_handler_func)) {
+ Smarty_Internal_Extension_DefaultTemplateHandler::_getDefault($_template, $source, $resObj);
+ }
+ // on recompiling resources we are done
+ if ($smarty->resource_caching && !$resource->recompiled) {
+ // may by we have already $unique_resource
+ $is_relative = false;
+ if (!isset($unique_resource)) {
+ $is_relative = isset($name[1]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/') &&
+ ($type == 'file' || (isset($_template->parent->source) && $_template->parent->source->type == 'extends'));
+ $unique_resource = $resource->buildUniqueResourceName($smarty, $is_relative ? $source->filepath . $name : $name);
+ }
+ $source->unique_resource = $unique_resource;
+ // save in runtime cache if not relative
+ if (!$is_relative) {
+ $smarty->source_objects[$unique_resource] = $source;
+ }
+ }
+ return $source;
+ }
+
+ /**
+ * render the uncompiled source
+ *
+ * @param Smarty_Internal_Template $_template template object
+ */
+ public function renderUncompiled(Smarty_Internal_Template $_template)
+ {
+ $level = ob_get_level();
+ ob_start();
+ try {
+ $this->handler->renderUncompiled($_template->source, $_template);
+ return ob_get_clean();
+ }
+ catch (Exception $e) {
+ while (ob_get_level() > $level) {
+ ob_end_clean();
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * <<magic>> Generic Setter.
+ *
+ * @param string $property_name valid: timestamp, exists, content, template
+ * @param mixed $value new value (is not checked)
+ *
+ * @throws SmartyException if $property_name is not valid
+ */
+ public function __set($property_name, $value)
+ {
+ switch ($property_name) {
+ // regular attributes
+ case 'timestamp':
+ case 'exists':
+ case 'content':
+ // required for extends: only
+ case 'template':
+ $this->$property_name = $value;
+ break;
+
+ default:
+ throw new SmartyException("source property '$property_name' does not exist.");
+ }
+ }
+
+ /**
+ * <<magic>> Generic getter.
+ *
+ * @param string $property_name valid: timestamp, exists, content
+ *
+ * @return mixed
+ * @throws SmartyException if $property_name is not valid
+ */
+ public function __get($property_name)
+ {
+ switch ($property_name) {
+ case 'timestamp':
+ case 'exists':
+ $this->handler->populateTimestamp($this);
+
+ return $this->$property_name;
+
+ case 'content':
+ return $this->content = $this->handler->getContent($this);
+
+ default:
+ throw new SmartyException("source property '$property_name' does not exist.");
+ }
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_undefined_variable.php b/library/Smarty/libs/sysplugins/smarty_undefined_variable.php
new file mode 100644
index 000000000..88bc6f68c
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_undefined_variable.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * class for undefined variable object
+ * This class defines an object for undefined variable handling
+ *
+ * @package Smarty
+ * @subpackage Template
+ */
+class Smarty_Undefined_Variable
+{
+ /**
+ * Returns FALSE for 'nocache' and NULL otherwise.
+ *
+ * @param string $name
+ *
+ * @return bool
+ */
+ public function __get($name)
+ {
+ if ($name == 'nocache') {
+ return false;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Always returns an empty string.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return "";
+ }
+}
diff --git a/library/Smarty/libs/sysplugins/smarty_variable.php b/library/Smarty/libs/sysplugins/smarty_variable.php
new file mode 100644
index 000000000..c1de93cb5
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smarty_variable.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * class for the Smarty variable object
+ * This class defines the Smarty variable object
+ *
+ * @package Smarty
+ * @subpackage Template
+ */
+class Smarty_Variable
+{
+ /**
+ * template variable
+ *
+ * @var mixed
+ */
+ public $value = null;
+ /**
+ * if true any output of this variable will be not cached
+ *
+ * @var boolean
+ */
+ public $nocache = false;
+ /**
+ * the scope the variable will have (local,parent or root)
+ *
+ * @var int
+ */
+ public $scope = Smarty::SCOPE_LOCAL;
+
+ /**
+ * create Smarty variable object
+ *
+ * @param mixed $value the value to assign
+ * @param boolean $nocache if true any output of this variable will be not cached
+ * @param int $scope the scope the variable will have (local,parent or root)
+ */
+ public function __construct($value = null, $nocache = false, $scope = Smarty::SCOPE_LOCAL)
+ {
+ $this->value = $value;
+ $this->nocache = $nocache;
+ $this->scope = $scope;
+ }
+
+ /**
+ * <<magic>> String conversion
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return (string) $this->value;
+ }
+}
+
diff --git a/library/Smarty/libs/sysplugins/smartycompilerexception.php b/library/Smarty/libs/sysplugins/smartycompilerexception.php
new file mode 100644
index 000000000..4d5d77875
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smartycompilerexception.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * Smarty compiler exception class
+ *
+ * @package Smarty
+ */
+class SmartyCompilerException extends SmartyException
+{
+ public function __toString()
+ {
+ return ' --> Smarty Compiler: ' . $this->message . ' <-- ';
+ }
+
+ /**
+ * The line number of the template error
+ *
+ * @type int|null
+ */
+ public $line = null;
+ /**
+ * The template source snippet relating to the error
+ *
+ * @type string|null
+ */
+ public $source = null;
+ /**
+ * The raw text of the error message
+ *
+ * @type string|null
+ */
+ public $desc = null;
+ /**
+ * The resource identifier or template name
+ *
+ * @type string|null
+ */
+ public $template = null;
+}
diff --git a/library/Smarty/libs/sysplugins/smartyexception.php b/library/Smarty/libs/sysplugins/smartyexception.php
new file mode 100644
index 000000000..3da16c276
--- /dev/null
+++ b/library/Smarty/libs/sysplugins/smartyexception.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Smarty exception class
+ *
+ * @package Smarty
+ */
+class SmartyException extends Exception
+{
+ public static $escape = false;
+
+ public function __toString()
+ {
+ return ' --> Smarty: ' . (self::$escape ? htmlentities($this->message) : $this->message) . ' <-- ';
+ }
+}