diff options
136 files changed, 14200 insertions, 7656 deletions
diff --git a/SMARTY2_BC_NOTES b/SMARTY2_BC_NOTES index cde8629c..79a2cb1b 100644 --- a/SMARTY2_BC_NOTES +++ b/SMARTY2_BC_NOTES @@ -1,23 +1,19 @@ -Smarty 2 and Smarty 3 are quite similar in implementation, but do have a few -differences you need to be aware of when upgrading from Smarty 2 to Smarty 3. - = Known incompatibilities with Smarty 2 = == Syntax == -The Smarty 3 API has been updated in various places. Some Smarty 2 API calls -need to be updated to comply with Smarty 3. You will get a deprecation notice -with old Smarty 2 API calls, and informed what the new one is. See the README that -comes with Smarty 3 for more information. +Smarty 3 API has a new syntax. Much of the Smarty 2 syntax is supported +by a wrapper but deprecated. See the README that comes with Smarty 3 for more +information. The {$array|@mod} syntax has always been a bit confusing, where an "@" is required -to apply a modifier to an array instead of the individual array elements. Normally you +to apply a modifier to an array instead of the individual elements. Normally you always want the modifier to apply to the variable regardless of its type. In Smarty 3, {$array|mod} and {$array|@mod} behave identical. It is safe to drop the "@" and the modifier will still apply to the array. If you really want the modifier to apply to each array element, you must loop the array in-template, or use a custom modifier that -supports array iteration. Most smarty functions already escape array elements where -necessary such as {html_options} +supports array iteration. Most smarty functions already escape values where necessary +such as {html_options} == PHP Version == Smarty 3 is PHP 5 only. It will not work with PHP 4. @@ -26,31 +22,30 @@ Smarty 3 is PHP 5 only. It will not work with PHP 4. The {php} tag is disabled by default. The use of {php} tags is deprecated. It can be enabled with $smarty->allow_php_tag=true. -Variables inside {php} blocks no longer share scope with other -{php} blocks on the page, so be aware of this change if you use them. +But if you scatter PHP code which belongs together into several +{php} tags it may not work any longer. == Delimiters and whitespace == -Smarty delimiters {} surrounded by whitespace are no longer treated as Smarty tags. -Therefore, { foo } will be ignored by Smarty, but {foo} is recognized. This change -makes Javascript/CSS easier to work with, eliminating the need for {literal}. -This feature can be disabled by setting $smarty->auto_literal = false; +Delimiters surrounded by whitespace are no longer treated as Smarty tags. +Therefore, { foo } will not compile as a tag, you must use {foo}. This change +Makes Javascript/CSS easier to work with, eliminating the need for {literal}. +This can be disabled by setting $smarty->auto_literal = false; == Unquoted Strings == Smarty 2 was a bit more forgiving (and ambiguous) when it comes to unquoted strings in parameters. Smarty3 is more restrictive. You can still pass strings without quotes so long as they contain no special characters. (anything outside of A-Za-z0-9_) -For example filename strings must be quoted: - +For example filename strings must be quoted <source lang="smarty"> -{assign var=foo value=baz} <-- works ok -{include file="path/foo.tpl"} <-- needs quotes! +{include file='path/foo.tpl'} </source> == Extending the Smarty class == -Smarty 3 follows standard PHP5 constructor rules. When extending the Smarty class, -use __construct() as the class constructor name. If you implement your own constructor, -be certain to call parent::__construct() first. +Smarty 3 makes use of the __construct method for initialization. If you are extending +the Smarty class, its constructor is not called implicitly if the your child class defines +its own constructor. In order to run Smarty's constructor, a call to parent::__construct() +within your child constructor is required. <source lang="php"> class MySmarty extends Smarty { @@ -64,35 +59,41 @@ class MySmarty extends Smarty { </source> == Autoloader == -Smarty implements its own autoloader with spl_autoload_register. If you -use an autoloader in your own application, you MUST register yours as well. Using -__autoload() WILL FAIL. This is standard PHP5 autoloader procedure for shared libraries. -See http://us3.php.net/manual/en/function.spl-autoload-register.php +Smarty 3 does register its own autoloader with spl_autoload_register. If your code has +an existing __autoload function then this function must be explicitly registered on +the __autoload stack. See http://us3.php.net/manual/en/function.spl-autoload-register.php +for further details. == Plugin Filenames == -Since Smarty 3 uses the default spl_autoloader, the plugin filenames are now required to be -lower case. Smarty 2 allowed mixed case plugin names, you must rename them for Smarty 3. +Smarty 3 optionally supports the PHP spl_autoloader. The autoloader requires filenames +to be lower case. Because of this, Smarty plugin file names must also be lowercase. +In Smarty 2, mixed case file names did work. == Scope of Special Smarty Variables == -In Smarty 2 the special Smarty variables $smarty.section.* and $smarty.foreach.* -had global scope. If you had loops with the same name in subtemplates, you could accidentally -overwrite values of a parent template. - -In Smarty 3 these special Smarty variables now have local scope in the template which -is defining the loop. In the rare case you need these values in a subtemplate, you have to -pass them as parameters. +In Smarty 2 the special Smarty variables $smarty.section... and $smarty.foreach... +had global scope. If you had loops with the same name in subtemplates you could accidentally +overwrite values of parent template. +In Smarty 3 these special Smarty variable have only local scope in the template which +is defining the loop. If you need their value in a subtemplate you have to pass them +as parameter. <source lang="smarty"> -{include file="path/foo.tpl" index=$smarty.section.foo.index} +{include file='path/foo.tpl' index=$smarty.section.foo.index} </source> == SMARTY_RESOURCE_CHAR_SET == -Smarty 3 sets the constant SMARTY_RESOURCE_CHAR_SET to utf-8 as the default template charset. -This is now used with modifiers like escape as the default charset. If your templates use -another charset, make sure that you define the constant accordingly. +Smarty 3 sets the constant SMARTY_RESOURCE_CHAR_SET to utf-8 as default template charset. +This is now used also on modifiers like escape as default charset. If your templates use +other charsets make sure that you define the constant accordingly. Otherwise you may not +get any output. + +== newline at {if} tags == +A \n was added to the compiled code of the {if},{else},{elseif},{/if} tags to get output of newlines as expected by the template source. +If one of the {if} tags is at the line end you will now get a newline in the HTML output. == trigger_error() == -The API function trigger_error() has been removed. It is still included in the Smarty2 API wrapper. +The API function trigger_error() has been removed because it did just map to PHP trigger_error. +However it's still included in the Smarty2 API wrapper. == Smarty constants == The constants diff --git a/SMARTY3.0_BC_NOTES.txt b/SMARTY3.0_BC_NOTES.txt new file mode 100644 index 00000000..fd8b540c --- /dev/null +++ b/SMARTY3.0_BC_NOTES.txt @@ -0,0 +1,24 @@ +== Smarty2 backward compatibility == +All Smarty2 specific API functions and deprecated functionallity has been moved +to the SmartyBC class. + +== {php} Tag == +The {php} tag is no longer available in the standard Smarty calls. +The use of {php} tags is deprecated and only available in the SmartyBC class. + +== {include_php} Tag == +The {include_php} tag is no longer available in the standard Smarty calls. +The use of {include_php} tags is deprecated and only available in the SmartyBC class. + +== php template resource == +The support of the php template resource is removed. + +== $cache_dir, $compile_dir, $config_dir, $template_dir access == +The mentioned properties can't be accessed directly any longer. You must use +corresponding getter/setters like addConfigDir(), setConfigDir(), getConfigDir() + +== obsolete Smarty class properties == +The following no longer used properties are removed: +$allow_php_tag +$allow_php_template +$deprecation_notices
\ No newline at end of file diff --git a/SMARTY_3.1_NOTES.txt b/SMARTY_3.1_NOTES.txt new file mode 100644 index 00000000..6da478de --- /dev/null +++ b/SMARTY_3.1_NOTES.txt @@ -0,0 +1,306 @@ +Smarty 3.1 Notes +================ + +Smarty 3.1 is a departure from 2.0 compatibility. Most notably, all +backward compatibility has been moved to a separate class file named +SmartyBC.class.php. If you require compatibility with 2.0, you will +need to use this class. + +Some differences from 3.0 are also present. 3.1 begins the journey of +requiring setters/getters for property access. So far this is only +implemented on the five directory properties: template_dir, +plugins_dir, configs_dir, compile_dir and cache_dir. These properties +are now protected, it is required to use the setters/getters instead. +That said, direct property access will still work, however slightly +slower since they will now fall through __set() and __get() and in +turn passed through the setter/getter methods. 3.2 will exhibit a full +list of setter/getter methods for all (currently) public properties, +so code-completion in your IDE will work as expected. + +There is absolutely no PHP allowed in templates any more. All +deprecated features of Smarty 2.0 are gone. Again, use the SmartyBC +class if you need any backward compatibility. + +Internal Changes + + Full UTF-8 Compatibility + +The plugins shipped with Smarty 3.1 have been rewritten to fully +support UTF-8 strings if Multibyte String is available. Without +MBString UTF-8 cannot be handled properly. For those rare cases where +templates themselves have to juggle encodings, the new modifiers +to_charset and from_charset may come in handy. + + Plugin API and Performance + +All Plugins (modifiers, functions, blocks, resources, +default_template_handlers, etc) are now receiving the +Smarty_Internal_Template instance, where they were supplied with the +Smarty instance in Smarty 3.0. *. As The Smarty_Internal_Template +mimics the behavior of Smarty, this API simplification should not +require any changes to custom plugins. + +The plugins shipped with Smarty 3.1 have been rewritten for better +performance. Most notably {html_select_date} and {html_select_time} +have been improved vastly. Performance aside, plugins have also been +reviewed and generalized in their API. {html_select_date} and +{html_select_time} now share almost all available options. + +The escape modifier now knows the $double_encode option, which will +prevent entities from being encoded again. + +The capitalize modifier now know the $lc_rest option, which makes sure +all letters following a captial letter are lower-cased. + +The count_sentences modifier now accepts ».?!« as +legitimate endings of a sentence - previously only ».« was +accepted + +The new unescape modifier is there to reverse the effects of the +escape modifier. This applies to the escape formats html, htmlall and +entity. + + default_template_handler_func + +The invocation of $smarty->$default_template_handler_func had to be +altered. Instead of a Smarty_Internal_Template, the fifth argument is +now provided with the Smarty instance. New footprint: + + +/** + * Default Template Handler + * + * called when Smarty's file: resource is unable to load a requested file + * + * @param string $type resource type (e.g. "file", "string", "eval", "resource") + * @param string $name resource name (e.g. "foo/bar.tpl") + * @param string &$content template's content + * @param integer &$modified template's modification time + * @param Smarty $smarty Smarty instance + * @return string|boolean path to file or boolean true if $content and $modified + * have been filled, boolean false if no default template + * could be loaded + */ +function default_template_handler_func($type, $name, &$content, &$modified, Smarty $smarty) { + if (false) { + // return corrected filepath + return "/tmp/some/foobar.tpl"; + } elseif (false) { + // return a template directly + $content = "the template source"; + $modified = time(); + return true; + } else { + // tell smarty that we failed + return false; + } +} + + Stuff done to the compiler + +@todo uwe.tews + +Many performance improvements have happened internally. One notable +improvement is that all compiled templates are now handled as PHP +functions. This speeds up repeated templates tremendously, as each one +calls an (in-memory) PHP function instead of performing another file +include/scan. + +New Features + + Template syntax + + {block}..{/block} + +The {block} tag has a new hide option flag. It does suppress the block +content if no corresponding child block exists. +EXAMPLE: +parent.tpl +{block name=body hide} child content "{$smarty.block.child}" was +inserted {block} +In the above example the whole block will be suppressed if no child +block "body" is existing. + + {setfilter}..{/setfilter} + +The new {setfilter} block tag allows the definition of filters which +run on variable output. +SYNTAX: +{setfilter filter1|filter2|filter3....} +Smarty3 will lookup up matching filters in the following search order: +1. varibale filter plugin in plugins_dir. +2. a valid modifier. A modifier specification will also accept +additional parameter like filter2:'foo' +3. a PHP function +{/setfilter} will turn previous filter setting off again. +{setfilter} tags can be nested. +EXAMPLE: +{setfilter filter1} + {$foo} + {setfilter filter2} + {$bar} + {/setfilter} + {$buh} +{/setfilter} +{$blar} +In the above example filter1 will run on the output of $foo, filter2 +on $bar, filter1 again on $buh and no filter on $blar. +NOTES: +- {$foo nofilter} will suppress the filters +- These filters will run in addition to filters defined by +registerFilter('variable',...), autoLoadFilter('variable',...) and +defined default modifier. +- {setfilter} will effect only the current template, not included +subtemplates. + + Resource API + +Smarty 3.1 features a new approach to resource management. The +Smarty_Resource API allows simple, yet powerful integration of custom +resources for templates and configuration files. It offers simple +functions for loading data from a custom resource (e.g. database) as +well as define new template types adhering to the special +non-compiling (e,g, plain php) and non-compile-caching (e.g. eval: +resource type) resources. + +See demo/plugins/resource.mysql.php for an example custom database +resource. + +Note that old-fashioned registration of callbacks for resource +management has been deprecated but is still possible with SmartyBC. + + CacheResource API + +In line with the Resource API, the CacheResource API offers a more +comfortable handling of output-cache data. With the +Smarty_CacheResource_Custom accessing databases is made simple. With +the introduction of Smarty_CacheResource_KeyValueStore the +implementation of resources like memcache or APC became a no-brainer; +simple hash-based storage systems are now supporting hierarchical +output-caches. + +See demo/plugins/cacheresource.mysql.php for an example custom +database CacheResource. +See demo/plugins/cacheresource.memcache.php for an example custom +memcache CacheResource using the KeyValueStore helper. + +Note that old-fashioned registration of $cache_handler is not possible +anymore. As the functionality had not been ported to Smarty 3.0.x +properly, it has been dropped from 3.1 completely. + +Locking facilities have been implemented to avoid concurrent cache +generation. Enable cache locking by setting +$smarty->cache_locking = true; + + Relative Paths in Templates (File-Resource) + +As of Smarty 3.1 {include file="../foo.tpl"} and {include +file="./foo.tpl"} will resolve relative to the template they're in. +Relative paths are available with {include file="..."} and +{extends file="..."}. As $smarty->fetch('../foo.tpl') and +$smarty->fetch('./foo.tpl') cannot be relative to a template, an +exception is thrown. + + Adressing a specific $template_dir + +Smarty 3.1 introduces the $template_dir index notation. +$smarty->fetch('[foo]bar.tpl') and {include file="[foo]bar.tpl"} +require the template bar.tpl to be loaded from $template_dir['foo']; +Smarty::setTemplateDir() and Smarty::addTemplateDir() offer ways to +define indexes along with the actual directories. + + Mixing Resources in extends-Resource + +Taking the php extends: template resource one step further, it is now +possible to mix resources within an extends: call like +$smarty->fetch("extends:file:foo.tpl|db:bar.tpl"); + +To make eval: and string: resources available to the inheritance +chain, eval:base64:TPL_STRING and eval:urlencode:TPL_STRING have been +introduced. Supplying the base64 or urlencode flags will trigger +decoding the TPL_STRING in with either base64_decode() or urldecode(). + + extends-Resource in template inheritance + +Template based inheritance may now inherit from php's extends: +resource like {extends file="extends:foo.tpl|db:bar.tpl"}. + + New Smarty property escape_html + +$smarty->escape_html = true will autoescape all template variable +output by calling htmlspecialchars({$output}, ENT_QUOTES, +SMARTY_RESOURCE_CHAR_SET). +NOTE: +This is a compile time option. If you change the setting you must make +sure that the templates get recompiled. + + New option at Smarty property compile_check + +The automatic recompilation of modified templates can now be +controlled by the following settings: +$smarty->compile_check = COMPILECHECK_OFF (false) - template files +will not be checked +$smarty->compile_check = COMPILECHECK_ON (true) - template files will +always be checked +$smarty->compile_check = COMPILECHECK_CACHEMISS - template files will +be checked if caching is enabled and there is no existing cache file +or it has expired + + Automatic recompilation on Smarty version change + +Templates will now be automatically recompiled on Smarty version +changes to avoide incompatibillities in the compiled code. Compiled +template checked against the current setting of the SMARTY_VERSION +constant. + + default_config_handler_func() + +Analogous to the default_template_handler_func() +default_config_handler_func() has been introduced. + + default_plugin_handler_func() + +@todo uwe.tews + +New getters/setters + +The following setters/getters will be part of the official +documentation, and will be strongly recommended. Direct property +access will still work for the foreseeable future... it will be +transparently routed through the setters/getters, and consequently a +bit slower. + +array|string getTemplateDir( [string $index] ) +replaces $smarty->template_dir; and $smarty->template_dir[$index]; +Smarty setTemplateDir( array|string $path ) +replaces $smarty->template_dir = "foo"; and $smarty->template_dir = +array("foo", "bar"); +Smarty addTemplateDir( array|string $path, [string $index]) +replaces $smarty->template_dir[] = "bar"; and +$smarty->template_dir[$index] = "bar"; + +array|string getConfigDir( [string $index] ) +replaces $smarty->config_dir; and $smarty->config_dir[$index]; +Smarty setConfigDir( array|string $path ) +replaces $smarty->config_dir = "foo"; and $smarty->config_dir = +array("foo", "bar"); +Smarty addConfigDir( array|string $path, [string $index]) +replaces $smarty->config_dir[] = "bar"; and +$smarty->config_dir[$index] = "bar"; + +array getPluginsDir() +replaces $smarty->plugins_dir; +Smarty setPluginsDir( array|string $path ) +replaces $smarty->plugins_dir = "foo"; +Smarty addPluginsDir( array|string $path ) +replaces $smarty->plugins_dir[] = "bar"; + +string getCompileDir() +replaces $smarty->compile_dir; +Smarty setCompileDir( string $path ) +replaces $smarty->compile_dir = "foo"; + +string getCacheDir() +replaces $smarty->cache_dir; +Smarty setCacheDir( string $path ) +replaces $smarty->cache_dir; diff --git a/change_log.txt b/change_log.txt index d01dcbb8..2864cb06 100644 --- a/change_log.txt +++ b/change_log.txt @@ -1,32 +1,298 @@ -===== SVN trunk ===== -27/07/2011 -- bugfix subtemplate could use wrong varibale scope when it was recalled from different templates +===== Smarty 3.1-DEV ===== +15/09/2011 +- optimization of {foreach}; call internal _count() method only when "total" or "last" {foreach} properties are used + +11/09/2011 +- added unregisterObject() methode + +06/09/2011 +- bugfix isset() did not work in templates on config variables + +03/09/2011 +- bugfix createTemplate() must default to cache_id and compile_id of Smarty object +- bugfix Smarty_CacheResource_KeyValueStore must include $source->uid in cache filepath to keep templates with same + name but different folders seperated +- added cacheresource.apc.php example in demo folder + +02/09/2011 +- bugfix cache lock file must use absolute filepath + +01/09/2011 +- update of cache locking + +30/08/2011 +- added locking mechanism to CacheResource API (implemented with File and KeyValueStores) + +28/08/2011 +- bugfix clearCompileTemplate() did not work for specific template subfolder or resource + +27/08/2011 +- bugfix {$foo|bar+1} did create syntax error + +26/08/2011 +- bugfix when generating nocache code which contains double \ +- bugfix handle race condition if cache file was deleted between filemtime and include + +17/08/2011 +- bugfix CacheResource_Custom bad internal fetch() call + +15/08/2011 +- bugfix CacheResource would load content twice for KeyValueStore and Custom handlers + +06/08/2011 +- bugfix {include} with scope attribute could execute in wrong scope +- optimization of compile_check processing + +03/08/2011 +- allow comment tags to comment {block} tags out in child templates 26/07/2011 - bugfix experimental getTags() method did not work +24/07/2011 +- sure opened output buffers are closed on exception +- bugfix {foreach} did not work on IteratorAggregate + +22/07/2011 +- clear internal caches on clearAllCache(), clearCache(), clearCompiledTemplate() + +21/07/2011 +- bugfix value changes of variable values assigned to Smarty object could not be seen on repeated $smarty->fetch() calls + +17/07/2011 +- bugfix {$smarty.block.child} did drop a notice at undefined child + 15/07/2011 - bugfix individual cache_lifetime of {include} did not work correctly inside {block} tags +- added caches for Smarty_Template_Source and Smarty_Template_Compiled to reduce I/O for multiple cache_id rendering + +14/07/2011 +- made Smarty::loadPlugin() respect the include_path if required -12/07/2011 +13/07/2011 +- optimized internal file write functionality - bugfix PHP did eat line break on nocache sections +- fixed typo of Smarty_Security properties $allowed_modifiers and $disabled_modifiers + +06/07/2011 +- bugfix variable modifier must run befor gereral filtering/escaping + +04/07/2011 +- bugfix use (?P<name>) syntax at preg_match as some pcre libraries failed on (?<name>) +- some performance improvement when using generic getter/setter on template objects + +30/06/2011 +- bugfix generic getter/setter of Smarty properties used on template objects did throw exception +- removed is_dir and is_readable checks from directory setters for better performance + +28/06/2011 +- added back support of php template resource as undocumented feature +- bugfix automatic recompilation on version change could drop undefined index notice on old 3.0 cache and compiled files +- update of README_3_1_DEV.txt and moved into the distribution folder +- improvement show first characters of eval and string templates instead sha1 Uid in debug window + +===== Smarty 3.1-RC1 ===== +25/06/2011 +- revert change of 17/06/2011. $_smarty varibale removed. call loadPlugin() from inside plugin code if required +- code cleanup, remove no longer used properties and methods +- update of PHPdoc comments + +23/06/2011 +- bugfix {html_select_date} would not respect current time zone 19/06/2011 -- bugfix clear_config Smarty2 BC wrapper function was missing +- added $errors argument to testInstall() functions to suppress output. +- added plugin-file checks to testInstall() + +18/06/2011 +- bugfix mixed use of same subtemplate inline and not inline in same script could cause a warning during compilation + +17/06/2011 +- bugfix/change use $_smarty->loadPlugin() when loading nested depending plugins via loadPlugin +- bugfix {include ... inline} within {block}...{/block} did fail 16/06/2011 -- bugfix do not overwrite 'smarty' template variable when {include ... scope=parent} exits +- bugfix do not overwrite '$smarty' template variable when {include ... scope=parent} is called +- bugfix complete empty inline subtemplates did fail + +15/06/2011 +- bugfix template variables where not accessable within inline subtemplates + +12/06/2011 +- bugfix removed unneeded merging of template variable when fetching includled subtemplates + +10/06/2011 +- made protected properties $template_dir, $plugins_dir, $cache_dir, $compile_dir, $config_dir accessible via magic methods 09/06/2011 -- bugfix smarty security_policy issue in plugins {html_image} and {fetch} +- fix smarty security_policy issue in plugins {html_image} and {fetch} + +05/06/2011 +- update of SMARTY_VERSION +- bugfix made getTags() working again + +04/06/2011 +- allow extends resource in file attribute of {extends} tag + +03/06/2011 +- added {setfilter} tag to set filters for variable output +- added escape_html property to control autoescaping of variable output + +27/05/2011 +- added allowed/disabled tags and modifiers in security for sandboxing + +23/05/2011 +- added base64: and urlencode: arguments to eval and string resource types + +22/05/2011 +- made time-attribute of {html_select_date} and {html_select_time} accept arrays as defined by attributes prefix and field_array + +13/05/2011 +- remove setOption / getOption calls from SamrtyBC class + +02/05/2011 +- removed experimental setOption() getOption() methods +- output returned content also on opening tag calls of block plugins +- rewrite of default plugin handler +- compile code of variable filters for better performance + +20/04/2011 +- allow {php} {include_php} tags and PHP_ALLOW handling only with the SmartyBC class +- removed support of php template resource -07/06/2011 -- bugfix registerFilter() or registerPlugin() on template objects did register to the main Smarty object if the register methods had been used on the main Smarty object before. +20/04/2011 +- added extendsall resource example +- optimization of template variable access +- optimization of subtemplate handling {include} +- optimization of template class -===== Smarty 3.0.8 ===== -29/05/2011 -- bugfix <?xml ...> in templates did break "cache modified check" +01/04/2011 +- bugfix quote handling in capitalize modifier + +28/03/2011 +- bugfix stripslashes() requried when using PCRE e-modifier + +04/03/2011 +- upgrade to new PHP_LexerGenerator version 0.4.0 for better performance + +27/02/2011 +- ignore .svn folders when clearing cache and compiled files +- string resources do not need a modify check + +26/02/2011 +- replaced smarty_internal_wrapper by SmartyBC class +- load utility functions as static methods instead through __call() +- bugfix in extends resource when subresources are used +- optimization of modify checks + +25/02/2011 +- use $smarty->error_unassigned to control NOTICE handling on unassigned variables + +21/02/2011 +- added new new compile_check mode COMPILECHECK_CACHEMISS +- corrected new cloning behaviour of createTemplate() +- do no longer store the compiler object as property in the compile_tag classes to avoid possible memory leaks + during compilation + +19/02/2011 +- optimizations on merge_compiled_includes handling +- a couple of optimizations and bugfixes related to new resource structure + +17/02/2011 +- changed ./ and ../ behaviour + +14/02/2011 +- added {block ... hide} option to supress block if no child is defined + +13/02/2011 +- update handling of recursive subtemplate calls +- bugfix replace $smarty->triggerError() by exception in smarty_internal_resource_extends.php + +12/02/2011 +- new class Smarty_Internal_TemplateBase with shared methods of Smarty and Template objects +- optimizations of template processing +- made register... methods permanet +- code for default_plugin_handler +- add automatic recompilation at version change + +04/02/2011 +- change in Smarty_CacheResource_Custom +- bugfix cache_lifetime did not compile correctly at {include} after last update +- moved isCached processing into CacheResource class +- bugfix new CacheResource API did not work with disabled compile_check + +03/02/2011 +- handle template content as function to improve speed on multiple calls of same subtemplate and isCached()/display() calls +- bugfixes and improvents in the new resource API +- optimizations of template class code + +25/01/2011 +- optimized function html_select_time + +22/01/2011 +- added Smarty::$use_include_path configuration directive for Resource API +21/01/2011 +- optimized function html_select_date + +19/01/2011 +- optimized outputfilter trimwhitespace + +18/01/2011 +- bugfix Config to use Smarty_Resource to fetch sources +- optimized Smarty_Security's isTrustedDir() and isTrustedPHPDir() + +17/01/2011 +- bugfix HTTP headers for CGI SAPIs + +16/01/2011 +- optimized internals of Smarty_Resource and Smarty_CacheResource + +14/01/2011 +- added modifiercompiler escape to improve performance of escaping html, htmlall, url, urlpathinfo, quotes, javascript +- added support to choose template_dir to load from: [index]filename.tpl + +12/01/2011 +- added unencode modifier to revert results of encode modifier +- added to_charset and from_charset modifier for character encoding + +11/01/2011 +- added SMARTY_MBSTRING to generalize MBString detection +- added argument $lc_rest to modifier.capitalize to lower-case anything but the first character of a word +- changed strip modifier to consider unicode white-space, too +- changed wordwrap modifier to accept UTF-8 strings +- changed count_sentences modifier to consider unicode characters and treat sequences delimited by ? and ! as sentences, too +- added argument $double_encode to modifier.escape (applies to html and htmlall only) +- changed escape modifier to be UTF-8 compliant +- changed textformat block to be UTF-8 compliant +- optimized performance of mailto function +- fixed spacify modifier so characters are not prepended and appended, made it unicode compatible +- fixed truncate modifier to properly use mb_string if possible +- removed UTF-8 frenzy from count_characters modifier +- fixed count_words modifier to treat "hello-world" as a single word like str_count_words() does +- removed UTF-8 frenzy from upper modifier +- removed UTF-8 frenzy from lower modifier + +01/01/2011 +- optimize smarty_modified_escape for hex, hexentity, decentity. + +28/12/2010 +- changed $tpl_vars, $config_vars and $parent to belong to Smarty_Internal_Data +- added Smarty::registerCacheResource() for dynamic cache resource object registration + +27/12/2010 +- added Smarty_CacheResource API and refactored existing cache resources accordingly +- added Smarty_CacheResource_Custom and Smarty_CacheResource_Mysql + +26/12/2010 +- added Smarty_Resource API and refactored existing resources accordingly +- added Smarty_Resource_Custom and Smarty_Resource_Mysql +- bugfix Smarty::createTemplate() to return properly cloned template instances + +24/12/2010 +- optimize smarty_function_escape_special_chars() for PHP >= 5.2.3 + +===== SVN 3.0 trunk ===== 14/05/2011 - bugfix error handling at stream resources @@ -35,7 +301,6 @@ 22/04/2011 - bugfix allow only fixed string as file attribute at {extends} tag -- workaround for PHP 5.2.13 bug in method_exists() 01/04/2011 - bugfix do not run filters and default modifier when displaying the debug template @@ -73,7 +338,7 @@ 18/02/2011 - bugfix removed possible race condition when isCached() was called for an individually cached subtemplate -- bugfix force default debug.tpl to be loaded by the file resource when default_resource_type was modified +- bugfix force default debug.tpl to be loaded by the file resource 17/02/2011 -improvement not to delete files starting with '.' from cache and template_c folders on clearCompiledTemplate() and clearCache() @@ -83,8 +348,9 @@ -improvement allow leading spaces on } tag closing if auto_literal is enabled 13/02/2011 -- bugfix replace $smarty->triggerError() by exception in smarty_internal_resource_extends.php +- bufix replace $smarty->triggerError() by exception - removed obsolete {popup_init..} plugin from demo templates +- bugfix replace $smarty->triggerError() by exception in smarty_internal_resource_extends.php ===== Smarty 3.0.7 ===== 09/02/2011 @@ -615,7 +881,7 @@ request_use_auto_globals - added $smarty->_tag_stack for tracing block tag hierarchy 08/02/2010 -- bugfix use template fullpath at §smarty->cache->clear(...), $smarty->clear_cache(....) +- bugfix use template fullpath at §smarty->cache->clear(...), $smarty->clear_cache(....) - bugfix of cache filename on extended templates when force_compile=true 07/02/2010 diff --git a/demo/index.php b/demo/index.php index b9ec74ae..74c8e897 100644 --- a/demo/index.php +++ b/demo/index.php @@ -1,4 +1,10 @@ <?php + /** + * Example Application + + * @package Example-application + */ + require('../libs/Smarty.class.php'); $smarty = new Smarty; diff --git a/demo/index_php_template.php b/demo/index_php_template.php deleted file mode 100644 index 2f95bf67..00000000 --- a/demo/index_php_template.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php -/** -* Test script for PHP template -* @author Monte Ohrt <monte at ohrt dot com> -* @package SmartyTestScripts -*/ -require('../libs/Smarty.class.php'); - - class Person -{ - private $m_szName; - private $m_iAge; - - public function setName($szName) - { - $this->m_szName = $szName; - return $this; // We now return $this (the Person) - } - - public function setAge($iAge) - { - $this->m_iAge = $iAge; - return $this; // Again, return our Person - } - - public function introduce() - { - return 'Hello my name is '.$this->m_szName.' and I am '.$this->m_iAge.' years old.'; - } -} - -$smarty = new Smarty(); -$smarty->allow_php_templates= true; -$smarty->force_compile = false; -$smarty->caching = true; -$smarty->cache_lifetime = 100; -//$smarty->debugging = true; - -$smarty->assign('foo',"'bar'"); - -$person = new Person; - -$smarty->assign('person',$person); - -$smarty->assign('array',array('a'=>array('aa'=>'This is a long string'),'b'=>2)); - -$smarty->display('php:index_view.php'); - -?> diff --git a/demo/plugins/cacheresource.apc.php b/demo/plugins/cacheresource.apc.php new file mode 100644 index 00000000..40369e3a --- /dev/null +++ b/demo/plugins/cacheresource.apc.php @@ -0,0 +1,76 @@ +<?php + +/** + * APC CacheResource + * + * CacheResource Implementation based on the KeyValueStore API to use + * memcache as the storage resource for Smarty's output caching. + * * + * @package CacheResource-examples + * @author Uwe Tews + */ +class Smarty_CacheResource_Apc extends Smarty_CacheResource_KeyValueStore { + + public function __construct() + { + // test if APC is present + if(!function_exists('apc_cache_info')) + throw new Exception('APC Template Caching Error: APC is not installed'); + } + + /** + * Read values for a set of keys from cache + * + * @param array $keys list of keys to fetch + * @return array list of values with the given keys used as indexes + * @return boolean true on success, false on failure + */ + protected function read(array $keys) + { + $_res = array(); + $res = apc_fetch($keys); + foreach ($res as $k => $v) { + $_res[$k] = $v; + } + return $_res; + } + + /** + * Save values for a set of keys to cache + * + * @param array $keys list of values to save + * @param int $expire expiration time + * @return boolean true on success, false on failure + */ + protected function write(array $keys, $expire=null) + { + foreach ($keys as $k => $v) { + apc_store($k, $v, $expire); + } + return true; + } + + /** + * Remove values from cache + * + * @param array $keys list of keys to delete + * @return boolean true on success, false on failure + */ + protected function delete(array $keys) + { + foreach ($keys as $k) { + apc_delete($k); + } + return true; + } + + /** + * Remove *all* values from cache + * + * @return boolean true on success, false on failure + */ + protected function purge() + { + return apc_clear_cache('user'); + } +} diff --git a/demo/plugins/cacheresource.memcache.php b/demo/plugins/cacheresource.memcache.php new file mode 100644 index 00000000..230607d6 --- /dev/null +++ b/demo/plugins/cacheresource.memcache.php @@ -0,0 +1,91 @@ +<?php + +/** + * Memcache CacheResource + * + * CacheResource Implementation based on the KeyValueStore API to use + * memcache as the storage resource for Smarty's output caching. + * + * Note that memcache has a limitation of 256 characters per cache-key. + * To avoid complications all cache-keys are translated to a sha1 hash. + * + * @package CacheResource-examples + * @author Rodney Rehm + */ +class Smarty_CacheResource_Memcache extends Smarty_CacheResource_KeyValueStore { + /** + * memcache instance + * @var Memcache + */ + protected $memcache = null; + + public function __construct() + { + $this->memcache = new Memcache(); + $this->memcache->addServer( '127.0.0.1', 11211 ); + } + + /** + * Read values for a set of keys from cache + * + * @param array $keys list of keys to fetch + * @return array list of values with the given keys used as indexes + * @return boolean true on success, false on failure + */ + protected function read(array $keys) + { + $_keys = $lookup = array(); + foreach ($keys as $k) { + $_k = sha1($k); + $_keys[] = $_k; + $lookup[$_k] = $k; + } + $_res = array(); + $res = $this->memcache->get($_keys); + foreach ($res as $k => $v) { + $_res[$lookup[$k]] = $v; + } + return $_res; + } + + /** + * Save values for a set of keys to cache + * + * @param array $keys list of values to save + * @param int $expire expiration time + * @return boolean true on success, false on failure + */ + protected function write(array $keys, $expire=null) + { + foreach ($keys as $k => $v) { + $k = sha1($k); + $this->memcache->set($k, $v, 0, $expire); + } + return true; + } + + /** + * Remove values from cache + * + * @param array $keys list of keys to delete + * @return boolean true on success, false on failure + */ + protected function delete(array $keys) + { + foreach ($keys as $k) { + $k = sha1($k); + $this->memcache->delete($k); + } + return true; + } + + /** + * Remove *all* values from cache + * + * @return boolean true on success, false on failure + */ + protected function purge() + { + return $this->memcache->flush(); + } +} diff --git a/demo/plugins/cacheresource.mysql.php b/demo/plugins/cacheresource.mysql.php new file mode 100644 index 00000000..03455c80 --- /dev/null +++ b/demo/plugins/cacheresource.mysql.php @@ -0,0 +1,152 @@ +<?php + +/** + * MySQL CacheResource + * + * CacheResource Implementation based on the Custom API to use + * MySQL as the storage resource for Smarty's output caching. + * + * Table definition: + * <pre>CREATE TABLE IF NOT EXISTS `output_cache` ( + * `id` CHAR(40) NOT NULL COMMENT 'sha1 hash', + * `name` VARCHAR(250) NOT NULL, + * `cache_id` VARCHAR(250) NULL DEFAULT NULL, + * `compile_id` VARCHAR(250) NULL DEFAULT NULL, + * `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + * `content` LONGTEXT NOT NULL, + * PRIMARY KEY (`id`), + * INDEX(`name`), + * INDEX(`cache_id`), + * INDEX(`compile_id`), + * INDEX(`modified`) + * ) ENGINE = InnoDB;</pre> + * + * @package CacheResource-examples + * @author Rodney Rehm + */ +class Smarty_CacheResource_Mysql extends Smarty_CacheResource_Custom { + // PDO instance + protected $db; + protected $fetch; + protected $fetchTimestamp; + protected $save; + + public function __construct() { + try { + $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty"); + } catch (PDOException $e) { + throw new SmartyException('Mysql Resource failed: ' . $e->getMessage()); + } + $this->fetch = $this->db->prepare('SELECT modified, content FROM output_cache WHERE id = :id'); + $this->fetchTimestamp = $this->db->prepare('SELECT modified FROM output_cache WHERE id = :id'); + $this->save = $this->db->prepare('REPLACE INTO output_cache (id, name, cache_id, compile_id, content) + VALUES (:id, :name, :cache_id, :compile_id, :content)'); + } + + /** + * fetch cached content and its modification time from data source + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param string $content cached content + * @param integer $mtime cache modification timestamp (epoch) + * @return void + */ + protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime) + { + $this->fetch->execute(array('id' => $id)); + $row = $this->fetch->fetch(); + $this->fetch->closeCursor(); + if ($row) { + $content = $row['content']; + $mtime = $row['modified']; + } else { + $content = null; + $mtime = null; + } + } + + /** + * Fetch cached content's modification timestamp from data source + * + * @note implementing this method is optional. Only implement it if modification times can be accessed faster than loading the complete cached content. + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @return integer|boolean timestamp (epoch) the template was modified, or false if not found + */ + protected function fetchTimestamp($id, $name, $cache_id, $compile_id) + { + $this->fetchTimestamp->execute(array('id' => $id)); + $mtime = $this->fetchTimestamp->fetchColumn(); + $this->fetchTimestamp->closeCursor(); + return $mtime; + } + + /** + * Save content to cache + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer|null $exp_time seconds till expiration time in seconds or null + * @param string $content content to cache + * @return boolean success + */ + protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content) + { + $this->save->execute(array( + 'id' => $id, + 'name' => $name, + 'cache_id' => $cache_id, + 'compile_id' => $compile_id, + 'content' => $content, + )); + return !!$this->save->rowCount(); + } + + /** + * Delete content from cache + * + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer|null $exp_time seconds till expiration or null + * @return integer number of deleted caches + */ + protected function delete($name, $cache_id, $compile_id, $exp_time) + { + // delete the whole cache + if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) { + // returning the number of deleted caches would require a second query to count them + $query = $this->db->query('TRUNCATE TABLE output_cache'); + return -1; + } + // build the filter + $where = array(); + // equal test name + if ($name !== null) { + $where[] = 'name = ' . $this->db->quote($name); + } + // equal test compile_id + if ($compile_id !== null) { + $where[] = 'compile_id = ' . $this->db->quote($compile_id); + } + // range test expiration time + if ($exp_time !== null) { + $where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)'; + } + // equal test cache_id and match sub-groups + if ($cache_id !== null) { + $where[] = '(cache_id = '. $this->db->quote($cache_id) + . ' OR cache_id LIKE '. $this->db->quote($cache_id .'|%') .')'; + } + // run delete query + $query = $this->db->query('DELETE FROM output_cache WHERE ' . join(' AND ', $where)); + return $query->rowCount(); + } +} diff --git a/demo/plugins/resource.extendsall.php b/demo/plugins/resource.extendsall.php new file mode 100644 index 00000000..d8c40b5b --- /dev/null +++ b/demo/plugins/resource.extendsall.php @@ -0,0 +1,60 @@ +<?php + +/** + * Extends All Resource + * + * Resource Implementation modifying the extends-Resource to walk + * through the template_dirs and inherit all templates of the same name + * + * @package Resource-examples + * @author Rodney Rehm + */ +class Smarty_Resource_Extendsall extends Smarty_Internal_Resource_Extends { + + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * @return void + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null) + { + $uid = ''; + $sources = array(); + $exists = true; + foreach ($_template->smarty->getTemplateDir() as $key => $directory) { + try { + $s = Smarty_Resource::source(null, $source->smarty, '[' . $key . ']' . $source->name ); + if (!$s->exists) { + continue; + } + $sources[$s->uid] = $s; + $uid .= $s->filepath; + } + catch (SmartyException $e) {} + } + + if (!$sources) { + $source->exists = false; + $source->template = $_template; + return; + } + + $sources = array_reverse($sources, true); + reset($sources); + $s = current($sources); + + $source->components = $sources; + $source->filepath = $s->filepath; + $source->uid = sha1($uid); + $source->exists = $exists; + if ($_template && $_template->smarty->compile_check) { + $source->timestamp = $s->timestamp; + } + // need the template at getContent() + $source->template = $_template; + } +} + +?>
\ No newline at end of file diff --git a/demo/plugins/resource.mysql.php b/demo/plugins/resource.mysql.php new file mode 100644 index 00000000..312f3fc7 --- /dev/null +++ b/demo/plugins/resource.mysql.php @@ -0,0 +1,76 @@ +<?php + +/** + * MySQL Resource + * + * Resource Implementation based on the Custom API to use + * MySQL as the storage resource for Smarty's templates and configs. + * + * Table definition: + * <pre>CREATE TABLE IF NOT EXISTS `templates` ( + * `name` varchar(100) NOT NULL, + * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + * `source` text, + * PRIMARY KEY (`name`) + * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre> + * + * Demo data: + * <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');</pre> + * + * @package Resource-examples + * @author Rodney Rehm + */ +class Smarty_Resource_Mysql extends Smarty_Resource_Custom { + // PDO instance + protected $db; + // prepared fetch() statement + protected $fetch; + // prepared fetchTimestamp() statement + protected $mtime; + + public function __construct() { + try { + $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty"); + } catch (PDOException $e) { + throw new SmartyException('Mysql Resource failed: ' . $e->getMessage()); + } + $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name'); + $this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name'); + } + + /** + * Fetch a template and its modification time from database + * + * @param string $name template name + * @param string $source template source + * @param integer $mtime template modification timestamp (epoch) + * @return void + */ + protected function fetch($name, &$source, &$mtime) + { + $this->fetch->execute(array('name' => $name)); + $row = $this->fetch->fetch(); + $this->fetch->closeCursor(); + if ($row) { + $source = $row['source']; + $mtime = strtotime($row['modified']); + } else { + $source = null; + $mtime = null; + } + } + + /** + * Fetch a template's modification time from database + * + * @note implementing this method is optional. Only implement it if modification times can be accessed faster than loading the comple template source. + * @param string $name template name + * @return integer timestamp (epoch) the template was modified + */ + protected function fetchTimestamp($name) { + $this->mtime->execute(array('name' => $name)); + $mtime = $this->mtime->fetchColumn(); + $this->mtime->closeCursor(); + return strtotime($mtime); + } +} diff --git a/demo/plugins/resource.mysqls.php b/demo/plugins/resource.mysqls.php new file mode 100644 index 00000000..f9fe1c2f --- /dev/null +++ b/demo/plugins/resource.mysqls.php @@ -0,0 +1,62 @@ +<?php + +/** + * MySQL Resource + * + * Resource Implementation based on the Custom API to use + * MySQL as the storage resource for Smarty's templates and configs. + * + * Note that this MySQL implementation fetches the source and timestamps in + * a single database query, instead of two seperate like resource.mysql.php does. + * + * Table definition: + * <pre>CREATE TABLE IF NOT EXISTS `templates` ( + * `name` varchar(100) NOT NULL, + * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + * `source` text, + * PRIMARY KEY (`name`) + * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre> + * + * Demo data: + * <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');</pre> + * + * @package Resource-examples + * @author Rodney Rehm + */ +class Smarty_Resource_Mysqls extends Smarty_Resource_Custom { + // PDO instance + protected $db; + // prepared fetch() statement + protected $fetch; + + public function __construct() { + try { + $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty"); + } catch (PDOException $e) { + throw new SmartyException('Mysql Resource failed: ' . $e->getMessage()); + } + $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name'); + } + + /** + * Fetch a template and its modification time from database + * + * @param string $name template name + * @param string $source template source + * @param integer $mtime template modification timestamp (epoch) + * @return void + */ + protected function fetch($name, &$source, &$mtime) + { + $this->fetch->execute(array('name' => $name)); + $row = $this->fetch->fetch(); + $this->fetch->closeCursor(); + if ($row) { + $source = $row['source']; + $mtime = strtotime($row['modified']); + } else { + $source = null; + $mtime = null; + } + } +} diff --git a/demo/templates/index_view.php b/demo/templates/index_view.php deleted file mode 100644 index 833fe961..00000000 --- a/demo/templates/index_view.php +++ /dev/null @@ -1,13 +0,0 @@ -PHP file test -$foo is <?=$foo?> -<br> Test functions -<? echo trim($foo,"'");?> -<br>Test objects -<?=$person->setName('Paul')->setAge(39)->introduce()?> -<br>Test Arrays -<?=$array['a']['aa']?> <?=$array['b']?> -<br>function time -<? echo time();?> -<br>nocache function time -<? echo '<? echo time();?>';?> -<br>DONE diff --git a/libs/Smarty.class.php b/libs/Smarty.class.php index 6c9b7489..3e3492a9 100644 --- a/libs/Smarty.class.php +++ b/libs/Smarty.class.php @@ -1,71 +1,75 @@ <?php - /** - * Project: Smarty: the PHP compiling template engine - * File: Smarty.class.php - * SVN: $Id$ - * - * 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 - * - * For questions, help, comments, discussion, etc., please join the - * Smarty mailing list. Send a blank e-mail to - * smarty-discussion-subscribe@googlegroups.com - * - * @link http://www.smarty.net/ - * @copyright 2008 New Digital Group, Inc. - * @author Monte Ohrt <monte at ohrt dot com> - * @author Uwe Tews - * @package Smarty - * @version 3-SVN$Rev: 3286 $ - */ +* Project: Smarty: the PHP compiling template engine +* File: Smarty.class.php +* SVN: $Id$ +* +* 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 +* +* For questions, help, comments, discussion, etc., please join the +* Smarty mailing list. Send a blank e-mail to +* smarty-discussion-subscribe@googlegroups.com +* +* @link http://www.smarty.net/ +* @copyright 2008 New Digital Group, Inc. +* @author Monte Ohrt <monte at ohrt dot com> +* @author Uwe Tews +* @author Rodney Rehm +* @package Smarty +* @version 3.1-DEV +*/ /** - * define shorthand directory separator constant - */ +* define shorthand directory separator constant +*/ if (!defined('DS')) { define('DS', DIRECTORY_SEPARATOR); } /** - * set SMARTY_DIR to absolute path to Smarty library files. - * Sets SMARTY_DIR only if user application has not already defined it. - */ +* set SMARTY_DIR to absolute path to Smarty library files. +* Sets SMARTY_DIR only if user application has not already defined it. +*/ if (!defined('SMARTY_DIR')) { define('SMARTY_DIR', dirname(__FILE__) . DS); } /** - * set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins. - * Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it. - */ +* set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins. +* Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it. +*/ if (!defined('SMARTY_SYSPLUGINS_DIR')) { define('SMARTY_SYSPLUGINS_DIR', SMARTY_DIR . 'sysplugins' . DS); } if (!defined('SMARTY_PLUGINS_DIR')) { define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DS); } +if (!defined('SMARTY_MBSTRING')) { + define('SMARTY_MBSTRING', function_exists('mb_strlen')); +} if (!defined('SMARTY_RESOURCE_CHAR_SET')) { - define('SMARTY_RESOURCE_CHAR_SET', 'UTF-8'); + // UTF-8 can only be done properly when mbstring is available! + define('SMARTY_RESOURCE_CHAR_SET', SMARTY_MBSTRING ? 'UTF-8' : 'ISO-8859-1'); } if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) { define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y'); } /** - * register the class autoloader - */ +* register the class autoloader +*/ if (!defined('SMARTY_SPL_AUTOLOAD')) { define('SMARTY_SPL_AUTOLOAD', 0); } @@ -80,176 +84,465 @@ if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR } /** - * This is the main Smarty class - */ -class Smarty extends Smarty_Internal_Data { - /** - * constant definitions - */ - // smarty version - const SMARTY_VERSION = 'Smarty3-SVN$Rev: 3286 $'; - //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; - /** 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'; +* 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'; - /** - * static variables - */ - // assigned global tpl vars - static $global_tpl_vars = array(); +/** +* This is the main Smarty class +* @package Smarty +*/ +class Smarty extends Smarty_Internal_TemplateBase { + + /**#@+ + * constant definitions + */ - /** - * variables - */ - // auto literal on delimiters with whitspace + /** + * smarty version + */ + const SMARTY_VERSION = 'Smarty 3.1-DEV'; + + /** + * 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 compile check modes + */ + const COMPILECHECK_OFF = 0; + const COMPILECHECK_ON = 1; + const COMPILECHECK_CACHEMISS = 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'; + + /**#@-*/ + + /** + * assigned global tpl vars + */ + public static $global_tpl_vars = array(); + + /**#@+ + * variables + */ + + /** + * auto literal on delimiters with whitspace + * @var boolean + */ public $auto_literal = true; - // display error on not assigned variables + /** + * display error on not assigned variables + * @var boolean + */ public $error_unassigned = false; - // template directory - public $template_dir = null; - // default template handler + /** + * look up relative filepaths in include_path + * @var boolean + */ + public $use_include_path = false; + /** + * template directory + * @var string + */ + protected $template_dir = null; + /** + * default template handler + * @var callable + */ public $default_template_handler_func = null; - // compile directory - public $compile_dir = null; - // plugins directory - public $plugins_dir = null; - // cache directory - public $cache_dir = null; - // config directory - public $config_dir = null; - // force template compiling? + /** + * 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 + */ + protected $compile_dir = null; + /** + * plugins directory + * @var string + */ + protected $plugins_dir = null; + /** + * cache directory + * @var string + */ + protected $cache_dir = null; + /** + * config directory + * @var string + */ + protected $config_dir = null; + /** + * force template compiling? + * @var boolean + */ public $force_compile = false; - // check template for modifications? + /** + * check template for modifications? + * @var boolean + */ public $compile_check = true; - // locking concurrent compiles - public $compile_locking = true; - // use sub dirs for compiled/cached files? + /** + * use sub dirs for compiled/cached files? + * @var boolean + */ public $use_sub_dirs = false; - // compile_error? - public $compile_error = false; - // caching enabled + /** + * caching enabled + * @var boolean + */ public $caching = false; - // merge compiled includes + /** + * merge compiled includes + * @var boolean + */ public $merge_compiled_includes = false; - // cache lifetime + /** + * cache lifetime in seconds + * @var integer + */ public $cache_lifetime = 3600; - // force cache file creation + /** + * force cache file creation + * @var boolean + */ public $force_cache = false; - // cache_id + /** + * Set this if you want different sets of cache files for the same + * templates. + * + * @var string + */ public $cache_id = null; - // compile_id + /** + * Set this if you want different sets of compiled files for the same + * templates. + * + * @var string + */ public $compile_id = null; - // template delimiters + /** + * template left-delimiter + * @var string + */ public $left_delimiter = "{"; + /** + * template right-delimiter + * @var string + */ public $right_delimiter = "}"; - // security + /**#@+ + * security + */ + /** + * class name + * + * This should be instance of Smarty_Security. + * + * @var string + * @see Smarty_Security + */ public $security_class = 'Smarty_Security'; + /** + * implementation of security class + * + * @var Smarty_Security + */ public $security_policy = null; + /** + * controls handling of PHP-blocks + * + * @var integer + */ public $php_handling = self::PHP_PASSTHRU; - public $allow_php_tag = false; + /** + * 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 + * Currently used by Smarty_Internal_Template only. + * }} + * + * @var boolean + */ public $direct_access_security = true; - public $trusted_dir = array(); - // debug mode + /**#@-*/ + /** + * debug mode + * + * Setting this to true enables the debug-console. + * + * @var boolean + */ public $debugging = false; + /** + * This determines if debugging is enable-able from the browser. + * <ul> + * <li>NONE => no debugging control allowed</li> + * <li>URL => enable debugging when SMARTY_DEBUG is found in the URL.</li> + * </ul> + * @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 + */ public $smarty_debug_id = 'SMARTY_DEBUG'; + /** + * Path of debug template. + * @var string + */ public $debug_tpl = null; - // When set, smarty does uses this value as error_reporting-level. + /** + * When set, smarty uses this value as error_reporting-level. + * @var int + */ public $error_reporting = null; - // config var settings - public $config_overwrite = true; //Controls whether variables with the same name overwrite each other. - public $config_booleanize = true; //Controls whether config values of on/true/yes and off/false/no get converted to boolean - public $config_read_hidden = false; //Controls whether hidden config sections/vars are read from the file. - // config vars - public $config_vars = array(); - // assigned tpl vars - public $tpl_vars = array(); - // dummy parent object - public $parent = null; - // global template functions + /** + * Internal flag for getTags() + * @var boolean + */ + public $get_used_tags = false; + + /**#@+ + * config var settings + */ + + /** + * Controls whether variables with the same name overwrite each other. + * @var boolean + */ + public $config_overwrite = true; + /** + * Controls whether config values of on/true/yes and off/false/no get converted to boolean. + * @var boolean + */ + public $config_booleanize = true; + /** + * Controls whether hidden config sections/vars are read from the file. + * @var boolean + */ + public $config_read_hidden = false; + + /**#@-*/ + + /**#@+ + * resource locking + */ + + /** + * locking concurrent compiles + * @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 + * @var float + */ + public $locking_timeout = 10; + + /**#@-*/ + + /** + * global template functions + * @var array + */ public $template_functions = array(); - // resource type used if none given + /** + * resource type used if none given + * + * Must be an valid key of $registered_resources. + * @var string + */ public $default_resource_type = 'file'; - // caching type + /** + * caching type + * + * Must be an element of $cache_resource_types. + * + * @var string + */ public $caching_type = 'file'; - // internal cache resource types - public $cache_resource_types = array('file'); - // internal config properties + /** + * internal config properties + * @var array + */ public $properties = array(); - // config type + /** + * config type + * @var string + */ public $default_config_type = 'file'; - // cached template objects - public $template_objects = null; - // check If-Modified-Since headers + /** + * cached template objects + * @var array + */ + public $template_objects = array(); + /** + * check If-Modified-Since headers + * @var boolean + */ public $cache_modified_check = false; - // registered plugins + /** + * registered plugins + * @var array + */ public $registered_plugins = array(); - // plugin search order + /** + * plugin search order + * @var array + */ public $plugin_search_order = array('function', 'block', 'compiler', 'class'); - // registered objects + /** + * registered objects + * @var array + */ public $registered_objects = array(); - // registered classes + /** + * registered classes + * @var array + */ public $registered_classes = array(); - // registered filters + /** + * registered filters + * @var array + */ public $registered_filters = array(); - // registered resources + /** + * registered resources + * @var array + */ public $registered_resources = array(); - // autoload filter + /** + * registered cache resources + * @var array + */ + public $registered_cache_resources = array(); + /** + * autoload filter + * @var array + */ public $autoload_filters = array(); - // status of filter on variable output - public $variable_filter = true; - // default modifier + /** + * default modifier + * @var array + */ public $default_modifiers = array(); - // global internal smarty vars - static $_smarty_vars = array(); - // start time for execution time calculation + /** + * 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 + /** + * default file permissions + * @var int + */ public $_file_perms = 0644; - // default dir permissions + /** + * default dir permissions + * @var int + */ public $_dir_perms = 0771; - // block tag hierarchy + /** + * block tag hierarchy + * @var array + */ public $_tag_stack = array(); - // flag if {block} tag is compiled for template inheritance - public $inheritance = false; - // generate deprecated function call notices? - public $deprecation_notices = true; - // internal flag for getTags() - public $get_used_tags = false; - // Smarty 2 BC - public $_version = self::SMARTY_VERSION; - // self pointer to Smarty object + /** + * 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; + /**#@-*/ /** - * Class constructor, initializes basic smarty properties - */ + * Initialize new Smarty object + * + */ public function __construct() { - // selfpointer need by some other class methods - $this->smarty = $this; + // selfpointer needed by some other class methods + $this->smarty = $this; if (is_callable('mb_internal_encoding')) { mb_internal_encoding(SMARTY_RESOURCE_CHAR_SET); } @@ -259,241 +552,107 @@ class Smarty extends Smarty_Internal_Data { $this->compile_dir = '.' . DS . 'templates_c' . DS; $this->plugins_dir = array(SMARTY_PLUGINS_DIR); $this->cache_dir = '.' . DS . 'cache' . DS; - $this->config_dir = '.' . DS . 'configs' . DS; - $this->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl'; + $this->config_dir = array('.' . DS . 'configs' . DS); + $this->debug_tpl = 'file:' . dirname(__FILE__) . '/debug.tpl'; if (isset($_SERVER['SCRIPT_NAME'])) { $this->assignGlobal('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']); } } /** - * Class destructor - */ + * Class destructor + */ public function __destruct() { + // intentionally left blank } /** - * 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 $ |null $parent next higher level of Smarty variables - * @return string rendered template output - */ - public function fetch($template, $cache_id = null, $compile_id = null, $parent = null, $display = false) + * <<magic>> set selfpointer on cloned object + */ + public function __clone() { - if (!empty($cache_id) && is_object($cache_id)) { - $parent = $cache_id; - $cache_id = null; - } - if ($parent === null) { - // get default Smarty data object - $parent = $this; - } - // create template object if necessary - ($template instanceof $this->template_class)? $_template = $template : - $_template = $this->createTemplate ($template, $cache_id, $compile_id, $parent, false); - if (isset($this->error_reporting)) { - $_smarty_old_error_level = error_reporting($this->error_reporting); - } - // check URL debugging control - if (!$this->debugging && $this->debugging_ctrl == 'URL') { - if (isset($_SERVER['QUERY_STRING'])) { - $_query_string = $_SERVER['QUERY_STRING']; - } else { - $_query_string = ''; - } - if (false !== strpos($_query_string, $this->smarty_debug_id)) { - if (false !== strpos($_query_string, $this->smarty_debug_id . '=on')) { - // enable debugging for this browser session - setcookie('SMARTY_DEBUG', true); - $this->debugging = true; - } elseif (false !== strpos($_query_string, $this->smarty_debug_id . '=off')) { - // disable debugging for this browser session - setcookie('SMARTY_DEBUG', false); - $this->debugging = false; - } else { - // enable debugging for this page - $this->debugging = true; - } - } else { - if (isset($_COOKIE['SMARTY_DEBUG'])) { - $this->debugging = true; - } - } - } - // obtain data for cache modified check - if ($this->cache_modified_check && $this->caching && $display) { - $_isCached = $_template->isCached() && !$_template->has_nocache_code; - if ($_isCached) { - $_gmt_mtime = gmdate('D, d M Y H:i:s', $_template->getCachedTimestamp()) . ' GMT'; - } else { - $_gmt_mtime = ''; - } - } - // return rendered template - if ((!$this->caching || $_template->resource_object->isEvaluated) && (isset($this->autoload_filters['output']) || isset($this->registered_filters['output']))) { - $_output = Smarty_Internal_Filter_Handler::runFilter('output', $_template->getRenderedTemplate(), $_template); - } else { - $_output = $_template->getRenderedTemplate(); - } - $_template->rendered_content = null; - if (isset($this->error_reporting)) { - error_reporting($_smarty_old_error_level); - } - // display or fetch - if ($display) { - if ($this->caching && $this->cache_modified_check) { - $_last_modified_date = @substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3); - if ($_isCached && $_gmt_mtime == $_last_modified_date) { - if (php_sapi_name() == 'cgi') - header('Status: 304 Not Modified'); - else - header('HTTP/1.1 304 Not Modified'); - } else { - header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->getCachedTimestamp()) . ' GMT'); - echo $_output; - } - } else { - echo $_output; - } - // debug output - if ($this->debugging) { - Smarty_Internal_Debug::display_debug($this); - } - return; - } else { - // return fetched content - return $_output; - } + $this->smarty = $this; } - /** - * displays a Smarty template - * - * @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 - */ - public function display($template, $cache_id = null, $compile_id = null, $parent = null) - { - // display template - $this->fetch ($template, $cache_id, $compile_id, $parent, true); - } /** - * test if cache i 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, $cache_id = null, $compile_id = null, $parent = null) + * <<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) { - if ($parent === null) { - $parent = $this; - } - if (!($template instanceof $this->template_class)) { - $template = $this->createTemplate ($template, $cache_id, $compile_id, $parent, 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); } - // return cache status of template - return $template->isCached(); } /** - * creates a data object - * - * @param object $parent next higher level of Smarty variables - * @returns object data object - */ - public function createData($parent = null) + * <<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) { - return new Smarty_Data($parent, $this); - } + $allowed = array( + 'template_dir' => 'setTemplateDir', + 'config_dir' => 'setConfigDir', + 'plugins_dir' => 'setPluginsDir', + 'compile_dir' => 'setCompileDir', + 'cache_dir' => 'setCacheDir', + ); - /** - * creates a template object - * - * @param string $template the resource handle of the template file - * @param mixed $cache_id cache id to be used with this template - * @param mixed $compile_id compile id to be used with this template - * @param object $parent next higher level of Smarty variables - * @param boolean $do_clone flag is Smarty object shall be cloned - * @returns object template object - */ - public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) - { - if (!empty($cache_id) && (is_object($cache_id) || is_array($cache_id))) { - $parent = $cache_id; - $cache_id = null; - } - if (!empty($parent) && is_array($parent)) { - $data = $parent; - $parent = null; - } else { - $data = null; - } - if (!is_object($template)) { - // we got a template resource - // already in template cache? - $_templateId = sha1($template . $cache_id . $compile_id); - if (isset($this->template_objects[$_templateId]) && $this->caching) { - // return cached template object - $tpl = $this->template_objects[$_templateId]; - } else { - // create new template object - if ($do_clone) { - $tpl = new $this->template_class($template, clone $this, $parent, $cache_id, $compile_id); - } else { - $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id); - } - } + if (isset($allowed[$name])) { + $this->{$allowed[$name]}($value); } else { - // just return a copy of template class - $tpl = $template; - } - // 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); - } + trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); } - return $tpl; } - - /** - * Check if a template resource exists - * - * @param string $resource_name template name - * @return boolean status - */ - function templateExists($resource_name) + * Check if a template resource exists + * + * @param string $resource_name template name + * @return boolean status + */ + public function templateExists($resource_name) { // create template object $save = $this->template_objects; $tpl = new $this->template_class($resource_name, $this); // check if it does exists - $result = $tpl->isExisting(); + $result = $tpl->source->exists; $this->template_objects = $save; return $result; } /** - * Returns a single or all global variables - * - * @param object $smarty - * @param string $varname variable name or null - * @return string variable value or or array of variables - */ - function getGlobal($varname = null) + * Returns a single or all global variables + * + * @param object $smarty + * @param string $varname variable name or null + * @return string variable value or or array of variables + */ + public function getGlobal($varname = null) { if (isset($varname)) { if (isset(self::$global_tpl_vars[$varname])) { @@ -514,168 +673,497 @@ class Smarty extends Smarty_Internal_Data { * Empty cache folder * * @param integer $exp_time expiration time - * @param string $type resource type + * @param string $type resource type * @return integer number of cache files deleted */ function clearAllCache($exp_time = null, $type = null) { - // load cache resource and call clearAll - return $this->loadCacheResource($type)->clearAll($exp_time); + // load cache resource and call clearAll + $_cache_resource = Smarty_CacheResource::load($this, $type); + Smarty_CacheResource::invalidLoadedCache($this); + return $_cache_resource->clearAll($this, $exp_time); } /** * Empty cache for a specific template * - * @param string $template_name template name - * @param string $cache_id cache id - * @param string $compile_id compile id - * @param integer $exp_time expiration time - * @param string $type resource type + * @param string $template_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time + * @param string $type resource type * @return integer number of cache files deleted */ - function clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null) + public function clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null) { - // load cache resource and call clear - return $this->loadCacheResource($type)->clear($template_name, $cache_id, $compile_id, $exp_time); + // load cache resource and call clear + $_cache_resource = Smarty_CacheResource::load($this, $type); + Smarty_CacheResource::invalidLoadedCache($this); + return $_cache_resource->clear($this, $template_name, $cache_id, $compile_id, $exp_time); } /** - * Loads security class and enables security - */ + * Loads security class and enables security + * + * @param string|Smarty_Security $security_class if a string is used, it must be class-name + * @return Smarty current Smarty instance for chaining + * @throws SmartyException when an invalid class name is provided + */ public function enableSecurity($security_class = null) { - if ($security_class instanceof Smarty_Security) { - $this->security_policy = $security_class; - return; - } - if ($security_class == null) { - $security_class = $this->security_class; - } - if (class_exists($security_class)) { - $this->security_policy = new $security_class($this); - } else { + if ($security_class instanceof Smarty_Security) { + $this->security_policy = $security_class; + return $this; + } elseif (is_object($security_class)) { + throw new SmartyException("Class '" . get_class($security_class) . "' must extend Smarty_Security."); + } + if ($security_class == null) { + $security_class = $this->security_class; + } + if (!class_exists($security_class)) { throw new SmartyException("Security class '$security_class' is not defined"); + } elseif ($security_class !== 'Smarty_Security' && !is_subclass_of($security_class, 'Smarty_Security')) { + throw new SmartyException("Class '$security_class' must extend Smarty_Security."); + } else { + $this->security_policy = new $security_class($this); } + + return $this; } /** - * Disable security - */ + * Disable security + * @return Smarty current Smarty instance for chaining + */ public function disableSecurity() { - $this->security_policy = null; + $this->security_policy = null; + + return $this; + } + + /** + * Set template directory + * + * @param string|array $template_dir directory(s) of template sources + * @return Smarty current Smarty instance for chaining + */ + public function setTemplateDir($template_dir) + { + $this->template_dir = array(); + foreach ((array) $template_dir as $k => $v) { + $this->template_dir[$k] = rtrim($v, '/\\') . DS; + } + + return $this; } /** - * Loads cache resource. + * Add template directory(s) * - * @param string $type cache resource type - * @return object of cache resource + * @param string|array $template_dir directory(s) of template sources + * @param string $key of the array element to assign the template dir to + * @return Smarty current Smarty instance for chaining + * @throws SmartyException when the given template directory is not valid */ - public function loadCacheResource($type = null) { - if (!isset($type)) { - $type = $this->caching_type; + 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) { + if (is_int($k)) { + // indexes are not merged but appended + $this->template_dir[] = rtrim($v, '/\\') . DS; + } else { + // string indexes are overridden + $this->template_dir[$k] = rtrim($v, '/\\') . DS; + } + } + } elseif ($key !== null) { + // override directory at specified index + $this->template_dir[$key] = rtrim($template_dir, '/\\') . DS; + } else { + // append new directory + $this->template_dir[] = rtrim($template_dir, '/\\') . DS; } - if (in_array($type, $this->cache_resource_types)) { - $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type); - return new $cache_resource_class($this); + + return $this; + } + + /** + * Get template directories + * + * @param mixed index of directory to get, null to get all + * @return array|string list of template directories, or directory of $index + */ + public function getTemplateDir($index=null) + { + if ($index !== null) { + return isset($this->template_dir[$index]) ? $this->template_dir[$index] : null; } - else { - // try plugins dir - $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type); - if ($this->loadPlugin($cache_resource_class)) { - return new $cache_resource_class($this); + + return $this->template_dir; + } + + /** + * Set config directory + * + * @param string|array $template_dir directory(s) of configuration sources + * @return Smarty current Smarty instance for chaining + */ + public function setConfigDir($config_dir) + { + $this->config_dir = array(); + foreach ((array) $config_dir as $k => $v) { + $this->config_dir[$k] = rtrim($v, '/\\') . DS; + } + + return $this; + } + + /** + * Add config directory(s) + * + * @param string|array $config_dir directory(s) of config sources + * @param string 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) { + if (is_int($k)) { + // indexes are not merged but appended + $this->config_dir[] = rtrim($v, '/\\') . DS; + } else { + // string indexes are overridden + $this->config_dir[$k] = rtrim($v, '/\\') . DS; + } } - else { - throw new SmartyException("Unable to load cache resource '{$type}'"); + } elseif( $key !== null ) { + // override directory at specified index + $this->config_dir[$key] = rtrim($config_dir, '/\\') . DS; + } else { + // append new directory + $this->config_dir[] = rtrim($config_dir, '/\\') . DS; + } + + return $this; + } + + /** + * Get config directory + * + * @param mixed index of directory to get, null to get all + * @return array|string configuration directory + */ + public function getConfigDir($index=null) + { + if ($index !== null) { + return isset($this->config_dir[$index]) ? $this->config_dir[$index] : null; + } + + return $this->config_dir; + } + + /** + * Set plugins directory + * + * @param string|array $plugins_dir directory(s) of plugins + * @return Smarty current Smarty instance for chaining + */ + public function setPluginsDir($plugins_dir) + { + $this->plugins_dir = array(); + foreach ((array)$plugins_dir as $k => $v) { + $this->plugins_dir[$k] = rtrim($v, '/\\') . DS; + } + + return $this; + } + + /** + * Adds directory of plugin files + * + * @param object $smarty + * @param string $ |array $ plugins folder + * @return Smarty current Smarty instance for chaining + */ + public function addPluginsDir($plugins_dir) + { + // 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; } + + $this->plugins_dir = array_unique($this->plugins_dir); + return $this; + } + + /** + * Get plugin directories + * + * @return array list of plugin directories + */ + public function getPluginsDir() + { + return $this->plugins_dir; } + /** + * Set compile directory + * + * @param string $compile_dir directory to store compiled templates in + * @return Smarty current Smarty instance for chaining + */ + public function setCompileDir($compile_dir) + { + $this->compile_dir = rtrim($compile_dir, '/\\') . DS; + return $this; + } /** - * Set template directory - * - * @param string $ |array $template_dir folder(s) of template sorces - */ - public function setTemplateDir($template_dir) + * Get compiled directory + * + * @return string path to compiled templates + */ + public function getCompileDir() { - $this->template_dir = (array)$template_dir; - return; + return $this->compile_dir; } /** - * Adds template directory(s) to existing ones - * - * @param string $ |array $template_dir folder(s) of template sources - */ - public function addTemplateDir($template_dir) + * Set cache directory + * + * @param string $cache_dir directory to store cached templates in + * @return Smarty current Smarty instance for chaining + */ + public function setCacheDir($cache_dir) { - $this->template_dir = array_unique(array_merge((array)$this->template_dir, (array)$template_dir)); - return; + $this->cache_dir = rtrim($cache_dir, '/\\') . DS; + return $this; } /** - * Adds directory of plugin files - * - * @param object $smarty - * @param string $ |array $ plugins folder - * @return - */ - function addPluginsDir($plugins_dir) + * Get cache directory + * + * @return string path of cache directory + */ + public function getCacheDir() { - $this->plugins_dir = array_unique(array_merge((array)$this->plugins_dir, (array)$plugins_dir)); - return; + return $this->cache_dir; } + /** + * Set default modifiers + * + * @param array|string $modifiers modifier or list of modifiers to set + * @return Smarty current Smarty instance for chaining + */ + public function setDefaultModifiers($modifiers) + { + $this->default_modifiers = (array) $modifiers; + return $this; + } /** - * return a reference to a registered object - * - * @param string $name object name - * @return object - */ - function getRegisteredObject($name) + * Add default modifiers + * + * @param array|string $modifiers modifier or list of modifiers to add + * @return Smarty current Smarty instance for chaining + */ + public function addDefaultModifiers($modifiers) + { + if (is_array($modifiers)) { + $this->default_modifiers = array_merge($this->default_modifiers, $modifiers); + } else { + $this->default_modifiers[] = $modifiers; + } + + return $this; + } + + /** + * Get default modifiers + * + * @return array list of default modifiers + */ + public function getDefaultModifiers() { - if (!isset($this->registered_objects[$name])) - throw new SmartyException("'$name' is not a registered object"); + return $this->default_modifiers; + } - if (!is_object($this->registered_objects[$name][0])) - throw new SmartyException("registered '$name' is not an object"); - return $this->registered_objects[$name][0]; + /** + * 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 + * @return Smarty current Smarty instance for chaining + */ + public function setAutoloadFilters($filters, $type=null) + { + if ($type !== null) { + $this->autoload_filters[$type] = (array) $filters; + } else { + $this->autoload_filters = (array) $filters; + } + + return $this; } + /** + * 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 + * @return Smarty current Smarty instance for chaining + */ + public function addAutoloadFilters($filters, $type=null) + { + if ($type !== null) { + if (!empty($this->autoload_filters[$type])) { + $this->autoload_filters[$type] = array_merge($this->autoload_filters[$type], (array) $filters); + } else { + $this->autoload_filters[$type] = (array) $filters; + } + } else { + foreach ((array) $filters as $key => $value) { + if (!empty($this->autoload_filters[$key])) { + $this->autoload_filters[$key] = array_merge($this->autoload_filters[$key], (array) $value); + } else { + $this->autoload_filters[$key] = (array) $value; + } + } + } + + return $this; + } /** - * return name of debugging template - * - * @return string - */ - function getDebugTemplate() + * Get autoload filters + * + * @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 + */ + public function getAutoloadFilters($type=null) + { + if ($type !== null) { + return isset($this->autoload_filters[$type]) ? $this->autoload_filters[$type] : array(); + } + + return $this->autoload_filters; + } + + /** + * return name of debugging template + * + * @return string + */ + public function getDebugTemplate() { return $this->debug_tpl; } /** - * set the debug template - * - * @param string $tpl_name - * @return bool - */ - function setDebugTemplate($tpl_name) + * set the debug template + * + * @param string $tpl_name + * @return Smarty current Smarty instance for chaining + * @throws SmartyException if file is not readable + */ + public function setDebugTemplate($tpl_name) { - return $this->debug_tpl = $tpl_name; + if (!is_readable($tpl_name)) { + throw new SmartyException("Unknown file '{$tpl_name}'"); + } + $this->debug_tpl = $tpl_name; + + return $this; } /** - * Takes unknown classes and loads plugin files for them - * class name format: Smarty_PluginType_PluginName - * plugin filename format: plugintype.pluginname.php - * - * @param string $plugin_name class plugin name to load - * @return string |boolean filepath of loaded file or false - */ + * creates a template object + * + * @param string $template the resource handle of the template file + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + * @param boolean $do_clone flag is Smarty object shall be cloned + * @return object template object + */ + public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) + { + if (!empty($cache_id) && (is_object($cache_id) || is_array($cache_id))) { + $parent = $cache_id; + $cache_id = null; + } + if (!empty($parent) && is_array($parent)) { + $data = $parent; + $parent = null; + } 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? + $_templateId = sha1($template . $cache_id . $compile_id); + if ($do_clone) { + if (isset($this->template_objects[$_templateId])) { + // return cached template object + $tpl = clone $this->template_objects[$_templateId]; + $tpl->smarty = clone $tpl->smarty; + $tpl->parent = $parent; + } else { + $tpl = new $this->template_class($template, clone $this, $parent, $cache_id, $compile_id); + } + } else { + if (isset($this->template_objects[$_templateId])) { + // return cached template object + $tpl = $this->template_objects[$_templateId]; + } else { + $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id); + } + } + // 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); + } + } + return $tpl; + } + + + /** + * Takes unknown classes and loads plugin files for them + * class name format: Smarty_PluginType_PluginName + * plugin filename format: plugintype.pluginname.php + * + * @param string $plugin_name class plugin name to load + * @param bool $check check if already loaded + * @return string |boolean filepath of loaded file or false + */ public function loadPlugin($plugin_name, $check = true) { // if function or class exists, exit silently (already loaded) @@ -702,21 +1190,67 @@ class Smarty extends Smarty_Internal_Data { // plugin filename is expected to be: [type].[name].php $_plugin_filename = "{$_name_parts[1]}.{$_name_parts[2]}.php"; // loop through plugin dirs and find the plugin - foreach((array)$this->plugins_dir as $_plugin_dir) { - if (strpos('/\\', substr($_plugin_dir, -1)) === false) { - $_plugin_dir .= DS; - } + foreach($this->getPluginsDir() as $_plugin_dir) { $file = $_plugin_dir . $_plugin_filename; if (file_exists($file)) { require_once($file); return $file; } + if ($this->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) { + // try PHP include_path + if (($file = Smarty_Internal_Get_Include_Path::getIncludePath($file)) !== false) { + require_once($file); + return $file; + } + } } // no plugin loaded return false; } /** + * Compile all template files + * + * @param string $extension file extension + * @param bool $force_compile force all to recompile + * @param int $time_limit + * @param int $max_errors + * @return integer number of template files recompiled + */ + public function compileAllTemplates($extention = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null) + { + return Smarty_Internal_Utility::compileAllTemplates($extention, $force_compile, $time_limit, $max_errors, $this); + } + + /** + * Compile all config files + * + * @param string $extension file extension + * @param bool $force_compile force all to recompile + * @param int $time_limit + * @param int $max_errors + * @return integer number of template files recompiled + */ + public function compileAllConfig($extention = '.conf', $force_compile = false, $time_limit = 0, $max_errors = null) + { + return Smarty_Internal_Utility::compileAllConfig($extention, $force_compile, $time_limit, $max_errors, $this); + } + + /** + * Delete compiled template file + * + * @param string $resource_name template name + * @param string $compile_id compile id + * @param integer $exp_time expiration time + * @return integer number of template files deleted + */ + public function clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) + { + return Smarty_Internal_Utility::clearCompiledTemplate($resource_name, $compile_id, $exp_time, $this); + } + + + /** * Return array of tag/attributes of all tags used by an template * * @param object $templae template object @@ -728,101 +1262,53 @@ class Smarty extends Smarty_Internal_Data { } /** - * clean up properties on cloned object + * Run installation test + * + * @param array $errors Array to write errors into, rather than outputting them + * @return boolean true if setup is fine, false if something is wrong */ - public function __clone() + public function testInstall(&$errors=null) { - // clear config vars - $this->config_vars = array(); - // clear assigned tpl vars - $this->tpl_vars = array(); - // clear objects for external methods - unset($this->Register); - unset($this->Filter); - } - + return Smarty_Internal_Utility::testInstall($this, $errors); + } - /** - * Handle unknown class methods - * - * @param string $name unknown methode name - * @param array $args aurgument array - */ - public function __call($name, $args) - { - static $camel_func; - if (!isset($camel_func)) - $camel_func = create_function('$c', 'return "_" . strtolower($c[1]);'); - // see if this is a set/get for a property - $first3 = strtolower(substr($name, 0, 3)); - if (in_array($first3, array('set', 'get')) && substr($name, 3, 1) !== '_') { - // 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])/', $camel_func, $property_name); - if (!property_exists($this, $property_name)) { - throw new SmartyException("property '$property_name' does not exist."); - return false; - } - if ($first3 == 'get') - return $this->$property_name; - else - return $this->$property_name = $args[0]; - } - // Smarty Backward Compatible wrapper - if (strpos($name,'_') !== false) { - if (!isset($this->wrapper)) { - $this->wrapper = new Smarty_Internal_Wrapper($this); - } - return $this->wrapper->convert($name, $args); - } - // external Smarty methods ? - foreach(array('Filter','Register') as $external) { - if (class_exists("Smarty_Internal_{$external}") && method_exists("Smarty_Internal_{$external}",$name)) { - if (!isset($this->$external)) { - $class = "Smarty_Internal_{$external}"; - $this->$external = new $class($this); - } - return call_user_func_array(array($this->$external,$name), $args); - } - } - if (in_array($name,array('clearCompiledTemplate','compileAllTemplates','compileAllConfig','testInstall','getTags'))) { - if (!isset($this->utility)) { - $this->utility = new Smarty_Internal_Utility($this); - } - return call_user_func_array(array($this->utility,$name), $args); - } - // PHP4 call to constructor? - if (strtolower($name) == 'smarty') { - throw new SmartyException('Please use parent::__construct() to call parent constuctor'); - return false; - } - throw new SmartyException("Call of unknown function '$name'."); - } } /** - * Autoloader - */ -function smartyAutoload($class) -{ - $_class = strtolower($class); - if (substr($_class, 0, 16) === 'smarty_internal_' || $_class == 'smarty_security') { - include SMARTY_SYSPLUGINS_DIR . $_class . '.php'; - } +* Smarty exception class +* @package Smarty +*/ +class SmartyException extends Exception { } /** - * Smarty exception class - */ -Class SmartyException extends Exception { +* Smarty compiler exception class +* @package Smarty +*/ +class SmartyCompilerException extends SmartyException { } /** - * Smarty compiler exception class - */ -Class SmartyCompilerException extends SmartyException { +* Autoloader +*/ +function smartyAutoload($class) +{ + $_class = strtolower($class); + if (substr($_class, 0, 16) == 'smarty_internal_' + || in_array( $_class, array( + 'smarty_config_source', + 'smarty_config_compiled', + 'smarty_security', + 'smarty_cacheresource', + 'smarty_cacheresource_custom', + 'smarty_cacheresource_keyvaluestore', + 'smarty_resource', + 'smarty_resource_custom', + 'smarty_resource_uncompiled', + 'smarty_resource_recompiled', + ))) { + include SMARTY_SYSPLUGINS_DIR . $_class . '.php'; + } } -?> +?>
\ No newline at end of file diff --git a/libs/SmartyBC.class.php b/libs/SmartyBC.class.php new file mode 100644 index 00000000..f8f0a138 --- /dev/null +++ b/libs/SmartyBC.class.php @@ -0,0 +1,460 @@ +<?php
+/**
+ * Project: Smarty: the PHP compiling template engine
+ * File: SmartyBC.class.php
+ * SVN: $Id: $
+ *
+ * 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
+ *
+ * For questions, help, comments, discussion, etc., please join the
+ * Smarty mailing list. Send a blank e-mail to
+ * smarty-discussion-subscribe@googlegroups.com
+ *
+ * @link http://www.smarty.net/
+ * @copyright 2008 New Digital Group, Inc.
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Uwe Tews
+ * @author Rodney Rehm
+ * @package Smarty
+ */
+/**
+ * @ignore
+ */
+require(dirname(__FILE__) . '/Smarty.class.php');
+
+/**
+ * Smarty Backward Compatability Wrapper Class
+ *
+ * @package Smarty
+ */
+class SmartyBC extends Smarty {
+
+ /**
+ * Smarty 2 BC
+ * @var string
+ */
+ public $_version = self::SMARTY_VERSION;
+
+ /**
+ * Initialize new SmartyBC object
+ *
+ * @param array $options options to set during initialization, e.g. array( 'forceCompile' => false )
+ */
+ public function __construct(array $options=array())
+ {
+ parent::__construct($options);
+ // register {php} tag
+ $this->registerPlugin('block', 'php', 'smarty_php_tag');
+ }
+
+ /**
+ * wrapper for assign_by_ref
+ *
+ * @param string $tpl_var the template variable name
+ * @param mixed &$value the referenced value to assign
+ */
+ public function assign_by_ref($tpl_var, &$value)
+ {
+ $this->assignByRef($tpl_var, $value);
+ }
+
+ /**
+ * wrapper for append_by_ref
+ *
+ * @param string $tpl_var the template variable name
+ * @param mixed &$value the referenced value to append
+ * @param boolean $merge flag if array elements shall be merged
+ */
+ public function append_by_ref($tpl_var, &$value, $merge = false)
+ {
+ $this->appendByRef($tpl_var, $value, $merge);
+ }
+
+ /**
+ * clear the given assigned template variable.
+ *
+ * @param string $tpl_var the template variable to clear
+ */
+ public function clear_assign($tpl_var)
+ {
+ $this->clearAssign($tpl_var);
+ }
+
+ /**
+ * Registers custom function to be used in templates
+ *
+ * @param string $function the name of the template function
+ * @param string $function_impl the name of the PHP function to register
+ * @param bool $cacheable
+ * @param mixed $cache_attrs
+ */
+ public function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null)
+ {
+ $this->registerPlugin('function', $function, $function_impl, $cacheable, $cache_attrs);
+ }
+
+ /**
+ * Unregisters custom function
+ *
+ * @param string $function name of template function
+ */
+ public function unregister_function($function)
+ {
+ $this->unregisterPlugin('function', $function);
+ }
+
+ /**
+ * 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 array $block_functs list of methods that are block format
+ */
+ public function register_object($object, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+ {
+ settype($allowed, 'array');
+ settype($smarty_args, 'boolean');
+ $this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods);
+ }
+
+ /**
+ * Unregisters object
+ *
+ * @param string $object name of template object
+ */
+ public function unregister_object($object)
+ {
+ $this->unregisterObject($object);
+ }
+
+ /**
+ * Registers block function to be used in templates
+ *
+ * @param string $block name of template block
+ * @param string $block_impl PHP function to register
+ * @param bool $cacheable
+ * @param mixed $cache_attrs
+ */
+ public function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null)
+ {
+ $this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs);
+ }
+
+ /**
+ * Unregisters block function
+ *
+ * @param string $block name of template function
+ */
+ public function unregister_block($block)
+ {
+ $this->unregisterPlugin('block', $block);
+ }
+
+ /**
+ * Registers compiler function
+ *
+ * @param string $function name of template function
+ * @param string $function_impl name of PHP function to register
+ * @param bool $cacheable
+ */
+ public function register_compiler_function($function, $function_impl, $cacheable=true)
+ {
+ $this->registerPlugin('compiler', $function, $function_impl, $cacheable);
+ }
+
+ /**
+ * Unregisters compiler function
+ *
+ * @param string $function name of template function
+ */
+ public function unregister_compiler_function($function)
+ {
+ $this->unregisterPlugin('compiler', $function);
+ }
+
+ /**
+ * Registers modifier to be used in templates
+ *
+ * @param string $modifier name of template modifier
+ * @param string $modifier_impl name of PHP function to register
+ */
+ public function register_modifier($modifier, $modifier_impl)
+ {
+ $this->registerPlugin('modifier', $modifier, $modifier_impl);
+ }
+
+ /**
+ * Unregisters modifier
+ *
+ * @param string $modifier name of template modifier
+ */
+ public function unregister_modifier($modifier)
+ {
+ $this->unregisterPlugin('modifier', $modifier);
+ }
+
+ /**
+ * Registers a resource to fetch a template
+ *
+ * @param string $type name of resource
+ * @param array $functions array of functions to handle resource
+ */
+ public function register_resource($type, $functions)
+ {
+ $this->registerResource($type, $functions);
+ }
+
+ /**
+ * Unregisters a resource
+ *
+ * @param string $type name of resource
+ */
+ public function unregister_resource($type)
+ {
+ $this->unregisterResource($type);
+ }
+
+ /**
+ * Registers a prefilter function to apply
+ * to a template before compiling
+ *
+ * @param callable $function
+ */
+ public function register_prefilter($function)
+ {
+ $this->registerFilter('pre', $function);
+ }
+
+ /**
+ * Unregisters a prefilter function
+ *
+ * @param callable $function
+ */
+ public function unregister_prefilter($function)
+ {
+ $this->unregisterFilter('pre', $function);
+ }
+
+ /**
+ * Registers a postfilter function to apply
+ * to a compiled template after compilation
+ *
+ * @param callable $function
+ */
+ public function register_postfilter($function)
+ {
+ $this->registerFilter('post', $function);
+ }
+
+ /**
+ * Unregisters a postfilter function
+ *
+ * @param callable $function
+ */
+ public function unregister_postfilter($function)
+ {
+ $this->unregisterFilter('post', $function);
+ }
+
+ /**
+ * Registers an output filter function to apply
+ * to a template output
+ *
+ * @param callable $function
+ */
+ public function register_outputfilter($function)
+ {
+ $this->registerFilter('output', $function);
+ }
+
+ /**
+ * Unregisters an outputfilter function
+ *
+ * @param callable $function
+ */
+ public function unregister_outputfilter($function)
+ {
+ $this->unregisterFilter('output', $function);
+ }
+
+ /**
+ * load a filter of specified type and name
+ *
+ * @param string $type filter type
+ * @param string $name filter name
+ */
+ public function load_filter($type, $name)
+ {
+ $this->loadFilter($type, $name);
+ }
+
+ /**
+ * clear cached content for the given template and cache id
+ *
+ * @param string $tpl_file name of template file
+ * @param string $cache_id name of cache_id
+ * @param string $compile_id name of compile_id
+ * @param string $exp_time expiration time
+ * @return boolean
+ */
+ public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
+ {
+ return $this->clearCache($tpl_file, $cache_id, $compile_id, $exp_time);
+ }
+
+ /**
+ * clear the entire contents of cache (all templates)
+ *
+ * @param string $exp_time expire time
+ * @return boolean
+ */
+ public function clear_all_cache($exp_time = null)
+ {
+ return $this->clearCache(null, null, null, $exp_time);
+ }
+
+ /**
+ * test to see if valid cache exists for this template
+ *
+ * @param string $tpl_file name of template file
+ * @param string $cache_id
+ * @param string $compile_id
+ * @return boolean
+ */
+ public function is_cached($tpl_file, $cache_id = null, $compile_id = null)
+ {
+ return $this->isCached($tpl_file, $cache_id, $compile_id);
+ }
+
+ /**
+ * clear all the assigned template variables.
+ */
+ public function clear_all_assign()
+ {
+ $this->clearAllAssign();
+ }
+
+ /**
+ * clears compiled version of specified template resource,
+ * or all compiled template files if one is not specified.
+ * This function is for advanced use only, not normally needed.
+ *
+ * @param string $tpl_file
+ * @param string $compile_id
+ * @param string $exp_time
+ * @return boolean results of {@link smarty_core_rm_auto()}
+ */
+ public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
+ {
+ return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time);
+ }
+
+ /**
+ * Checks whether requested template exists.
+ *
+ * @param string $tpl_file
+ * @return boolean
+ */
+ public function template_exists($tpl_file)
+ {
+ return $this->templateExists($tpl_file);
+ }
+
+ /**
+ * Returns an array containing template variables
+ *
+ * @param string $name
+ * @return array
+ */
+ public function get_template_vars($name=null)
+ {
+ return $this->getTemplateVars($name);
+ }
+
+ /**
+ * Returns an array containing config variables
+ *
+ * @param string $name
+ * @return array
+ */
+ public function get_config_vars($name=null)
+ {
+ return $this->getConfigVars($name);
+ }
+
+ /**
+ * load configuration values
+ *
+ * @param string $file
+ * @param string $section
+ * @param string $scope
+ */
+ public function config_load($file, $section = null, $scope = 'global')
+ {
+ $this->ConfigLoad($file, $section, $scope);
+ }
+
+ /**
+ * return a reference to a registered object
+ *
+ * @param string $name
+ * @return object
+ */
+ public function get_registered_object($name)
+ {
+ return $this->getRegisteredObject($name);
+ }
+
+ /**
+ * clear configuration values
+ *
+ * @param string $var
+ */
+ public function clear_config($var = null)
+ {
+ $this->clearConfig($var);
+ }
+
+ /**
+ * trigger Smarty error
+ *
+ * @param string $error_msg
+ * @param integer $error_type
+ */
+ public function trigger_error($error_msg, $error_type = E_USER_WARNING)
+ {
+ 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 '';
+}
+
+?>
\ No newline at end of file diff --git a/libs/plugins/block.php.php b/libs/plugins/block.php.php deleted file mode 100644 index 8fedd8b4..00000000 --- a/libs/plugins/block.php.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/** - * Smarty plugin to execute PHP code - * - * @package Smarty - * @subpackage PluginsBlock - * @author Uwe Tews - */ - -/** - * Smarty {php}{/php} block plugin - * - * @param string $content contents of the block - * @param object $template template object - * @param boolean $ &$repeat repeat flag - * @return string content re-formatted - */ -function smarty_block_php($params, $content, $template, &$repeat) -{ - if (!$template->allow_php_tag) { - throw new SmartyException("{php} is deprecated, set allow_php_tag = true to enable"); - } - eval($content); - return ''; -} - -?>
\ No newline at end of file diff --git a/libs/plugins/block.textformat.php b/libs/plugins/block.textformat.php index 517fd62d..dc465ac9 100644 --- a/libs/plugins/block.textformat.php +++ b/libs/plugins/block.textformat.php @@ -8,34 +8,35 @@ /** * Smarty {textformat}{/textformat} block plugin - * + * * Type: block function<br> * Name: textformat<br> * Purpose: format text a certain way with preset styles - * or custom wrap/indent settings<br> - * - * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat} - * (Smarty online manual) - * @param array $params parameters + * or custom wrap/indent settings<br> + * Params: * <pre> - * Params: style: string (email) - * indent: integer (0) - * wrap: integer (80) - * wrap_char string ("\n") - * indent_char: string (" ") - * wrap_boundary: boolean (true) + * - style - string (email) + * - indent - integer (0) + * - wrap - integer (80) + * - wrap_char - string ("\n") + * - indent_char - string (" ") + * - wrap_boundary - boolean (true) * </pre> - * @author Monte Ohrt <monte at ohrt dot com> - * @param string $content contents of the block - * @param object $template template object - * @param boolean &$repeat repeat flag + * + * @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat} + * (Smarty online manual) + * @param array $params parameters + * @param string $content contents of the block + * @param Smarty_Internal_Template $template template object + * @param boolean &$repeat repeat flag * @return string content re-formatted + * @author Monte Ohrt <monte at ohrt dot com> */ function smarty_block_textformat($params, $content, $template, &$repeat) { if (is_null($content)) { return; - } + } $style = null; $indent = 0; @@ -67,36 +68,41 @@ function smarty_block_textformat($params, $content, $template, &$repeat) default: trigger_error("textformat: unknown attribute '$_key'"); - } - } + } + } if ($style == 'email') { $wrap = 72; - } + } // split into paragraphs - $_paragraphs = preg_split('![\r\n][\r\n]!', $content); + $_paragraphs = preg_split('![\r\n]{2}!', $content); $_output = ''; for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) { if ($_paragraphs[$_x] == '') { continue; - } + } // convert mult. spaces & special chars to single space - $_paragraphs[$_x] = preg_replace(array('!\s+!', '!(^\s+)|(\s+$)!'), array(' ', ''), $_paragraphs[$_x]); + $_paragraphs[$_x] = preg_replace(array('!\s+!u', '!(^\s+)|(\s+$)!u'), array(' ', ''), $_paragraphs[$_x]); // indent first line if ($indent_first > 0) { $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x]; - } + } // wordwrap sentences - $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut); + if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'); + $_paragraphs[$_x] = smarty_mb_wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut); + } else { + $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut); + } // indent lines if ($indent > 0) { $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]); - } - } + } + } $_output = implode($wrap_char . $wrap_char, $_paragraphs); - + return $assign ? $template->assign($assign, $_output) : $_output; -} +} ?>
\ No newline at end of file diff --git a/libs/plugins/function.counter.php b/libs/plugins/function.counter.php index 7c50bd44..3906badf 100644 --- a/libs/plugins/function.counter.php +++ b/libs/plugins/function.counter.php @@ -11,12 +11,12 @@ * Type: function<br> * Name: counter<br> * Purpose: print out a counter value + * * @author Monte Ohrt <monte at ohrt dot com> - * @link http://smarty.php.net/manual/en/language.function.counter.php {counter} + * @link http://www.smarty.net/manual/en/language.function.counter.php {counter} * (Smarty online manual) - * @param array parameters - * @param Smarty - * @param object $template template object + * @param array $params parameters + * @param Smarty_Internal_Template $template template object * @return string|null */ function smarty_function_counter($params, $template) diff --git a/libs/plugins/function.cycle.php b/libs/plugins/function.cycle.php index 98e3e287..d456ee54 100644 --- a/libs/plugins/function.cycle.php +++ b/libs/plugins/function.cycle.php @@ -13,45 +13,45 @@ * Name: cycle<br> * Date: May 3, 2002<br> * Purpose: cycle through given values<br> - * Input: - * - name = name of cycle (optional) - * - values = comma separated list of values to cycle, - * or an array of values to cycle - * (this can be left out for subsequent calls) - * - reset = boolean - resets given var to true - * - print = boolean - print var or not. default is true - * - advance = boolean - whether or not to advance the cycle - * - delimiter = the value delimiter, default is "," - * - assign = boolean, assigns to template var instead of - * printed. - * + * Params: + * <pre> + * - name - name of cycle (optional) + * - values - comma separated list of values to cycle, or an array of values to cycle + * (this can be left out for subsequent calls) + * - reset - boolean - resets given var to true + * - print - boolean - print var or not. default is true + * - advance - boolean - whether or not to advance the cycle + * - delimiter - the value delimiter, default is "," + * - assign - boolean, assigns to template var instead of printed. + * </pre> * Examples:<br> * <pre> * {cycle values="#eeeeee,#d0d0d0d"} * {cycle name=row values="one,two,three" reset=true} * {cycle name=row} * </pre> - * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle} + * + * @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle} * (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> * @author credit to Mark Priatel <mpriatel@rogers.com> * @author credit to Gerard <gerard@interfold.com> * @author credit to Jason Sweat <jsweat_php@yahoo.com> * @version 1.3 - * @param array - * @param object $template template object + * @param array $params parameters + * @param Smarty_Internal_Template $template template object * @return string|null */ function smarty_function_cycle($params, $template) { static $cycle_vars; - + $name = (empty($params['name'])) ? 'default' : $params['name']; $print = (isset($params['print'])) ? (bool)$params['print'] : true; $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true; $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false; - + if (!in_array('values', array_keys($params))) { if(!isset($cycle_vars[$name]['values'])) { trigger_error("cycle: missing 'values' parameter"); @@ -68,24 +68,24 @@ function smarty_function_cycle($params, $template) if (isset($params['delimiter'])) { $cycle_vars[$name]['delimiter'] = $params['delimiter']; } elseif (!isset($cycle_vars[$name]['delimiter'])) { - $cycle_vars[$name]['delimiter'] = ','; + $cycle_vars[$name]['delimiter'] = ','; } - + if(is_array($cycle_vars[$name]['values'])) { $cycle_array = $cycle_vars[$name]['values']; } else { $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); } - + if(!isset($cycle_vars[$name]['index']) || $reset ) { $cycle_vars[$name]['index'] = 0; } - + if (isset($params['assign'])) { $print = false; $template->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); } - + if($print) { $retval = $cycle_array[$cycle_vars[$name]['index']]; } else { @@ -99,7 +99,7 @@ function smarty_function_cycle($params, $template) $cycle_vars[$name]['index']++; } } - + return $retval; } diff --git a/libs/plugins/function.fetch.php b/libs/plugins/function.fetch.php index a800350b..cde98d2e 100644 --- a/libs/plugins/function.fetch.php +++ b/libs/plugins/function.fetch.php @@ -12,13 +12,13 @@ * Type: function<br> * Name: fetch<br> * Purpose: fetch file, web or ftp data and display results - * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch} + * + * @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch} * (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> - * @param array $params parameters - * @param object $template template object - * @return string|null if the assign parameter is passed, Smarty assigns the - * result to a template variable + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable */ function smarty_function_fetch($params, $template) { @@ -32,7 +32,7 @@ function smarty_function_fetch($params, $template) if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { return; } - + // fetch the file if($fp = @fopen($params['file'],'r')) { while(!feof($fp)) { @@ -52,7 +52,7 @@ function smarty_function_fetch($params, $template) $host = $server_name = $uri_parts['host']; $timeout = 30; $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; - $agent = "Smarty Template Engine ".$template->_version; + $agent = "Smarty Template Engine ". Smarty::SMARTY_VERSION; $referer = ""; $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; diff --git a/libs/plugins/function.html_checkboxes.php b/libs/plugins/function.html_checkboxes.php index 6a1a3ffd..40e4a8fc 100644 --- a/libs/plugins/function.html_checkboxes.php +++ b/libs/plugins/function.html_checkboxes.php @@ -20,20 +20,23 @@ * {html_checkboxes values=$ids name='box' separator='<br>' output=$names} * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names} * </pre> - * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} + * Params: + * <pre> + * - name (optional) - string default "checkbox" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie <br> or + * - output (optional) - the output next to each checkbox + * - assign (optional) - assign the output as an array to this variable + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} * (Smarty online manual) * @author Christopher Kvarme <christopher.kvarme@flashjab.com> * @author credits to Monte Ohrt <monte at ohrt dot com> * @version 1.0 * @param array $params parameters - * Input:<br> - * - name (optional) - string default "checkbox" - * - values (required) - array - * - options (optional) - associative array - * - checked (optional) - array default not set - * - separator (optional) - ie <br> or - * - output (optional) - the output next to each checkbox - * - assign (optional) - assign the output as an array to this variable * @param object $template template object * @return string * @uses smarty_function_escape_special_chars() diff --git a/libs/plugins/function.html_image.php b/libs/plugins/function.html_image.php index f148f1c3..2f1ef641 100644 --- a/libs/plugins/function.html_image.php +++ b/libs/plugins/function.html_image.php @@ -13,23 +13,24 @@ * Name: html_image<br> * Date: Feb 24, 2003<br> * Purpose: format HTML tags for the image<br> - * Examples: {html_image file="/images/masthead.gif"} - * Output: <img src="/images/masthead.gif" width=400 height=23> + * Examples: {html_image file="/images/masthead.gif"}<br> + * Output: <img src="/images/masthead.gif" width=400 height=23><br> + * Params: + * <pre> + * - file - (required) - file (and path) of image + * - height - (optional) - image height (default actual height) + * - width - (optional) - image width (default actual width) + * - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT + * - path_prefix - prefix for path output (optional, default empty) + * </pre> * - * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image} + * @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image} * (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> * @author credits to Duda <duda@big.hu> * @version 1.0 - * @param array $params parameters - * Input:<br> - * - file = file (and path) of image (required) - * - height = image height (optional, default actual height) - * - width = image width (optional, default actual width) - * - basedir = base directory for absolute paths, default - * is environment variable DOCUMENT_ROOT - * - path_prefix = prefix for path output (optional, default empty) - * @param object $template template object + * @param array $params parameters + * @param Smarty_Internal_Template $template template object * @return string * @uses smarty_function_escape_special_chars() */ diff --git a/libs/plugins/function.html_options.php b/libs/plugins/function.html_options.php index 7ac03902..269601a5 100644 --- a/libs/plugins/function.html_options.php +++ b/libs/plugins/function.html_options.php @@ -12,19 +12,24 @@ * Type: function<br> * Name: html_options<br> * Purpose: Prints the list of <option> tags generated from - * the passed parameters + * the passed parameters<br> + * Params: + * <pre> + * - name (optional) - string default "select" + * - values (required) - if no options supplied) - array + * - options (required) - if no values supplied) - associative array + * - selected (optional) - string default not set + * - output (required) - if not options supplied) - array + * - id (optional) - string default not set + * - class (optional) - string default not set + * </pre> * - * @link http://smarty.php.net/manual/en/language.function.html.options.php {html_image} + * @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image} * (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> - * @param array $params parameters - * Input:<br> - * - name (optional) - string default "select" - * - values (required if no options supplied) - array - * - options (required if no values supplied) - associative array - * - selected (optional) - string default not set - * - output (required if not options supplied) - array - * @param object $template template object + * @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de> + * @param array $params parameters + * @param Smarty_Internal_Template $template template object * @return string * @uses smarty_function_escape_special_chars() */ @@ -35,15 +40,14 @@ function smarty_function_html_options($params, $template) $name = null; $values = null; $options = null; - $selected = array(); + $selected = null; $output = null; $id = null; $class = null; $extra = ''; - $options_extra = ''; - foreach($params as $_key => $_val) { + foreach ($params as $_key => $_val) { switch ($_key) { case 'name': case 'class': @@ -52,7 +56,7 @@ function smarty_function_html_options($params, $template) break; case 'options': - $$_key = (array)$_val; + $options = (array)$_val; break; case 'values': @@ -61,7 +65,11 @@ function smarty_function_html_options($params, $template) break; case 'selected': - $$_key = array_map('strval', array_values((array)$_val)); + if (is_array($_val)) { + $selected = array_map('strval', array_values((array)$_val)); + } else { + $selected = $_val; + } break; default: @@ -72,7 +80,7 @@ function smarty_function_html_options($params, $template) } break; } - } + } if (!isset($options) && !isset($values)) return ''; @@ -83,14 +91,14 @@ function smarty_function_html_options($params, $template) if (isset($options)) { foreach ($options as $_key => $_val) { - $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); + $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); } } else { foreach ($values as $_i => $_key) { $_val = isset($output[$_i]) ? $output[$_i] : ''; $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); } - } + } if (!empty($name)) { $_html_class = !empty($class) ? ' class="'.$class.'"' : ''; @@ -99,22 +107,26 @@ function smarty_function_html_options($params, $template) } return $_html_result; -} +} function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx) { if (!is_array($value)) { - $_html_result = '<option value="' . - smarty_function_escape_special_chars($key) . '"'; - if (in_array((string)$key, $selected)) + $_html_result = '<option value="' . smarty_function_escape_special_chars($key) . '"'; + if (is_array($selected)) { + if (in_array((string)$key, $selected)) { + $_html_result .= ' selected="selected"'; + } + } elseif ($key == $selected) { $_html_result .= ' selected="selected"'; + } $_html_class = !empty($class) ? ' class="'.$class.' option"' : ''; $_html_id = !empty($id) ? ' id="'.$id.'-'.$idx.'"' : ''; $_html_result .= $_html_class . $_html_id . '>' . smarty_function_escape_special_chars($value) . '</option>' . "\n"; $idx++; } else { $_idx = 0; - $_html_result = smarty_function_html_options_optgroup($key, $value, $selected, $id.'-'.$idx, $class, $_idx); + $_html_result = smarty_function_html_options_optgroup($key, $value, $selected, !empty($id) ? ($id.'-'.$idx) : null, $class, $_idx); $idx++; } return $_html_result; diff --git a/libs/plugins/function.html_radios.php b/libs/plugins/function.html_radios.php index c6b27edf..83674ec7 100644 --- a/libs/plugins/function.html_radios.php +++ b/libs/plugins/function.html_radios.php @@ -14,6 +14,16 @@ * Name: html_radios<br> * Date: 24.Feb.2003<br> * Purpose: Prints out a list of radio input types<br> + * Params: + * <pre> + * - name (optional) - string default "radio" + * - values (required) - array + * - options (required) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie <br> or + * - output (optional) - the output next to each radio button + * - assign (optional) - assign the output as an array to this variable + * </pre> * Examples: * <pre> * {html_radios values=$ids output=$names} @@ -26,16 +36,8 @@ * @author Christopher Kvarme <christopher.kvarme@flashjab.com> * @author credits to Monte Ohrt <monte at ohrt dot com> * @version 1.0 - * @param array $params parameters - * Input:<br> - * - name (optional) - string default "radio" - * - values (required) - array - * - options (optional) - associative array - * - checked (optional) - array default not set - * - separator (optional) - ie <br> or - * - output (optional) - the output next to each radio button - * - assign (optional) - assign the output as an array to this variable - * @param object $template template object + * @param array $params parameters + * @param Smarty_Internal_Template $template template object * @return string * @uses smarty_function_escape_special_chars() */ diff --git a/libs/plugins/function.html_select_date.php b/libs/plugins/function.html_select_date.php index 1d57fdc7..93a37d74 100644 --- a/libs/plugins/function.html_select_date.php +++ b/libs/plugins/function.html_select_date.php @@ -7,46 +7,65 @@ */ /** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + +/** * Smarty {html_select_date} plugin * * Type: function<br> * Name: html_select_date<br> * Purpose: Prints the dropdowns for date selection. * - * ChangeLog:<br> + * ChangeLog: + * <pre> * - 1.0 initial release * - 1.1 added support for +/- N syntax for begin - * and end year values. (Monte) + * and end year values. (Monte) * - 1.2 added support for yyyy-mm-dd syntax for - * time value. (Jan Rosier) + * time value. (Jan Rosier) * - 1.3 added support for choosing format for - * month values (Gary Loescher) + * month values (Gary Loescher) * - 1.3.1 added support for choosing format for - * day values (Marcus Bointon) + * day values (Marcus Bointon) * - 1.3.2 support negative timestamps, force year * dropdown to include given date unless explicitly set (Monte) * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that * of 0000-00-00 dates (cybot, boots) + * - 2.0 complete rewrite for performance, + * added attributes month_names, *_id + * </pre> * - * @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date} + * @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date} * (Smarty online manual) - * @version 1.3.4 + * @version 2.0 * @author Andrei Zmievski * @author Monte Ohrt <monte at ohrt dot com> - * @param array $params parameters - * @param object $template template object + * @author Rodney Rehm + * @param array $params parameters + * @param Smarty_Internal_Template $template template object * @return string */ function smarty_function_html_select_date($params, $template) { - require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); - require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); - require_once(SMARTY_PLUGINS_DIR . 'function.html_options.php'); + // generate timestamps used for month names only + static $_month_timestamps = null; + if ($_month_timestamps === null) { + $_month_timestamps = array(); + for ($i = 1; $i <= 12; $i++) { + $_month_timestamps[$i] = mktime(0, 0, 0, $i, 1, 2000); + } + } /* Default values. */ $prefix = "Date_"; - $start_year = strftime("%Y"); - $end_year = $start_year; + $start_year = null; + $end_year = null; $display_days = true; $display_months = true; $display_years = true; @@ -80,23 +99,42 @@ function smarty_function_html_select_date($params, $template) $field_order = 'MDY'; /* String printed between the different fields. */ $field_separator = "\n"; - $time = time(); - $all_empty = null; - $day_empty = null; - $month_empty = null; - $year_empty = null; + $option_separator = "\n"; + $time = null; + // $all_empty = null; + // $day_empty = null; + // $month_empty = null; + // $year_empty = null; $extra_attrs = ''; + $all_id = null; + $day_id = null; + $month_id = null; + $year_id = null; foreach ($params as $_key => $_value) { switch ($_key) { - case 'prefix': case 'time': + if (!is_array($_value)) { + $time = smarty_make_timestamp($_value); + } + break; + + case 'month_names': + if (is_array($_value) && count($_value) == 12) { + $$_key = $_value; + } else { + trigger_error("html_select_date: month_names must be an array of 12 strings", E_USER_NOTICE); + } + break; + + case 'prefix': + case 'field_array': case 'start_year': case 'end_year': - case 'month_format': case 'day_format': case 'day_value_format': - case 'field_array': + case 'month_format': + case 'month_value_format': case 'day_size': case 'month_size': case 'year_size': @@ -106,18 +144,18 @@ function smarty_function_html_select_date($params, $template) case 'year_extra': case 'field_order': case 'field_separator': - case 'month_value_format': + case 'option_separator': + case 'all_empty': case 'month_empty': case 'day_empty': case 'year_empty': + case 'all_id': + case 'month_id': + case 'day_id': + case 'year_id': $$_key = (string)$_value; break; - case 'all_empty': - $$_key = (string)$_value; - $day_empty = $month_empty = $year_empty = $all_empty; - break; - case 'display_days': case 'display_months': case 'display_years': @@ -134,197 +172,217 @@ function smarty_function_html_select_date($params, $template) } break; } - } - - if (preg_match('!^-\d+$!', $time)) { - // negative timestamp, use date() - $time = date('Y-m-d', $time); - } - // If $time is not in format yyyy-mm-dd - if (preg_match('/^(\d{0,4}-\d{0,2}-\d{0,2})/', $time, $found)) { - $time = $found[1]; - } else { - // use smarty_make_timestamp to get an unix timestamp and - // strftime to make yyyy-mm-dd - $time = strftime('%Y-%m-%d', smarty_make_timestamp($time)); - } - // Now split this in pieces, which later can be used to set the select - $time = explode("-", $time); - // make syntax "+N" or "-N" work with start_year and end_year - if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) { - if ($match[1] == '+') { - $end_year = strftime('%Y') + $match[2]; - } else { - $end_year = strftime('%Y') - $match[2]; - } - } - if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) { - if ($match[1] == '+') { - $start_year = strftime('%Y') + $match[2]; + } + + // Note: date() is faster than strftime() + // Note: explode(date()) is faster than date() date() date() + if (isset($params['time']) && is_array($params['time'])) { + if (isset($params['time'][$prefix . 'Year'])) { + // $_REQUEST[$field_array] given + foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$prefix . $_elementName]) + ? $params['time'][$prefix . $_elementName] + : date($_elementKey); + } + $time = mktime(0, 0, 0, $_month, $_day, $_year); + } elseif (isset($params['time'][$field_array][$prefix . 'Year'])) { + // $_REQUEST given + foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) + ? $params['time'][$field_array][$prefix . $_elementName] + : date($_elementKey); + } + $time = mktime(0, 0, 0, $_month, $_day, $_year); } else { - $start_year = strftime('%Y') - $match[2]; - } - } - if (strlen($time[0]) > 0) { - if ($start_year > $time[0] && !isset($params['start_year'])) { - // force start year to include given date if not explicitly set - $start_year = $time[0]; - } - if ($end_year < $time[0] && !isset($params['end_year'])) { - // force end year to include given date if not explicitly set - $end_year = $time[0]; - } - } - - $field_order = strtoupper($field_order); - - $html_result = $month_result = $day_result = $year_result = ""; - - $field_separator_count = -1; - if ($display_months) { - $field_separator_count++; - $month_names = array(); - $month_values = array(); - if (isset($month_empty)) { - $month_names[''] = $month_empty; - $month_values[''] = ''; - } - for ($i = 1; $i <= 12; $i++) { - $month_names[$i] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000)); - $month_values[$i] = strftime($month_value_format, mktime(0, 0, 0, $i, 1, 2000)); - } + // no date found, use NOW + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } elseif ($time === null) { + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } else { + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time)); + } - $month_result .= '<select name='; - if (null !== $field_array) { - $month_result .= '"' . $field_array . '[' . $prefix . 'Month]"'; + // make syntax "+N" or "-N" work with $start_year and $end_year + // Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr + foreach (array('start', 'end') as $key) { + $key .= '_year'; + $t = $$key; + if ($t === null) { + $$key = (int)$_year; + } else if ($t[0] == '+') { + $$key = (int)($_year + trim(substr($t, 1))); + } else if ($t[0] == '-') { + $$key = (int)($_year - trim(substr($t, 1))); } else { - $month_result .= '"' . $prefix . 'Month"'; - } - if (null !== $month_size) { - $month_result .= ' size="' . $month_size . '"'; - } - if (null !== $month_extra) { - $month_result .= ' ' . $month_extra; - } - if (null !== $all_extra) { - $month_result .= ' ' . $all_extra; - } - $month_result .= $extra_attrs . '>' . "\n"; - - $month_result .= smarty_function_html_options(array('output' => $month_names, - 'values' => $month_values, - 'selected' => (int)$time[1] ? strftime($month_value_format, mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '', - 'print_result' => false), - $template); - $month_result .= '</select>'; - } + $$key = (int)$$key; + } + } - if ($display_days) { - $field_separator_count++; - $days = array(); - if (isset($day_empty)) { - $days[''] = $day_empty; - $day_values[''] = ''; - } - for ($i = 1; $i <= 31; $i++) { - $days[] = sprintf($day_format, $i); - $day_values[] = sprintf($day_value_format, $i); - } - - $day_result .= '<select name='; - if (null !== $field_array) { - $day_result .= '"' . $field_array . '[' . $prefix . 'Day]"'; - } else { - $day_result .= '"' . $prefix . 'Day"'; - } - if (null !== $day_size) { - $day_result .= ' size="' . $day_size . '"'; - } - if (null !== $all_extra) { - $day_result .= ' ' . $all_extra; - } - if (null !== $day_extra) { - $day_result .= ' ' . $day_extra; - } - $day_result .= $extra_attrs . '>' . "\n"; - $day_result .= smarty_function_html_options(array('output' => $days, - 'values' => $day_values, - 'selected' => $time[2], - 'print_result' => false), - $template); - $day_result .= '</select>'; - } + // flip for ascending or descending + if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) { + $t = $end_year; + $end_year = $start_year; + $start_year = $t; + } + // generate year <select> or <input> if ($display_years) { - $field_separator_count++; - if (null !== $field_array) { - $year_name = $field_array . '[' . $prefix . 'Year]'; - } else { - $year_name = $prefix . 'Year'; + $_html_years = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; } + if ($year_extra) { + $_extra .= ' ' . $year_extra; + } + if ($year_as_text) { - $year_result .= '<input type="text" name="' . $year_name . '" value="' . $time[0] . '" size="4" maxlength="4"'; - if (null !== $all_extra) { - $year_result .= ' ' . $all_extra; - } - if (null !== $year_extra) { - $year_result .= ' ' . $year_extra; - } - $year_result .= ' />'; + $_html_years = '<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra . $extra_attrs . ' />'; } else { - $years = range((int)$start_year, (int)$end_year); - if ($reverse_years) { - rsort($years, SORT_NUMERIC); - } else { - sort($years, SORT_NUMERIC); - } - $yearvals = $years; - if (isset($year_empty)) { - array_unshift($years, $year_empty); - array_unshift($yearvals, ''); + $_html_years = '<select name="' . $_name . '"'; + if ($year_id !== null || $all_id !== null) { + $_html_years .= ' id="' . smarty_function_escape_special_chars( + $year_id !== null ? ( $year_id ? $year_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($year_size) { + $_html_years .= ' size="' . $year_size . '"'; } - $year_result .= '<select name="' . $year_name . '"'; - if (null !== $year_size) { - $year_result .= ' size="' . $year_size . '"'; - } - if (null !== $all_extra) { - $year_result .= ' ' . $all_extra; - } - if (null !== $year_extra) { - $year_result .= ' ' . $year_extra; - } - $year_result .= $extra_attrs . '>' . "\n"; - $year_result .= smarty_function_html_options(array('output' => $years, - 'values' => $yearvals, - 'selected' => $time[0], - 'print_result' => false), - $template); - $year_result .= '</select>'; + $_html_years .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($year_empty) || isset($all_empty)) { + $_html_years .= '<option value="">' . ( isset($year_empty) ? $year_empty : $all_empty ) . '</option>' . $option_separator; + } + + $op = $start_year > $end_year ? -1 : 1; + for ($i=$start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) { + $_html_years .= '<option value="' . $i . '"' + . ($_year == $i ? ' selected="selected"' : '') + . '>' . $i . '</option>' . $option_separator; + } + + $_html_years .= '</select>'; + } + } + + // generate month <select> or <input> + if ($display_months) { + $_html_month = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; } - } - // Loop thru the field_order field - for ($i = 0; $i <= 2; $i++) { - $c = substr($field_order, $i, 1); - switch ($c) { - case 'D': - $html_result .= $day_result; - break; - - case 'M': - $html_result .= $month_result; - break; - - case 'Y': - $html_result .= $year_result; - break; + if ($month_extra) { + $_extra .= ' ' . $month_extra; + } + + $_html_months = '<select name="' . $_name . '"'; + if ($month_id !== null || $all_id !== null) { + $_html_months .= ' id="' . smarty_function_escape_special_chars( + $month_id !== null ? ( $month_id ? $month_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($month_size) { + $_html_months .= ' size="' . $month_size . '"'; + } + $_html_months .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($month_empty) || isset($all_empty)) { + $_html_months .= '<option value="">' . ( isset($month_empty) ? $month_empty : $all_empty ) . '</option>' . $option_separator; + } + + for ($i = 1; $i <= 12; $i++) { + $_val = sprintf('%02d', $i); + $_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[$i]) : ($month_format == "%m" ? $_val : strftime($month_format, $_month_timestamps[$i])); + $_value = $month_value_format == "%m" ? $_val : strftime($month_value_format, $_month_timestamps[$i]); + $_html_months .= '<option value="' . $_value . '"' + . ($_val == $_month ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_months .= '</select>'; + } + + // generate day <select> or <input> + if ($display_days) { + $_html_day = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; } - // Add the field seperator - if ($i < $field_separator_count) { - $html_result .= $field_separator; + if ($day_extra) { + $_extra .= ' ' . $day_extra; + } + + $_html_days = '<select name="' . $_name . '"'; + if ($day_id !== null || $all_id !== null) { + $_html_days .= ' id="' . smarty_function_escape_special_chars( + $day_id !== null ? ( $day_id ? $day_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($day_size) { + $_html_days .= ' size="' . $day_size . '"'; } - } + $_html_days .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($day_empty) || isset($all_empty)) { + $_html_days .= '<option value="">' . ( isset($day_empty) ? $day_empty : $all_empty ) . '</option>' . $option_separator; + } + + for ($i = 1; $i <= 31; $i++) { + $_val = sprintf('%02d', $i); + $_text = $day_format == '%02d' ? $_val : sprintf($day_format, $i); + $_value = $day_value_format == '%02d' ? $_val : sprintf($day_value_format, $i); + $_html_days .= '<option value="' . $_value . '"' + . ($_val == $_day ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_days .= '</select>'; + } - return $html_result; + // order the fields for output + $_html = ''; + for ($i=0; $i <= 2; $i++) { + switch ($field_order[$i]) { + case 'Y': + case 'y': + if (isset($_html_years)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_years; + } + break; + + case 'm': + case 'M': + if (isset($_html_months)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_months; + } + break; + + case 'd': + case 'D': + if (isset($_html_days)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_days; + } + break; + } + } + return $_html; } ?>
\ No newline at end of file diff --git a/libs/plugins/function.html_select_time.php b/libs/plugins/function.html_select_time.php index ddde4f5a..f4a19dd7 100644 --- a/libs/plugins/function.html_select_time.php +++ b/libs/plugins/function.html_select_time.php @@ -1,47 +1,78 @@ <?php /** * Smarty plugin - * + * * @package Smarty * @subpackage PluginsFunction */ /** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + +/** * Smarty {html_select_time} function plugin - * + * * Type: function<br> * Name: html_select_time<br> * Purpose: Prints the dropdowns for time selection - * - * @link http://smarty.php.net/manual/en/language.function.html.select.time.php {html_select_time} + * + * @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time} * (Smarty online manual) - * @author Roberto Berto <roberto@berto.net> - * @credits Monte Ohrt <monte AT ohrt DOT com> - * @param array $params parameters - * @param object $template template object - * @return string + * @author Roberto Berto <roberto@berto.net> + * @author Monte Ohrt <monte AT ohrt DOT com> + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string * @uses smarty_make_timestamp() */ function smarty_function_html_select_time($params, $template) { - require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); - require_once(SMARTY_PLUGINS_DIR . 'function.html_options.php'); - - /* Default values. */ $prefix = "Time_"; - $time = time(); + $field_array = null; + $field_separator = "\n"; + $option_separator = "\n"; + $time = null; + $display_hours = true; $display_minutes = true; $display_seconds = true; $display_meridian = true; + + $hour_format = '%02d'; + $hour_value_format = '%02d'; + $minute_format = '%02d'; + $minute_value_format = '%02d'; + $second_format = '%02d'; + $second_value_format = '%02d'; + + $hour_size = null; + $minute_size = null; + $second_size = null; + $meridian_size = null; + + $all_empty = null; + $hour_empty = null; + $minute_empty = null; + $second_empty = null; + $meridian_empty = null; + + $all_id = null; + $hour_id = null; + $minute_id = null; + $second_id = null; + $meridian_id = null; + $use_24_hours = true; $minute_interval = 1; $second_interval = 1; - /* Should the select boxes be part of an array when returned from PHP? - e.g. setting it to "birthday", would create "birthday[Hour]", - "birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]". - Can be combined with prefix. */ - $field_array = null; + + $extra_attrs = ''; $all_extra = null; $hour_extra = null; $minute_extra = null; @@ -50,14 +81,42 @@ function smarty_function_html_select_time($params, $template) foreach ($params as $_key => $_value) { switch ($_key) { - case 'prefix': case 'time': + if (!is_array($_value)) { + $time = smarty_make_timestamp($_value); + } + break; + + case 'prefix': case 'field_array': + + case 'field_separator': + case 'option_separator': + case 'all_extra': case 'hour_extra': case 'minute_extra': case 'second_extra': case 'meridian_extra': + + case 'all_empty': + case 'hour_empty': + case 'minute_empty': + case 'second_empty': + case 'meridian_empty': + + case 'all_id': + case 'hour_id': + case 'minute_id': + case 'second_id': + case 'meridian_id': + + case 'hour_format': + case 'hour_value_format': + case 'minute_format': + case 'minute_value_format': + case 'second_format': + case 'second_value_format': $$_key = (string)$_value; break; @@ -71,124 +130,235 @@ function smarty_function_html_select_time($params, $template) case 'minute_interval': case 'second_interval': + + case 'hour_size': + case 'minute_size': + case 'second_size': + case 'meridian_size': $$_key = (int)$_value; break; default: - trigger_error("[html_select_time] unknown parameter $_key", E_USER_WARNING); - } - } - - $time = smarty_make_timestamp($time); + if (!is_array($_value)) { + $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; + } else { + trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } - $html_result = ''; + if (isset($params['time']) && is_array($params['time'])) { + if (isset($params['time'][$prefix . 'Hour'])) { + // $_REQUEST[$field_array] given + foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$prefix . $_elementName]) + ? $params['time'][$prefix . $_elementName] + : date($_elementKey); + } + $_meridian = isset($params['time'][$prefix . 'Meridian']) + ? (' ' . $params['time'][$prefix . 'Meridian']) + : ''; + $time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian ); + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } elseif (isset($params['time'][$field_array][$prefix . 'Hour'])) { + // $_REQUEST given + foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) + ? $params['time'][$field_array][$prefix . $_elementName] + : date($_elementKey); + } + $_meridian = isset($params['time'][$field_array][$prefix . 'Meridian']) + ? (' ' . $params['time'][$field_array][$prefix . 'Meridian']) + : ''; + $time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian ); + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } else { + // no date found, use NOW + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } elseif ($time === null) { + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s')); + } else { + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } + // generate hour <select> if ($display_hours) { - $hours = $use_24_hours ? range(0, 23) : range(1, 12); - $hour_fmt = $use_24_hours ? '%H' : '%I'; - for ($i = 0, $for_max = count($hours); $i < $for_max; $i++) - $hours[$i] = sprintf('%02d', $hours[$i]); - $html_result .= '<select name='; - if (null !== $field_array) { - $html_result .= '"' . $field_array . '[' . $prefix . 'Hour]"'; - } else { - $html_result .= '"' . $prefix . 'Hour"'; - } - if (null !== $hour_extra) { - $html_result .= ' ' . $hour_extra; - } - if (null !== $all_extra) { - $html_result .= ' ' . $all_extra; - } - $html_result .= '>' . "\n"; - $html_result .= smarty_function_html_options(array('output' => $hours, - 'values' => $hours, - 'selected' => strftime($hour_fmt, $time), - 'print_result' => false), - $template); - $html_result .= "</select>\n"; - } + $_html_hours = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($hour_extra) { + $_extra .= ' ' . $hour_extra; + } + + $_html_hours = '<select name="' . $_name . '"'; + if ($hour_id !== null || $all_id !== null) { + $_html_hours .= ' id="' . smarty_function_escape_special_chars( + $hour_id !== null ? ( $hour_id ? $hour_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($hour_size) { + $_html_hours .= ' size="' . $hour_size . '"'; + } + $_html_hours .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($hour_empty) || isset($all_empty)) { + $_html_hours .= '<option value="">' . ( isset($hour_empty) ? $hour_empty : $all_empty ) . '</option>' . $option_separator; + } + + $start = $use_24_hours ? 0 : 1; + $end = $use_24_hours ? 23 : 12; + for ($i=$start; $i <= $end; $i++) { + $_val = sprintf('%02d', $i); + $_text = $hour_format == '%02d' ? $_val : sprintf($hour_format, $i); + $_value = $hour_value_format == '%02d' ? $_val : sprintf($hour_value_format, $i); + + if ($use_24_hours) { + $selected = $_hour == $_val; + } else { + $_hour12 = $_hour == 0 + ? 12 + : ($_hour <= 12 ? $_hour : $_hour -12); + } + + $selected = $use_24_hours ? $_hour == $_val : $_hour12 == $_val; + $_html_hours .= '<option value="' . $_value . '"' + . ($selected ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + $_html_hours .= '</select>'; + } + + // generate minute <select> if ($display_minutes) { - $all_minutes = range(0, 59); - for ($i = 0, $for_max = count($all_minutes); $i < $for_max; $i += $minute_interval) - $minutes[] = sprintf('%02d', $all_minutes[$i]); - $selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval); - $html_result .= '<select name='; - if (null !== $field_array) { - $html_result .= '"' . $field_array . '[' . $prefix . 'Minute]"'; - } else { - $html_result .= '"' . $prefix . 'Minute"'; - } - if (null !== $minute_extra) { - $html_result .= ' ' . $minute_extra; - } - if (null !== $all_extra) { - $html_result .= ' ' . $all_extra; - } - $html_result .= '>' . "\n"; + $_html_minutes = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($minute_extra) { + $_extra .= ' ' . $minute_extra; + } + + $_html_minutes = '<select name="' . $_name . '"'; + if ($minute_id !== null || $all_id !== null) { + $_html_minutes .= ' id="' . smarty_function_escape_special_chars( + $minute_id !== null ? ( $minute_id ? $minute_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($minute_size) { + $_html_minutes .= ' size="' . $minute_size . '"'; + } + $_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator; - $html_result .= smarty_function_html_options(array('output' => $minutes, - 'values' => $minutes, - 'selected' => $selected, - 'print_result' => false), - $template); - $html_result .= "</select>\n"; - } + if (isset($minute_empty) || isset($all_empty)) { + $_html_minutes .= '<option value="">' . ( isset($minute_empty) ? $minute_empty : $all_empty ) . '</option>' . $option_separator; + } + $selected = $_minute - $_minute % $minute_interval; + for ($i=0; $i <= 59; $i += $minute_interval) { + $_val = sprintf('%02d', $i); + $_text = $minute_format == '%02d' ? $_val : sprintf($minute_format, $i); + $_value = $minute_value_format == '%02d' ? $_val : sprintf($minute_value_format, $i); + $_html_minutes .= '<option value="' . $_value . '"' + . ($selected == $i ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_minutes .= '</select>'; + } + + // generate second <select> if ($display_seconds) { - $all_seconds = range(0, 59); - for ($i = 0, $for_max = count($all_seconds); $i < $for_max; $i += $second_interval) - $seconds[] = sprintf('%02d', $all_seconds[$i]); - $selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval); - $html_result .= '<select name='; - if (null !== $field_array) { - $html_result .= '"' . $field_array . '[' . $prefix . 'Second]"'; - } else { - $html_result .= '"' . $prefix . 'Second"'; - } + $_html_seconds = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($second_extra) { + $_extra .= ' ' . $second_extra; + } - if (null !== $second_extra) { - $html_result .= ' ' . $second_extra; - } - if (null !== $all_extra) { - $html_result .= ' ' . $all_extra; - } - $html_result .= '>' . "\n"; + $_html_seconds = '<select name="' . $_name . '"'; + if ($second_id !== null || $all_id !== null) { + $_html_seconds .= ' id="' . smarty_function_escape_special_chars( + $second_id !== null ? ( $second_id ? $second_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($second_size) { + $_html_seconds .= ' size="' . $second_size . '"'; + } + $_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator; - $html_result .= smarty_function_html_options(array('output' => $seconds, - 'values' => $seconds, - 'selected' => $selected, - 'print_result' => false), - $template); - $html_result .= "</select>\n"; - } + if (isset($second_empty) || isset($all_empty)) { + $_html_seconds .= '<option value="">' . ( isset($second_empty) ? $second_empty : $all_empty ) . '</option>' . $option_separator; + } + $selected = $_second - $_second % $second_interval; + for ($i=0; $i <= 59; $i += $second_interval) { + $_val = sprintf('%02d', $i); + $_text = $second_format == '%02d' ? $_val : sprintf($second_format, $i); + $_value = $second_value_format == '%02d' ? $_val : sprintf($second_value_format, $i); + $_html_seconds .= '<option value="' . $_value . '"' + . ($selected == $i ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_seconds .= '</select>'; + } + + // generate meridian <select> if ($display_meridian && !$use_24_hours) { - $html_result .= '<select name='; - if (null !== $field_array) { - $html_result .= '"' . $field_array . '[' . $prefix . 'Meridian]"'; - } else { - $html_result .= '"' . $prefix . 'Meridian"'; - } + $_html_meridian = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($meridian_extra) { + $_extra .= ' ' . $meridian_extra; + } + + $_html_meridian = '<select name="' . $_name . '"'; + if ($meridian_id !== null || $all_id !== null) { + $_html_meridian .= ' id="' . smarty_function_escape_special_chars( + $meridian_id !== null ? ( $meridian_id ? $meridian_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($meridian_size) { + $_html_meridian .= ' size="' . $meridian_size . '"'; + } + $_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($meridian_empty) || isset($all_empty)) { + $_html_meridian .= '<option value="">' . ( isset($meridian_empty) ? $meridian_empty : $all_empty ) . '</option>' . $option_separator; + } - if (null !== $meridian_extra) { - $html_result .= ' ' . $meridian_extra; - } - if (null !== $all_extra) { - $html_result .= ' ' . $all_extra; - } - $html_result .= '>' . "\n"; + $_html_meridian .= '<option value="am"'. ($_hour < 12 ? ' selected="selected"' : '') .'>AM</option>' . $option_separator + . '<option value="pm"'. ($_hour < 12 ? '' : ' selected="selected"') .'>PM</option>' . $option_separator + . '</select>'; + } - $html_result .= smarty_function_html_options(array('output' => array('AM', 'PM'), - 'values' => array('am', 'pm'), - 'selected' => strtolower(strftime('%p', $time)), - 'print_result' => false), - $template); - $html_result .= "</select>\n"; - } + $_html = ''; + foreach (array('_html_hours', '_html_minutes', '_html_seconds', '_html_meridian') as $k) { + if (isset($$k)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $$k; + } + } - return $html_result; -} + return $_html; +} ?>
\ No newline at end of file diff --git a/libs/plugins/function.html_table.php b/libs/plugins/function.html_table.php index 7986a9bc..6b9cb9d1 100644 --- a/libs/plugins/function.html_table.php +++ b/libs/plugins/function.html_table.php @@ -1,51 +1,51 @@ <?php /** * Smarty plugin - * + * * @package Smarty * @subpackage PluginsFunction */ /** * Smarty {html_table} function plugin - * + * * Type: function<br> * Name: html_table<br> * Date: Feb 17, 2003<br> * Purpose: make an html table from an array of data<br> - * - * + * Params: + * <pre> + * - loop - array to loop through + * - cols - number of columns, comma separated list of column names + * or array of column names + * - rows - number of rows + * - table_attr - table attributes + * - th_attr - table heading attributes (arrays are cycled) + * - tr_attr - table row attributes (arrays are cycled) + * - td_attr - table cell attributes (arrays are cycled) + * - trailpad - value to pad trailing cells with + * - caption - text for caption element + * - vdir - vertical direction (default: "down", means top-to-bottom) + * - hdir - horizontal direction (default: "right", means left-to-right) + * - inner - inner loop (default "cols": print $loop line by line, + * $loop will be printed column by column otherwise) + * </pre> * Examples: * <pre> * {table loop=$data} * {table loop=$data cols=4 tr_attr='"bgcolor=red"'} * {table loop=$data cols="first,second,third" tr_attr=$colors} * </pre> - * - * @author Monte Ohrt <monte at ohrt dot com> - * @author credit to Messju Mohr <messju at lammfellpuschen dot de> - * @author credit to boots <boots dot smarty at yahoo dot com> + * + * @author Monte Ohrt <monte at ohrt dot com> + * @author credit to Messju Mohr <messju at lammfellpuschen dot de> + * @author credit to boots <boots dot smarty at yahoo dot com> * @version 1.1 - * @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table} + * @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table} * (Smarty online manual) - * @param array $params parameters - * Input:<br> - * - loop = array to loop through - * - cols = number of columns, comma separated list of column names - * or array of column names - * - rows = number of rows - * - table_attr = table attributes - * - th_attr = table heading attributes (arrays are cycled) - * - tr_attr = table row attributes (arrays are cycled) - * - td_attr = table cell attributes (arrays are cycled) - * - trailpad = value to pad trailing cells with - * - caption = text for caption element - * - vdir = vertical direction (default: "down", means top-to-bottom) - * - hdir = horizontal direction (default: "right", means left-to-right) - * - inner = inner loop (default "cols": print $loop line by line, - * $loop will be printed column by column otherwise) - * @param object $template template object - * @return string + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string */ function smarty_function_html_table($params, $template) { @@ -65,7 +65,7 @@ function smarty_function_html_table($params, $template) if (!isset($params['loop'])) { trigger_error("html_table: missing 'loop' parameter",E_USER_WARNING); return; - } + } foreach ($params as $_key => $_value) { switch ($_key) { @@ -84,7 +84,7 @@ function smarty_function_html_table($params, $template) $cols_count = (int)$_value; } else { $cols_count = $cols; - } + } break; case 'rows': @@ -105,8 +105,8 @@ function smarty_function_html_table($params, $template) case 'th_attr': $$_key = $_value; break; - } - } + } + } $loop_count = count($loop); if (empty($params['rows'])) { @@ -116,14 +116,14 @@ function smarty_function_html_table($params, $template) if (!empty($params['rows'])) { /* no cols specified, but rows */ $cols_count = ceil($loop_count / $rows); - } - } + } + } $output = "<table $table_attr>\n"; if (!empty($caption)) { $output .= '<caption>' . $caption . "</caption>\n"; - } + } if (is_array($cols)) { $cols = ($hdir == 'right') ? $cols : array_reverse($cols); @@ -133,9 +133,9 @@ function smarty_function_html_table($params, $template) $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>'; $output .= $cols[$r]; $output .= "</th>\n"; - } + } $output .= "</tr></thead>\n"; - } + } $output .= "<tbody>\n"; for ($r = 0; $r < $rows; $r++) { @@ -147,21 +147,21 @@ function smarty_function_html_table($params, $template) if ($inner != 'cols') { /* shuffle x to loop over rows*/ $x = floor($x / $cols_count) + ($x % $cols_count) * $rows; - } + } if ($x < $loop_count) { $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n"; } else { $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n"; - } - } + } + } $output .= "</tr>\n"; - } + } $output .= "</tbody>\n"; $output .= "</table>\n"; return $output; -} +} function smarty_function_html_table_cycle($name, $var, $no) { @@ -169,7 +169,7 @@ function smarty_function_html_table_cycle($name, $var, $no) $ret = $var; } else { $ret = $var[$no % count($var)]; - } + } return ($ret) ? ' ' . $ret : ''; } diff --git a/libs/plugins/function.mailto.php b/libs/plugins/function.mailto.php index 976218f5..5875713a 100644 --- a/libs/plugins/function.mailto.php +++ b/libs/plugins/function.mailto.php @@ -1,20 +1,34 @@ <?php /** * Smarty plugin - * + * * @package Smarty * @subpackage PluginsFunction */ /** * Smarty {mailto} function plugin - * + * * Type: function<br> * Name: mailto<br> * Date: May 21, 2002 - * Purpose: automate mailto address link creation, and optionally - * encode them.<br> - * + * Purpose: automate mailto address link creation, and optionally encode them.<br> + * Params: + * <pre> + * - address - (required) - e-mail address + * - text - (optional) - text to display, default is address + * - encode - (optional) - can be one of: + * * none : no encoding (default) + * * javascript : encode with javascript + * * javascript_charcode : encode with javascript charcode + * * hex : encode with hexidecimal (no javascript) + * - cc - (optional) - address(es) to carbon copy + * - bcc - (optional) - address(es) to blind carbon copy + * - subject - (optional) - e-mail subject + * - newsgroups - (optional) - newsgroup(s) to post to + * - followupto - (optional) - address(es) to follow up to + * - extra - (optional) - extra tags for the href link + * </pre> * Examples: * <pre> * {mailto address="me@domain.com"} @@ -24,29 +38,15 @@ * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"} * {mailto address="me@domain.com" extra='class="mailto"'} * </pre> - * - * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto} + * + * @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto} * (Smarty online manual) * @version 1.2 - * @author Monte Ohrt <monte at ohrt dot com> - * @author credits to Jason Sweat (added cc, bcc and subject functionality) - * @param array $params parameters - * Input:<br> - * - address = e-mail address - * - text = (optional) text to display, default is address - * - encode = (optional) can be one of: - * * none : no encoding (default) - * * javascript : encode with javascript - * * javascript_charcode : encode with javascript charcode - * * hex : encode with hexidecimal (no javascript) - * - cc = (optional) address(es) to carbon copy - * - bcc = (optional) address(es) to blind carbon copy - * - subject = (optional) e-mail subject - * - newsgroups = (optional) newsgroup(s) to post to - * - followupto = (optional) address(es) to follow up to - * - extra = (optional) extra tags for the href link - * @param object $template template object - * @return string + * @author Monte Ohrt <monte at ohrt dot com> + * @author credits to Jason Sweat (added cc, bcc and subject functionality) + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string */ function smarty_function_mailto($params, $template) { @@ -57,9 +57,9 @@ function smarty_function_mailto($params, $template) return; } else { $address = $params['address']; - } + } - $text = $address; + $text = $address; // netscape and mozilla do not decode %40 (@) in BCC field (bug?) // so, don't encode it. $search = array('%40', '%2C'); @@ -84,29 +84,29 @@ function smarty_function_mailto($params, $template) $$var = $value; default: - } - } + } + } $mail_parm_vals = ''; - for ($i = 0; $i < count($mail_parms); $i++) { + for ($i = 0, $_length = count($mail_parms); $i < $_length; $i++) { $mail_parm_vals .= (0 == $i) ? '?' : '&'; $mail_parm_vals .= $mail_parms[$i]; - } + } $address .= $mail_parm_vals; $encode = (empty($params['encode'])) ? 'none' : $params['encode']; if (!in_array($encode, array('javascript', 'javascript_charcode', 'hex', 'none'))) { - trigger_error("mailto: 'encode' parameter must be none, javascript or hex",E_USER_WARNING); + trigger_error("mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex", E_USER_WARNING); return; - } - + } + // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed! if ($encode == 'javascript') { $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');'; $js_encode = ''; - for ($x = 0; $x < strlen($string); $x++) { + for ($x = 0, $_length = strlen($string); $x < $_length; $x++) { $js_encode .= '%' . bin2hex($string[$x]); - } + } return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>'; } elseif ($encode == 'javascript_charcode') { @@ -114,7 +114,7 @@ function smarty_function_mailto($params, $template) for($x = 0, $y = strlen($string); $x < $y; $x++) { $ord[] = ord($string[$x]); - } + } $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n"; $_ret .= "<!--\n"; @@ -131,26 +131,26 @@ function smarty_function_mailto($params, $template) if (!empty($match[2])) { trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.",E_USER_WARNING); return; - } + } $address_encode = ''; - for ($x = 0; $x < strlen($address); $x++) { - if (preg_match('!\w!', $address[$x])) { + for ($x = 0, $_length = strlen($address); $x < $_length; $x++) { + if (preg_match('!\w!u', $address[$x])) { $address_encode .= '%' . bin2hex($address[$x]); } else { $address_encode .= $address[$x]; - } - } + } + } $text_encode = ''; - for ($x = 0; $x < strlen($text); $x++) { + for ($x = 0, $_length = strlen($text); $x < $_length; $x++) { $text_encode .= '&#x' . bin2hex($text[$x]) . ';'; - } + } $mailto = "mailto:"; return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>'; } else { // no encoding return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; - } -} + } +} ?>
\ No newline at end of file diff --git a/libs/plugins/function.math.php b/libs/plugins/function.math.php index cd90020a..cdbe6d61 100644 --- a/libs/plugins/function.math.php +++ b/libs/plugins/function.math.php @@ -12,12 +12,13 @@ * * Type: function<br> * Name: math<br> - * Purpose: handle math computations in template<br> - * @link http://smarty.php.net/manual/en/language.function.math.php {math} + * Purpose: handle math computations in template + * + * @link http://www.smarty.net/manual/en/language.function.math.php {math} * (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> - * @param array $params parameters - * @param object $template template object + * @param array $params parameters + * @param Smarty_Internal_Template $template template object * @return string|null */ function smarty_function_math($params, $template) @@ -40,7 +41,7 @@ function smarty_function_math($params, $template) preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match); $allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10', 'max','min','pi','pow','rand','round','sin','sqrt','srand','tan'); - + foreach($match[1] as $curr_var) { if ($curr_var && !in_array($curr_var, array_keys($params)) && !in_array($curr_var, $allowed_funcs)) { trigger_error("math: function call $curr_var not allowed",E_USER_WARNING); diff --git a/libs/plugins/modifier.capitalize.php b/libs/plugins/modifier.capitalize.php index cd24589d..1e199096 100644 --- a/libs/plugins/modifier.capitalize.php +++ b/libs/plugins/modifier.capitalize.php @@ -12,25 +12,53 @@ * Type: modifier<br> * Name: capitalize<br> * Purpose: capitalize words in the string - * - * @link + * + * {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }} + * + * @param string $string string to capitalize + * @param boolean $uc_digits also capitalize "x123" to "X123" + * @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa" + * @return string capitalized string * @author Monte Ohrt <monte at ohrt dot com> - * @param string $ - * @return string + * @author Rodney Rehm */ -function smarty_modifier_capitalize($string, $uc_digits = false) -{ - // uppercase with php function ucwords - $upper_string = ucwords($string); - // check for any missed hyphenated words - $upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!ue", "'\\1'.ucfirst('\\2')", $upper_string); +function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false) +{ + if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + if ($lc_rest) { + // uppercase (including hyphenated words) + $upper_string = mb_convert_case( $string, MB_CASE_TITLE, SMARTY_RESOURCE_CHAR_SET ); + } else { + // uppercase word breaks + $upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!ueS", "stripslashes('\\1').mb_convert_case(stripslashes('\\2'),MB_CASE_UPPER, SMARTY_RESOURCE_CHAR_SET)", $string); + } + // check uc_digits case + if (!$uc_digits) { + if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!u", $string, $matches, PREG_OFFSET_CAPTURE)) { + foreach($matches[1] as $match) { + $upper_string = substr_replace($upper_string, mb_strtolower($match[0], SMARTY_RESOURCE_CHAR_SET), $match[1], strlen($match[0])); + } + } + } + $upper_string = preg_replace("!((^|\s)['\"])(\w)!ue", "stripslashes('\\1').mb_convert_case(stripslashes('\\3'),MB_CASE_UPPER, SMARTY_RESOURCE_CHAR_SET)", $upper_string); + return $upper_string; + } + + // lowercase first + if ($lc_rest) { + $string = strtolower($string); + } + // uppercase (including hyphenated words) + $upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!ueS", "stripslashes('\\1').ucfirst(stripslashes('\\2'))", $string); // check uc_digits case if (!$uc_digits) { if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!u", $string, $matches, PREG_OFFSET_CAPTURE)) { - foreach($matches[1] as $match) - $upper_string = substr_replace($upper_string, $match[0], $match[1], strlen($match[0])); + foreach($matches[1] as $match) { + $upper_string = substr_replace($upper_string, strtolower($match[0]), $match[1], strlen($match[0])); + } } - } + } + $upper_string = preg_replace("!((^|\s)['\"])(\w)!ue", "stripslashes('\\1').strtoupper(stripslashes('\\3'))", $upper_string); return $upper_string; } diff --git a/libs/plugins/modifier.date_format.php b/libs/plugins/modifier.date_format.php index 3656c1c8..729322b2 100644 --- a/libs/plugins/modifier.date_format.php +++ b/libs/plugins/modifier.date_format.php @@ -17,11 +17,12 @@ * - format: strftime format for output * - default_date: default date if $string is empty * - * @link http://smarty.php.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual) + * @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> - * @param string $ - * @param string $ - * @param string $ + * @param string $string input date string + * @param string $format strftime format for output + * @param string $default_date default date if $string is empty + * @param string $formatter either 'strftime' or 'auto' * @return string |void * @uses smarty_make_timestamp() */ diff --git a/libs/plugins/modifier.debug_print_var.php b/libs/plugins/modifier.debug_print_var.php index 013337ae..bac589c1 100644 --- a/libs/plugins/modifier.debug_print_var.php +++ b/libs/plugins/modifier.debug_print_var.php @@ -12,12 +12,11 @@ * Type: modifier<br> * Name: debug_print_var<br> * Purpose: formats variable contents for display in the console - * - * @link http://smarty.php.net/manual/en/language.modifier.debug.print.var.php debug_print_var (Smarty online manual) + * * @author Monte Ohrt <monte at ohrt dot com> - * @param array $ |object - * @param integer $ - * @param integer $ + * @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 * @return string */ function smarty_modifier_debug_print_var ($var, $depth = 0, $length = 40) @@ -37,6 +36,7 @@ function smarty_modifier_debug_print_var ($var, $depth = 0, $length = 40) $depth--; } break; + case 'object' : $object_vars = get_object_vars($var); $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>'; @@ -47,6 +47,7 @@ function smarty_modifier_debug_print_var ($var, $depth = 0, $length = 40) $depth--; } break; + case 'boolean' : case 'NULL' : case 'resource' : @@ -61,23 +62,40 @@ function smarty_modifier_debug_print_var ($var, $depth = 0, $length = 40) } $results = '<i>' . $results . '</i>'; break; + case 'integer' : case 'float' : $results = htmlspecialchars((string) $var); break; + case 'string' : $results = strtr($var, $_replace); - if (strlen($var) > $length) { - $results = substr($var, 0, $length - 3) . '...'; - } + if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + if (mb_strlen($var, SMARTY_RESOURCE_CHAR_SET) > $length) { + $results = mb_substr($var, 0, $length - 3, SMARTY_RESOURCE_CHAR_SET) . '...'; + } + } else { + if (strlen($var) > $length) { + $results = substr($var, 0, $length - 3) . '...'; + } + } + $results = htmlspecialchars('"' . $results . '"'); break; + case 'unknown type' : default : $results = strtr((string) $var, $_replace); - if (strlen($results) > $length) { - $results = substr($results, 0, $length - 3) . '...'; - } + if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + if (mb_strlen($results, SMARTY_RESOURCE_CHAR_SET) > $length) { + $results = mb_substr($results, 0, $length - 3, SMARTY_RESOURCE_CHAR_SET) . '...'; + } + } else { + if (strlen($results) > $length) { + $results = substr($results, 0, $length - 3) . '...'; + } + } + $results = htmlspecialchars($results); } diff --git a/libs/plugins/modifier.escape.php b/libs/plugins/modifier.escape.php index 37bc0e30..5e865a8f 100644 --- a/libs/plugins/modifier.escape.php +++ b/libs/plugins/modifier.escape.php @@ -1,33 +1,46 @@ <?php /** * Smarty plugin - * + * * @package Smarty * @subpackage PluginsModifier */ - + /** * Smarty escape modifier plugin - * + * * Type: modifier<br> * Name: escape<br> * Purpose: escape string for output - * - * @link http://smarty.php.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual) - * @author Monte Ohrt <monte at ohrt dot com> - * @param string $string input string - * @param string $esc_type escape type - * @param string $char_set character set + * + * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string input string + * @param string $esc_type escape type + * @param string $char_set character set, used for htmlspecialchars() or htmlentities() + * @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities() * @return string escaped input string */ -function smarty_modifier_escape($string, $esc_type = 'html', $char_set = SMARTY_RESOURCE_CHAR_SET) +function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true) { + if (!$char_set) { + $char_set = SMARTY_RESOURCE_CHAR_SET; + } + switch ($esc_type) { case 'html': - return htmlspecialchars($string, ENT_QUOTES, $char_set); + return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); case 'htmlall': - return htmlentities($string, ENT_QUOTES, $char_set); + if (SMARTY_MBSTRING /* ^phpunit */ && empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + // mb_convert_encoding ignores htmlspecialchars() + $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); + // htmlentities() won't convert everything, so use mb_convert_encoding + return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set); + } + + // no MBString fallback + return htmlentities($string, ENT_QUOTES, $char_set, $double_encode); case 'url': return rawurlencode($string); @@ -35,57 +48,96 @@ function smarty_modifier_escape($string, $esc_type = 'html', $char_set = SMARTY_ case 'urlpathinfo': return str_replace('%2F', '/', rawurlencode($string)); - case 'quotes': + case 'quotes': // escape unescaped single quotes return preg_replace("%(?<!\\\\)'%", "\\'", $string); - case 'hex': - // escape every character into hex + case 'hex': + // escape every byte into hex + // Note that the UTF-8 encoded character ä will be represented as %c3%a4 $return = ''; - for ($x = 0; $x < strlen($string); $x++) { + $_length = strlen($string); + for ($x = 0; $x < $_length; $x++) { $return .= '%' . bin2hex($string[$x]); - } + } return $return; case 'hexentity': $return = ''; - for ($x = 0; $x < strlen($string); $x++) { + if (SMARTY_MBSTRING /* ^phpunit */ && empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + $return = ''; + foreach (smarty_mb_to_unicode($string, SMARTY_RESOURCE_CHAR_SET) as $unicode) { + $return .= '&#x' . strtoupper(dechex($unicode)) . ';'; + } + return $return; + } + // no MBString fallback + $_length = strlen($string); + for ($x = 0; $x < $_length; $x++) { $return .= '&#x' . bin2hex($string[$x]) . ';'; - } + } return $return; case 'decentity': $return = ''; - for ($x = 0; $x < strlen($string); $x++) { + if (SMARTY_MBSTRING /* ^phpunit */ && empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + $return = ''; + foreach (smarty_mb_to_unicode($string, SMARTY_RESOURCE_CHAR_SET) as $unicode) { + $return .= '&#' . $unicode . ';'; + } + return $return; + } + // no MBString fallback + $_length = strlen($string); + for ($x = 0; $x < $_length; $x++) { $return .= '&#' . ord($string[$x]) . ';'; - } + } return $return; - case 'javascript': + case 'javascript': // escape quotes and backslashes, newlines, etc. return strtr($string, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n', '</' => '<\/')); - case 'mail': - require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); - return smarty_mb_str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); + case 'mail': + if (SMARTY_MBSTRING /* ^phpunit */ && empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); + return smarty_mb_str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); + } + // no MBString fallback + return str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); - case 'nonstd': + case 'nonstd': // escape non-standard chars, such as ms document quotes - $_res = ''; - for($_i = 0, $_len = strlen($string); $_i < $_len; $_i++) { - $_ord = ord(substr($string, $_i, 1)); + $return = ''; + if (SMARTY_MBSTRING /* ^phpunit */ && empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + foreach (smarty_mb_to_unicode($string, SMARTY_RESOURCE_CHAR_SET) as $unicode) { + if ($unicode >= 126) { + $return .= '&#' . $unicode . ';'; + } else { + $return .= chr($unicode); + } + } + return $return; + } + + $_length = strlen($string); + for ($_i = 0; $_i < $_length; $_i++) { + $_ord = ord(substr($string, $_i, 1)); // non-standard char, escape it if ($_ord >= 126) { - $_res .= '&#' . $_ord . ';'; + $return .= '&#' . $_ord . ';'; } else { - $_res .= substr($string, $_i, 1); - } - } - return $_res; + $return .= substr($string, $_i, 1); + } + } + return $return; default: return $string; - } -} + } +} ?>
\ No newline at end of file diff --git a/libs/plugins/modifier.regex_replace.php b/libs/plugins/modifier.regex_replace.php index 9f148800..f9fd5fa5 100644 --- a/libs/plugins/modifier.regex_replace.php +++ b/libs/plugins/modifier.regex_replace.php @@ -12,32 +12,41 @@ * Type: modifier<br> * Name: regex_replace<br> * Purpose: regular expression search/replace + * * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php * regex_replace (Smarty online manual) - * @author Monte Ohrt <monte at ohrt dot com> - * @param string - * @param string|array - * @param string|array + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string input string + * @param string|array $search regular expression(s) to search for + * @param string|array $replace string(s) that should be replaced * @return string */ function smarty_modifier_regex_replace($string, $search, $replace) { if(is_array($search)) { - foreach($search as $idx => $s) - $search[$idx] = _smarty_regex_replace_check($s); + foreach($search as $idx => $s) { + $search[$idx] = _smarty_regex_replace_check($s); + } } else { - $search = _smarty_regex_replace_check($search); - } - + $search = _smarty_regex_replace_check($search); + } return preg_replace($search, $replace, $string); } +/** + * @param string $search string(s) that should be replaced + * @return string + * @ignore + */ function _smarty_regex_replace_check($search) { - if (($pos = strpos($search,"\0")) !== false) - $search = substr($search,0,$pos); + // null-byte injection detection + // anything behind the first null-byte is ignored + if (($pos = strpos($search,"\0")) !== false) { + $search = substr($search,0,$pos); + } + // remove eval-modifier from $search if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) { - /* remove eval-modifier from $search */ $search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]); } return $search; diff --git a/libs/plugins/modifier.replace.php b/libs/plugins/modifier.replace.php index 6a669816..ce671b1f 100644 --- a/libs/plugins/modifier.replace.php +++ b/libs/plugins/modifier.replace.php @@ -15,17 +15,19 @@ * @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> * @author Uwe Tews - * @param string $ - * @param string $ - * @param string $ + * @param string $string input string + * @param string $search text to search for + * @param string $replace replacement text * @return string */ function smarty_modifier_replace($string, $search, $replace) { - if (function_exists('mb_split')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); - return smarty_mb_str_replace($search, $replace, $string); + if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); + return smarty_mb_str_replace($search, $replace, $string); } + return str_replace($search, $replace, $string); } + ?>
\ No newline at end of file diff --git a/libs/plugins/modifier.spacify.php b/libs/plugins/modifier.spacify.php index f14e026b..f7985add 100644 --- a/libs/plugins/modifier.spacify.php +++ b/libs/plugins/modifier.spacify.php @@ -14,24 +14,14 @@ * * @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> - * @param string $ - * @param string $ - * @return string + * @param string $string input string + * @param string $spacify_char string to insert between characters. + * @return string */ function smarty_modifier_spacify($string, $spacify_char = ' ') -{ - // mb_ functions available? - if (function_exists('mb_strlen') && mb_detect_encoding($string, 'UTF-8, ISO-8859-1') === 'UTF-8') { - $strlen = mb_strlen($string); - while ($strlen) { - $array[] = mb_substr($string, 0, 1, "UTF-8"); - $string = mb_substr($string, 1, $strlen, "UTF-8"); - $strlen = mb_strlen($string); - } - return implode($spacify_char, $array); - } else { - return implode($spacify_char, preg_split('//', $string, -1)); - } +{ + // well… what about charsets besides latin and UTF-8? + return implode($spacify_char, preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY)); } ?>
\ No newline at end of file diff --git a/libs/plugins/modifier.truncate.php b/libs/plugins/modifier.truncate.php index 0e9d4b9f..f495bb22 100644 --- a/libs/plugins/modifier.truncate.php +++ b/libs/plugins/modifier.truncate.php @@ -17,38 +17,32 @@ * * @link http://smarty.php.net/manual/en/language.modifier.truncate.php truncate (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> - * @param string $string input string - * @param integer $length lenght of truncated text - * @param string $etc end string + * @param string $string input string + * @param integer $length length of truncated text + * @param string $etc end string * @param boolean $break_words truncate at word boundary - * @param boolean $middle truncate in the middle of text + * @param boolean $middle truncate in the middle of text * @return string truncated string */ -function smarty_modifier_truncate($string, $length = 80, $etc = '...', - $break_words = false, $middle = false) -{ +function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) { if ($length == 0) return ''; - if (is_callable('mb_strlen')) { - if (mb_detect_encoding($string, 'UTF-8, ISO-8859-1') === 'UTF-8') { - // $string has utf-8 encoding - if (mb_strlen($string) > $length) { - $length -= min($length, mb_strlen($etc)); - if (!$break_words && !$middle) { - $string = preg_replace('/\s+?(\S+)?$/u', '', mb_substr($string, 0, $length + 1)); - } - if (!$middle) { - return mb_substr($string, 0, $length) . $etc; - } else { - return mb_substr($string, 0, $length / 2) . $etc . mb_substr($string, - $length / 2); - } - } else { - return $string; + if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + if (mb_strlen($string, SMARTY_RESOURCE_CHAR_SET) > $length) { + $length -= min($length, mb_strlen($etc, SMARTY_RESOURCE_CHAR_SET)); + if (!$break_words && !$middle) { + $string = preg_replace('/\s+?(\S+)?$/u', '', mb_substr($string, 0, $length + 1, SMARTY_RESOURCE_CHAR_SET)); } - } - } - // $string has no utf-8 encoding + if (!$middle) { + return mb_substr($string, 0, $length, SMARTY_RESOURCE_CHAR_SET) . $etc; + } + return mb_substr($string, 0, $length / 2, SMARTY_RESOURCE_CHAR_SET) . $etc . mb_substr($string, - $length / 2, $length, SMARTY_RESOURCE_CHAR_SET); + } + return $string; + } + + // no MBString fallback if (strlen($string) > $length) { $length -= min($length, strlen($etc)); if (!$break_words && !$middle) { @@ -56,12 +50,10 @@ function smarty_modifier_truncate($string, $length = 80, $etc = '...', } if (!$middle) { return substr($string, 0, $length) . $etc; - } else { - return substr($string, 0, $length / 2) . $etc . substr($string, - $length / 2); - } - } else { - return $string; - } + } + return substr($string, 0, $length / 2) . $etc . substr($string, - $length / 2); + } + return $string; } ?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.cat.php b/libs/plugins/modifiercompiler.cat.php index 37019d72..1cfe6308 100644 --- a/libs/plugins/modifiercompiler.cat.php +++ b/libs/plugins/modifiercompiler.cat.php @@ -11,10 +11,11 @@ *
* Type: modifier<br>
* Name: cat<br>
- * Date: Feb 24, 2003
- * Purpose: catenate a value to a variable
- * Input: string to catenate
+ * Date: Feb 24, 2003<br>
+ * Purpose: catenate a value to a variable<br>
+ * Input: string to catenate<br>
* Example: {$var|cat:"foo"}
+ *
* @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
* (Smarty online manual)
* @author Uwe Tews
diff --git a/libs/plugins/modifiercompiler.count_characters.php b/libs/plugins/modifiercompiler.count_characters.php index 40867f52..ae95fda4 100644 --- a/libs/plugins/modifiercompiler.count_characters.php +++ b/libs/plugins/modifiercompiler.count_characters.php @@ -8,32 +8,26 @@ /**
* Smarty count_characters modifier plugin
- *
+ *
* Type: modifier<br>
* Name: count_characteres<br>
* Purpose: count the number of characters in a text
- *
- * @link http://smarty.php.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual)
- * @author Uwe Tews
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual)
+ * @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
*/
function smarty_modifiercompiler_count_characters($params, $compiler)
{
- // mb_ functions available?
- if (function_exists('mb_strlen')) {
- // count also spaces?
- if (isset($params[1]) && $params[1] == 'true') {
- return '((mb_detect_encoding(' . $params[0] . ', \'UTF-8, ISO-8859-1\') === \'UTF-8\') ? mb_strlen(' . $params[0] . ', SMARTY_RESOURCE_CHAR_SET) : strlen(' . $params[0] . '))';
- }
- return '((mb_detect_encoding(' . $params[0] . ', \'UTF-8, ISO-8859-1\') === \'UTF-8\') ? preg_match_all(\'#[^\s\pZ]#u\', ' . $params[0] . ', $tmp) : preg_match_all(\'/[^\s]/\',' . $params[0] . ', $tmp))';
- } else {
- // count also spaces?
- if (isset($params[1]) && $params[1] == 'true') {
- return 'strlen(' . $params[0] . ')';
- }
- return 'preg_match_all(\'/[^\s]/\',' . $params[0] . ', $tmp)';
- }
+ if (!isset($params[1]) || $params[1] != 'true') {
+ return 'preg_match_all(\'/[^\s]/u\',' . $params[0] . ', $tmp)';
+ }
+ if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) {
+ return 'mb_strlen(' . $params[0] . ', SMARTY_RESOURCE_CHAR_SET)';
+ }
+ // no MBString fallback
+ return 'strlen(' . $params[0] . ')';
}
?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.count_paragraphs.php b/libs/plugins/modifiercompiler.count_paragraphs.php index 09973ef3..0e1b0af8 100644 --- a/libs/plugins/modifiercompiler.count_paragraphs.php +++ b/libs/plugins/modifiercompiler.count_paragraphs.php @@ -12,9 +12,10 @@ * Type: modifier<br>
* Name: count_paragraphs<br>
* Purpose: count the number of paragraphs in a text
- * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
* count_paragraphs (Smarty online manual)
- * @author Uwe Tews
+ * @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
*/
diff --git a/libs/plugins/modifiercompiler.count_sentences.php b/libs/plugins/modifiercompiler.count_sentences.php index cde5c467..7f48a3ec 100644 --- a/libs/plugins/modifiercompiler.count_sentences.php +++ b/libs/plugins/modifiercompiler.count_sentences.php @@ -12,16 +12,17 @@ * Type: modifier<br>
* Name: count_sentences
* Purpose: count the number of sentences in a text
- * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
* count_sentences (Smarty online manual)
- * @author Uwe Tews
+ * @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
*/
function smarty_modifiercompiler_count_sentences($params, $compiler)
{
- // find periods with a word before but not after.
- return 'preg_match_all(\'/[^\s]\.(?!\w)/\', ' . $params[0] . ', $tmp)';
+ // find periods, question marks, exclamation marks with a word before but not after.
+ return 'preg_match_all("#\w[\.\?\!](\W|$)#uS", ' . $params[0] . ', $tmp)';
}
?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.count_words.php b/libs/plugins/modifiercompiler.count_words.php index dbc2f43b..cd9ae5bf 100644 --- a/libs/plugins/modifiercompiler.count_words.php +++ b/libs/plugins/modifiercompiler.count_words.php @@ -1,31 +1,32 @@ <?php
/**
* Smarty plugin
- *
+ *
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty count_words modifier plugin
- *
+ *
* Type: modifier<br>
* Name: count_words<br>
* Purpose: count the number of words in a text
- *
- * @link http://smarty.php.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual)
- * @author Uwe Tews
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual)
+ * @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
*/
function smarty_modifiercompiler_count_words($params, $compiler)
-{
- // mb_ functions available?
- if (function_exists('mb_strlen')) {
- return '((mb_detect_encoding(' . $params[0] . ', \'UTF-8, ISO-8859-1\') === \'UTF-8\') ? preg_match_all(\'#[\w\pL]+#u\', ' . $params[0] . ', $tmp) : preg_match_all(\'#\w+#\',' . $params[0] . ', $tmp))';
- } else {
- return 'str_word_count(' . $params[0] . ')';
- }
-}
+{
+ if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) {
+ // return 'preg_match_all(\'#[\w\pL]+#u\', ' . $params[0] . ', $tmp)';
+ // expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592
+ return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/u\', ' . $params[0] . ', $tmp)';
+ }
+ // no MBString fallback
+ return 'str_word_count(' . $params[0] . ')';
+}
?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.default.php b/libs/plugins/modifiercompiler.default.php index 7bfda8b0..93635228 100644 --- a/libs/plugins/modifiercompiler.default.php +++ b/libs/plugins/modifiercompiler.default.php @@ -8,13 +8,13 @@ /**
* Smarty default modifier plugin
- *
+ *
* Type: modifier<br>
* Name: default<br>
* Purpose: designate default value for empty variables
- *
- * @link http://smarty.php.net/manual/en/language.modifier.default.php default (Smarty online manual)
- * @author Uwe Tews
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual)
+ * @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
*/
@@ -23,11 +23,11 @@ function smarty_modifiercompiler_default ($params, $compiler) $output = $params[0];
if (!isset($params[1])) {
$params[1] = "''";
- }
+ }
for ($i = 1, $cnt = count($params); $i < $cnt; $i++) {
$output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $params[$i] . ' : $tmp)';
- }
+ }
return $output;
-}
+}
?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.escape.php b/libs/plugins/modifiercompiler.escape.php new file mode 100644 index 00000000..c536d5f4 --- /dev/null +++ b/libs/plugins/modifiercompiler.escape.php @@ -0,0 +1,90 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * @ignore
+ */
+require_once( SMARTY_PLUGINS_DIR .'shared.literal_compiler_param.php' );
+
+/**
+ * Smarty escape modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: escape<br>
+ * Purpose: escape string for output
+ *
+ * @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual)
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_escape($params, $compiler)
+{
+ try {
+ $esc_type = smarty_literal_compiler_param($params, 1, 'html');
+ $char_set = smarty_literal_compiler_param($params, 2, SMARTY_RESOURCE_CHAR_SET);
+ $double_encode = smarty_literal_compiler_param($params, 3, true);
+
+ if (!$char_set) {
+ $char_set = SMARTY_RESOURCE_CHAR_SET;
+ }
+
+ switch ($esc_type) {
+ case 'html':
+ return 'htmlspecialchars('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ', '
+ . var_export($double_encode, true) . ')';
+
+ case 'htmlall':
+ if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) {
+ return 'mb_convert_encoding(htmlspecialchars('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ', '
+ . var_export($double_encode, true)
+ . '), "HTML-ENTITIES", '
+ . var_export($char_set, true) . ')';
+ }
+
+ // no MBString fallback
+ return 'htmlentities('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ', '
+ . var_export($double_encode, true) . ')';
+
+ case 'url':
+ return 'rawurlencode(' . $params[0] . ')';
+
+ case 'urlpathinfo':
+ return 'str_replace("%2F", "/", rawurlencode(' . $params[0] . '))';
+
+ case 'quotes':
+ // escape unescaped single quotes
+ return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[0] . ')';
+
+ case 'javascript':
+ // escape quotes and backslashes, newlines, etc.
+ return 'strtr(' . $params[0] . ', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))';
+
+ }
+ } catch(SmartyException $e) {
+ // pass through to regular plugin fallback
+ }
+
+ // could not optimize |escape call, so fallback to regular plugin
+ if ($compiler->tag_nocache | $compiler->nocache) {
+ $compiler->template->required_plugins['nocache']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR .'modifier.escape.php';
+ $compiler->template->required_plugins['nocache']['escape']['modifier']['function'] = 'smarty_modifier_escape';
+ } else {
+ $compiler->template->required_plugins['compiled']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR .'modifier.escape.php';
+ $compiler->template->required_plugins['compiled']['escape']['modifier']['function'] = 'smarty_modifier_escape';
+ }
+ return 'smarty_modifier_escape(' . join( ', ', $params ) . ')';
+}
+
+?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.from_charset.php b/libs/plugins/modifiercompiler.from_charset.php new file mode 100644 index 00000000..1561fbc0 --- /dev/null +++ b/libs/plugins/modifiercompiler.from_charset.php @@ -0,0 +1,34 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty from_charset modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: from_charset<br>
+ * Purpose: convert character encoding from $charset to internal encoding
+ *
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_from_charset($params, $compiler)
+{
+ if (!SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) {
+ // FIXME: (rodneyrehm) shouldn't this throw an error?
+ return $params[0];
+ }
+
+ if (!isset($params[1])) {
+ $params[1] = '"ISO-8859-1"';
+ }
+
+ return 'mb_convert_encoding(' . $params[0] . ', SMARTY_RESOURCE_CHAR_SET, ' . $params[1] . ')';
+}
+
+?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.indent.php b/libs/plugins/modifiercompiler.indent.php index e62d56ca..020c4fdb 100644 --- a/libs/plugins/modifiercompiler.indent.php +++ b/libs/plugins/modifiercompiler.indent.php @@ -11,9 +11,9 @@ * Type: modifier<br>
* Name: indent<br>
* Purpose: indent lines of text
- * @link http://smarty.php.net/manual/en/language.modifier.indent.php
- * indent (Smarty online manual)
- * @author Uwe Tews
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual)
+ * @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
*/
@@ -22,10 +22,10 @@ function smarty_modifiercompiler_indent($params, $compiler) {
if (!isset($params[1])) {
$params[1] = 4;
- }
+ }
if (!isset($params[2])) {
$params[2] = "' '";
- }
+ }
return 'preg_replace(\'!^!m\',str_repeat(' . $params[2] . ',' . $params[1] . '),' . $params[0] . ')';
}
diff --git a/libs/plugins/modifiercompiler.lower.php b/libs/plugins/modifiercompiler.lower.php index 3604994a..17441584 100644 --- a/libs/plugins/modifiercompiler.lower.php +++ b/libs/plugins/modifiercompiler.lower.php @@ -7,25 +7,25 @@ /**
* Smarty lower modifier plugin
- *
+ *
* Type: modifier<br>
* Name: lower<br>
* Purpose: convert string to lowercase
- *
- * @link http://smarty.php.net/manual/en/language.modifier.lower.php lower (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @author Uwe Tews
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
*/
function smarty_modifiercompiler_lower($params, $compiler)
{
- if (function_exists('mb_strtolower')) {
- return '((mb_detect_encoding(' . $params[0] . ', \'UTF-8, ISO-8859-1\') === \'UTF-8\') ? mb_strtolower(' . $params[0] . ',SMARTY_RESOURCE_CHAR_SET) : strtolower(' . $params[0] . '))' ;
- } else {
- return 'strtolower(' . $params[0] . ')';
- }
-}
+ if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) {
+ return 'mb_strtolower(' . $params[0] . ',SMARTY_RESOURCE_CHAR_SET)' ;
+ }
+ // no MBString fallback
+ return 'strtolower(' . $params[0] . ')';
+}
?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.noprint.php b/libs/plugins/modifiercompiler.noprint.php index cd2a663e..3ca26571 100644 --- a/libs/plugins/modifiercompiler.noprint.php +++ b/libs/plugins/modifiercompiler.noprint.php @@ -12,6 +12,7 @@ * Type: modifier<br>
* Name: noprint<br>
* Purpose: return an empty string
+ *
* @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
diff --git a/libs/plugins/modifiercompiler.string_format.php b/libs/plugins/modifiercompiler.string_format.php index fd9fd876..83345977 100644 --- a/libs/plugins/modifiercompiler.string_format.php +++ b/libs/plugins/modifiercompiler.string_format.php @@ -1,26 +1,26 @@ <?php
/**
* Smarty plugin
- *
+ *
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty string_format modifier plugin
- *
+ *
* Type: modifier<br>
* Name: string_format<br>
* Purpose: format strings via sprintf
- *
- * @link http://smarty.php.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual)
- * @author Uwe Tews
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual)
+ * @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
*/
function smarty_modifiercompiler_string_format($params, $compiler)
{
return 'sprintf(' . $params[1] . ',' . $params[0] . ')';
-}
+}
?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.strip.php b/libs/plugins/modifiercompiler.strip.php index 55b98e0e..2a2d9d0e 100644 --- a/libs/plugins/modifiercompiler.strip.php +++ b/libs/plugins/modifiercompiler.strip.php @@ -8,16 +8,16 @@ /**
* Smarty strip modifier plugin
- *
+ *
* Type: modifier<br>
* Name: strip<br>
* Purpose: Replace all repeated spaces, newlines, tabs
* with a single space or supplied replacement string.<br>
- * Example: {$var|strip} {$var|strip:" "}
+ * Example: {$var|strip} {$var|strip:" "}<br>
* Date: September 25th, 2002
- *
- * @link http://smarty.php.net/manual/en/language.modifier.strip.php strip (Smarty online manual)
- * @author Uwe Tews
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual)
+ * @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
*/
@@ -28,6 +28,6 @@ function smarty_modifiercompiler_strip($params, $compiler) $params[1] = "' '";
}
return "preg_replace('!\s+!u', {$params[1]},{$params[0]})";
-}
+}
?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.strip_tags.php b/libs/plugins/modifiercompiler.strip_tags.php index 5e479b28..296a3a2d 100644 --- a/libs/plugins/modifiercompiler.strip_tags.php +++ b/libs/plugins/modifiercompiler.strip_tags.php @@ -8,27 +8,26 @@ /**
* Smarty strip_tags modifier plugin
- *
+ *
* Type: modifier<br>
* Name: strip_tags<br>
* Purpose: strip html tags from text
- *
- * @link http://smarty.php.net/manual/en/language.modifier.strip.tags.php strip_tags (Smarty online manual)
- * @author Uwe Tews
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.strip.tags.php strip_tags (Smarty online manual)
+ * @author Uwe Tews
* @param array $params parameters
* @return string with compiled code
*/
-
function smarty_modifiercompiler_strip_tags($params, $compiler)
{
if (!isset($params[1])) {
$params[1] = true;
- }
+ }
if ($params[1] === true) {
return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})";
} else {
return 'strip_tags(' . $params[0] . ')';
- }
-}
+ }
+}
?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.to_charset.php b/libs/plugins/modifiercompiler.to_charset.php new file mode 100644 index 00000000..e0877b78 --- /dev/null +++ b/libs/plugins/modifiercompiler.to_charset.php @@ -0,0 +1,34 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty to_charset modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: to_charset<br>
+ * Purpose: convert character encoding from internal encoding to $charset
+ *
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_to_charset($params, $compiler)
+{
+ if (!SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) {
+ // FIXME: (rodneyrehm) shouldn't this throw an error?
+ return $params[0];
+ }
+
+ if (!isset($params[1])) {
+ $params[1] = '"ISO-8859-1"';
+ }
+
+ return 'mb_convert_encoding(' . $params[0] . ', ' . $params[1] . ', SMARTY_RESOURCE_CHAR_SET)';
+}
+
+?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.unescape.php b/libs/plugins/modifiercompiler.unescape.php new file mode 100644 index 00000000..7e77cb49 --- /dev/null +++ b/libs/plugins/modifiercompiler.unescape.php @@ -0,0 +1,48 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty unescape modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: unescape<br>
+ * Purpose: unescape html entities
+ *
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_unescape($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = 'html';
+ }
+ if (!isset($params[2])) {
+ $params[2] = "SMARTY_RESOURCE_CHAR_SET";
+ } else {
+ $params[2] = "'" . $params[2] . "'";
+ }
+
+ switch (trim($params[1], '"\'')) {
+ case 'entity':
+ return 'mb_convert_encoding(' . $params[0] . ', ' . $params[2] . ', \'HTML-ENTITIES\')';
+ case 'htmlall':
+ if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) {
+ return 'mb_convert_encoding(' . $params[0] . ', ' . $params[2] . ', \'HTML-ENTITIES\')';
+ }
+ return 'html_entity_decode(' . $params[0] . ', ENT_QUOTES, ' . $params[2] . ')';
+
+ case 'html':
+ return 'htmlspecialchars_decode(' . $params[0] . ', ENT_QUOTES)';
+
+ default:
+ return $params[0];
+ }
+}
+
+?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.upper.php b/libs/plugins/modifiercompiler.upper.php index 2869b879..739057ce 100644 --- a/libs/plugins/modifiercompiler.upper.php +++ b/libs/plugins/modifiercompiler.upper.php @@ -20,11 +20,11 @@ */
function smarty_modifiercompiler_upper($params, $compiler)
{
- if (function_exists('mb_strtoupper')) {
- return '((mb_detect_encoding(' . $params[0] . ', \'UTF-8, ISO-8859-1\') === \'UTF-8\') ? mb_strtoupper(' . $params[0] . ',SMARTY_RESOURCE_CHAR_SET) : strtoupper(' . $params[0] . '))' ;
- } else {
- return 'strtoupper(' . $params[0] . ')';
- }
+ if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) {
+ return 'mb_strtoupper(' . $params[0] . ',SMARTY_RESOURCE_CHAR_SET)' ;
+ }
+ // no MBString fallback
+ return 'strtoupper(' . $params[0] . ')';
}
?>
\ No newline at end of file diff --git a/libs/plugins/modifiercompiler.wordwrap.php b/libs/plugins/modifiercompiler.wordwrap.php index 5b91f64c..577135ad 100644 --- a/libs/plugins/modifiercompiler.wordwrap.php +++ b/libs/plugins/modifiercompiler.wordwrap.php @@ -29,7 +29,18 @@ function smarty_modifiercompiler_wordwrap($params, $compiler) if (!isset($params[3])) {
$params[3] = 'false';
}
- return 'wordwrap(' . $params[0] . ',' . $params[1] . ',' . $params[2] . ',' . $params[3] . ')';
+ $function = 'wordwrap';
+ if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) {
+ if ($compiler->tag_nocache | $compiler->nocache) {
+ $compiler->template->required_plugins['nocache']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR .'shared.mb_wordwrap.php';
+ $compiler->template->required_plugins['nocache']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap';
+ } else {
+ $compiler->template->required_plugins['compiled']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR .'shared.mb_wordwrap.php';
+ $compiler->template->required_plugins['compiled']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap';
+ }
+ $function = 'smarty_mb_wordwrap';
+ }
+ return $function . '(' . $params[0] . ',' . $params[1] . ',' . $params[2] . ',' . $params[3] . ')';
}
?>
\ No newline at end of file diff --git a/libs/plugins/outputfilter.trimwhitespace.php b/libs/plugins/outputfilter.trimwhitespace.php index 20e9bb60..41828e1d 100644 --- a/libs/plugins/outputfilter.trimwhitespace.php +++ b/libs/plugins/outputfilter.trimwhitespace.php @@ -9,69 +9,84 @@ /** * Smarty trimwhitespace outputfilter plugin * - * File: outputfilter.trimwhitespace.php<br> - * Type: outputfilter<br> - * Name: trimwhitespace<br> - * Date: Jan 25, 2003<br> - * Purpose: trim leading white space and blank lines from - * template source after it gets interpreted, cleaning - * up code and saving bandwidth. Does not affect - * <<PRE>></PRE> and <SCRIPT></SCRIPT> blocks.<br> - * Install: Drop into the plugin directory, call - * <code>$smarty->load_filter('output','trimwhitespace');</code> - * from application. - * @author Monte Ohrt <monte at ohrt dot com> - * @author Contributions from Lars Noschinski <lars@usenet.noschinski.de> - * @version 1.3 - * @param string $source input string - * @param object &$smarty Smarty object + * Trim unnecessary whitespace from HTML markup. + * + * @author Rodney Rehm + * @param string $source input string + * @param Smarty_Internal_Template $smarty Smarty object * @return string filtered output */ -function smarty_outputfilter_trimwhitespace($source, $smarty) +function smarty_outputfilter_trimwhitespace($source, Smarty_Internal_Template $smarty) { - // Pull out the script blocks - preg_match_all("!<script[^>]*?>.*?</script>!is", $source, $match); - $_script_blocks = $match[0]; - $source = preg_replace("!<script[^>]*?>.*?</script>!is", - '@@@SMARTY:TRIM:SCRIPT@@@', $source); + $store = array(); + $_store = 0; + $_offset = 0; - // Pull out the pre blocks - preg_match_all("!<pre[^>]*?>.*?</pre>!is", $source, $match); - $_pre_blocks = $match[0]; - $source = preg_replace("!<pre[^>]*?>.*?</pre>!is", - '@@@SMARTY:TRIM:PRE@@@', $source); - - // Pull out the textarea blocks - preg_match_all("!<textarea[^>]*?>.*?</textarea>!is", $source, $match); - $_textarea_blocks = $match[0]; - $source = preg_replace("!<textarea[^>]*?>.*?</textarea>!is", - '@@@SMARTY:TRIM:TEXTAREA@@@', $source); + // Unify Line-Breaks to \n + $source = preg_replace("/\015\012|\015|\012/", "\n", $source); - // remove all leading spaces, tabs and carriage returns NOT - // preceeded by a php close tag. - $source = trim(preg_replace('/((?<!\?>)\n)[\s]+/m', '\1', $source)); + // capture Internet Explorer Conditional Comments + if (preg_match_all('#<!--\[[^\]]+\]>.*?<!\[[^\]]+\]-->#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $store[] = $match[0][0]; + $_length = strlen($match[0][0]); + $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; + $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length); - // replace textarea blocks - smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:TEXTAREA@@@",$_textarea_blocks, $source); + $_offset += $_length - strlen($replace); + $_store++; + } + } - // replace pre blocks - smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:PRE@@@",$_pre_blocks, $source); + // Strip all HTML-Comments + $source = preg_replace( '#<!--.*?-->#ms', '', $source ); - // replace script blocks - smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:SCRIPT@@@",$_script_blocks, $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)) { + foreach ($matches as $match) { + $store[] = $match[0][0]; + $_length = strlen($match[0][0]); + $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; + $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length); - return $source; -} + $_offset += $_length - strlen($replace); + $_store++; + } + } + + $expressions = array( + // replace multiple spaces between tags by a single space + // can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements + '#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2', + // remove spaces between attributes (but not in attribute values!) + '#(([a-z0-9]\s*=\s*(["\'])[^\3]*?\3)|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \4', + // note: for some very weird reason trim() seems to remove spaces inside attributes. + // maybe a \0 byte or something is interfering? + '#^\s+<#Ss' => '<', + '#>\s+$#Ss' => '>', + ); -function smarty_outputfilter_trimwhitespace_replace($search_str, $replace, &$subject) { - $_len = strlen($search_str); - $_pos = 0; - for ($_i=0, $_count=count($replace); $_i<$_count; $_i++) - if (($_pos=strpos($subject, $search_str, $_pos))!==false) - $subject = substr_replace($subject, $replace[$_i], $_pos, $_len); - else - break; + $source = preg_replace( array_keys($expressions), array_values($expressions), $source ); + // note: for some very weird reason trim() seems to remove spaces inside attributes. + // maybe a \0 byte or something is interfering? + // $source = trim( $source ); + // capture html elements not to be messed with + $_offset = 0; + if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $store[] = $match[0][0]; + $_length = strlen($match[0][0]); + $replace = array_shift($store); + $source = substr_replace($source, $replace, $match[0][1] + $_offset, $_length); + + $_offset += strlen($replace) - $_length; + $_store++; + } + } + + return $source; } ?>
\ No newline at end of file diff --git a/libs/plugins/shared.escape_special_chars.php b/libs/plugins/shared.escape_special_chars.php index e36b2c89..c087be1f 100644 --- a/libs/plugins/shared.escape_special_chars.php +++ b/libs/plugins/shared.escape_special_chars.php @@ -6,24 +6,46 @@ * @subpackage PluginsShared */ -/** - * escape_special_chars common function - * - * Function: smarty_function_escape_special_chars<br> - * Purpose: used by other smarty functions to escape - * special chars except for already escaped ones - * @author Monte Ohrt <monte at ohrt dot com> - * @param string - * @return string - */ -function smarty_function_escape_special_chars($string) -{ - if(!is_array($string)) { - $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); - $string = htmlspecialchars($string); - $string = str_replace(array('%%%SMARTY_START%%%','%%%SMARTY_END%%%'), array('&',';'), $string); - } - return $string; -} +if (version_compare(PHP_VERSION, '5.2.3', '>=')) { + /** + * escape_special_chars common function + * + * Function: smarty_function_escape_special_chars<br> + * Purpose: used by other smarty functions to escape + * special chars except for already escaped ones + * + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string text that should by escaped + * @return string + */ + function smarty_function_escape_special_chars($string) + { + if (!is_array($string)) { + $string = htmlspecialchars($string, ENT_COMPAT, SMARTY_RESOURCE_CHAR_SET, false); + } + return $string; + } +} else { + /** + * escape_special_chars common function + * + * Function: smarty_function_escape_special_chars<br> + * Purpose: used by other smarty functions to escape + * special chars except for already escaped ones + * + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string text that should by escaped + * @return string + */ + function smarty_function_escape_special_chars($string) + { + if (!is_array($string)) { + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string); + $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + } + return $string; + } +} ?>
\ No newline at end of file diff --git a/libs/plugins/shared.literal_compiler_param.php b/libs/plugins/shared.literal_compiler_param.php new file mode 100644 index 00000000..a27e48e4 --- /dev/null +++ b/libs/plugins/shared.literal_compiler_param.php @@ -0,0 +1,33 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +/** + * evaluate compiler parameter + * + * @param array $params paramter array as given to the compiler function + * @param integer $index array index of the paramter to convert + * @param mixed $default value to be returned if the paramter is not present + * @return mixed evaluated value of paramter or $default + * @throws SmartyException if paramter is not a literal (but an expression, variable, …) + * @author Rodney Rehm + */ +function smarty_literal_compiler_param($params, $index, $default=null) +{ + // not set, go default + if (!isset($params[$index])) { + return $default; + } + // test if param is a literal + if (!preg_match('/^([\'"]?)[a-zA-Z0-9]+(\\1)$/', $params[$index])) { + throw new SmartyException('$param[' . $index . '] is not a literal and is thus not evaluatable at compile time'); + } + + $t = null; + eval("\$t = " . $params[$index] . ";"); + return $t; +} diff --git a/libs/plugins/shared.make_timestamp.php b/libs/plugins/shared.make_timestamp.php index 9789f53f..b0a2d0d1 100644 --- a/libs/plugins/shared.make_timestamp.php +++ b/libs/plugins/shared.make_timestamp.php @@ -8,27 +8,26 @@ /** * Function: smarty_make_timestamp<br> - * Purpose: used by other smarty functions to make a timestamp - * from a string. + * Purpose: used by other smarty functions to make a timestamp from a string. + * * @author Monte Ohrt <monte at ohrt dot com> - * @param string $string - * @return string + * @param DateTime|int|string $string date object, timestamp or string that can be converted using strtotime() + * @return int */ - function smarty_make_timestamp($string) { - if(empty($string)) { + if (empty($string)) { // use "now": return time(); } elseif ($string instanceof DateTime) { - return $string->getTimestamp(); - } elseif (strlen($string)==14 && ctype_digit($string)) { - // it is mysql timestamp format of YYYYMMDDHHMMSS? + return $string->source->timestamp; + } elseif (strlen($string) == 14 && ctype_digit($string)) { + // it is mysql timestamp format of YYYYMMDDHHMMSS? return mktime(substr($string, 8, 2),substr($string, 10, 2),substr($string, 12, 2), substr($string, 4, 2),substr($string, 6, 2),substr($string, 0, 4)); } elseif (is_numeric($string)) { // it is a numeric string, we handle it as timestamp - return (int)$string; + return (int) $string; } else { // strtotime should handle it $time = strtotime($string); diff --git a/libs/plugins/shared.mb_str_replace.php b/libs/plugins/shared.mb_str_replace.php index 8bc156f0..ecafeb74 100644 --- a/libs/plugins/shared.mb_str_replace.php +++ b/libs/plugins/shared.mb_str_replace.php @@ -1,38 +1,55 @@ <?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ +if (!function_exists('smarty_mb_str_replace')) { -if(!function_exists('smarty_mb_str_replace')) { - function smarty_mb_str_replace($search, $replace, $subject, &$count=0) { - if (!is_array($search) && is_array($replace)) { - return false; - } - if (is_array($subject)) { - // call mb_replace for each single string in $subject - foreach ($subject as &$string) { - $string = &smarty_mb_str_replace($search, $replace, $string, $c); - $count += $c; - } - } elseif (is_array($search)) { - if (!is_array($replace)) { - foreach ($search as &$string) { - $subject = smarty_mb_str_replace($string, $replace, $subject, $c); - $count += $c; - } - } else { - $n = max(count($search), count($replace)); - while ($n--) { - $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c); - $count += $c; - next($search); - next($replace); - } - } - } else { - $parts = mb_split(preg_quote($search), $subject); - $count = count($parts)-1; - $subject = implode($replace, $parts); - } - return $subject; - } -} + /** + * Multibyte string replace + * + * @param string $search the string to be searched + * @param string $replace the replacement string + * @param string $subject the source string + * @param int &$count number of matches found + * @return string replaced string + * @author Rodney Rehm + */ + function smarty_mb_str_replace($search, $replace, $subject, &$count=0) + { + if (!is_array($search) && is_array($replace)) { + return false; + } + if (is_array($subject)) { + // call mb_replace for each single string in $subject + foreach ($subject as &$string) { + $string = &smarty_mb_str_replace($search, $replace, $string, $c); + $count += $c; + } + } elseif (is_array($search)) { + if (!is_array($replace)) { + foreach ($search as &$string) { + $subject = smarty_mb_str_replace($string, $replace, $subject, $c); + $count += $c; + } + } else { + $n = max(count($search), count($replace)); + while ($n--) { + $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c); + $count += $c; + next($search); + next($replace); + } + } + } else { + $parts = mb_split(preg_quote($search), $subject); + $count = count($parts) - 1; + $subject = implode($replace, $parts); + } + return $subject; + } +} ?>
\ No newline at end of file diff --git a/libs/plugins/shared.mb_unicode.php b/libs/plugins/shared.mb_unicode.php new file mode 100644 index 00000000..b0a250a1 --- /dev/null +++ b/libs/plugins/shared.mb_unicode.php @@ -0,0 +1,48 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +/** + * convert characters to their decimal unicode equivalents + * + * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration + * @param string $string characters to calculate unicode of + * @param string $encoding encoding of $string, if null mb_internal_encoding() is used + * @return array sequence of unicodes + * @author Rodney Rehm + */ +function smarty_mb_to_unicode($string, $encoding=null) { + if ($encoding) { + $expanded = mb_convert_encoding($string, "UTF-32BE", $encoding); + } else { + $expanded = mb_convert_encoding($string, "UTF-32BE"); + } + return unpack("N*", $expanded); +} + +/** + * convert unicodes to the character of given encoding + * + * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration + * @param integer|array $unicode single unicode or list of unicodes to convert + * @param string $encoding encoding of returned string, if null mb_internal_encoding() is used + * @return string unicode as character sequence in given $encoding + * @author Rodney Rehm + */ +function smarty_mb_from_unicode($unicode, $encoding=null) { + $t = ''; + if (!$encoding) { + $encoding = mb_internal_encoding(); + } + foreach((array) $unicode as $utf32be) { + $character = pack("N", $utf32be); + $t .= mb_convert_encoding($character, $encoding, "UTF-32BE"); + } + return $t; +} + +?>
\ No newline at end of file diff --git a/libs/plugins/shared.mb_wordwrap.php b/libs/plugins/shared.mb_wordwrap.php new file mode 100644 index 00000000..89e8fbfa --- /dev/null +++ b/libs/plugins/shared.mb_wordwrap.php @@ -0,0 +1,83 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +if(!function_exists('smarty_mb_wordwrap')) { + + /** + * Wrap a string to a given number of characters + * + * @link http://php.net/manual/en/function.wordwrap.php for similarity + * @param string $str the string to wrap + * @param int $width the width of the output + * @param string $break the character used to break the line + * @param boolean $cut ignored parameter, just for the sake of + * @return string wrapped string + * @author Rodney Rehm + */ + function smarty_mb_wordwrap($str, $width=75, $break="\n", $cut=false) + { + // break words into tokens using white space as a delimiter + $tokens = preg_split('!(\s)!uS', $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + $length = 0; + $t = ''; + $_previous = false; + + foreach ($tokens as $_token) { + $token_length = mb_strlen($_token, SMARTY_RESOURCE_CHAR_SET); + $_tokens = array($_token); + if ($token_length > $width) { + // remove last space + $t = mb_substr($t, 0, -1, SMARTY_RESOURCE_CHAR_SET); + $_previous = false; + $length = 0; + + if ($cut) { + $_tokens = preg_split('!(.{' . $width . '})!uS', $_token, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + // broken words go on a new line + $t .= $break; + } + } + + foreach ($_tokens as $token) { + $_space = !!preg_match('!^\s$!uS', $token); + $token_length = mb_strlen($token, SMARTY_RESOURCE_CHAR_SET); + $length += $token_length; + + if ($length > $width) { + // remove space before inserted break + if ($_previous && $token_length < $width) { + $t = mb_substr($t, 0, -1, SMARTY_RESOURCE_CHAR_SET); + } + + // add the break before the token + $t .= $break; + $length = $token_length; + + // skip space after inserting a break + if ($_space) { + $length = 0; + continue; + } + } else if ($token == "\n") { + // hard break must reset counters + $_previous = 0; + $length = 0; + } else { + // remember if we had a space or not + $_previous = $_space; + } + // add the token + $t .= $token; + } + } + + return $t; + } + +} +?>
\ No newline at end of file diff --git a/libs/plugins/variablefilter.htmlspecialchars.php b/libs/plugins/variablefilter.htmlspecialchars.php index 4d3550c0..aeaeb600 100644 --- a/libs/plugins/variablefilter.htmlspecialchars.php +++ b/libs/plugins/variablefilter.htmlspecialchars.php @@ -1,22 +1,21 @@ <?php /** * Smarty plugin - * + * * @package Smarty * @subpackage PluginsFilter */ /** * Smarty htmlspecialchars variablefilter plugin - * - * @param string $source input string - * @param object $ &$smarty Smarty object + * + * @param string $source input string + * @param Smarty_Internal_Template $smarty Smarty object * @return string filtered output */ - function smarty_variablefilter_htmlspecialchars($source, $smarty) { - return htmlspecialchars($source, ENT_QUOTES); -} + return htmlspecialchars($source, ENT_QUOTES, SMARTY_RESOURCE_CHAR_SET); +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_cacheresource.php b/libs/sysplugins/smarty_cacheresource.php new file mode 100644 index 00000000..23d3ce02 --- /dev/null +++ b/libs/sysplugins/smarty_cacheresource.php @@ -0,0 +1,372 @@ +<?php +/** +* Smarty Internal Plugin +* +* @package Smarty +* @subpackage Cacher +*/ + +/** +* Cache Handler API +* +* @package Smarty +* @subpackage Cacher +* @author Rodney Rehm +*/ +abstract class Smarty_CacheResource { + /** + * cache for Smarty_CacheResource instances + * @var array + */ + protected static $resources = array(); + + /** + * resource types provided by the core + * @var array + */ + protected static $sysplugins = array( + 'file' => true, + ); + + /** + * populate Cached Object with meta data from Resource + * + * @param Smarty_Template_Cached $cached cached object + * @param Smarty_Internal_Template $_template template object + * @return void + */ + public abstract function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template); + + /** + * populate Cached Object with timestamp and exists from Resource + * + * @param Smarty_Template_Cached $source cached object + * @return void + */ + public abstract function populateTimestamp(Smarty_Template_Cached $cached); + + /** + * Read the cached template and process header + * + * @param Smarty_Internal_Template $_template template object + * @param Smarty_Template_Cached $cached cached object + * @return booelan true or false if the cached content does not exist + */ + public abstract function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null); + + /** + * Write the rendered template output to cache + * + * @param Smarty_Internal_Template $_template template object + * @param string $content content to cache + * @return boolean success + */ + public abstract function writeCachedContent(Smarty_Internal_Template $_template, $content); + + /** + * Return cached content + * + * @param Smarty_Internal_Template $_template template object + * @param string $content content of cache + */ + public function getCachedContent(Smarty_Internal_Template $_template) + { + if ($_template->cached->handler->process($_template)) { + ob_start(); + $_template->properties['unifunc']($_template); + return ob_get_clean(); + } + return null; + } + + /** + * Empty cache + * + * @param Smarty $smarty Smarty object + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * @return integer number of cache files deleted + */ + public abstract function clearAll(Smarty $smarty, $exp_time=null); + + /** + * Empty cache for a specific template + * + * @param Smarty $smarty Smarty object + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * @return integer number of cache files deleted + */ + public abstract function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time); + + + public function locked(Smarty $smarty, Smarty_Template_Cached $cached) + { + // theoretically locking_timeout should be checked against time_limit (max_execution_time) + $start = microtime(true); + $hadLock = null; + while ($this->hasLock($smarty, $cached)) { + $hadLock = true; + if (microtime(true) - $start > $smarty->locking_timeout) { + // abort waiting for lock release + return false; + } + sleep(1); + } + return $hadLock; + } + + public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + // check if lock exists + return false; + } + + public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + // create lock + return true; + } + + public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + // release lock + return true; + } + + + /** + * Load Cache Resource Handler + * + * @param Smarty $smarty Smarty object + * @param string $type name of the cache resource + * @return Smarty_CacheResource Cache Resource Handler + */ + public static function load(Smarty $smarty, $type = null) + { + if (!isset($type)) { + $type = $smarty->caching_type; + } + // try the instance cache + if (isset(self::$resources[$type])) { + return self::$resources[$type]; + } + // try registered resource + if (isset($smarty->registered_cache_resources[$type])) { + // do not cache these instances as they may vary from instance to instance + return $smarty->registered_cache_resources[$type]; + } + // try sysplugins dir + if (isset(self::$sysplugins[$type])) { + $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type); + return self::$resources[$type] = new $cache_resource_class(); + } + // try plugins dir + $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type); + if ($smarty->loadPlugin($cache_resource_class)) { + return self::$resources[$type] = new $cache_resource_class(); + } + // give up + throw new SmartyException("Unable to load cache resource '{$type}'"); + } + + /** + * Invalid Loaded Cache Files + * + * @param Smarty $smarty Smarty object + */ + public static function invalidLoadedCache(Smarty $smarty) + { + foreach ($smarty->template_objects as $tpl) { + if (isset($tpl->cached)) { + $tpl->cached->valid = false; + $tpl->cached->processed = false; + } + } + } +} + +/** +* 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 Existance + * @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) { + 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->timestamp = time(); + $this->exists = true; + $this->valid = true; + if ($_template->smarty->cache_locking) { + $this->handler->releaseLock($_template->smarty, $this); + } + return true; + } + } + return false; + } + +} +?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_cacheresource_custom.php b/libs/sysplugins/smarty_cacheresource_custom.php new file mode 100644 index 00000000..beec39f3 --- /dev/null +++ b/libs/sysplugins/smarty_cacheresource_custom.php @@ -0,0 +1,189 @@ +<?php +/** + * Smarty Internal Plugin + * + * @package Smarty + * @subpackage Cacher + */ + +/** + * Cache Handler API + * + * @package Smarty + * @subpackage Cacher + * @author Rodney Rehm + */ +abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource { + + /** + * fetch cached content and its modification time from data source + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param string $content cached content + * @param integer $mtime cache modification timestamp (epoch) + * @return void + */ + protected abstract function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime); + + /** + * 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 $cache_id cache id + * @param string $compile_id compile id + * @return integer|boolean timestamp (epoch) the template was modified, or false if not found + */ + protected function fetchTimestamp($id, $name, $cache_id, $compile_id) + { + return null; + } + + /** + * Save content to cache + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer|null $exp_time seconds till expiration or null + * @param string $content content to cache + * @return boolean success + */ + protected abstract function save($id, $name, $cache_id, $compile_id, $exp_time, $content); + + /** + * Delete content from cache + * + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer|null $exp_time seconds till expiration time in seconds or null + * @return integer number of deleted caches + */ + protected abstract function delete($name, $cache_id, $compile_id, $exp_time); + + /** + * populate Cached Object with meta data from Resource + * + * @param Smarty_Template_Cached $cached cached object + * @param Smarty_Internal_Template $_template template object + * @return void + */ + public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template) + { + $_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); + $this->populateTimestamp($cached); + } + + /** + * populate Cached Object with timestamp and exists from Resource + * + * @param Smarty_Template_Cached $source cached object + * @return void + */ + public function populateTimestamp(Smarty_Template_Cached $cached) + { + $mtime = $this->fetchTimestamp($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id); + if ($mtime !== null) { + $cached->timestamp = $mtime; + $cached->exists = !!$cached->timestamp; + return; + } + $timestamp = null; + $this->fetch($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id, $cached->content, $timestamp); + $cached->timestamp = isset($timestamp) ? $timestamp : false; + $cached->exists = !!$cached->timestamp; + } + + /** + * Read the cached template and process the header + * + * @param Smarty_Internal_Template $_template template object + * @param Smarty_Template_Cached $cached cached object + * @return booelan true or false if the cached content does not exist + */ + public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null) + { + if (!$cached) { + $cached = $_template->cached; + } + $content = $cached->content ? $cached->content : null; + $timestamp = $cached->timestamp ? $cached->timestamp : null; + if ($content === null || !$timestamp) { + $this->fetch( + $_template->cached->filepath, + $_template->source->name, + $_template->cache_id, + $_template->compile_id, + $content, + $timestamp + ); + } + if (isset($content)) { + $_smarty_tpl = $_template; + eval("?>" . $content); + return true; + } + return false; + } + + /** + * Write the rendered template output to cache + * + * @param Smarty_Internal_Template $_template template object + * @param string $content content to cache + * @return boolean success + */ + public function writeCachedContent(Smarty_Internal_Template $_template, $content) + { + return $this->save( + $_template->cached->filepath, + $_template->source->name, + $_template->cache_id, + $_template->compile_id, + $_template->properties['cache_lifetime'], + $content + ); + } + + /** + * Empty cache + * + * @param Smarty $smarty Smarty object + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * @return integer number of cache files deleted + */ + public function clearAll(Smarty $smarty, $exp_time=null) + { + $this->cache = array(); + return $this->delete(null, null, null, $exp_time); + } + + /** + * Empty cache for a specific template + * + * @param Smarty $smarty Smarty object + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * @return integer number of cache files deleted + */ + public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) + { + $this->cache = array(); + return $this->delete($resource_name, $cache_id, $compile_id, $exp_time); + } + +} +?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_cacheresource_keyvaluestore.php b/libs/sysplugins/smarty_cacheresource_keyvaluestore.php new file mode 100644 index 00000000..f2ab5296 --- /dev/null +++ b/libs/sysplugins/smarty_cacheresource_keyvaluestore.php @@ -0,0 +1,450 @@ +<?php +/** + * Smarty Internal Plugin + * + * @package Smarty + * @subpackage Cacher + */ + +/** + * Smarty Cache Handler Base for Key/Value Storage Implementations + * + * This class implements the functionality required to use simple key/value stores + * for hierarchical cache groups. key/value stores like memcache or APC do not support + * wildcards in keys, therefore a cache group cannot be cleared like "a|*" - which + * is no problem to filesystem and RDBMS implementations. + * + * This implementation is based on the concept of invalidation. While one specific cache + * can be identified and cleared, any range of caches cannot be identified. For this reason + * each level of the cache group hierarchy can have its own value in the store. These values + * are nothing but microtimes, telling us when a particular cache group was cleared for the + * last time. These keys are evaluated for every cache read to determine if the cache has + * been invalidated since it was created and should hence be treated as inexistent. + * + * Although deep hierarchies are possible, they are not recommended. Try to keep your + * cache groups as shallow as possible. Anything up 3-5 parents should be ok. So + * »a|b|c« is a good depth where »a|b|c|d|e|f|g|h|i|j|k« isn't. Try to join correlating + * cache groups: if your cache groups look somewhat like »a|b|$page|$items|$whatever« + * consider using »a|b|c|$page-$items-$whatever« instead. + * + * @package Smarty + * @subpackage Cacher + * @author Rodney Rehm + */ +abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource { + + /** + * cache for contents + * @var array + */ + protected $contents = array(); + /** + * cache for timestamps + * @var array + */ + protected $timestamps = array(); + + /** + * populate Cached Object with meta data from Resource + * + * @param Smarty_Template_Cached $cached cached object + * @param Smarty_Internal_Template $_template template object + * @return void + */ + public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template) + { + $cached->filepath = $_template->source->uid + . '#' . $this->sanitize($cached->source->name) + . '#' . $this->sanitize($cached->cache_id) + . '#' . $this->sanitize($cached->compile_id); + + $this->populateTimestamp($cached); + } + + /** + * populate Cached Object with timestamp and exists from Resource + * + * @param Smarty_Template_Cached $cached cached object + * @return void + */ + public function populateTimestamp(Smarty_Template_Cached $cached) + { + if (!$this->fetch($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id, $content, $timestamp)) { + return; + } + $cached->content = $content; + $cached->timestamp = (int) $timestamp; + $cached->exists = $cached->timestamp; + } + + /** + * Read the cached template and process the header + * + * @param Smarty_Internal_Template $_template template object + * @param Smarty_Template_Cached $cached cached object + * @return booelan true or false if the cached content does not exist + */ + public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null) + { + if (!$cached) { + $cached = $_template->cached; + } + $content = $cached->content ? $cached->content : null; + $timestamp = $cached->timestamp ? $cached->timestamp : null; + if ($content === null || !$timestamp) { + if (!$this->fetch($_template->cached->filepath, $_template->source->name, $_template->cache_id, $_template->compile_id, $content, $timestamp)) { + return false; + } + } + if (isset($content)) { + $_smarty_tpl = $_template; + eval("?>" . $content); + return true; + } + return false; + } + + /** + * Write the rendered template output to cache + * + * @param Smarty_Internal_Template $_template template object + * @param string $content content to cache + * @return boolean success + */ + public function writeCachedContent(Smarty_Internal_Template $_template, $content) + { + $this->addMetaTimestamp($content); + return $this->write(array($_template->cached->filepath => $content), $_template->properties['cache_lifetime']); + } + + /** + * Empty cache + * + * {@internal the $exp_time argument is ignored altogether }} + * + * @param Smarty $smarty Smarty object + * @param integer $exp_time expiration time [being ignored] + * @return integer number of cache files deleted [always -1] + * @uses purge() to clear the whole store + * @uses invalidate() to mark everything outdated if purge() is inapplicable + */ + public function clearAll(Smarty $smarty, $exp_time=null) + { + if (!$this->purge()) { + $this->invalidate(null); + } + return -1; + } + + /** + * Empty cache for a specific template + * + * {@internal the $exp_time argument is ignored altogether}} + * + * @param Smarty $smarty Smarty object + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time [being ignored] + * @return integer number of cache files deleted [always -1] + * @uses buildCachedFilepath() to generate the CacheID + * @uses invalidate() to mark CacheIDs parent chain as outdated + * @uses delete() to remove CacheID from cache + */ + public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) + { + $cid = $this->buildCachedFilepath($smarty,$resource_name, $cache_id, $compile_id); + $this->delete(array($cid)); + $this->invalidate($cid, $resource_name, $cache_id, $compile_id); + return -1; + } + + /** + * Get system filepath to cached file. + * + * @param Smarty $smarty Smarty object + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @return string filepath of cache file + * @uses sanitize() on $resource_name and $compile_id to avoid bad segments + */ + protected function buildCachedFilepath(Smarty $smarty, $resource_name, $cache_id, $compile_id) + { + $uid = ''; + if (isset($resource_name)) { + $tpl = new $smarty->template_class($resource_name, $smarty); + if ($tpl->source->exists) { + $uid = $tpl->source->uid; + } + // remove from template cache + unset($smarty->template_objects[sha1($tpl->template_resource . $tpl->cache_id . $tpl->compile_id)]); + } + return $uid . '#' . $this->sanitize($resource_name) . '#' . $this->sanitize($cache_id) . '#' . $this->sanitize($compile_id); + } + + /** + * Sanitize CacheID components + * + * @param string $string CacheID component to sanitize + * @return string sanitized CacheID component + */ + protected function sanitize($string) + { + // some poeple smoke bad weed + $string = trim($string, '|'); + if (!$string) { + return null; + } + return preg_replace('#[^\w\|]+#S', '_', $string); + } + + /** + * Fetch and prepare a cache object. + * + * @param string $cid CacheID to fetch + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param string $content cached content + * @param integer &$timestamp cached timestamp (epoch) + * @return boolean success + */ + protected function fetch($cid, $resource_name = null, $cache_id = null, $compile_id = null, &$content = null, &$timestamp = null) + { + $t = $this->read(array($cid)); + $content = !empty($t[$cid]) ? $t[$cid] : null; + $timestamp = null; + + if ($content && ($timestamp = $this->getMetaTimestamp($content))) { + $invalidated = $this->getLatestInvalidationTimestamp($cid, $resource_name, $cache_id, $compile_id); + if ($invalidated > $timestamp) { + $timestamp = null; + $content = null; + } + } + + return !!$content; + } + + /** + * Add current microtime to the beginning of $cache_content + * + * {@internal the header uses 8 Bytes, the first 4 Bytes are the seconds, the second 4 Bytes are the microseconds}} + * + * @param string &$content the content to be cached + */ + protected function addMetaTimestamp(&$content) + { + $mt = explode(" ", microtime()); + $ts = pack("NN", $mt[1], (int) ($mt[0] * 100000000)); + $content = $ts . $content; + } + + /** + * Extract the timestamp the $content was cached + * + * @param string &$content the cached content + * @return float the microtime the content was cached + */ + 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); + } + + /** + * Invalidate CacheID + * + * @param string $cid CacheID + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @return void + */ + protected function invalidate($cid = null, $resource_name = null, $cache_id = null, $compile_id = null) + { + $now = microtime(true); + $key = null; + // invalidate everything + if (!$resource_name && !$cache_id && !$compile_id) { + $key = 'IVK#ALL'; + } + // invalidate all caches by template + else if ($resource_name && !$cache_id && !$compile_id) { + $key = 'IVK#TEMPLATE#' . $this->sanitize($resource_name); + } + // invalidate all caches by cache group + else if (!$resource_name && $cache_id && !$compile_id) { + $key = 'IVK#CACHE#' . $this->sanitize($cache_id); + } + // invalidate all caches by compile id + else if (!$resource_name && !$cache_id && $compile_id) { + $key = 'IVK#COMPILE#' . $this->sanitize($compile_id); + } + // invalidate by combination + else { + $key = 'IVK#CID#' . $cid; + } + $this->write(array($key => $now)); + } + + /** + * Determine the latest timestamp known to the invalidation chain + * + * @param string $cid CacheID to determine latest invalidation timestamp of + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @return float the microtime the CacheID was invalidated + */ + protected function getLatestInvalidationTimestamp($cid, $resource_name = null, $cache_id = null, $compile_id = null) + { + // abort if there is no CacheID + if (false && !$cid) { + return 0; + } + // abort if there are no InvalidationKeys to check + if (!($_cid = $this->listInvalidationKeys($cid, $resource_name, $cache_id, $compile_id))) { + return 0; + } + // there are no InValidationKeys + if (!($values = $this->read($_cid))) { + return 0; + } + // make sure we're dealing with floats + $values = array_map('floatval', $values); + return max($values); + } + + /** + * Translate a CacheID into the list of applicable InvalidationKeys. + * + * Splits "some|chain|into|an|array" into array( '#clearAll#', 'some', 'some|chain', 'some|chain|into', ... ) + * + * @param string $cid CacheID to translate + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @return array list of InvalidationKeys + * @uses $invalidationKeyPrefix to prepend to each InvalidationKey + */ + protected function listInvalidationKeys($cid, $resource_name = null, $cache_id = null, $compile_id = null) + { + $t = array('IVK#ALL'); + $_name = $_compile = '#'; + if ($resource_name) { + $_name .= $this->sanitize($resource_name); + $t[] = 'IVK#TEMPLATE' . $_name; + } + if ($compile_id) { + $_compile .= $this->sanitize($compile_id); + $t[] = 'IVK#COMPILE' . $_compile; + } + $_name .= '#'; + // some poeple smoke bad weed + $cid = trim($cache_id, '|'); + if (!$cid) { + return $t; + } + $i = 0; + while (true) { + // determine next delimiter position + $i = strpos($cid, '|', $i); + // add complete CacheID if there are no more delimiters + if ($i === false) { + $t[] = 'IVK#CACHE#' . $cid; + $t[] = 'IVK#CID' . $_name . $cid . $_compile; + $t[] = 'IVK#CID' . $_name . $_compile; + break; + } + $part = substr($cid, 0, $i); + // add slice to list + $t[] = 'IVK#CACHE#' . $part; + $t[] = 'IVK#CID' . $_name . $part . $_compile; + // skip past delimiter position + $i++; + } + return $t; + } + + /** + * Check is cache is locked for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * @return booelan true or false if cache is locked + */ + public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $key = 'LOCK#' . $cached->filepath; + $data = $this->read(array($key)); + return $data && time() - $data[$key] < $smarty->locking_timeout; + } + + /** + * Lock cache for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + */ + public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $cached->is_locked = true; + $key = 'LOCK#' . $cached->filepath; + $this->write(array($key => time()), $smarty->locking_timeout); + } + + /** + * Unlock cache for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + */ + public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $cached->is_locked = false; + $key = 'LOCK#' . $cached->filepath; + $this->delete(array($key)); + } + + /** + * Read values for a set of keys from cache + * + * @param array $keys list of keys to fetch + * @return array list of values with the given keys used as indexes + */ + protected abstract function read(array $keys); + + /** + * Save values for a set of keys to cache + * + * @param array $keys list of values to save + * @param int $expire expiration time + * @return boolean true on success, false on failure + */ + protected abstract function write(array $keys, $expire=null); + + /** + * Remove values from cache + * + * @param array $keys list of keys to delete + * @return boolean true on success, false on failure + */ + protected abstract function delete(array $keys); + + /** + * Remove *all* values from cache + * + * @return boolean true on success, false on failure + */ + protected function purge() + { + return false; + } + +} + +?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_config_source.php b/libs/sysplugins/smarty_config_source.php new file mode 100644 index 00000000..fb6d9817 --- /dev/null +++ b/libs/sysplugins/smarty_config_source.php @@ -0,0 +1,107 @@ +<?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 + */ + public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name) + { + $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; + } + + /** + * get a Compiled Object of this source + * + * @param Smarty_Internal_Template $_template template objet + * @return Smarty_Template_Compiled compiled object + * + public function getCompiled(Smarty_Internal_Template $_template) + { + $compiled = new Smarty_Template_Compiled($this); + $this->handler->populateCompiledFilepath($compiled, $_template); + return $compiled; + } + */ + + /** + * <<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 + * @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."); + } + } + +} + +?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_cacheresource_file.php b/libs/sysplugins/smarty_internal_cacheresource_file.php index 512f6fbf..35b1be3a 100644 --- a/libs/sysplugins/smarty_internal_cacheresource_file.php +++ b/libs/sysplugins/smarty_internal_cacheresource_file.php @@ -1,207 +1,255 @@ <?php - /** * Smarty Internal Plugin CacheResource File - * - * Implements the file system as resource for the HTML cache - * Version ussing nocache inserts - * + * * @package Smarty * @subpackage Cacher - * @author Uwe Tews + * @author Uwe Tews + * @author Rodney Rehm */ /** * This class does contain all necessary methods for the HTML cache on file system + * + * Implements the file system as resource for the HTML cache Version ussing nocache inserts. + * + * @package Smarty + * @subpackage Cacher */ -class Smarty_Internal_CacheResource_File { - function __construct($smarty) - { - $this->smarty = $smarty; - } +class Smarty_Internal_CacheResource_File extends Smarty_CacheResource { + /** - * Returns the filepath of the cached template output - * - * @param object $_template current template - * @return string the cache filepath + * populate Cached Object with meta data from Resource + * + * @param Smarty_Template_Cached $cached cached object + * @param Smarty_Internal_Template $_template template object + * @return void */ - public function getCachedFilepath($_template) + public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template) { - $_source_file_path = str_replace(':', '.', $_template->getTemplateFilepath()); + $_source_file_path = str_replace(':', '.', $_template->source->filepath); $_cache_id = isset($_template->cache_id) ? preg_replace('![^\w\|]+!', '_', $_template->cache_id) : null; $_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null; - $_filepath = $_template->templateUid; + $_filepath = $_template->source->uid; // if use_sub_dirs, break file into directories - if ($this->smarty->use_sub_dirs) { + 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 = $this->smarty->use_sub_dirs ? DS : '^'; + . substr($_filepath, 2, 2) . DS + . substr($_filepath, 4, 2) . DS + . $_filepath; + } + $_compile_dir_sep = $_template->smarty->use_sub_dirs ? DS : '^'; if (isset($_cache_id)) { $_cache_id = str_replace('|', $_compile_dir_sep, $_cache_id) . $_compile_dir_sep; } else { $_cache_id = ''; - } + } if (isset($_compile_id)) { $_compile_id = $_compile_id . $_compile_dir_sep; } else { $_compile_id = ''; - } - $_cache_dir = $this->smarty->cache_dir; - if (strpos('/\\', substr($_cache_dir, -1)) === false) { - $_cache_dir .= DS; - } - return $_cache_dir . $_cache_id . $_compile_id . $_filepath . '.' . basename($_source_file_path) . '.php'; - } + } + $_cache_dir = $_template->smarty->getCacheDir(); + if ($_template->smarty->cache_locking) { + // create locking file name + // relative file name? + if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_cache_dir)) { + $_lock_dir = getcwd().$_cache_dir; + } else { + $_lock_dir = $_cache_dir; + } + $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; + } /** - * Returns the timpestamp of the cached template output - * - * @param object $_template current template - * @return integer |booelan the template timestamp or false if the file does not exist + * populate Cached Object with timestamp and exists from Resource + * + * @param Smarty_Template_Cached $cached cached object + * @return void */ - public function getCachedTimestamp($_template) - { - // return @filemtime ($_template->getCachedFilepath()); - return ($_template->getCachedFilepath() && file_exists($_template->getCachedFilepath())) ? filemtime($_template->getCachedFilepath()) : false ; - } + public function populateTimestamp(Smarty_Template_Cached $cached) + { + $cached->timestamp = @filemtime($cached->filepath); + $cached->exists = !!$cached->timestamp; + } /** - * Returns the cached template output - * - * @param object $_template current template - * @return string |booelan the template content or false if the file does not exist + * Read the cached template and process its header + * + * @param Smarty_Internal_Template $_template template object + * @param Smarty_Template_Cached $cached cached object + * @return booelan true or false if the cached content does not exist */ - public function getCachedContents($_template, $no_render = false) + public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null) { - if (!$no_render) { - ob_start(); - } $_smarty_tpl = $_template; - include $_template->getCachedFilepath(); - if ($no_render) { - return null; - } else { - return ob_get_clean(); - } - } + return @include $_template->cached->filepath; + } /** - * Writes the rendered template output to cache file - * - * @param object $_template current template - * @return boolean status + * Write the rendered template output to cache + * + * @param Smarty_Internal_Template $_template template object + * @param string $content content to cache + * @return boolean success */ - public function writeCachedContent($_template, $content) + public function writeCachedContent(Smarty_Internal_Template $_template, $content) { - if (!$_template->resource_object->isEvaluated) { - if (Smarty_Internal_Write_File::writeFile($_template->getCachedFilepath(), $content, $this->smarty) === true) { - $_template->cached_timestamp = filemtime($_template->getCachedFilepath()); - return true; - } - } + 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; + return true; + } return false; - } + } /** - * Empty cache folder - * - * @param integer $exp_time expiration time + * Empty cache + * + * @param Smarty_Internal_Template $_template template object + * @param integer $exp_time expiration time (number of seconds, not timestamp) * @return integer number of cache files deleted */ - public function clearAll($exp_time = null) + public function clearAll(Smarty $smarty, $exp_time = null) { - return $this->clear(null, null, null, $exp_time); - } + return $this->clear($smarty, null, null, null, $exp_time); + } + /** * Empty cache for a specific template - * - * @param string $resource_name template name - * @param string $cache_id cache id - * @param string $compile_id compile id - * @param integer $exp_time expiration time + * + * @param Smarty $_template template object + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time (number of seconds, not timestamp) * @return integer number of cache files deleted - */ - public function clear($resource_name, $cache_id, $compile_id, $exp_time) + */ + public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) { $_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null; $_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null; - $_dir_sep = $this->smarty->use_sub_dirs ? '/' : '^'; - $_compile_id_offset = $this->smarty->use_sub_dirs ? 3 : 0; - $_dir = rtrim($this->smarty->cache_dir, '/\\') . DS; + $_dir_sep = $smarty->use_sub_dirs ? '/' : '^'; + $_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0; + $_dir = $smarty->getCacheDir(); $_dir_length = strlen($_dir); if (isset($_cache_id)) { $_cache_id_parts = explode('|', $_cache_id); $_cache_id_parts_count = count($_cache_id_parts); - if ($this->smarty->use_sub_dirs) { + if ($smarty->use_sub_dirs) { foreach ($_cache_id_parts as $id_part) { $_dir .= $id_part . DS; - } - } - } + } + } + } if (isset($resource_name)) { - $_save_stat = $this->smarty->caching; - $this->smarty->caching = true; - $tpl = new $this->smarty->template_class($resource_name, $this->smarty); - $this->smarty->caching = $_save_stat; - if ($tpl->isExisting()) { - $_resourcename_parts = basename(str_replace('^', '/', $tpl->getCachedFilepath())); - // remove from template cache - unset($this->smarty->template_objects[sha1($tpl->template_resource . $tpl->cache_id . $tpl->compile_id)]); + $_save_stat = $smarty->caching; + $smarty->caching = true; + $tpl = new $smarty->template_class($resource_name, $smarty); + $smarty->caching = $_save_stat; + if ($tpl->source->exists) { + $_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath)); + // remove from template cache + unset($smarty->template_objects[sha1($tpl->template_resource . $tpl->cache_id . $tpl->compile_id)]); } else { - // remove from template cache - unset($this->smarty->template_objects[sha1($tpl->template_resource . $tpl->cache_id . $tpl->compile_id)]); + // remove from template cache + unset($smarty->template_objects[sha1($tpl->template_resource . $tpl->cache_id . $tpl->compile_id)]); return 0; - } - } + } + } $_count = 0; + $_time = time(); if (file_exists($_dir)) { $_cacheDirs = new RecursiveDirectoryIterator($_dir); $_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST); foreach ($_cache as $_file) { - if (substr($_file->getBasename(),0,1) == '.') continue; + if (substr($_file->getBasename(),0,1) == '.' || strpos($_file, '.svn') !== false) continue; // directory ? if ($_file->isDir()) { if (!$_cache->isDot()) { // delete folder if empty @rmdir($_file->getPathname()); - } + } } else { $_parts = explode($_dir_sep, str_replace('\\', '/', substr((string)$_file, $_dir_length))); - $_parts_count = count($_parts); + $_parts_count = count($_parts); // check name if (isset($resource_name)) { if ($_parts[$_parts_count-1] != $_resourcename_parts) { continue; - } - } + } + } // check compile id if (isset($_compile_id) && (!isset($_parts[$_parts_count-2 - $_compile_id_offset]) || $_parts[$_parts_count-2 - $_compile_id_offset] != $_compile_id)) { continue; - } + } // check cache id if (isset($_cache_id)) { // count of cache id parts $_parts_count = (isset($_compile_id)) ? $_parts_count - 2 - $_compile_id_offset : $_parts_count - 1 - $_compile_id_offset; if ($_parts_count < $_cache_id_parts_count) { continue; - } + } for ($i = 0; $i < $_cache_id_parts_count; $i++) { if ($_parts[$i] != $_cache_id_parts[$i]) continue 2; - } - } + } + } // expired ? - if (isset($exp_time) && time() - @filemtime($_file) < $exp_time) { + if (isset($exp_time) && $_time - @filemtime($_file) < $exp_time) { continue; - } + } $_count += @unlink((string) $_file) ? 1 : 0; - } - } - } + } + } + } return $_count; - } -} + } + + /** + * Check is cache is locked for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * @return booelan true or false if cache is locked + */ + public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + if (version_compare(PHP_VERSION, '5.3.0', '>=')) { + clearstatcache(true, $cached->lock_id); + } else { + clearstatcache(); + } + $t = @filemtime($cached->lock_id); + return $t && (time() - $t < $smarty->locking_timeout); + } + + /** + * Lock cache for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + */ + public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $cached->is_locked = true; + touch($cached->lock_id); + } + + /** + * Unlock cache for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + */ + public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $cached->is_locked = false; + @unlink($cached->lock_id); + } +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_append.php b/libs/sysplugins/smarty_internal_compile_append.php index 98e696e3..f6036e88 100644 --- a/libs/sysplugins/smarty_internal_compile_append.php +++ b/libs/sysplugins/smarty_internal_compile_append.php @@ -1,22 +1,25 @@ <?php - /** * Smarty Internal Plugin Compile Append - * + * * Compiles the {append} tag - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ + /** * Smarty Internal Plugin Compile Append Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Append extends Smarty_Internal_Compile_Assign { /** * Compiles code for the {append} tag - * + * * @param array $args array with attributes from parser * @param object $compiler compiler object * @param array $parameter array with compilation parameter @@ -24,13 +27,12 @@ class Smarty_Internal_Compile_Append extends Smarty_Internal_Compile_Assign { */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // the following must be assigned at runtime because it will be overwritten in parent class $this->required_attributes = array('var', 'value'); $this->shorttag_order = array('var', 'value'); - $this->optional_attributes = array('scope','index'); + $this->optional_attributes = array('scope', 'index'); // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // map to compile assign attributes if (isset($_attr['index'])) { $_params['smarty_internal_index'] = '[' . $_attr['index'] . ']'; @@ -41,10 +43,11 @@ class Smarty_Internal_Compile_Append extends Smarty_Internal_Compile_Assign { $_new_attr = array(); foreach ($_attr as $key => $value) { $_new_attr[] = array($key => $value); - } + } // call compile assign return parent::compile($_new_attr, $compiler, $_params); - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_assign.php b/libs/sysplugins/smarty_internal_compile_assign.php index 8d8c643a..3cc3e144 100644 --- a/libs/sysplugins/smarty_internal_compile_assign.php +++ b/libs/sysplugins/smarty_internal_compile_assign.php @@ -1,44 +1,46 @@ <?php - /** * Smarty Internal Plugin Compile Assign - * + * * Compiles the {assign} tag - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Assign Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase { + /** * Compiles code for the {assign} 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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // the following must be assigned at runtime because it will be overwritten in Smarty_Internal_Compile_Append $this->required_attributes = array('var', 'value'); $this->shorttag_order = array('var', 'value'); $this->optional_attributes = array('scope'); $_nocache = 'null'; - $_scope = 'null'; + $_scope = Smarty::SCOPE_LOCAL; // check and get attributes - $_attr = $this->_get_attributes($args); - // nocache ? - if ($this->compiler->tag_nocache || $this->compiler->nocache) { - $_nocache = 'true'; + $_attr = $this->getAttributes($compiler, $args); + // nocache ? + if ($compiler->tag_nocache || $compiler->nocache) { + $_nocache = 'true'; // create nocache var to make it know for further compiling $compiler->template->tpl_vars[trim($_attr['var'], "'")] = new Smarty_variable(null, true); - } + } // scope setup if (isset($_attr['scope'])) { $_attr['scope'] = trim($_attr['scope'], "'\""); @@ -49,16 +51,23 @@ class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase { } elseif ($_attr['scope'] == 'global') { $_scope = Smarty::SCOPE_GLOBAL; } else { - $this->compiler->trigger_template_error('illegal value for "scope" attribute', $this->compiler->lex->taglineno); - } - } + $compiler->trigger_template_error('illegal value for "scope" attribute', $compiler->lex->taglineno); + } + } // compiled output if (isset($parameter['smarty_internal_index'])) { - return "<?php if (!isset(\$_smarty_tpl->tpl_vars[$_attr[var]]) || !is_array(\$_smarty_tpl->tpl_vars[$_attr[var]]->value)) \$_smarty_tpl->createLocalArrayVariable($_attr[var], $_nocache, $_scope);\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value$parameter[smarty_internal_index] = $_attr[value];?>"; + $output = "<?php \$_smarty_tpl->createLocalArrayVariable($_attr[var], $_nocache, $_scope);\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value$parameter[smarty_internal_index] = $_attr[value];"; + } else { + $output = "<?php \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);"; + } + if ($_scope != Smarty::SCOPE_LOCAL) { + $output .= "\nif (\$tmp_ptr = &\$_smarty_tpl->getScope($_scope) != null) \$tmp_ptr[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];?>"; } else { - return "<?php \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);?>"; - } - } -} + $output .= '?>'; + } + return $output; + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_block.php b/libs/sysplugins/smarty_internal_compile_block.php index fc003dd7..6e3f0fbb 100644 --- a/libs/sysplugins/smarty_internal_compile_block.php +++ b/libs/sysplugins/smarty_internal_compile_block.php @@ -11,177 +11,229 @@ /** * Smarty Internal Plugin Compile Block Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase { - // attribute definitions + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('name'); - public $shorttag_order = array('name'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('name', 'hide'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('hide'); + /** * Compiles code for the {block} tag * - * @param array $args array with attributes from parser + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return boolean true */ public function compile($args, $compiler) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); - $save = array($_attr, $compiler->parser->current_buffer, $this->compiler->nocache, $this->compiler->smarty->merge_compiled_includes, $compiler->smarty->inheritance); - $this->_open_tag('block', $save); + $_attr = $this->getAttributes($compiler, $args); + $save = array($_attr, $compiler->parser->current_buffer, $compiler->nocache, $compiler->smarty->merge_compiled_includes, $compiler->merged_templates); + $this->openTag($compiler, 'block', $save); if ($_attr['nocache'] == true) { $compiler->nocache = true; } // set flag for {block} tag - $compiler->smarty->inheritance = true; + $compiler->inheritance = true; // must merge includes - $this->compiler->smarty->merge_compiled_includes = true; + $compiler->smarty->merge_compiled_includes = true; $compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser); $compiler->has_code = false; return true; } - - static function saveBlockData($block_content, $block_tag, $template, $filepath) + /** + * Save or replace child block source by block name during parsing + * + * @param string $block_content block source content + * @param string $block_tag opening block tag + * @param object $template template object + * @param string $filepath filepath of template source + */ + public static function saveBlockData($block_content, $block_tag, $template, $filepath) { - $_rdl = preg_quote($template->smarty->right_delimiter); + $_rdl = preg_quote($template->smarty->right_delimiter); $_ldl = preg_quote($template->smarty->left_delimiter); - if (0 == preg_match("!({$_ldl}block\s+)(name=)?(\w+|'.*'|\".*\")(\s*?)?((append|prepend|nocache)(=true)?)?(\s*{$_rdl})!", $block_tag, $_match)) { - $error_text = 'Syntax Error in template "' . $template->getTemplateFilepath() . '" "' . htmlspecialchars($block_tag) . '" illegal options'; + if (0 == preg_match("!({$_ldl}block\s+)(name=)?(\w+|'.*'|\".*\")(\s*?)?((append|prepend|nocache)?(\s*)?(hide)?)?(\s*{$_rdl})!", $block_tag, $_match)) { + $error_text = 'Syntax Error in template "' . $template->source->filepath . '" "' . htmlspecialchars($block_tag) . '" illegal options'; throw new SmartyCompilerException($error_text); } else { $_name = trim($_match[3], '\'"'); - // replace {$smarty.block.child} - if (strpos($block_content, $template->smarty->left_delimiter . '$smarty.block.child' . $template->smarty->right_delimiter) !== false) { - if (isset($template->block_data[$_name])) { - $block_content = str_replace($template->smarty->left_delimiter . '$smarty.block.child' . $template->smarty->right_delimiter, + if ($_match[8] != 'hide' || isset($template->block_data[$_name])) { // replace {$smarty.block.child} + if (strpos($block_content, $template->smarty->left_delimiter . '$smarty.block.child' . $template->smarty->right_delimiter) !== false) { + if (isset($template->block_data[$_name])) { + $block_content = str_replace($template->smarty->left_delimiter . '$smarty.block.child' . $template->smarty->right_delimiter, $template->block_data[$_name]['source'], $block_content); - unset($template->block_data[$_name]); - } else { - $block_content = str_replace($template->smarty->left_delimiter . '$smarty.block.child' . $template->smarty->right_delimiter, + unset($template->block_data[$_name]); + } else { + $block_content = str_replace($template->smarty->left_delimiter . '$smarty.block.child' . $template->smarty->right_delimiter, '', $block_content); + } } - } - if (isset($template->block_data[$_name])) { - if (strpos($template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) { - $template->block_data[$_name]['source'] = - str_replace('%%%%SMARTY_PARENT%%%%', $block_content, $template->block_data[$_name]['source']); - } elseif ($template->block_data[$_name]['mode'] == 'prepend') { - $template->block_data[$_name]['source'] .= $block_content; - } elseif ($template->block_data[$_name]['mode'] == 'append') { - $template->block_data[$_name]['source'] = $block_content . $template->block_data[$_name]['source']; + if (isset($template->block_data[$_name])) { + if (strpos($template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) { + $template->block_data[$_name]['source'] = + str_replace('%%%%SMARTY_PARENT%%%%', $block_content, $template->block_data[$_name]['source']); + } elseif ($template->block_data[$_name]['mode'] == 'prepend') { + $template->block_data[$_name]['source'] .= $block_content; + } elseif ($template->block_data[$_name]['mode'] == 'append') { + $template->block_data[$_name]['source'] = $block_content . $template->block_data[$_name]['source']; + } + } else { + $template->block_data[$_name]['source'] = $block_content; + $template->block_data[$_name]['file'] = $filepath; + } + if ($_match[6] == 'append') { + $template->block_data[$_name]['mode'] = 'append'; + } elseif ($_match[6] == 'prepend') { + $template->block_data[$_name]['mode'] = 'prepend'; + } else { + $template->block_data[$_name]['mode'] = 'replace'; } - } else { - $template->block_data[$_name]['source'] = $block_content; - } - if ($_match[6] == 'append') { - $template->block_data[$_name]['mode'] = 'append'; - } elseif ($_match[6] == 'prepend') { - $template->block_data[$_name]['mode'] = 'prepend'; - } else { - $template->block_data[$_name]['mode'] = 'replace'; } - $template->block_data[$_name]['file'] = $filepath; } } - static function compileChildBlock ($compiler, $_name = null) - { - $_output = ''; + /** + * Compile saved child block source + * + * @param object $compiler compiler object + * @param string $_name optional name of child block + * @return string compiled code of schild block + */ + public static function compileChildBlock($compiler, $_name = null) + { + $_output = ''; // if called by {$smarty.block.child} we must search the name of enclosing {block} - if ($_name == null) { - $stack_count = count($compiler->_tag_stack); + if ($_name == null) { + $stack_count = count($compiler->_tag_stack); while (--$stack_count >= 0) { - if ($compiler->_tag_stack[$stack_count][0] == 'block') { - $_name = trim($compiler->_tag_stack[$stack_count][1][0]['name'] ,"'\""); - break; + if ($compiler->_tag_stack[$stack_count][0] == 'block') { + $_name = trim($compiler->_tag_stack[$stack_count][1][0]['name'] ,"'\""); + break; + } + } + // flag that child is already compile by {$smarty.block.child} inclusion + $compiler->template->block_data[$_name]['compiled'] = true; + } + if ($_name == null) { + $compiler->trigger_template_error('{$smarty.block.child} used out of context', $compiler->lex->taglineno); + } + // undefined child? + if (!isset($compiler->template->block_data[$_name]['source'])) { + return ''; + } + $_tpl = new Smarty_Internal_template ('string:' . $compiler->template->block_data[$_name]['source'], $compiler->smarty, $compiler->template, $compiler->template->cache_id, + $compiler->template->compile_id = null, $compiler->template->caching, $compiler->template->cache_lifetime); + $_tpl->variable_filters = $compiler->template->variable_filters; + $_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash']; + $_tpl->source->filepath = $compiler->template->block_data[$_name]['file']; + if ($compiler->nocache) { + $_tpl->compiler->forceNocache = 2; + } else { + $_tpl->compiler->forceNocache = 1; + } + $_tpl->compiler->suppressHeader = true; + $_tpl->compiler->suppressTemplatePropertyHeader = true; + $_tpl->compiler->suppressMergedTemplates = true; + if (strpos($compiler->template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) { + $_output = str_replace('%%%%SMARTY_PARENT%%%%', $compiler->parser->current_buffer->to_smarty_php(), $_tpl->compiler->compileTemplate($_tpl)); + } elseif ($compiler->template->block_data[$_name]['mode'] == 'prepend') { + $_output = $_tpl->compiler->compileTemplate($_tpl) . $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); + } elseif (!empty($compiler->template->block_data[$_name])) { + $_output = $_tpl->compiler->compileTemplate($_tpl); + } + $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->variable_filters = $_tpl->variable_filters; + if ($_tpl->has_nocache_code) { + $compiler->template->has_nocache_code = true; + } + foreach($_tpl->required_plugins as $code => $tmp1) { + foreach($tmp1 as $name => $tmp) { + foreach($tmp as $type => $data) { + $compiler->template->required_plugins[$code][$name][$type] = $data; } } - // flag that child is already compile by {$smarty.block.child} inclusion - $compiler->template->block_data[$_name]['compiled'] = true; } - if ($_name == null) { - $compiler->trigger_template_error('{$smarty.block.child} used out of context', $compiler->lex->taglineno); - } - // undefined child? - if (!isset($compiler->template->block_data[$_name])) { - return ''; - } - $_tpl = new Smarty_Internal_template ('eval:' . $compiler->template->block_data[$_name]['source'], $compiler->smarty, $compiler->template, $compiler->template->cache_id, - $compiler->template->compile_id = null, $compiler->template->caching, $compiler->template->cache_lifetime); - $_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash']; - $_tpl->template_filepath = $compiler->template->block_data[$_name]['file']; - if ($compiler->nocache) { - $_tpl->forceNocache = 2; - } else { - $_tpl->forceNocache = 1; - } - $_tpl->suppressHeader = true; - $_tpl->suppressFileDependency = true; - if (strpos($compiler->template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) { - $_output = str_replace('%%%%SMARTY_PARENT%%%%', $compiler->parser->current_buffer->to_smarty_php(), $_tpl->getCompiledTemplate()); - } elseif ($compiler->template->block_data[$_name]['mode'] == 'prepend') { - $_output = $_tpl->getCompiledTemplate() . $compiler->parser->current_buffer->to_smarty_php(); - } elseif ($compiler->template->block_data[$_name]['mode'] == 'append') { - $_output = $compiler->parser->current_buffer->to_smarty_php() . $_tpl->getCompiledTemplate(); - } elseif (!empty($compiler->template->block_data[$_name])) { - $_output = $_tpl->getCompiledTemplate(); - } - $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']); - if ($_tpl->has_nocache_code) { - $compiler->template->has_nocache_code = true; - } - foreach($_tpl->required_plugins as $code => $tmp1) { - foreach($tmp1 as $name => $tmp) { - foreach($tmp as $type => $data) { - $compiler->template->required_plugins[$code][$name][$type] = $data; - } - } - } - unset($_tpl); - return $_output; - } + unset($_tpl); + return $_output; + } } /** * Smarty Internal Plugin Compile BlockClose Class - */ + * + * @package Smarty + * @subpackage Compiler +*/ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_CompileBase { + /** * Compiles code for the {/block} tag * - * @param array $args array with attributes from parser + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; - $this->smarty = $compiler->smarty; - $this->compiler->has_code = true; + $compiler->has_code = true; // check and get attributes - $_attr = $this->_get_attributes($args); - $saved_data = $this->_close_tag(array('block')); + $_attr = $this->getAttributes($compiler, $args); + $saved_data = $this->closeTag($compiler, array('block')); $_name = trim($saved_data[0]['name'], "\"'"); if (isset($compiler->template->block_data[$_name]) && !isset($compiler->template->block_data[$_name]['compiled'])) { - $_output = Smarty_Internal_Compile_Block::compileChildBlock($compiler, $_name); + $compiler->merged_templates = $saved_data[4]; + $_output = Smarty_Internal_Compile_Block::compileChildBlock($compiler, $_name); } else { - $_output = $compiler->parser->current_buffer->to_smarty_php(); + if (isset($saved_data[0]['hide']) && !isset($compiler->template->block_data[$_name]['source'])) { + $compiler->merged_templates = $saved_data[4]; + $_output = ''; + } else { + $_output = $compiler->parser->current_buffer->to_smarty_php(); + } unset ($compiler->template->block_data[$_name]['compiled']); } // reset flags $compiler->parser->current_buffer = $saved_data[1]; $compiler->nocache = $saved_data[2]; $compiler->smarty->merge_compiled_includes = $saved_data[3]; - $compiler->smarty->inheritance = $saved_data[4]; + // reset flag for {block} tag + $compiler->inheritance = false; // $_output content has already nocache code processed $compiler->suppressNocacheProcessing = true; return $_output; } + } + ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_break.php b/libs/sysplugins/smarty_internal_compile_break.php index 2e57da40..84e67479 100644 --- a/libs/sysplugins/smarty_internal_compile_break.php +++ b/libs/sysplugins/smarty_internal_compile_break.php @@ -1,65 +1,76 @@ <?php
-
/**
* Smarty Internal Plugin Compile Break
- *
+ *
* Compiles the {break} tag
- *
+ *
* @package Smarty
* @subpackage Compiler
- * @author Uwe Tews
+ * @author Uwe Tews
*/
/**
* Smarty Internal Plugin Compile Break Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
*/
class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase {
- // attribute definitions
- public $optional_attributes = array('levels');
- public $shorttag_order = array('levels');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('levels');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('levels');
/**
* Compiles code for the {break} 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 $compiler compiler object
+ * @param array $parameter array with compilation parameter
* @return string compiled code
*/
public function compile($args, $compiler, $parameter)
- {
- $this->compiler = $compiler;
- $this->smarty = $compiler->smarty;
+ {
// check and get attributes
- $_attr = $this->_get_attributes($args);
+ $_attr = $this->getAttributes($compiler, $args);
if ($_attr['nocache'] === true) {
- $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno);
+ $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
}
if (isset($_attr['levels'])) {
if (!is_numeric($_attr['levels'])) {
- $this->compiler->trigger_template_error('level attribute must be a numeric constant', $this->compiler->lex->taglineno);
- }
+ $compiler->trigger_template_error('level attribute must be a numeric constant', $compiler->lex->taglineno);
+ }
$_levels = $_attr['levels'];
} else {
$_levels = 1;
- }
+ }
$level_count = $_levels;
$stack_count = count($compiler->_tag_stack) - 1;
while ($level_count > 0 && $stack_count >= 0) {
if (in_array($compiler->_tag_stack[$stack_count][0], array('for', 'foreach', 'while', 'section'))) {
$level_count--;
- }
+ }
$stack_count--;
- }
+ }
if ($level_count != 0) {
- $this->compiler->trigger_template_error("cannot break {$_levels} level(s)", $this->compiler->lex->taglineno);
- }
- // this tag does not return compiled code
- $this->compiler->has_code = true;
+ $compiler->trigger_template_error("cannot break {$_levels} level(s)", $compiler->lex->taglineno);
+ }
+ $compiler->has_code = true;
return "<?php break {$_levels}?>";
- }
-}
+ }
+
+}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_call.php b/libs/sysplugins/smarty_internal_compile_call.php index 50ba6328..f1feba36 100644 --- a/libs/sysplugins/smarty_internal_compile_call.php +++ b/libs/sysplugins/smarty_internal_compile_call.php @@ -1,58 +1,76 @@ <?php - /** * Smarty Internal Plugin Compile Function_Call - * + * * Compiles the calls of user defined tags defined by {function} - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Function_Call Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase { - // attribute definitions + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('name'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $shorttag_order = array('name'); - public $optional_attributes = array('_any'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); /** * Compiles the calls of user defined tags defined by {function} - * - * @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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; - $this->smarty = $compiler->smarty; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // save possible attributes if (isset($_attr['assign'])) { // output will be stored in a smarty variable instead of beind displayed $_assign = $_attr['assign']; - } + } $_name = $_attr['name']; - unset($_attr['name'], $_attr['assign'], $_attr['nocache']); + 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) { $_nocache = 'true'; } else { $_nocache = 'false'; - } + } $_paramsArray = array(); foreach ($_attr as $_key => $_value) { if (is_int($_key)) { $_paramsArray[] = "$_key=>$_value"; } else { $_paramsArray[] = "'$_key'=>$_value"; - } + } } if (isset($compiler->template->properties['function'][$_name]['parameter'])) { foreach ($compiler->template->properties['function'][$_name]['parameter'] as $_key => $_value) { @@ -61,48 +79,49 @@ class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase { $_paramsArray[] = "$_key=>$_value"; } else { $_paramsArray[] = "'$_key'=>$_value"; - } - } - } - } elseif (isset($this->smarty->template_functions[$_name]['parameter'])) { - foreach ($this->smarty->template_functions[$_name]['parameter'] as $_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"; - } - } - } + } + } + } } //varibale 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; + 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']); + $_hash = str_replace('-', '_', $compiler->template->properties['nocache_hash']); // 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"; - } + } } 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"; - } - } + } + } return $_output; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_capture.php b/libs/sysplugins/smarty_internal_compile_capture.php index 74ade680..da4ad172 100644 --- a/libs/sysplugins/smarty_internal_compile_capture.php +++ b/libs/sysplugins/smarty_internal_compile_capture.php @@ -1,81 +1,100 @@ <?php /** * Smarty Internal Plugin Compile Capture - * + * * Compiles the {capture} tag - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Capture Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase { - // attribute definitions + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $shorttag_order = array('name'); - public $optional_attributes = array('name', 'assign', 'append'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('name', 'assign', 'append'); /** * Compiles code for the {capture} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); $buffer = isset($_attr['name']) ? $_attr['name'] : "'default'"; $assign = isset($_attr['assign']) ? $_attr['assign'] : null; $append = isset($_attr['append']) ? $_attr['append'] : null; - $this->compiler->_capture_stack[] = array($buffer, $assign, $append, $this->compiler->nocache); + $compiler->_capture_stack[] = array($buffer, $assign, $append, $compiler->nocache); // maybe nocache because of nocache variables - $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; $_output = "<?php ob_start(); ?>"; return $_output; - } -} + } + +} /** * Smarty Internal Plugin Compile Captureclose Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_CaptureClose extends Smarty_Internal_CompileBase { + /** * Compiles code for the {/capture} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // must endblock be nocache? - if ($this->compiler->nocache) { - $this->compiler->tag_nocache = true; - } + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } - list($buffer, $assign, $append, $this->compiler->nocache) = array_pop($this->compiler->_capture_stack); + list($buffer, $assign, $append, $compiler->nocache) = array_pop($compiler->_capture_stack); $_output = "<?php "; if (isset($assign)) { $_output .= " \$_smarty_tpl->assign($assign, ob_get_contents());"; - } + } if (isset($append)) { $_output .= " \$_smarty_tpl->append($append, ob_get_contents());"; - } + } $_output .= " Smarty::\$_smarty_vars['capture'][$buffer]=ob_get_clean();?>"; return $_output; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_config_load.php b/libs/sysplugins/smarty_internal_compile_config_load.php index 733e1ac5..408f6d98 100644 --- a/libs/sysplugins/smarty_internal_compile_config_load.php +++ b/libs/sysplugins/smarty_internal_compile_config_load.php @@ -1,49 +1,68 @@ <?php - /** * Smarty Internal Plugin Compile Config Load - * + * * Compiles the {config load} tag - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Config Load Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase { - // attribute definitions + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('file'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $shorttag_order = array('file','section'); - public $optional_attributes = array('section', 'scope'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('section', 'scope'); /** * Compiles code for the {config_load} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); - + $_attr = $this->getAttributes($compiler, $args); + if ($_attr['nocache'] === true) { - $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno); + $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); } - + // save posible attributes $conf_file = $_attr['file']; if (isset($_attr['section'])) { $section = $_attr['section']; } else { $section = 'null'; - } + } $scope = 'local'; // scope setup if (isset($_attr['scope'])) { @@ -51,14 +70,15 @@ class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase { if (in_array($_attr['scope'],array('local','parent','root','global'))) { $scope = $_attr['scope']; } else { - $this->compiler->trigger_template_error('illegal value for "scope" attribute', $this->compiler->lex->taglineno); - } - } + $compiler->trigger_template_error('illegal value for "scope" attribute', $compiler->lex->taglineno); + } + } // create config object $_output = "<?php \$_config = new Smarty_Internal_Config($conf_file, \$_smarty_tpl->smarty, \$_smarty_tpl);"; $_output .= "\$_config->loadConfigVars($section, '$scope'); ?>"; return $_output; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_continue.php b/libs/sysplugins/smarty_internal_compile_continue.php index 7d796673..9db194dd 100644 --- a/libs/sysplugins/smarty_internal_compile_continue.php +++ b/libs/sysplugins/smarty_internal_compile_continue.php @@ -1,64 +1,77 @@ <?php
-
/**
* Smarty Internal Plugin Compile Continue
- *
+ *
* Compiles the {continue} tag
- *
+ *
* @package Smarty
* @subpackage Compiler
- * @author Uwe Tews
+ * @author Uwe Tews
*/
+
/**
* Smarty Internal Plugin Compile Continue Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
*/
class Smarty_Internal_Compile_Continue extends Smarty_Internal_CompileBase {
- // attribute definitions
- public $optional_attributes = array('levels');
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('levels');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
public $shorttag_order = array('levels');
/**
* Compiles code for the {continue} 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 $compiler compiler object
+ * @param array $parameter array with compilation parameter
* @return string compiled code
*/
public function compile($args, $compiler, $parameter)
{
- $this->compiler = $compiler;
- $this->smarty = $compiler->smarty;
// check and get attributes
- $_attr = $this->_get_attributes($args);
+ $_attr = $this->getAttributes($compiler, $args);
if ($_attr['nocache'] === true) {
- $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno);
+ $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
}
if (isset($_attr['levels'])) {
if (!is_numeric($_attr['levels'])) {
- $this->compiler->trigger_template_error('level attribute must be a numeric constant', $this->compiler->lex->taglineno);
- }
+ $compiler->trigger_template_error('level attribute must be a numeric constant', $compiler->lex->taglineno);
+ }
$_levels = $_attr['levels'];
} else {
$_levels = 1;
- }
+ }
$level_count = $_levels;
$stack_count = count($compiler->_tag_stack) - 1;
while ($level_count > 0 && $stack_count >= 0) {
if (in_array($compiler->_tag_stack[$stack_count][0], array('for', 'foreach', 'while', 'section'))) {
$level_count--;
- }
+ }
$stack_count--;
- }
+ }
if ($level_count != 0) {
- $this->compiler->trigger_template_error("cannot continue {$_levels} level(s)", $this->compiler->lex->taglineno);
- }
- // this tag does not return compiled code
- $this->compiler->has_code = true;
+ $compiler->trigger_template_error("cannot continue {$_levels} level(s)", $compiler->lex->taglineno);
+ }
+ $compiler->has_code = true;
return "<?php continue {$_levels}?>";
- }
-}
+ }
+
+}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_debug.php b/libs/sysplugins/smarty_internal_compile_debug.php index f6189e7e..f50c7aee 100644 --- a/libs/sysplugins/smarty_internal_compile_debug.php +++ b/libs/sysplugins/smarty_internal_compile_debug.php @@ -1,9 +1,10 @@ -<?php +<?php /** * Smarty Internal Plugin Compile Debug * - * Compiles the {debug} tag - * It opens a window the the Smarty Debugging Console + * Compiles the {debug} tag. + * It opens a window the the Smarty Debugging Console. + * * @package Smarty * @subpackage Compiler * @author Uwe Tews @@ -11,28 +12,32 @@ /** * Smarty Internal Plugin Compile Debug Class - */ + * + * @package Smarty + * @subpackage Compiler + */ class Smarty_Internal_Compile_Debug extends Smarty_Internal_CompileBase { + /** * Compiles code for the {debug} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); - // compile always as nocache - $this->compiler->tag_nocache = true; + // compile always as nocache + $compiler->tag_nocache = true; // display debug template $_output = "<?php \$_smarty_tpl->smarty->loadPlugin('Smarty_Internal_Debug'); Smarty_Internal_Debug::display_debug(\$_smarty_tpl); ?>"; return $_output; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_eval.php b/libs/sysplugins/smarty_internal_compile_eval.php index aa3c2580..6cf481b5 100644 --- a/libs/sysplugins/smarty_internal_compile_eval.php +++ b/libs/sysplugins/smarty_internal_compile_eval.php @@ -1,9 +1,9 @@ <?php - /** * Smarty Internal Plugin Compile Eval * - * Compiles the {eval} tag + * Compiles the {eval} tag. + * * @package Smarty * @subpackage Compiler * @author Uwe Tews @@ -11,41 +11,63 @@ /** * Smarty Internal Plugin Compile Eval Class - */ + * + * @package Smarty + * @subpackage Compiler + */ class Smarty_Internal_Compile_Eval extends Smarty_Internal_CompileBase { + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('var'); - public $optional_attributes = array('assign'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('assign'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $shorttag_order = array('var','assign'); /** * Compiles code for the {eval} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; $this->required_attributes = array('var'); - $this->optional_attributes = array('assign'); + $this->optional_attributes = array('assign'); // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); if (isset($_attr['assign'])) { // output will be stored in a smarty variable instead of beind displayed $_assign = $_attr['assign']; } - + // create template object - $_output = "\$_template = new {$compiler->smarty->template_class}('eval:'.".$_attr['var'].", \$_smarty_tpl->smarty, \$_smarty_tpl);"; - //was there an assign attribute? + $_output = "\$_template = new {$compiler->smarty->template_class}('eval:'.".$_attr['var'].", \$_smarty_tpl->smarty, \$_smarty_tpl);"; + //was there an assign attribute? if (isset($_assign)) { - $_output .= "\$_smarty_tpl->assign($_assign,\$_template->getRenderedTemplate());"; + $_output .= "\$_smarty_tpl->assign($_assign,\$_template->fetch());"; } else { - $_output .= "echo \$_template->getRenderedTemplate();"; - } + $_output .= "echo \$_template->fetch();"; + } return "<?php $_output ?>"; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_extends.php b/libs/sysplugins/smarty_internal_compile_extends.php index b76cf98d..90974f38 100644 --- a/libs/sysplugins/smarty_internal_compile_extends.php +++ b/libs/sysplugins/smarty_internal_compile_extends.php @@ -1,90 +1,121 @@ <?php /** - * Smarty Internal Plugin Compile extend - * - * Compiles the {extends} tag - * - * @package Smarty - * @subpackage Compiler - * @author Uwe Tews - */ +* Smarty Internal Plugin Compile extend +* +* Compiles the {extends} tag +* +* @package Smarty +* @subpackage Compiler +* @author Uwe Tews +*/ /** - * Smarty Internal Plugin Compile extend Class - */ +* Smarty Internal Plugin Compile extend Class +* +* @package Smarty +* @subpackage Compiler +*/ class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase { - // attribute definitions + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('file'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $shorttag_order = array('file'); /** - * Compiles code for the {extends} tag - * - * @param array $args array with attributes from parser - * @param object $compiler compiler object - * @return string compiled code - */ + * Compiles code for the {extends} tag + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @return string compiled code + */ public function compile($args, $compiler) { - $this->compiler = $compiler; - $this->smarty = $compiler->smarty; - $this->_rdl = preg_quote($this->smarty->right_delimiter); - $this->_ldl = preg_quote($this->smarty->left_delimiter); - $filepath = $compiler->template->getTemplateFilepath(); + $this->_rdl = preg_quote($compiler->smarty->right_delimiter); + $this->_ldl = preg_quote($compiler->smarty->left_delimiter); + $filepath = $compiler->template->source->filepath; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); if ($_attr['nocache'] === true) { - $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno); + $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); } $_smarty_tpl = $compiler->template; $include_file = null; - if (strpos($_attr['file'],'$_tmp') !== false || strpos($_attr['file'],'$_smarty_tpl') !== false || strpos($_attr['file'],'::') !== false) { - $this->compiler->trigger_template_error('a variable file attribute is illegal', $this->compiler->lex->taglineno); + if (strpos($_attr['file'], '$_tmp') !== false) { + $compiler->trigger_template_error('illegal value for file attribute', $compiler->lex->taglineno); } eval('$include_file = ' . $_attr['file'] . ';'); // create template object - $_template = new $compiler->smarty->template_class($include_file, $this->smarty, $compiler->template); + $_template = new $compiler->smarty->template_class($include_file, $compiler->smarty, $compiler->template); // save file dependency - if (in_array($_template->resource_type,array('eval','string'))) { - $template_sha1 = sha1($include_file); - } else { - $template_sha1 = sha1($_template->getTemplateFilepath()); - } + if (in_array($_template->source->type, array('eval', 'string'))) { + $template_sha1 = sha1($include_file); + } else { + $template_sha1 = sha1($_template->source->filepath); + } if (isset($compiler->template->properties['file_dependency'][$template_sha1])) { - $this->compiler->trigger_template_error("illegal recursive call of \"{$include_file}\"",$compiler->lex->line-1); + $compiler->trigger_template_error("illegal recursive call of \"{$include_file}\"", $compiler->lex->line - 1); } - $compiler->template->properties['file_dependency'][$template_sha1] = array($_template->getTemplateFilepath(), $_template->getTemplateTimestamp(),$_template->resource_type); - $_content = substr($compiler->template->template_source,$compiler->lex->counter-1); + $compiler->template->properties['file_dependency'][$template_sha1] = array($_template->source->filepath, $_template->source->timestamp, $_template->source->type); + $_content = substr($compiler->template->source->content, $compiler->lex->counter - 1); if (preg_match_all("!({$this->_ldl}block\s(.+?){$this->_rdl})!", $_content, $s) != - preg_match_all("!({$this->_ldl}/block{$this->_rdl})!", $_content, $c)) { - $this->compiler->trigger_template_error('unmatched {block} {/block} pairs'); + preg_match_all("!({$this->_ldl}/block{$this->_rdl})!", $_content, $c)) { + $compiler->trigger_template_error('unmatched {block} {/block} pairs'); } - preg_match_all("!{$this->_ldl}block\s(.+?){$this->_rdl}|{$this->_ldl}/block{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE); + preg_match_all("!{$this->_ldl}block\s(.+?){$this->_rdl}|{$this->_ldl}/block{$this->_rdl}|{$this->_ldl}\*([\S\s]*?)\*{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE); $_result_count = count($_result[0]); $_start = 0; - while ($_start < $_result_count) { + while ($_start+1 < $_result_count) { $_end = 0; $_level = 1; + if (substr($_result[0][$_start][0],0,strlen($compiler->smarty->left_delimiter)+1) == $compiler->smarty->left_delimiter.'*') { + echo 'lll'; + $_start++; + continue; + } while ($_level != 0) { $_end++; + if (substr($_result[0][$_start + $_end][0],0,strlen($compiler->smarty->left_delimiter)+1) == $compiler->smarty->left_delimiter.'*') { + continue; + } if (!strpos($_result[0][$_start + $_end][0], '/')) { $_level++; } else { $_level--; } } - $_block_content = str_replace($this->smarty->left_delimiter . '$smarty.block.parent' . $this->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%', - substr($_content, $_result[0][$_start][1] + strlen($_result[0][$_start][0]), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + strlen($_result[0][$_start][0]))); + $_block_content = str_replace($compiler->smarty->left_delimiter . '$smarty.block.parent' . $compiler->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%', + substr($_content, $_result[0][$_start][1] + strlen($_result[0][$_start][0]), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + strlen($_result[0][$_start][0]))); Smarty_Internal_Compile_Block::saveBlockData($_block_content, $_result[0][$_start][0], $compiler->template, $filepath); $_start = $_start + $_end + 1; } - $compiler->template->template_source = $_template->getTemplateSource(); - $compiler->template->template_filepath = $_template->getTemplateFilepath(); + if ($_template->source->type == 'extends') { + $_template->block_data = $compiler->template->block_data; + } + $compiler->template->source->content = $_template->source->content; + if ($_template->source->type == 'extends') { + $compiler->template->block_data = $_template->block_data; + foreach ($_template->source->components as $key => $component) { + $compiler->template->properties['file_dependency'][$key] = array($component->filepath, $component->timestamp, $component->type); + } + } + $compiler->template->source->filepath = $_template->source->filepath; $compiler->abort_and_recompile = true; return ''; } } + ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_for.php b/libs/sysplugins/smarty_internal_compile_for.php index 2e5d0a11..057f4fb7 100644 --- a/libs/sysplugins/smarty_internal_compile_for.php +++ b/libs/sysplugins/smarty_internal_compile_for.php @@ -1,147 +1,151 @@ <?php /** * Smarty Internal Plugin Compile For - * + * * Compiles the {for} {forelse} {/for} tags - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile For Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase { + /** * Compiles code for the {for} tag - * + * * Smarty 3 does implement two different sytaxes: - * + * * - {for $var in $array} * For looping over arrays or iterators - * + * * - {for $x=0; $x<$y; $x++} * For general loops - * - * The parser is gereration different sets of attribute by which this compiler can + * + * The parser is gereration different sets of attribute by which this compiler can * determin which syntax is used. - * - * @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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; if ($parameter == 0) { - $this->required_attributes = array('start','to'); - $this->optional_attributes = array('max','step'); + $this->required_attributes = array('start', 'to'); + $this->optional_attributes = array('max', 'step'); } else { - $this->required_attributes = array('start','ifexp','var','step'); - $this->optional_attributes = array(); + $this->required_attributes = array('start', 'ifexp', 'var', 'step'); + $this->optional_attributes = array(); } // check and get attributes - $_attr = $this->_get_attributes($args); - - $local_vars = array(); + $_attr = $this->getAttributes($compiler, $args); $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"; - $compiler->local_var[$_statement['var']] = true; - $local_vars[] = $_statement['var']; - } + } $output .= " if ($_attr[ifexp]){ for (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$_attr[var]]->value$_attr[step]){\n"; } else { $_statement = $_attr['start']; $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;"; - $compiler->local_var[$_statement['var']] = true; - $local_vars[] = $_statement['var']; if (isset($_attr['step'])) { $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = $_attr[step];"; } else { $output .= "\$_smarty_tpl->tpl_vars[$_statement[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"; } 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 .= "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 .= "?>"; - $this->_open_tag('for', array('for', $this->compiler->nocache, $local_vars)); + $this->openTag($compiler, 'for', array('for', $compiler->nocache)); // maybe nocache because of nocache variables - $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; // return compiled code return $output; - } -} + } + +} /** * Smarty Internal Plugin Compile Forelse Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Forelse extends Smarty_Internal_CompileBase { + /** * Compiles code for the {forelse} 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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); - list($_open_tag, $nocache, $local_vars) = $this->_close_tag(array('for')); - $this->_open_tag('forelse', array('forelse', $nocache, $local_vars)); + list($openTag, $nocache) = $this->closeTag($compiler, array('for')); + $this->openTag($compiler, 'forelse', array('forelse', $nocache)); return "<?php }} else { ?>"; - } -} + } + +} /** * Smarty Internal Plugin Compile Forclose Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Forclose extends Smarty_Internal_CompileBase { + /** * Compiles code for the {/for} 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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // must endblock be nocache? - if ($this->compiler->nocache) { - $this->compiler->tag_nocache = true; - } + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } - list($_open_tag, $this->compiler->nocache, $local_vars) = $this->_close_tag(array('for', 'forelse')); + list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('for', 'forelse')); - foreach ($local_vars as $var) { - unset($compiler->local_var[$var]); - } - if ($_open_tag == 'forelse') + if ($openTag == 'forelse') { return "<?php } ?>"; - else + } else { return "<?php }} ?>"; - } -} + } + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_foreach.php b/libs/sysplugins/smarty_internal_compile_foreach.php index 6ad1e07e..5a196cb4 100644 --- a/libs/sysplugins/smarty_internal_compile_foreach.php +++ b/libs/sysplugins/smarty_internal_compile_foreach.php @@ -1,54 +1,72 @@ <?php /** * Smarty Internal Plugin Compile Foreach - * + * * Compiles the {foreach} {foreachelse} {/foreach} tags - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Foreach Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase { - // attribute definitions + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('from', 'item'); - public $optional_attributes = array('name', 'key'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('name', 'key'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $shorttag_order = array('from','item','key','name'); /** * Compiles code for the {foreach} 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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; - $tpl = $compiler->template; + $tpl = $compiler->template; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); $from = $_attr['from']; $item = $_attr['item']; - - if (substr_compare("\$_smarty_tpl->getVariable($item)", $from,0, strlen("\$_smarty_tpl->getVariable($item)")) == 0) { - $this->compiler->trigger_template_error("item variable {$item} may not be the same variable as at 'from'", $this->compiler->lex->taglineno); - } + if (substr_compare("\$_smarty_tpl->tpl_vars[$item]", $from,0, strlen("\$_smarty_tpl->tpl_vars[$item]")) == 0) { + $compiler->trigger_template_error("item variable {$item} may not be the same variable as at 'from'", $compiler->lex->taglineno); + } if (isset($_attr['key'])) { $key = $_attr['key']; } else { $key = null; - } + } - $this->_open_tag('foreach', array('foreach', $this->compiler->nocache, $item, $key)); + $this->openTag($compiler, 'foreach', array('foreach', $compiler->nocache, $item, $key)); // maybe nocache because of nocache variables - $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; if (isset($_attr['name'])) { $name = $_attr['name']; @@ -57,163 +75,157 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase { } else { $name = null; $has_name = false; - } - $ItemVarName = '$' . trim($item, '\'"') . '@'; + } + $ItemVarName = '$' . trim($item, '\'"') . '@'; // evaluates which Smarty variables and properties have to be computed if ($has_name) { - $usesSmartyFirst = strpos($tpl->template_source, $SmartyVarName . 'first') !== false; - $usesSmartyLast = strpos($tpl->template_source, $SmartyVarName . 'last') !== false; - $usesSmartyIndex = strpos($tpl->template_source, $SmartyVarName . 'index') !== false; - $usesSmartyIteration = strpos($tpl->template_source, $SmartyVarName . 'iteration') !== false; - $usesSmartyShow = strpos($tpl->template_source, $SmartyVarName . 'show') !== false; - $usesSmartyTotal = strpos($tpl->template_source, $SmartyVarName . 'total') !== false; + $usesSmartyFirst = strpos($tpl->source->content, $SmartyVarName . 'first') !== false; + $usesSmartyLast = strpos($tpl->source->content, $SmartyVarName . 'last') !== false; + $usesSmartyIndex = strpos($tpl->source->content, $SmartyVarName . 'index') !== false; + $usesSmartyIteration = strpos($tpl->source->content, $SmartyVarName . 'iteration') !== false; + $usesSmartyShow = strpos($tpl->source->content, $SmartyVarName . 'show') !== false; + $usesSmartyTotal = strpos($tpl->source->content, $SmartyVarName . 'total') !== false; } else { $usesSmartyFirst = false; $usesSmartyLast = false; $usesSmartyTotal = false; $usesSmartyShow = false; - } + } - $usesPropFirst = $usesSmartyFirst || strpos($tpl->template_source, $ItemVarName . 'first') !== false; - $usesPropLast = $usesSmartyLast || strpos($tpl->template_source, $ItemVarName . 'last') !== false; - $usesPropIndex = $usesPropFirst || strpos($tpl->template_source, $ItemVarName . 'index') !== false; - $usesPropIteration = $usesPropLast || strpos($tpl->template_source, $ItemVarName . 'iteration') !== false; - $usesPropShow = strpos($tpl->template_source, $ItemVarName . 'show') !== false; - $usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($tpl->template_source, $ItemVarName . 'total') !== false; + $usesPropFirst = $usesSmartyFirst || strpos($tpl->source->content, $ItemVarName . 'first') !== false; + $usesPropLast = $usesSmartyLast || strpos($tpl->source->content, $ItemVarName . 'last') !== false; + $usesPropIndex = $usesPropFirst || strpos($tpl->source->content, $ItemVarName . 'index') !== false; + $usesPropIteration = $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'iteration') !== false; + $usesPropShow = strpos($tpl->source->content, $ItemVarName . 'show') !== false; + $usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'total') !== false; // generate output code $output = "<?php "; $output .= " \$_smarty_tpl->tpl_vars[$item] = new Smarty_Variable;\n"; - $compiler->local_var[$item] = true; if ($key != null) { $output .= " \$_smarty_tpl->tpl_vars[$key] = new Smarty_Variable;\n"; - $compiler->local_var[$key] = true; - } + } $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"; - } + } if ($usesPropIteration) { $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration=0;\n"; - } + } if ($usesPropIndex) { $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 ($has_name) { if ($usesSmartyTotal) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['total'] = \$_smarty_tpl->tpl_vars[$item]->total;\n"; - } + } if ($usesSmartyIteration) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']=0;\n"; - } + } if ($usesSmartyIndex) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']=-1;\n"; - } + } if ($usesSmartyShow) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['show']=(\$_smarty_tpl->tpl_vars[$item]->total > 0);\n"; - } - } - if ($usesPropTotal) { - $output .= "if (\$_smarty_tpl->tpl_vars[$item]->total > 0){\n"; - } else { - $output .= "if (\$_smarty_tpl->_count(\$_from) > 0){\n"; - } - $output .= " foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n"; + } + } + $output .= "\$_loop = false;\nforeach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n\$_loop = true;\n"; if ($key != null) { $output .= " \$_smarty_tpl->tpl_vars[$key]->value = \$_smarty_tpl->tpl_vars[$item]->key;\n"; - } + } if ($usesPropIteration) { $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration++;\n"; - } + } if ($usesPropIndex) { $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 ($usesPropLast) { $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"; - } + } if ($usesSmartyIndex) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']++;\n"; - } + } if ($usesSmartyLast) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['last'] = \$_smarty_tpl->tpl_vars[$item]->last;\n"; - } - } + } + } $output .= "?>"; return $output; - } -} + } +} /** * Smarty Internal Plugin Compile Foreachelse Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase { + /** * Compiles code for the {foreachelse} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); + + list($openTag, $nocache, $item, $key) = $this->closeTag($compiler, array('foreach')); + $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $item, $key)); - list($_open_tag, $nocache, $item, $key) = $this->_close_tag(array('foreach')); - $this->_open_tag('foreachelse', array('foreachelse', $nocache, $item, $key)); + return "<?php }\nif (!\$_loop) {\n?>"; + } - return "<?php }} else { ?>"; - } -} +} /** * Smarty Internal Plugin Compile Foreachclose Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase { + /** * Compiles code for the {/foreach} 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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // must endblock be nocache? - if ($this->compiler->nocache) { - $this->compiler->tag_nocache = true; - } + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } - list($_open_tag, $this->compiler->nocache, $item, $key) = $this->_close_tag(array('foreach', 'foreachelse')); - unset($compiler->local_var[$item]); - if ($key != null) { - unset($compiler->local_var[$key]); - } + list($openTag, $compiler->nocache, $item, $key) = $this->closeTag($compiler, array('foreach', 'foreachelse')); + + return "<?php } ?>"; + } - if ($_open_tag == 'foreachelse') - return "<?php } ?>"; - else - return "<?php }} ?>"; - } -} +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_function.php b/libs/sysplugins/smarty_internal_compile_function.php index db2409a3..63ae5487 100644 --- a/libs/sysplugins/smarty_internal_compile_function.php +++ b/libs/sysplugins/smarty_internal_compile_function.php @@ -1,52 +1,72 @@ <?php /** * Smarty Internal Plugin Compile Function - * + * * Compiles the {function} {/function} tags - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Function Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase { - // attribute definitions + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('name'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $shorttag_order = array('name'); - public $optional_attributes = array('_any'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); /** * 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 - * @return boolean true + * @param array $parameter array with compilation parameter + * @return boolean true */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); if ($_attr['nocache'] === true) { - $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno); + $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); } - unset($_attr['nocache']); + unset($_attr['nocache']); $save = array($_attr, $compiler->parser->current_buffer, $compiler->template->has_nocache_code, $compiler->template->required_plugins); - $this->_open_tag('function', $save); + $this->openTag($compiler, 'function', $save); $_name = trim($_attr['name'], "'\""); unset($_attr['name']); $compiler->template->properties['function'][$_name]['parameter'] = array(); - $_smarty_tpl = $compiler->template; + $_smarty_tpl = $compiler->template; foreach ($_attr as $_key => $_data) { - eval ('$tmp='.$_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 = ''; @@ -54,9 +74,9 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase { $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->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}; + 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 temporay context $compiler->template->required_plugins = array('compiled' => array(), 'nocache' => array()); $compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser); @@ -65,16 +85,21 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase { $compiler->has_code = false; $compiler->template->properties['function'][$_name]['compiled'] = ''; return true; - } -} + } + +} /** * Smarty Internal Plugin Compile Functionclose Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase { + /** * 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 @@ -82,10 +107,9 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; - $_attr = $this->_get_attributes($args); - $saved_data = $this->_close_tag(array('function')); - $_name = trim($saved_data[0]['name'], "'\""); + $_attr = $this->getAttributes($compiler, $args); + $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'])) { @@ -93,24 +117,24 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase foreach($compiler->template->required_plugins['compiled'] as $tmp) { foreach($tmp as $data) { $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$data['file']}';\n"; - } - } + } + } $plugins_string .= '?>'; - } + } 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) { foreach($tmp as $data) { $plugins_string .= "if (!is_callable(\'{$data['function']}\')) include \'{$data['file']}\';\n"; - } - } + } + } $plugins_string .= "?>/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/';?>\n"; - } - // remove last line break from function definition - $last = count($compiler->parser->current_buffer->subtrees) - 1; - if ($compiler->parser->current_buffer->subtrees[$last] instanceof _smarty_linebreak) { - unset($compiler->parser->current_buffer->subtrees[$last]); - } + } + // remove last line break from function definition + $last = count($compiler->parser->current_buffer->subtrees) - 1; + if ($compiler->parser->current_buffer->subtrees[$last] instanceof _smarty_linebreak) { + unset($compiler->parser->current_buffer->subtrees[$last]); + } // if caching save template function for possible nocache call if ($compiler->template->caching) { $compiler->template->properties['function'][$_name]['compiled'] .= $plugins_string @@ -122,13 +146,14 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase $output = true; } else { $output = $plugins_string . $compiler->parser->current_buffer->to_smarty_php() . "<?php \$_smarty_tpl->tpl_vars = \$saved_tpl_vars;}}?>\n"; - } + } // restore old compiler status $compiler->parser->current_buffer = $saved_data[1]; $compiler->template->has_nocache_code = $compiler->template->has_nocache_code | $saved_data[2]; $compiler->template->required_plugins = $saved_data[3]; return $output; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_if.php b/libs/sysplugins/smarty_internal_compile_if.php index 41e6597e..98e8ac91 100644 --- a/libs/sysplugins/smarty_internal_compile_if.php +++ b/libs/sysplugins/smarty_internal_compile_if.php @@ -1,179 +1,198 @@ <?php /** * Smarty Internal Plugin Compile If - * + * * Compiles the {if} {else} {elseif} {/if} tags - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile If Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_If extends Smarty_Internal_CompileBase { + /** * Compiles code for the {if} 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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); - $this->_open_tag('if',array(1,$this->compiler->nocache)); + $_attr = $this->getAttributes($compiler, $args); + $this->openTag($compiler, 'if', array(1, $compiler->nocache)); // must whole block be nocache ? - $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; if (is_array($parameter['if condition'])) { - if ($this->compiler->nocache) { - $_nocache = ',true'; - // create nocache var to make it know for further compiling - if (is_array($parameter['if condition']['var'])) { - $this->compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true); - } else { - $this->compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true); - } - } else { - $_nocache = ''; - } + if ($compiler->nocache) { + $_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); + } else { + $compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true); + } + } else { + $_nocache = ''; + } if (is_array($parameter['if condition']['var'])) { - $_output = "<?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']."){?>"; + $_output = "<?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 \$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."] = new Smarty_Variable(\$_smarty_tpl->getVariable(".$parameter['if condition']['var'].",null,true,false)->value{$_nocache});"; - $_output .= "if (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."]->value = ".$parameter['if condition']['value']."){?>"; - } + $_output = "<?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 if ({$parameter['if condition']}){?>"; - } - } -} + } + } + +} /** * Smarty Internal Plugin Compile Else Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Else extends Smarty_Internal_CompileBase { + /** * Compiles code for the {else} 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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; - list($nesting, $compiler->tag_nocache) = $this->_close_tag(array('if', 'elseif')); - $this->_open_tag('else',array($nesting,$compiler->tag_nocache)); + list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif')); + $this->openTag($compiler, 'else', array($nesting, $compiler->tag_nocache)); return "<?php }else{ ?>"; - } -} + } + +} /** * Smarty Internal Plugin Compile ElseIf Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase { + /** * Compiles code for the {elseif} 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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); - list($nesting, $compiler->tag_nocache) = $this->_close_tag(array('if', 'elseif')); + list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif')); - if (is_array($parameter['if condition'])) { - $condition_by_assign = true; - if ($this->compiler->nocache) { - $_nocache = ',true'; - // create nocache var to make it know for further compiling - if (is_array($parameter['if condition']['var'])) { - $this->compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true); - } else { - $this->compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true); - } - } else { - $_nocache = ''; - } - } else { - $condition_by_assign = false; - } + if (is_array($parameter['if condition'])) { + $condition_by_assign = true; + if ($compiler->nocache) { + $_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); + } else { + $compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true); + } + } else { + $_nocache = ''; + } + } else { + $condition_by_assign = false; + } - if (empty($this->compiler->prefix_code)) { - if ($condition_by_assign) { - $this->_open_tag('elseif', array($nesting + 1, $compiler->tag_nocache)); - if (is_array($parameter['if condition']['var'])) { - $_output = "<?php }else{ 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{ \$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."] = new Smarty_Variable(\$_smarty_tpl->getVariable(".$parameter['if condition']['var'].",null,true,false)->value{$_nocache});"; - $_output .= "if (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."]->value = ".$parameter['if condition']['value']."){?>"; - } - return $_output; - } else { - $this->_open_tag('elseif', array($nesting, $compiler->tag_nocache)); - return "<?php }elseif({$parameter['if condition']}){?>"; - } + if (empty($compiler->prefix_code)) { + if ($condition_by_assign) { + $this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache)); + if (is_array($parameter['if condition']['var'])) { + $_output = "<?php }else{ 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{ 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 { + $this->openTag($compiler, 'elseif', array($nesting, $compiler->tag_nocache)); + return "<?php }elseif({$parameter['if condition']}){?>"; + } } else { $tmp = ''; - foreach ($this->compiler->prefix_code as $code) $tmp .= $code; - $this->compiler->prefix_code = array(); - $this->_open_tag('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 .= "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 \$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."] = new Smarty_Variable(\$_smarty_tpl->getVariable(".$parameter['if condition']['var'].",null,true,false)->value{$_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']}){?>"; - } - } - } -} + foreach ($compiler->prefix_code as $code) + $tmp .= $code; + $compiler->prefix_code = array(); + $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 .= "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 .= "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']}){?>"; + } + } + } + +} /** -* Smarty Internal Plugin Compile Ifclose Class -*/ + * Smarty Internal Plugin Compile Ifclose Class + * + * @package Smarty + * @subpackage Compiler + */ class Smarty_Internal_Compile_Ifclose extends Smarty_Internal_CompileBase { + /** - * Compiles code for the {/if} tag - * - * @param array $args array with attributes from parser - * @param object $compiler compiler object - * @param array $parameter array with compilation parameter - * @return string compiled code - */ + * Compiles code for the {/if} tag + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter + * @return string compiled code + */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; - // must endblock be nocache? - if ($this->compiler->nocache) { - $this->compiler->tag_nocache = true; - } - list($nesting, $this->compiler->nocache) = $this->_close_tag(array('if', 'else', 'elseif')); + // must endblock be nocache? + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } + list($nesting, $compiler->nocache) = $this->closeTag($compiler, array('if', 'else', 'elseif')); $tmp = ''; - for ($i = 0; $i < $nesting ; $i++) $tmp .= '}'; + for ($i = 0; $i < $nesting; $i++) { + $tmp .= '}'; + } return "<?php {$tmp}?>"; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_include.php b/libs/sysplugins/smarty_internal_compile_include.php index a85be6d5..e611d718 100644 --- a/libs/sysplugins/smarty_internal_compile_include.php +++ b/libs/sysplugins/smarty_internal_compile_include.php @@ -1,42 +1,75 @@ <?php - /** - * Smarty Internal Plugin Compile Include - * - * Compiles the {include} tag - * - * @package Smarty - * @subpackage Compiler - * @author Uwe Tews - */ +* Smarty Internal Plugin Compile Include +* +* Compiles the {include} tag +* +* @package Smarty +* @subpackage Compiler +* @author Uwe Tews +*/ /** - * Smarty Internal Plugin Compile Include Class - */ +* Smarty Internal Plugin Compile Include Class +* +* @package Smarty +* @subpackage Compiler +*/ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase { - // caching mode to create nocache code but no cache file - const CACHING_NOCACHE_CODE = 9999; - // attribute definitions + + /** + * caching mode to create nocache code but no cache file + */ + const CACHING_NOCACHE_CODE = 9999; + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('file'); - public $shorttag_order = array('file'); - public $option_flags = array('nocache','inline','caching'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('file'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $option_flags = array('nocache', 'inline', 'caching'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $optional_attributes = array('_any'); + /** + * Saved parameter of merged templates + * + * @var array + */ + private static $merged_templates_func = array(); /** - * Compiles code for the {include} tag - * + * 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 * @return string compiled code */ - public function compile($args, $compiler) + public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // save posible attributes $include_file = $_attr['file']; - $has_compiled_template = false; if (isset($_attr['assign'])) { // output will be stored in a smarty variable instead of beind displayed @@ -55,11 +88,11 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase { } } $_caching = 'null'; - if ($this->compiler->nocache || $this->compiler->tag_nocache) { + if ($compiler->nocache || $compiler->tag_nocache) { $_caching = Smarty::CACHING_OFF; } // default for included templates - if ($compiler->template->caching && !$this->compiler->nocache && !$this->compiler->tag_nocache) { + if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) { $_caching = self::CACHING_NOCACHE_CODE; } /* @@ -69,14 +102,14 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase { */ if (isset($_attr['cache_lifetime'])) { $_cache_lifetime = $_attr['cache_lifetime']; - $this->compiler->tag_nocache = true; + $compiler->tag_nocache = true; $_caching = Smarty::CACHING_LIFETIME_CURRENT; } else { $_cache_lifetime = 'null'; } if (isset($_attr['cache_id'])) { $_cache_id = $_attr['cache_id']; - $this->compiler->tag_nocache = true; + $compiler->tag_nocache = true; $_caching = Smarty::CACHING_LIFETIME_CURRENT; } else { $_cache_id = '$_smarty_tpl->cache_id'; @@ -90,100 +123,98 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase { $_caching = Smarty::CACHING_LIFETIME_CURRENT; } if ($_attr['nocache'] === true) { - $this->compiler->tag_nocache = true; + $compiler->tag_nocache = true; $_caching = Smarty::CACHING_OFF; } - - if (($compiler->smarty->merge_compiled_includes || $_attr['inline'] === true) && !($compiler->template->caching && ($this->compiler->tag_nocache || $this->compiler->nocache)) && $_caching != Smarty::CACHING_LIFETIME_CURRENT) { + $has_compiled_template = false; + if (($compiler->smarty->merge_compiled_includes || $_attr['inline'] === true) && !$compiler->template->source->recompiled + && !($compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache)) && $_caching != Smarty::CACHING_LIFETIME_CURRENT) { // check if compiled code can be merged (contains no variable part) if (!$compiler->has_variable_string && (substr_count($include_file, '"') == 2 or substr_count($include_file, "'") == 2) and substr_count($include_file, '(') == 0) { - $tmp = null; - eval("\$tmp = $include_file;"); - if ($this->compiler->template->template_resource != $tmp) { - $tpl = new $compiler->smarty->template_class ($tmp, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $compiler->template->compile_id); - // suppress writing of compiled file - $tpl->write_compiled_code = false; - if ($this->compiler->template->caching) { + $tpl_name = null; + eval("\$tpl_name = $include_file;"); + if (!isset(self::$merged_templates_func[$tpl_name]) || $compiler->inheritance) { + $tpl = new $compiler->smarty->template_class ($tpl_name, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $compiler->template->compile_id); + // save unique function name + self::$merged_templates_func[$tpl_name]['func'] = $tpl->properties['unifunc'] = 'content_'.uniqid(); + // use current nocache hash for inlined code + self::$merged_templates_func[$tpl_name]['nocache_hash'] = $tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash']; + if ($compiler->template->caching) { // needs code for cached page but no cache file $tpl->caching = self::CACHING_NOCACHE_CODE; } -// if ($this->compiler->template->mustCompile) { - // make sure whole chain gest compiled - $tpl->mustCompile = true; -// } - if ($tpl->resource_object->usesCompiler && $tpl->isExisting()) { + // make sure whole chain gest compiled + $tpl->mustCompile = true; + if (!($tpl->source->uncompiled) && $tpl->source->exists) { // get compiled code - $compiled_tpl = $tpl->getCompiledTemplate(); + $compiled_code = $tpl->compiler->compileTemplate($tpl); + // release compiler object to free memory + unset($tpl->compiler); // merge compiled code for {function} tags $compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $tpl->properties['function']); - // merge filedependency by evaluating header code - preg_match_all("/(<\?php \/\*%%SmartyHeaderCode:{$tpl->properties['nocache_hash']}%%\*\/(.+?)\/\*\/%%SmartyHeaderCode%%\*\/\?>\n)/s", $compiled_tpl, $result); - $saved_has_nocache_code = $compiler->template->has_nocache_code; - $saved_nocache_hash = $compiler->template->properties['nocache_hash']; - $_smarty_tpl = $compiler->template; - eval($result[2][0]); - $compiler->template->properties['nocache_hash'] = $saved_nocache_hash; - $compiler->template->has_nocache_code = $saved_has_nocache_code; + // 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_tpl = preg_replace("/(<\?php \/\*%%SmartyHeaderCode:{$tpl->properties['nocache_hash']}%%\*\/(.+?)\/\*\/%%SmartyHeaderCode%%\*\/\?>\n)/s", '', $compiled_tpl); + $compiled_code = preg_replace("/(<\?php \/\*%%SmartyHeaderCode:{$tpl->properties['nocache_hash']}%%\*\/(.+?)\/\*\/%%SmartyHeaderCode%%\*\/\?>\n)/s", '', $compiled_code); if ($tpl->has_nocache_code) { // replace nocache_hash - $compiled_tpl = preg_replace("/{$tpl->properties['nocache_hash']}/", $compiler->template->properties['nocache_hash'], $compiled_tpl); + $compiled_code = preg_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; $has_compiled_template = true; } + } else { + $has_compiled_template = true; } } } - - // create template object - $_output = "<?php "; - if ($_caching != 'null' && $_caching != Smarty::CACHING_OFF) { - $_output .= "\$sha = sha1($include_file . $_cache_id . $_compile_id);\n"; - $_output .= "if (isset(\$_smarty_tpl->smarty->template_objects[\$sha])) {\n"; - $_output .= "\$_template = \$_smarty_tpl->smarty->template_objects[\$sha]; \$_template->parent = \$_smarty_tpl; \$_template->caching = $_caching; \$_template->cache_lifetime = $_cache_lifetime;\n"; - $_output .= "} else {\n"; - } - $_output .= "\$_template = new {$compiler->smarty->template_class}($include_file, \$_smarty_tpl->smarty, \$_smarty_tpl, $_cache_id, $_compile_id, $_caching, $_cache_lifetime);\n"; - if ($_caching != 'null' && $_caching != Smarty::CACHING_OFF) { - $_output .= "}\n"; - } // 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 if (!empty($_attr)) { if ($_parent_scope == Smarty::SCOPE_LOCAL) { // create variables - foreach ($_attr as $_key => $_value) { - $_output .= "\$_template->assign('$_key',$_value);"; + foreach ($_attr as $key => $value) { + $_pairs[] = "'$key'=>$value"; } + $_vars = 'array('.join(',',$_pairs).')'; + $_has_vars = true; } else { - $this->compiler->trigger_template_error('variable passing not allowed in parent/global scope', $this->compiler->lex->taglineno); + $compiler->trigger_template_error('variable passing not allowed in parent/global scope', $compiler->lex->taglineno); } + } else { + $_vars = 'array()'; + $_has_vars = false; } + if ($has_compiled_template) { + $_hash = self::$merged_templates_func[$tpl_name]['nocache_hash']; + $_output = "<?php /* Call merged included template \"" . $tpl_name . "\" */\n"; + $_output .= "\$_tpl_stack[] = \$_smarty_tpl;\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(); '; + } + $_output .= self::$merged_templates_func[$tpl_name]['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 .= "/* End of included template \"" . $tpl_name . "\" */?>"; + return $_output; + } + // was there an assign attribute if (isset($_assign)) { - $_output .= "\$_smarty_tpl->assign($_assign,\$_template->getRenderedTemplate());?>"; + $_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";; } else { - if ($has_compiled_template) { - $_output .= "\$_template->properties['nocache_hash'] = '{$compiler->template->properties['nocache_hash']}';\n"; - $_output .= "\$_tpl_stack[] = \$_smarty_tpl; \$_smarty_tpl = \$_template;?>\n"; - $_output .= $compiled_tpl; - $_output .= "<?php \$_smarty_tpl->updateParentVariables($_parent_scope);?>\n"; - $_output .= "<?php /* End of included template \"" . $tpl->getTemplateFilepath() . "\" */ ?>\n"; - $_output .= "<?php \$_smarty_tpl = array_pop(\$_tpl_stack);?>"; - } else { - $_output .= " echo \$_template->getRenderedTemplate(); \$_template->rendered_content = null;?>"; - if ($_parent_scope != Smarty::SCOPE_LOCAL) { - $_output .= "<?php \$_template->updateParentVariables($_parent_scope);?>"; - } - } + $_output = "<?php echo \$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope);?>\n"; } - $_output .= "<?php unset(\$_template);?>"; return $_output; } + } ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_include_php.php b/libs/sysplugins/smarty_internal_compile_include_php.php index 19ee186b..d5271236 100644 --- a/libs/sysplugins/smarty_internal_compile_include_php.php +++ b/libs/sysplugins/smarty_internal_compile_include_php.php @@ -1,90 +1,108 @@ <?php - /** * Smarty Internal Plugin Compile Include PHP - * + * * Compiles the {include_php} tag - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Insert Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase { - // attribute definitions + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('file'); - public $shorttag_order = array('file'); - public $optional_attributes = array('once', 'assign'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('file'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('once', 'assign'); /** * Compiles code for the {include_php} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - if (!$compiler->smarty->allow_php_tag) { - throw new SmartyException("{include_php} is deprecated, set allow_php_tag = true to enable"); - } - $this->compiler = $compiler; + if (!($compiler->smarty instanceof SmartyBC)) { + throw new SmartyException("{include_php} is deprecated, use SmartyBC class to enable"); + } // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); - $_output = '<?php '; + $_output = '<?php '; - $_smarty_tpl = $compiler->template; + $_smarty_tpl = $compiler->template; $_filepath = false; - eval('$_file = ' . $_attr['file'] . ';'); - if (!isset($this->compiler->smarty->security_policy) && file_exists($_file)) { - $_filepath = $_file; + eval('$_file = ' . $_attr['file'] . ';'); + if (!isset($compiler->smarty->security_policy) && file_exists($_file)) { + $_filepath = $_file; } else { - if (isset($this->compiler->smarty->security_policy)) { - $_dir = $this->compiler->smarty->security_policy->trusted_dir; + if (isset($compiler->smarty->security_policy)) { + $_dir = $compiler->smarty->security_policy->trusted_dir; } else { - $_dir = $this->compiler->smarty->trusted_dir; - } + $_dir = $compiler->smarty->trusted_dir; + } if (!empty($_dir)) { foreach((array)$_dir as $_script_dir) { - if (strpos('/\\', substr($_script_dir, -1)) === false) { - $_script_dir .= DS; - } + $_script_dir = rtrim($_script_dir, '/\\') . DS; if (file_exists($_script_dir . $_file)) { $_filepath = $_script_dir . $_file; break; - } - } - } - } + } + } + } + } if ($_filepath == false) { - $this->compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", $this->compiler->lex->taglineno); - } + $compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", $compiler->lex->taglineno); + } - if (isset($this->compiler->smarty->security_policy)) { - $this->compiler->smarty->security_policy->isTrustedPHPDir($_filepath); - } + if (isset($compiler->smarty->security_policy)) { + $compiler->smarty->security_policy->isTrustedPHPDir($_filepath); + } if (isset($_attr['assign'])) { // output will be stored in a smarty variable instead of being displayed $_assign = $_attr['assign']; - } + } $_once = '_once'; if (isset($_attr['once'])) { if ($_attr['once'] == 'false') { $_once = ''; - } - } + } + } if (isset($_assign)) { return "<?php ob_start(); include{$_once} ('{$_filepath}'); \$_smarty_tpl->assign({$_assign},ob_get_contents()); ob_end_clean();?>"; } else { return "<?php include{$_once} ('{$_filepath}');?>\n"; - } - } -} + } + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_insert.php b/libs/sysplugins/smarty_internal_compile_insert.php index 898e5315..e4d3f935 100644 --- a/libs/sysplugins/smarty_internal_compile_insert.php +++ b/libs/sysplugins/smarty_internal_compile_insert.php @@ -2,122 +2,141 @@ /** * Smarty Internal Plugin Compile Insert - * + * * Compiles the {insert} tag - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Insert Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase { - // attribute definitions + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('name'); - public $shorttag_order = array('name'); - public $optional_attributes = array('_any'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('name'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); /** * Compiles code for the {insert} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // never compile as nocache code - $this->compiler->suppressNocacheProcessing = true; - $this->compiler->tag_nocache = true; + $compiler->suppressNocacheProcessing = true; + $compiler->tag_nocache = true; $_smarty_tpl = $compiler->template; $_name = null; $_script = null; - $_output = '<?php '; + $_output = '<?php '; // save posible attributes eval('$_name = ' . $_attr['name'] . ';'); if (isset($_attr['assign'])) { // output will be stored in a smarty variable instead of being displayed - $_assign = $_attr['assign']; + $_assign = $_attr['assign']; // create variable to make shure that the compiler knows about its nocache status - $this->compiler->template->tpl_vars[trim($_attr['assign'], "'")] = new Smarty_Variable(null, true); - } + $compiler->template->tpl_vars[trim($_attr['assign'], "'")] = new Smarty_Variable(null, true); + } if (isset($_attr['script'])) { // script which must be included $_function = "smarty_insert_{$_name}"; $_smarty_tpl = $compiler->template; $_filepath = false; eval('$_script = ' . $_attr['script'] . ';'); - if (!isset($this->compiler->smarty->security_policy) && file_exists($_script)) { + if (!isset($compiler->smarty->security_policy) && file_exists($_script)) { $_filepath = $_script; } else { - if (isset($this->compiler->smarty->security_policy)) { - $_dir = $this->compiler->smarty->security_policy->trusted_dir; + if (isset($compiler->smarty->security_policy)) { + $_dir = $compiler->smarty->security_policy->trusted_dir; } else { - $_dir = $this->compiler->smarty->trusted_dir; - } + $_dir = $compiler->smarty->trusted_dir; + } if (!empty($_dir)) { foreach((array)$_dir as $_script_dir) { - if (strpos('/\\', substr($_script_dir, -1)) === false) { - $_script_dir .= DS; - } + $_script_dir = rtrim($_script_dir, '/\\') . DS; if (file_exists($_script_dir . $_script)) { $_filepath = $_script_dir . $_script; break; - } - } - } - } + } + } + } + } if ($_filepath == false) { - $this->compiler->trigger_template_error("{insert} missing script file '{$_script}'", $this->compiler->lex->taglineno); - } + $compiler->trigger_template_error("{insert} missing script file '{$_script}'", $compiler->lex->taglineno); + } // code for script file loading $_output .= "require_once '{$_filepath}' ;"; require_once $_filepath; if (!is_callable($_function)) { - $this->compiler->trigger_template_error(" {insert} function '{$_function}' is not callable in script file '{$_script}'", $this->compiler->lex->taglineno); - } + $compiler->trigger_template_error(" {insert} function '{$_function}' is not callable in script file '{$_script}'", $compiler->lex->taglineno); + } } else { $_filepath = 'null'; - $_function = "insert_{$_name}"; + $_function = "insert_{$_name}"; // function in PHP script ? if (!is_callable($_function)) { // try plugin - if (!$_function = $this->compiler->getPlugin($_name, 'insert')) { - $this->compiler->trigger_template_error("{insert} no function or plugin found for '{$_name}'", $this->compiler->lex->taglineno); - } - } - } + if (!$_function = $compiler->getPlugin($_name, 'insert')) { + $compiler->trigger_template_error("{insert} no function or plugin found for '{$_name}'", $compiler->lex->taglineno); + } + } + } // delete {insert} standard attributes - unset($_attr['name'], $_attr['assign'], $_attr['script'], $_attr['nocache']); + unset($_attr['name'], $_attr['assign'], $_attr['script'], $_attr['nocache']); // convert attributes into parameter array string $_paramsArray = array(); foreach ($_attr as $_key => $_value) { $_paramsArray[] = "'$_key' => $_value"; - } - $_params = 'array(' . implode(", ", $_paramsArray) . ')'; + } + $_params = 'array(' . implode(", ", $_paramsArray) . ')'; // call insert if (isset($_assign)) { if ($_smarty_tpl->caching) { $_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 { - $this->compiler->has_output = true; + $compiler->has_output = true; if ($_smarty_tpl->caching) { $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}');?>"; } else { $_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>"; - } - } + } + } return $_output; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_ldelim.php b/libs/sysplugins/smarty_internal_compile_ldelim.php index bdf86de4..99063259 100644 --- a/libs/sysplugins/smarty_internal_compile_ldelim.php +++ b/libs/sysplugins/smarty_internal_compile_ldelim.php @@ -1,9 +1,9 @@ <?php - /** * Smarty Internal Plugin Compile Ldelim * - * Compiles the {ldelim} tag + * Compiles the {ldelim} tag + * * @package Smarty * @subpackage Compiler * @author Uwe Tews @@ -11,27 +11,31 @@ /** * Smarty Internal Plugin Compile Ldelim Class - */ + * + * @package Smarty + * @subpackage Compiler + */ class Smarty_Internal_Compile_Ldelim extends Smarty_Internal_CompileBase { + /** * Compiles code for the {ldelim} tag * - * This tag does output the left delimiter - * @param array $args array with attributes from parser + * This tag does output the left delimiter + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); if ($_attr['nocache'] === true) { - $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno); + $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); } // this tag does not return compiled code - $this->compiler->has_code = true; - return $this->compiler->smarty->left_delimiter; - } + $compiler->has_code = true; + return $compiler->smarty->left_delimiter; + } + } ?> diff --git a/libs/sysplugins/smarty_internal_compile_nocache.php b/libs/sysplugins/smarty_internal_compile_nocache.php index 0c88b14b..5fb71b71 100644 --- a/libs/sysplugins/smarty_internal_compile_nocache.php +++ b/libs/sysplugins/smarty_internal_compile_nocache.php @@ -1,63 +1,73 @@ <?php - /** * Smarty Internal Plugin Compile Nocache * - * Compiles the {nocache} {/nocache} tags + * Compiles the {nocache} {/nocache} tags. + * * @package Smarty * @subpackage Compiler * @author Uwe Tews */ /** - * Smarty Internal Plugin Compile Nocache Class - */ + * Smarty Internal Plugin Compile Nocache Classv + * + * @package Smarty + * @subpackage Compiler + */ class Smarty_Internal_Compile_Nocache extends Smarty_Internal_CompileBase { + /** * Compiles code for the {nocache} tag * - * This tag does not generate compiled output. It only sets a compiler flag - * @param array $args array with attributes from parser + * This tag does not generate compiled output. It only sets a compiler flag. + * + * @param array $args array with attributes from parser * @param object $compiler compiler object - * @return string compiled code + * @return bool */ public function compile($args, $compiler) { - $this->compiler = $compiler; - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); if ($_attr['nocache'] === true) { - $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno); + $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); } // enter nocache mode - $this->compiler->nocache = true; + $compiler->nocache = true; // this tag does not return compiled code - $this->compiler->has_code = false; + $compiler->has_code = false; return true; - } -} + } + +} /** * Smarty Internal Plugin Compile Nocacheclose Class - */ + * + * @package Smarty + * @subpackage Compiler + */ class Smarty_Internal_Compile_Nocacheclose extends Smarty_Internal_CompileBase { + /** * Compiles code for the {/nocache} tag * - * This tag does not generate compiled output. It only sets a compiler flag - * @param array $args array with attributes from parser + * This tag does not generate compiled output. It only sets a compiler flag. + * + * @param array $args array with attributes from parser * @param object $compiler compiler object - * @return string compiled code + * @return bool */ public function compile($args, $compiler) { - $this->compiler = $compiler; - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // leave nocache mode - $this->compiler->nocache = false; + $compiler->nocache = false; // this tag does not return compiled code - $this->compiler->has_code = false; + $compiler->has_code = false; return true; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_private_block_plugin.php b/libs/sysplugins/smarty_internal_compile_private_block_plugin.php index f61ff490..00fdd19f 100644 --- a/libs/sysplugins/smarty_internal_compile_private_block_plugin.php +++ b/libs/sysplugins/smarty_internal_compile_private_block_plugin.php @@ -1,42 +1,50 @@ <?php /** * Smarty Internal Plugin Compile Block Plugin - * + * * Compiles code for the execution of block plugin - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Block Plugin Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_CompileBase { - // attribute definitions - public $optional_attributes = array('_any'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); /** * Compiles code for the execution of block plugin - * - * @param array $args array with attributes from parser - * @param object $compiler compiler object - * @param array $parameter array with compilation parameter - * @param string $tag name of block plugin - * @param string $function PHP function name + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter + * @param string $tag name of block plugin + * @param string $function PHP function name * @return string compiled code */ public function compile($args, $compiler, $parameter, $tag, $function) { - $this->compiler = $compiler; if (strlen($tag) < 6 || substr($tag, -5) != 'close') { // opening tag of block plugin - // check and get attributes - $_attr = $this->_get_attributes($args); - if ($_attr['nocache'] === true) { - $this->compiler->tag_nocache = true; - } - unset($_attr['nocache']); + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + if ($_attr['nocache'] === true) { + $compiler->tag_nocache = true; + } + unset($_attr['nocache']); // convert attributes into parameter array string $_paramsArray = array(); foreach ($_attr as $_key => $_value) { @@ -44,35 +52,36 @@ class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_Compi $_paramsArray[] = "$_key=>$_value"; } else { $_paramsArray[] = "'$_key'=>$_value"; - } - } + } + } $_params = 'array(' . implode(",", $_paramsArray) . ')'; - $this->_open_tag($tag, array($_params, $this->compiler->nocache)); + $this->openTag($compiler, $tag, array($_params, $compiler->nocache)); // maybe nocache because of nocache variables or nocache plugin - $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; // compile code - $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; {$function}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>"; + $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; echo {$function}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>"; } else { // must endblock be nocache? - if ($this->compiler->nocache) { - $this->compiler->tag_nocache = true; - } + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } // closing tag of block plugin, restore nocache - list($_params, $this->compiler->nocache) = $this->_close_tag(substr($tag, 0, -5)); + list($_params, $compiler->nocache) = $this->closeTag($compiler, substr($tag, 0, -5)); // This tag does create output - $this->compiler->has_output = true; + $compiler->has_output = true; // compile code if (!isset($parameter['modifier_list'])) { - $mod_pre = $mod_post =''; + $mod_pre = $mod_post =''; } else { - $mod_pre = ' ob_start(); '; - $mod_post = 'echo '.$this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$parameter['modifier_list'],'value'=>'ob_get_clean()')).';'; + $mod_pre = ' ob_start(); '; + $mod_post = 'echo '.$compiler->compileTag('private_modifier',array(),array('modifierlist'=>$parameter['modifier_list'],'value'=>'ob_get_clean()')).';'; } $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false;".$mod_pre." echo {$function}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); ".$mod_post." } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>"; - } + } return $output . "\n"; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_private_function_plugin.php b/libs/sysplugins/smarty_internal_compile_private_function_plugin.php index 965d696e..70e76431 100644 --- a/libs/sysplugins/smarty_internal_compile_private_function_plugin.php +++ b/libs/sysplugins/smarty_internal_compile_private_function_plugin.php @@ -1,25 +1,40 @@ <?php /** * Smarty Internal Plugin Compile Function Plugin - * + * * Compiles code for the execution of function plugin - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Function Plugin Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_CompileBase { - // attribute definitions + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array(); - public $optional_attributes = array('_any'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); /** * Compiles code for the execution of function plugin - * + * * @param array $args array with attributes from parser * @param object $compiler compiler object * @param array $parameter array with compilation parameter @@ -29,14 +44,13 @@ class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_Co */ public function compile($args, $compiler, $parameter, $tag, $function) { - $this->compiler = $compiler; // This tag does create output - $this->compiler->has_output = true; + $compiler->has_output = true; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); if ($_attr['nocache'] === true) { - $this->compiler->tag_nocache = true; + $compiler->tag_nocache = true; } unset($_attr['nocache']); // convert attributes into parameter array string @@ -46,13 +60,14 @@ class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_Co $_paramsArray[] = "$_key=>$_value"; } else { $_paramsArray[] = "'$_key'=>$_value"; - } - } - $_params = 'array(' . implode(",", $_paramsArray) . ')'; + } + } + $_params = 'array(' . implode(",", $_paramsArray) . ')'; // compile code $output = "<?php echo {$function}({$_params},\$_smarty_tpl);?>\n"; return $output; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_private_modifier.php b/libs/sysplugins/smarty_internal_compile_private_modifier.php index 1648db2e..ca4d9077 100644 --- a/libs/sysplugins/smarty_internal_compile_private_modifier.php +++ b/libs/sysplugins/smarty_internal_compile_private_modifier.php @@ -1,38 +1,41 @@ <?php
+
/**
* Smarty Internal Plugin Compile Modifier
- *
+ *
* Compiles code for modifier execution
- *
+ *
* @package Smarty
* @subpackage Compiler
- * @author Uwe Tews
+ * @author Uwe Tews
*/
/**
* Smarty Internal Plugin Compile Modifier Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
*/
class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBase {
+
/**
* Compiles code for modifier execution
- *
- * @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 $compiler compiler object
+ * @param array $parameter array with compilation parameter
* @return string compiled code
*/
public function compile($args, $compiler, $parameter)
{
- $this->compiler = $compiler;
- $this->smarty = $this->compiler->smarty;
// check and get attributes
- $_attr = $this->_get_attributes($args);
- $output = $parameter['value'];
+ $_attr = $this->getAttributes($compiler, $args);
+ $output = $parameter['value'];
// loop over list of modifiers
foreach ($parameter['modifierlist'] as $single_modifier) {
$modifier = $single_modifier[0];
- $single_modifier[0] = $output;
- $params = implode(',', $single_modifier);
+ $single_modifier[0] = $output;
+ $params = implode(',', $single_modifier);
// check for registered modifier
if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier])) {
$function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0];
@@ -43,27 +46,36 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')';
} else {
$output = $function[0] . '::' . $function[1] . '(' . $params . ')';
- }
- }
+ }
+ }
+ } else if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0])) {
+ $output = call_user_func($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0], $single_modifier, $compiler->smarty);
// check for plugin modifiercompiler
} else if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) {
- $plugin = 'smarty_modifiercompiler_' . $modifier;
- $output = $plugin($single_modifier, $compiler);
+ // check if modifier allowed
+ if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) {
+ $plugin = 'smarty_modifiercompiler_' . $modifier;
+ $output = $plugin($single_modifier, $compiler);
+ }
// check for plugin modifier
- } else if ($function = $this->compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) {
- $output = "{$function}({$params})";
+ } else if ($function = $compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) {
+ // check if modifier allowed
+ if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) {
+ $output = "{$function}({$params})";
+ }
// check if trusted PHP function
} else if (is_callable($modifier)) {
// check if modifier allowed
- if (!is_object($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedModifier($modifier, $this->compiler)) {
+ if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)) {
$output = "{$modifier}({$params})";
- }
+ }
} else {
- $this->compiler->trigger_template_error ("unknown modifier \"" . $modifier . "\"", $this->compiler->lex->taglineno);
- }
- }
+ $compiler->trigger_template_error("unknown modifier \"" . $modifier . "\"", $compiler->lex->taglineno);
+ }
+ }
return $output;
- }
-}
+ }
+
+}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_private_object_block_function.php b/libs/sysplugins/smarty_internal_compile_private_object_block_function.php index 97737e8d..603195cb 100644 --- a/libs/sysplugins/smarty_internal_compile_private_object_block_function.php +++ b/libs/sysplugins/smarty_internal_compile_private_object_block_function.php @@ -1,43 +1,50 @@ <?php /** * Smarty Internal Plugin Compile Object Block Function - * + * * Compiles code for registered objects as block function - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Object Block Function Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Private_Object_Block_Function extends Smarty_Internal_CompileBase { - // attribute definitions - public $required_attributes = array(); - public $optional_attributes = array('_any'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); /** * Compiles code for the execution of block plugin - * - * @param array $args array with attributes from parser - * @param object $compiler compiler object - * @param array $parameter array with compilation parameter - * @param string $tag name of block object - * @param string $methode name of methode to call + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter + * @param string $tag name of block object + * @param string $method name of method to call * @return string compiled code */ - public function compile($args, $compiler, $parameter, $tag, $methode) + public function compile($args, $compiler, $parameter, $tag, $method) { - $this->compiler = $compiler; if (strlen($tag) < 5 || substr($tag, -5) != 'close') { // opening tag of block plugin - // check and get attributes - $_attr = $this->_get_attributes($args); - if ($_attr['nocache'] === true) { - $this->compiler->tag_nocache = true; - } - unset($_attr['nocache']); + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + if ($_attr['nocache'] === true) { + $compiler->tag_nocache = true; + } + unset($_attr['nocache']); // convert attributes into parameter array string $_paramsArray = array(); foreach ($_attr as $_key => $_value) { @@ -45,36 +52,37 @@ class Smarty_Internal_Compile_Private_Object_Block_Function extends Smarty_Inter $_paramsArray[] = "$_key=>$_value"; } else { $_paramsArray[] = "'$_key'=>$_value"; - } - } + } + } $_params = 'array(' . implode(",", $_paramsArray) . ')'; - $this->_open_tag($tag . '->' . $methode, array($_params, $this->compiler->nocache)); + $this->openTag($compiler, $tag . '->' . $method, array($_params, $compiler->nocache)); // maybe nocache because of nocache variables or nocache plugin - $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; // compile code - $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}->{$methode}', {$_params}); \$_block_repeat=true; \$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$methode}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>"; + $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}->{$method}', {$_params}); \$_block_repeat=true; echo \$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>"; } else { - $base_tag = substr($tag, 0, -5); + $base_tag = substr($tag, 0, -5); // must endblock be nocache? - if ($this->compiler->nocache) { - $this->compiler->tag_nocache = true; - } + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } // closing tag of block plugin, restore nocache - list($_params, $this->compiler->nocache) = $this->_close_tag($base_tag . '->' . $methode); + list($_params, $compiler->nocache) = $this->closeTag($compiler, $base_tag . '->' . $method); // This tag does create output - $this->compiler->has_output = true; + $compiler->has_output = true; // compile code if (!isset($parameter['modifier_list'])) { - $mod_pre = $mod_post =''; + $mod_pre = $mod_post = ''; } else { - $mod_pre = ' ob_start(); '; - $mod_post = 'echo '.$this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$parameter['modifier_list'],'value'=>'ob_get_clean()')).';'; + $mod_pre = ' ob_start(); '; + $mod_post = 'echo ' . $compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter['modifier_list'], 'value' => 'ob_get_clean()')) . ';'; } - $output = "<?php \$_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;".$mod_pre." echo \$_smarty_tpl->smarty->registered_objects['{$base_tag}'][0]->{$methode}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); ".$mod_post." } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>"; - } - return $output."\n"; - } -} + $output = "<?php \$_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;" . $mod_pre . " echo \$_smarty_tpl->smarty->registered_objects['{$base_tag}'][0]->{$method}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); " . $mod_post . " } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>"; + } + return $output . "\n"; + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_private_object_function.php b/libs/sysplugins/smarty_internal_compile_private_object_function.php index f0755f06..f649084c 100644 --- a/libs/sysplugins/smarty_internal_compile_private_object_function.php +++ b/libs/sysplugins/smarty_internal_compile_private_object_function.php @@ -1,71 +1,79 @@ <?php /** * Smarty Internal Plugin Compile Object Funtion - * + * * Compiles code for registered objects as function - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Object Function Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_CompileBase { - // attribute definitions - public $required_attributes = array(); - public $optional_attributes = array('_any'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); /** * Compiles code for the execution of function plugin - * - * @param array $args array with attributes from parser - * @param object $compiler compiler object - * @param array $parameter array with compilation parameter - * @param string $tag name of function - * @param string $methode name of methode to call + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter + * @param string $tag name of function + * @param string $method name of method to call * @return string compiled code */ - public function compile($args, $compiler, $parameter, $tag, $methode) + public function compile($args, $compiler, $parameter, $tag, $method) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); if ($_attr['nocache'] === true) { - $this->compiler->tag_nocache = true; + $compiler->tag_nocache = true; } unset($_attr['nocache']); $_assign = null; if (isset($_attr['assign'])) { $_assign = $_attr['assign']; unset($_attr['assign']); - } + } // convert attributes into parameter array string - if ($this->compiler->smarty->registered_objects[$tag][2]) { + if ($compiler->smarty->registered_objects[$tag][2]) { $_paramsArray = array(); foreach ($_attr as $_key => $_value) { if (is_int($_key)) { $_paramsArray[] = "$_key=>$_value"; } else { $_paramsArray[] = "'$_key'=>$_value"; - } - } + } + } $_params = 'array(' . implode(",", $_paramsArray) . ')'; - $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$methode}({$_params},\$_smarty_tpl)"; + $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params},\$_smarty_tpl)"; } else { $_params = implode(",", $_attr); - $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$methode}({$_params})"; - } + $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params})"; + } if (empty($_assign)) { // This tag does create output - $this->compiler->has_output = true; + $compiler->has_output = true; $output = "<?php echo {$return};?>\n"; } else { $output = "<?php \$_smarty_tpl->assign({$_assign},{$return});?>\n"; - } + } return $output; - } + } + } ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_private_print_expression.php b/libs/sysplugins/smarty_internal_compile_private_print_expression.php index 5a9c9319..56dfb2b9 100644 --- a/libs/sysplugins/smarty_internal_compile_private_print_expression.php +++ b/libs/sysplugins/smarty_internal_compile_private_print_expression.php @@ -1,77 +1,156 @@ <?php /** * Smarty Internal Plugin Compile Print Expression - * + * * Compiles any tag which will output an expression or variable - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Print Expression Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_CompileBase { - // attribute definitions - public $optional_attributes = array('assign'); - public $option_flags = array('nocache', 'nofilter'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('assign'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $option_flags = array('nocache', 'nofilter'); /** * Compiles code for gererting output from any expression - * - * @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 $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // nocache option if ($_attr['nocache'] === true) { - $this->compiler->tag_nocache = true; - } + $compiler->tag_nocache = true; + } // filter handling if ($_attr['nofilter'] === true) { $_filter = 'false'; } else { $_filter = 'true'; - } - // compiled output - // compiled output + } if (isset($_attr['assign'])) { // assign output to variable $output = "<?php \$_smarty_tpl->assign({$_attr['assign']},{$parameter['value']});?>"; } else { // display value - if (!$_attr['nofilter'] && isset($this->compiler->smarty->registered_filters['variable'])) { - $output = "Smarty_Internal_Filter_Handler::runFilter('variable', {$parameter['value']}, \$_smarty_tpl, {$_filter})"; - } else { - $output = $parameter['value']; - } - if (!$_attr['nofilter'] && !empty($this->compiler->smarty->default_modifiers)) { - $modifierlist = array(); - foreach ($this->compiler->smarty->default_modifiers as $key => $single_default_modifier) { - preg_match_all('/(\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|:|[^:]+)/', $single_default_modifier, $mod_array); - for ($i = 0, $count = count($mod_array[0]);$i < $count;$i++) { - if ($mod_array[0][$i] != ':') { - $modifierlist[$key][] = $mod_array[0][$i]; - } - } - } - $output = $this->compiler->compileTag('private_modifier', array(), array('modifierlist' => $modifierlist, 'value' => $output)); - } + $output = $parameter['value']; + // tag modifier if (!empty($parameter['modifierlist'])) { - $output = $this->compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter['modifierlist'], 'value' => $output)); - } - $this->compiler->has_output = true; + $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter['modifierlist'], 'value' => $output)); + } + // default modifier + if (!empty($compiler->smarty->default_modifiers)) { + if (empty($compiler->default_modifier_list)) { + $modifierlist = array(); + foreach ($compiler->smarty->default_modifiers as $key => $single_default_modifier) { + preg_match_all('/(\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|:|[^:]+)/', $single_default_modifier, $mod_array); + for ($i = 0, $count = count($mod_array[0]);$i < $count;$i++) { + if ($mod_array[0][$i] != ':') { + $modifierlist[$key][] = $mod_array[0][$i]; + } + } + } + $compiler->default_modifier_list = $modifierlist; + } + $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => $compiler->default_modifier_list, 'value' => $output)); + } + if (!$_attr['nofilter']) { + // autoescape html + if ($compiler->template->smarty->escape_html) { + $output = "htmlspecialchars({$output}, ENT_QUOTES, SMARTY_RESOURCE_CHAR_SET)"; + } + // loop over registerd filters + if (!empty($compiler->template->smarty->registered_filters[Smarty::FILTER_VARIABLE])) { + foreach ($compiler->template->smarty->registered_filters[Smarty::FILTER_VARIABLE] as $key => $function) { + if (!is_array($function)) { + $output = "{$function}({$output},\$_smarty_tpl)"; + } else if (is_object($function[0])) { + $output = "\$_smarty_tpl->smarty->registered_filters[Smarty::FILTER_VARIABLE][{$key}][0]->{$function[1]}({$output},\$_smarty_tpl)"; + } else { + $output = "{$function[0]}::{$function[1]}({$output},\$_smarty_tpl)"; + } + } + } + // auto loaded filters + if (isset($compiler->smarty->autoload_filters[Smarty::FILTER_VARIABLE])) { + foreach ((array)$compiler->template->smarty->autoload_filters[Smarty::FILTER_VARIABLE] as $name) { + $result = $this->compile_output_filter($compiler, $name, $output); + if ($result !== false) { + $output = $result; + } else { + // not found, throw exception + throw new SmartyException("Unable to load filter '{$name}'"); + } + } + } + if (isset($compiler->template->variable_filters)) { + foreach ($compiler->template->variable_filters as $filter) { + if (count($filter) == 1 && ($result = $this->compile_output_filter($compiler, $filter[0], $output)) !== false) { + $output = $result; + } else { + $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => array($filter), 'value' => $output)); + } + } + } + } + + $compiler->has_output = true; $output = "<?php echo {$output};?>"; - } + } return $output; - } -} + } + + /** + * @param object $compiler compiler object + * @param string $name name of variable filter + * @param type $output embedded output + * @return string + */ + private function compile_output_filter($compiler, $name, $output) + { + $plugin_name = "smarty_variablefilter_{$name}"; + $path = $compiler->smarty->loadPlugin($plugin_name, false); + if ($path) { + if ($compiler->template->caching) { + $compiler->template->required_plugins['nocache'][$name][Smarty::FILTER_VARIABLE]['file'] = $path; + $compiler->template->required_plugins['nocache'][$name][Smarty::FILTER_VARIABLE]['function'] = $plugin_name; + } else { + $compiler->template->required_plugins['compiled'][$name][Smarty::FILTER_VARIABLE]['file'] = $path; + $compiler->template->required_plugins['compiled'][$name][Smarty::FILTER_VARIABLE]['function'] = $plugin_name; + } + } else { + // not found + return false; + } + return "{$plugin_name}({$output},\$_smarty_tpl)"; + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_private_registered_block.php b/libs/sysplugins/smarty_internal_compile_private_registered_block.php index 05403624..b1ff4cb8 100644 --- a/libs/sysplugins/smarty_internal_compile_private_registered_block.php +++ b/libs/sysplugins/smarty_internal_compile_private_registered_block.php @@ -1,84 +1,101 @@ <?php
/**
* Smarty Internal Plugin Compile Registered Block
- *
+ *
* Compiles code for the execution of a registered block function
- *
+ *
* @package Smarty
* @subpackage Compiler
- * @author Uwe Tews
+ * @author Uwe Tews
*/
/**
* Smarty Internal Plugin Compile Registered Block Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
*/
class Smarty_Internal_Compile_Private_Registered_Block extends Smarty_Internal_CompileBase {
- // attribute definitions
- public $optional_attributes = array('_any');
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
/**
* Compiles code for the execution of a block function
- *
- * @param array $args array with attributes from parser
- * @param object $compiler compiler object
- * @param array $parameter array with compilation parameter
- * @param string $tag name of block function
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @param string $tag name of block function
* @return string compiled code
*/
public function compile($args, $compiler, $parameter, $tag)
{
- $this->compiler = $compiler;
if (strlen($tag) < 6 || substr($tag,-5) != 'close') {
// opening tag of block plugin
- // check and get attributes
- $_attr = $this->_get_attributes($args);
- if ($_attr['nocache']) {
- $this->compiler->tag_nocache = true;
- }
- unset($_attr['nocache']);
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache']) {
+ $compiler->tag_nocache = true;
+ }
+ unset($_attr['nocache']);
+ if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$tag])) {
+ $tag_info = $compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$tag];
+ } else {
+ $tag_info = $compiler->default_handler_plugins[Smarty::PLUGIN_BLOCK][$tag];
+ }
// convert attributes into parameter array string
$_paramsArray = array();
foreach ($_attr as $_key => $_value) {
if (is_int($_key)) {
$_paramsArray[] = "$_key=>$_value";
- } elseif ($this->compiler->template->caching && in_array($_key,$compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$tag][2])) {
- $_value = str_replace("'","^#^",$_value);
- $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^";
+ } elseif ($compiler->template->caching && in_array($_key,$tag_info[2])) {
+ $_value = str_replace("'","^#^",$_value);
+ $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^";
} else {
$_paramsArray[] = "'$_key'=>$_value";
- }
- }
+ }
+ }
$_params = 'array(' . implode(",", $_paramsArray) . ')';
- $this->_open_tag($tag, array($_params, $this->compiler->nocache));
+ $this->openTag($compiler, $tag, array($_params, $compiler->nocache));
// maybe nocache because of nocache variables or nocache plugin
- $this->compiler->nocache = !$compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$tag][1] | $this->compiler->nocache | $this->compiler->tag_nocache;
- $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$tag][0];
+ $compiler->nocache = !$tag_info[1] | $compiler->nocache | $compiler->tag_nocache;
+ $function = $tag_info[0];
// compile code
if (!is_array($function)) {
- $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; {$function}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
+ $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; echo {$function}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
} else if (is_object($function[0])) {
- $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; \$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]->{$function[1]}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
+ $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; echo \$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]->{$function[1]}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
} else {
- $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; {$function[0]}::{$function[1]}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
- }
+ $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; echo {$function[0]}::{$function[1]}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
+ }
} else {
// must endblock be nocache?
- if ($this->compiler->nocache) {
- $this->compiler->tag_nocache = true;
- }
- $base_tag = substr($tag, 0, -5);
+ if ($compiler->nocache) {
+ $compiler->tag_nocache = true;
+ }
+ $base_tag = substr($tag, 0, -5);
// closing tag of block plugin, restore nocache
- list($_params, $this->compiler->nocache) = $this->_close_tag($base_tag);
+ list($_params, $compiler->nocache) = $this->closeTag($compiler, $base_tag);
// This tag does create output
- $this->compiler->has_output = true;
- $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag][0];
+ $compiler->has_output = true;
+ if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag])) {
+ $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag][0];
+ } else {
+ $function = $compiler->default_handler_plugins[Smarty::PLUGIN_BLOCK][$base_tag][0];
+ }
// compile code
if (!isset($parameter['modifier_list'])) {
- $mod_pre = $mod_post ='';
+ $mod_pre = $mod_post ='';
} else {
- $mod_pre = ' ob_start(); ';
- $mod_post = 'echo '.$this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$parameter['modifier_list'],'value'=>'ob_get_clean()')).';';
+ $mod_pre = ' ob_start(); ';
+ $mod_post = 'echo '.$compiler->compileTag('private_modifier',array(),array('modifierlist'=>$parameter['modifier_list'],'value'=>'ob_get_clean()')).';';
}
if (!is_array($function)) {
$output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false;".$mod_pre." echo {$function}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat);".$mod_post." } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
@@ -86,10 +103,11 @@ class Smarty_Internal_Compile_Private_Registered_Block extends Smarty_Internal_C $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false;".$mod_pre." echo \$_smarty_tpl->smarty->registered_plugins['block']['{$base_tag}'][0][0]->{$function[1]}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); ".$mod_post."} array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
} else {
$output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false;".$mod_pre." echo {$function[0]}::{$function[1]}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); ".$mod_post."} array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
- }
- }
- return $output."\n";
- }
-}
+ }
+ }
+ return $output . "\n";
+ }
+
+}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_private_registered_function.php b/libs/sysplugins/smarty_internal_compile_private_registered_function.php index f79edf68..5058bfbb 100644 --- a/libs/sysplugins/smarty_internal_compile_private_registered_function.php +++ b/libs/sysplugins/smarty_internal_compile_private_registered_function.php @@ -1,57 +1,70 @@ <?php
/**
* Smarty Internal Plugin Compile Registered Function
- *
+ *
* Compiles code for the execution of a registered function
- *
+ *
* @package Smarty
* @subpackage Compiler
- * @author Uwe Tews
+ * @author Uwe Tews
*/
-
+
/**
* Smarty Internal Plugin Compile Registered Function Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
*/
class Smarty_Internal_Compile_Private_Registered_Function extends Smarty_Internal_CompileBase {
- // attribute definitions
- public $optional_attributes = array('_any');
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
/**
* Compiles code for the execution of a registered function
- *
- * @param array $args array with attributes from parser
- * @param object $compiler compiler object
- * @param array $parameter array with compilation parameter
- * @param string $tag name of function
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @param string $tag name of function
* @return string compiled code
*/
public function compile($args, $compiler, $parameter, $tag)
{
- $this->compiler = $compiler;
// This tag does create output
- $this->compiler->has_output = true;
+ $compiler->has_output = true;
// check and get attributes
- $_attr = $this->_get_attributes($args);
+ $_attr = $this->getAttributes($compiler, $args);
if ($_attr['nocache']) {
- $this->compiler->tag_nocache = true;
+ $compiler->tag_nocache = true;
}
unset($_attr['nocache']);
+ if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION][$tag])) {
+ $tag_info = $compiler->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION][$tag];
+ } else {
+ $tag_info = $compiler->default_handler_plugins[Smarty::PLUGIN_FUNCTION][$tag];
+ }
// not cachable?
- $this->compiler->tag_nocache = $this->compiler->tag_nocache || !$compiler->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION][$tag][1];
+ $compiler->tag_nocache = $compiler->tag_nocache || !$tag_info[1];
// convert attributes into parameter array string
$_paramsArray = array();
foreach ($_attr as $_key => $_value) {
if (is_int($_key)) {
$_paramsArray[] = "$_key=>$_value";
- } elseif ($this->compiler->template->caching && in_array($_key,$compiler->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION][$tag][2])) {
- $_value = str_replace("'","^#^",$_value);
+ } elseif ($compiler->template->caching && in_array($_key,$tag_info[2])) {
+ $_value = str_replace("'","^#^",$_value);
$_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^";
} else {
$_paramsArray[] = "'$_key'=>$_value";
- }
- }
- $_params = 'array(' . implode(",", $_paramsArray) . ')';
- $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION][$tag][0];
+ }
+ }
+ $_params = 'array(' . implode(",", $_paramsArray) . ')';
+ $function = $tag_info[0];
// compile code
if (!is_array($function)) {
$output = "<?php echo {$function}({$_params},\$_smarty_tpl);?>\n";
@@ -59,9 +72,10 @@ class Smarty_Internal_Compile_Private_Registered_Function extends Smarty_Interna $output = "<?php echo \$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['{$tag}'][0][0]->{$function[1]}({$_params},\$_smarty_tpl);?>\n";
} else {
$output = "<?php echo {$function[0]}::{$function[1]}({$_params},\$_smarty_tpl);?>\n";
- }
+ }
return $output;
- }
-}
+ }
+
+}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_private_special_variable.php b/libs/sysplugins/smarty_internal_compile_private_special_variable.php index 5d6ae801..f9adcec8 100644 --- a/libs/sysplugins/smarty_internal_compile_private_special_variable.php +++ b/libs/sysplugins/smarty_internal_compile_private_special_variable.php @@ -1,22 +1,26 @@ <?php /** * Smarty Internal Plugin Compile Special Smarty Variable - * + * * Compiles the special $smarty variables - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile special Smarty Variable Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_CompileBase { + /** * Compiles code for the speical $smarty variables - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ @@ -38,7 +42,7 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C 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; @@ -51,15 +55,15 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) { $compiler->trigger_template_error("(secure mode) super globals not permitted"); break; - } + } $compiled_ref = '$_'.strtoupper($variable); break; case 'template': - return 'basename($_smarty_tpl->getTemplateFilepath())'; + return 'basename($_smarty_tpl->source->filepath)'; case 'current_dir': - return 'dirname($_smarty_tpl->getTemplateFilepath())'; + return 'dirname($_smarty_tpl->source->filepath)'; case 'version': $_version = Smarty::SMARTY_VERSION; @@ -69,7 +73,7 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_constants) { $compiler->trigger_template_error("(secure mode) constants not permitted"); break; - } + } return '@' . trim($_index[1], "'"); case 'config': @@ -85,15 +89,16 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C 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; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_rdelim.php b/libs/sysplugins/smarty_internal_compile_rdelim.php index 6436bfd1..807c7e2b 100644 --- a/libs/sysplugins/smarty_internal_compile_rdelim.php +++ b/libs/sysplugins/smarty_internal_compile_rdelim.php @@ -1,9 +1,8 @@ <?php - /** * Smarty Internal Plugin Compile Rdelim * - * Compiles the {rdelim} tag + * Compiles the {rdelim} tag * @package Smarty * @subpackage Compiler * @author Uwe Tews @@ -11,27 +10,32 @@ /** * Smarty Internal Plugin Compile Rdelim Class - */ + * + * @package Smarty + * @subpackage Compiler + */ class Smarty_Internal_Compile_Rdelim extends Smarty_Internal_CompileBase { + /** * Compiles code for the {rdelim} tag * - * This tag does output the right delimiter - * @param array $args array with attributes from parser + * This tag does output the right delimiter. + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); if ($_attr['nocache'] === true) { - $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno); + $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); } // this tag does not return compiled code - $this->compiler->has_code = true; - return $this->compiler->smarty->right_delimiter; - } + $compiler->has_code = true; + return $compiler->smarty->right_delimiter; + } + } ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_section.php b/libs/sysplugins/smarty_internal_compile_section.php index 0768b026..fda307a3 100644 --- a/libs/sysplugins/smarty_internal_compile_section.php +++ b/libs/sysplugins/smarty_internal_compile_section.php @@ -1,44 +1,64 @@ <?php /** * Smarty Internal Plugin Compile Section - * + * * Compiles the {section} {sectionelse} {/section} tags - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Section Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Section extends Smarty_Internal_CompileBase { - // attribute definitions + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('name', 'loop'); - public $shorttag_order = array('name', 'loop'); - public $optional_attributes = array('start', 'step', 'max', 'show'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('name', 'loop'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('start', 'step', 'max', 'show'); /** * Compiles code for the {section} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); - $this->_open_tag('section', array('section',$this->compiler->nocache)); + $this->openTag($compiler, 'section', array('section', $compiler->nocache)); // maybe nocache because of nocache variables - $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; $output = "<?php "; $section_name = $_attr['name']; - + $output .= "unset(\$_smarty_tpl->tpl_vars['smarty']->value['section'][$section_name]);\n"; $section_props = "\$_smarty_tpl->tpl_vars['smarty']->value['section'][$section_name]"; @@ -68,8 +88,8 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_CompileBase { case 'step': $output .= "{$section_props}['$attr_name'] = ((int)$attr_value) == 0 ? 1 : (int)$attr_value;\n"; break; - } - } + } + } if (!isset($_attr['show'])) $output .= "{$section_props}['show'] = true;\n"; @@ -89,14 +109,14 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_CompileBase { $output .= "{$section_props}['start'] = {$section_props}['step'] > 0 ? 0 : {$section_props}['loop']-1;\n"; else { $output .= "if ({$section_props}['start'] < 0)\n" . " {$section_props}['start'] = max({$section_props}['step'] > 0 ? 0 : -1, {$section_props}['loop'] + {$section_props}['start']);\n" . "else\n" . " {$section_props}['start'] = min({$section_props}['start'], {$section_props}['step'] > 0 ? {$section_props}['loop'] : {$section_props}['loop']-1);\n"; - } + } $output .= "if ({$section_props}['show']) {\n"; if (!isset($_attr['start']) && !isset($_attr['step']) && !isset($_attr['max'])) { $output .= " {$section_props}['total'] = {$section_props}['loop'];\n"; } else { $output .= " {$section_props}['total'] = min(ceil(({$section_props}['step'] > 0 ? {$section_props}['loop'] - {$section_props}['start'] : {$section_props}['start']+1)/abs({$section_props}['step'])), {$section_props}['max']);\n"; - } + } $output .= " if ({$section_props}['total'] == 0)\n" . " {$section_props}['show'] = false;\n" . "} else\n" . " {$section_props}['total'] = 0;\n"; $output .= "if ({$section_props}['show']):\n"; @@ -112,62 +132,72 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_CompileBase { $output .= "?>"; return $output; - } -} + } + +} /** -* Smarty Internal Plugin Compile Sectionelse Class -*/ + * Smarty Internal Plugin Compile Sectionelse Class + * + * @package Smarty + * @subpackage Compiler + */ class Smarty_Internal_Compile_Sectionelse extends Smarty_Internal_CompileBase { + /** * Compiles code for the {sectionelse} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); - list($_open_tag, $nocache) = $this->_close_tag(array('section')); - $this->_open_tag('sectionelse',array('sectionelse', $nocache)); + list($openTag, $nocache) = $this->closeTag($compiler, array('section')); + $this->openTag($compiler, 'sectionelse', array('sectionelse', $nocache)); return "<?php endfor; else: ?>"; - } -} + } + +} /** * Smarty Internal Plugin Compile Sectionclose Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Sectionclose extends Smarty_Internal_CompileBase { + /** * Compiles code for the {/section} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object * @return string compiled code */ public function compile($args, $compiler) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // must endblock be nocache? - if ($this->compiler->nocache) { - $this->compiler->tag_nocache = true; + if ($compiler->nocache) { + $compiler->tag_nocache = true; } - list($_open_tag, $this->compiler->nocache) = $this->_close_tag(array('section', 'sectionelse')); + list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('section', 'sectionelse')); - if ($_open_tag == 'sectionelse') + if ($openTag == 'sectionelse') { return "<?php endif; ?>"; - else + } else { return "<?php endfor; endif; ?>"; - } -} + } + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_setfilter.php b/libs/sysplugins/smarty_internal_compile_setfilter.php new file mode 100644 index 00000000..d1dd90cf --- /dev/null +++ b/libs/sysplugins/smarty_internal_compile_setfilter.php @@ -0,0 +1,72 @@ +<?php
+/**
+ * Smarty Internal Plugin Compile Setfilter
+ *
+ * Compiles code for setfilter tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Setfilter Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Setfilter extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for setfilter tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ $compiler->variable_filter_stack[] = $compiler->template->variable_filters;
+ $compiler->template->variable_filters = $parameter['modifier_list'];
+ // this tag does not return compiled code
+ $compiler->has_code = false;
+ return true;
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Setfilterclose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Setfilterclose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/setfilter} tag
+ *
+ * This tag does not generate compiled output. It resets variable filter.
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ $_attr = $this->getAttributes($compiler, $args);
+ // reset variable filter to previous state
+ if (count($compiler->variable_filter_stack)) {
+ $compiler->template->variable_filters = array_pop($compiler->variable_filter_stack);
+ } else {
+ $compiler->template->variable_filters = array();
+ }
+ // this tag does not return compiled code
+ $compiler->has_code = false;
+ return true;
+ }
+
+}
+
+?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compile_while.php b/libs/sysplugins/smarty_internal_compile_while.php index 7e87a229..46b6e269 100644 --- a/libs/sysplugins/smarty_internal_compile_while.php +++ b/libs/sysplugins/smarty_internal_compile_while.php @@ -1,82 +1,90 @@ <?php /** -* Smarty Internal Plugin Compile While -* -* Compiles the {while} tag -* -* @package Smarty -* @subpackage Compiler -* @author Uwe Tews -*/ + * Smarty Internal Plugin Compile While + * + * Compiles the {while} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ /** -* Smarty Internal Plugin Compile While Class -*/ + * Smarty Internal Plugin Compile While Class + * + * @package Smarty + * @subpackage Compiler + */ class Smarty_Internal_Compile_While extends Smarty_Internal_CompileBase { + /** - * Compiles code for the {while} tag - * - * @param array $args array with attributes from parser - * @param object $compiler compiler object - * @param array $parameter array with compilation parameter - * @return string compiled code - */ + * Compiles code for the {while} tag + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter + * @return string compiled code + */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); - $this->_open_tag('while', $this->compiler->nocache); + $_attr = $this->getAttributes($compiler, $args); + $this->openTag($compiler, 'while', $compiler->nocache); // maybe nocache because of nocache variables - $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; if (is_array($parameter['if condition'])) { - if ($this->compiler->nocache) { - $_nocache = ',true'; - // create nocache var to make it know for further compiling - if (is_array($parameter['if condition']['var'])) { - $this->compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true); - } else { - $this->compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true); - } - } else { - $_nocache = ''; - } + if ($compiler->nocache) { + $_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); + } else { + $compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true); + } + } else { + $_nocache = ''; + } if (is_array($parameter['if condition']['var'])) { - $_output = "<?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 .= "while (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']['var']."]->value".$parameter['if condition']['var']['smarty_internal_index']." = ".$parameter['if condition']['value']."){?>"; + $_output = "<?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 .= "while (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value" . $parameter['if condition']['var']['smarty_internal_index'] . " = " . $parameter['if condition']['value'] . "){?>"; } else { - $_output = "<?php \$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."] = new Smarty_Variable(\$_smarty_tpl->getVariable(".$parameter['if condition']['var'].",null,true,false)->value{$_nocache});"; - $_output .= "while (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."]->value = ".$parameter['if condition']['value']."){?>"; - } + $_output = "<?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 .= "while (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "]->value = " . $parameter['if condition']['value'] . "){?>"; + } return $_output; } else { return "<?php while ({$parameter['if condition']}){?>"; - } - } -} + } + } + +} /** -* Smarty Internal Plugin Compile Whileclose Class -*/ + * Smarty Internal Plugin Compile Whileclose Class + * + * @package Smarty + * @subpackage Compiler + */ class Smarty_Internal_Compile_Whileclose extends Smarty_Internal_CompileBase { + /** - * Compiles code for the {/while} tag - * - * @param array $args array with attributes from parser - * @param object $compiler compiler object - * @return string compiled code - */ + * Compiles code for the {/while} tag + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @return string compiled code + */ public function compile($args, $compiler) { - $this->compiler = $compiler; // must endblock be nocache? - if ($this->compiler->nocache) { - $this->compiler->tag_nocache = true; + if ($compiler->nocache) { + $compiler->tag_nocache = true; } - $this->compiler->nocache = $this->_close_tag(array('while')); + $compiler->nocache = $this->closeTag($compiler, array('while')); return "<?php }?>"; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_compilebase.php b/libs/sysplugins/smarty_internal_compilebase.php index 6418acce..5fb56f37 100644 --- a/libs/sysplugins/smarty_internal_compilebase.php +++ b/libs/sysplugins/smarty_internal_compilebase.php @@ -1,55 +1,78 @@ <?php - /** * Smarty Internal Plugin CompileBase - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * This class does extend all internal compile plugins + * + * @package Smarty + * @subpackage Compiler */ -// abstract class Smarty_Internal_CompileBase implements TagCompilerInterface -class Smarty_Internal_CompileBase { - public $required_attributes = array(); +abstract class Smarty_Internal_CompileBase { + + /** + * Array of names of required attribute required by tag + * + * @var array + */ + public $required_attributes = array(); + /** + * Array of names of optional attribute required by tag + * use array('_any') if there is no restriction of attributes names + * + * @var array + */ public $optional_attributes = array(); + /** + * Shorttag attribute order defined by its names + * + * @var array + */ public $shorttag_order = array(); + /** + * Array of names of valid option flags + * + * @var array + */ public $option_flags = array('nocache'); - /** * This function checks if the attributes passed are valid - * - * The attributes passed for the tag to compile are checked against the list of required and + * + * The attributes passed for the tag to compile are checked against the list of required and * optional attributes. Required attributes must be present. Optional attributes are check against - * against the corresponding list. The keyword '_any' specifies that any attribute will be accepted + * the corresponding list. The keyword '_any' specifies that any attribute will be accepted * as valid - * - * @param array $attributes attributes applied to the tag + * + * @param object $compiler compiler object + * @param array $attributes attributes applied to the tag * @return array of mapped attributes for further processing */ - function _get_attributes ($attributes) + public function getAttributes($compiler, $attributes) { - $_indexed_attr = array(); + $_indexed_attr = array(); // loop over attributes foreach ($attributes as $key => $mixed) { // shorthand ? if (!is_array($mixed)) { // option flag ? if (in_array(trim($mixed, '\'"'), $this->option_flags)) { - $_indexed_attr[trim($mixed, '\'"')] = true; + $_indexed_attr[trim($mixed, '\'"')] = true; // shorthand attribute ? } else if (isset($this->shorttag_order[$key])) { $_indexed_attr[$this->shorttag_order[$key]] = $mixed; } else { // too many shorthands - $this->compiler->trigger_template_error('too many shorthand attributes', $this->compiler->lex->taglineno); - } + $compiler->trigger_template_error('too many shorthand attributes', $compiler->lex->taglineno); + } // named attribute } else { - $kv = each($mixed); + $kv = each($mixed); // option flag? if (in_array($kv['key'], $this->option_flags)) { if (is_bool($kv['value'])) { @@ -59,92 +82,95 @@ class Smarty_Internal_CompileBase { $_indexed_attr[$kv['key']] = true; } else { $_indexed_attr[$kv['key']] = false; - } + } } else if (is_numeric($kv['value']) && in_array($kv['value'], array(0, 1))) { if ($kv['value'] == 1) { $_indexed_attr[$kv['key']] = true; } else { $_indexed_attr[$kv['key']] = false; - } + } } else { - $this->compiler->trigger_template_error("illegal value of option flag \"{$kv['key']}\"", $this->compiler->lex->taglineno); - } + $compiler->trigger_template_error("illegal value of option flag \"{$kv['key']}\"", $compiler->lex->taglineno); + } // must be named attribute } else { - reset($mixed); + reset($mixed); $_indexed_attr[key($mixed)] = $mixed[key($mixed)]; - } - } - } + } + } + } // check if all required attributes present foreach ($this->required_attributes as $attr) { if (!array_key_exists($attr, $_indexed_attr)) { - $this->compiler->trigger_template_error("missing \"" . $attr . "\" attribute", $this->compiler->lex->taglineno); - } - } + $compiler->trigger_template_error("missing \"" . $attr . "\" attribute", $compiler->lex->taglineno); + } + } // check for unallowed attributes if ($this->optional_attributes != array('_any')) { $tmp_array = array_merge($this->required_attributes, $this->optional_attributes, $this->option_flags); foreach ($_indexed_attr as $key => $dummy) { if (!in_array($key, $tmp_array) && $key !== 0) { - $this->compiler->trigger_template_error("unexpected \"" . $key . "\" attribute", $this->compiler->lex->taglineno); - } - } - } + $compiler->trigger_template_error("unexpected \"" . $key . "\" attribute", $compiler->lex->taglineno); + } + } + } // default 'false' for all option flags not set foreach ($this->option_flags as $flag) { if (!isset($_indexed_attr[$flag])) { $_indexed_attr[$flag] = false; - } - } + } + } return $_indexed_attr; - } + } /** * Push opening tag name on stack - * + * * Optionally additional data can be saved on stack - * - * @param string $open_tag the opening tag's name - * @param anytype $data optional data which shall be saved on stack + * + * @param object $compiler compiler object + * @param string $openTag the opening tag's name + * @param mixed $data optional data saved */ - function _open_tag($open_tag, $data = null) + public function openTag($compiler, $openTag, $data = null) { - array_push($this->compiler->_tag_stack, array($open_tag, $data)); - } + array_push($compiler->_tag_stack, array($openTag, $data)); + } /** * Pop closing tag - * + * * Raise an error if this stack-top doesn't match with expected opening tags - * - * @param array $ |string $expected_tag the expected opening tag names - * @return anytype the opening tag's name or saved data + * + * @param object $compiler compiler object + * @param array|string $expectedTag the expected opening tag names + * @return mixed any type the opening tag's name or saved data */ - function _close_tag($expected_tag) + public function closeTag($compiler, $expectedTag) { - if (count($this->compiler->_tag_stack) > 0) { + if (count($compiler->_tag_stack) > 0) { // get stacked info - list($_open_tag, $_data) = array_pop($this->compiler->_tag_stack); + list($_openTag, $_data) = array_pop($compiler->_tag_stack); // open tag must match with the expected ones - if (in_array($_open_tag, (array)$expected_tag)) { + if (in_array($_openTag, (array) $expectedTag)) { if (is_null($_data)) { // return opening tag - return $_open_tag; + return $_openTag; } else { // return restored data return $_data; - } - } + } + } // wrong nesting of tags - $this->compiler->trigger_template_error("unclosed {" . $_open_tag . "} tag"); + $compiler->trigger_template_error("unclosed {" . $_openTag . "} tag"); return; - } + } // wrong nesting of tags - $this->compiler->trigger_template_error("unexpected closing tag", $this->compiler->lex->taglineno); + $compiler->trigger_template_error("unexpected closing tag", $compiler->lex->taglineno); return; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_config.php b/libs/sysplugins/smarty_internal_config.php index 53555123..3a38e212 100644 --- a/libs/sysplugins/smarty_internal_config.php +++ b/libs/sysplugins/smarty_internal_config.php @@ -1,193 +1,159 @@ <?php /** * Smarty Internal Plugin Config - * + * + * @package Smarty + * @subpackage Config + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Config + * * Main class for config variables - * - * @ignore + * * @package Smarty * @subpackage Config - * @author Uwe Tews + * + * @property Smarty_Config_Source $source + * @property Smarty_Config_Compiled $compiled + * @ignore */ class Smarty_Internal_Config { - static $config_objects = array(); - - public function __construct($config_resource, $smarty, $data = null) - { - $this->data = $data; - $this->smarty = $smarty; - $this->config_resource = $config_resource; - $this->config_resource_type = null; - $this->config_resource_name = null; - $this->config_filepath = null; - $this->config_timestamp = null; - $this->config_source = null; - $this->compiled_config = null; - $this->compiled_filepath = null; - $this->compiled_timestamp = null; - $this->mustCompile = null; - $this->compiler_object = null; - // parse config resource name - if (!$this->parseConfigResourceName ($config_resource)) { - throw new SmartyException ("Unable to parse config resource '{$config_resource}'"); - } - } - - public function getConfigFilepath () - { - return $this->config_filepath === null ? - $this->config_filepath = $this->buildConfigFilepath() : - $this->config_filepath; - } - - public function getTimestamp () - { - return $this->config_timestamp === null ? - $this->config_timestamp = filemtime($this->getConfigFilepath()) : - $this->config_timestamp; - } - - private function parseConfigResourceName($config_resource) - { - if (empty($config_resource)) - return false; - if (strpos($config_resource, ':') === false) { - // no resource given, use default - $this->config_resource_type = $this->smarty->default_config_type; - $this->config_resource_name = $config_resource; - } else { - // get type and name from path - list($this->config_resource_type, $this->config_resource_name) = explode(':', $config_resource, 2); - if (strlen($this->config_resource_type) == 1) { - // 1 char is not resource type, but part of filepath - $this->config_resource_type = $this->smarty->default_config_type; - $this->config_resource_name = $config_resource; - } else { - $this->config_resource_type = strtolower($this->config_resource_type); - } - } - return true; - } - /* - * get system filepath to config + /** + * Samrty instance + * + * @var Smarty object */ - public function buildConfigFilepath () - { - foreach((array)$this->smarty->config_dir as $_config_dir) { - if (strpos('/\\', substr($_config_dir, -1)) === false) { - $_config_dir .= DS; - } - - $_filepath = $_config_dir . $this->config_resource_name; - if (file_exists($_filepath)) - return $_filepath; - } - // check for absolute path - if (file_exists($this->config_resource_name)) - return $this->config_resource_name; - // no tpl file found - throw new SmartyException("Unable to load config file \"{$this->config_resource_name}\""); - return false; - } + 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; /** - * Read config file source - * - * @return string content of source file + * flag if compiled config file is invalid and must be (re)compiled + * @var bool */ + public $mustCompile = null; /** - * Returns the template source code - * - * The template source is being read by the actual resource handler - * - * @return string the template source + * Config file compiler object + * + * @var Smarty_Internal_Config_File_Compiler object */ - public function getConfigSource () + 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) { - if ($this->config_source === null) { - if ($this->readConfigSource($this) === false) { - throw new SmartyException("Unable to load config file \"{$this->config_resource_name}\""); - } - } - return $this->config_source; - } - public function readConfigSource() - { - // read source file - if (file_exists($this->getConfigFilepath())) { - $this->config_source = file_get_contents($this->getConfigFilepath()); - return true; - } else { - return false; - } - } + $this->data = $data; + $this->smarty = $smarty; + $this->config_resource = $config_resource; + } /** * Returns the compiled filepath - * + * * @return string the compiled filepath */ - public function getCompiledFilepath () + public function getCompiledFilepath() { return $this->compiled_filepath === null ? - ($this->compiled_filepath = $this->buildCompiledFilepath()) : - $this->compiled_filepath; - } + ($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($this->config_resource_name . $_flag); + $_flag = (int) $this->smarty->config_read_hidden + (int) $this->smarty->config_booleanize * 2 + + (int) $this->smarty->config_overwrite * 4; + $_filepath = sha1($this->source->name . $_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; - } + . 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->compile_dir; - if (substr($_compile_dir, -1) != DS) { - $_compile_dir .= DS; - } - return $_compile_dir . $_filepath . '.' . basename($this->config_resource_name) . '.config' . '.php'; - } + } + $_compile_dir = $this->smarty->getCompileDir(); + return $_compile_dir . $_filepath . '.' . basename($this->source->name) . '.config' . '.php'; + } + /** * Returns the timpestamp of the compiled file - * + * * @return integer the file timestamp */ - public function getCompiledTimestamp () + public function getCompiledTimestamp() { - return $this->compiled_timestamp === null ? - ($this->compiled_timestamp = (file_exists($this->getCompiledFilepath())) ? filemtime($this->getCompiledFilepath()) : false) : - $this->compiled_timestamp; - } + 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 - * + * 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 () + public function mustCompile() { return $this->mustCompile === null ? - $this->mustCompile = ($this->smarty->force_compile || $this->getCompiledTimestamp () === false || $this->smarty->compile_check && $this->getCompiledTimestamp () < $this->getTimestamp ()): - $this->mustCompile; - } + $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 - * + * 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 () + public function getCompiledConfig() { if ($this->compiled_config === null) { // see if template needs compiling. @@ -195,96 +161,142 @@ class Smarty_Internal_Config { $this->compileConfigSource(); } else { $this->compiled_config = file_get_contents($this->getCompiledFilepath()); - } - } + } + } return $this->compiled_config; - } + } /** * Compiles the config files + * + * @throws Exception */ - public function compileConfigSource () - { + 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) { + } 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 succeded // 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 object $scope global,parent or local - */ - public function loadConfigVars ($sections = null, $scope = 'local') + * + * @param mixed $sections array of section names, single section or null + * @param object $scope global,parent or local + */ + public function loadConfigVars($sections = null, $scope = 'local') { if ($this->data instanceof Smarty_Internal_Template) { - $this->data->properties['file_dependency'][sha1($this->getConfigFilepath())] = array($this->getConfigFilepath(), $this->getTimestamp(),'file'); - } + $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; + $scope_ptr = $this->data; } elseif ($scope == 'parent') { - if (isset($this->data->parent)) { - $scope_ptr = $this->data->parent; - } else { - $scope_ptr = $this->data; - } + 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; - } + $scope_ptr = $this->data; + while (isset($scope_ptr->parent)) { + $scope_ptr = $scope_ptr->parent; + } } $_config_vars = array(); - include($this->getCompiledFilepath ()); + 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); - } - } + $scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value); + } + } // scan sections - if(!empty($sections)) { - foreach ($_config_vars['sections'] as $this_section => $dummy) { - if (in_array($this_section, (array)$sections)) { - 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); - } - } - } - } + if (!empty($sections)) { + foreach ($_config_vars['sections'] as $this_section => $dummy) { + if (in_array($this_section, (array) $sections)) { + 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 + * @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."); + } + +} + ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_config_file_compiler.php b/libs/sysplugins/smarty_internal_config_file_compiler.php index e9dfbdb0..b16a6940 100644 --- a/libs/sysplugins/smarty_internal_config_file_compiler.php +++ b/libs/sysplugins/smarty_internal_config_file_compiler.php @@ -1,86 +1,123 @@ <?php - /** * Smarty Internal Plugin Config File Compiler - * + * * This is the config file compiler class. It calls the lexer and parser to * perform the compiling. - * + * * @package Smarty * @subpackage Config - * @author Uwe Tews + * @author Uwe Tews */ - + /** * Main config file compiler class + * + * @package Smarty + * @subpackage Config */ class Smarty_Internal_Config_File_Compiler { + + /** + * Lexer object + * + * @var object + */ + public $lex; + + /** + * Parser object + * + * @var object + */ + public $parser; + + /** + * Smarty object + * + * @var Smarty object + */ + public $smarty; + + /** + * Smarty object + * + * @var Smarty_Internal_Config object + */ + public $config; + + /** + * Compiled config data sections and variables + * + * @var array + */ + public $config_data = array(); + /** * Initialize compiler + * + * @param Smarty $smarty base instance */ public function __construct($smarty) { - $this->smarty = $smarty; - // get required plugins - $this->smarty->loadPlugin('Smarty_Internal_Configfilelexer'); - $this->smarty->loadPlugin('Smarty_Internal_Configfileparser'); + $this->smarty = $smarty; $this->config_data['sections'] = array(); $this->config_data['vars'] = array(); - } + } /** - * Methode to compile a Smarty template - * - * @param $template template object to compile + * Method to compile a Smarty template. + * + * @param Smarty_Internal_Config $config config object * @return bool true if compiling succeeded, false if it failed */ - public function compileSource($config) + public function compileSource(Smarty_Internal_Config $config) { /* 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; + tags in the templates are replaces with PHP code, + then written to compiled files. */ + $this->config = $config; // get config file source - $_content = $config->getConfigSource() . "\n"; + $_content = $config->source->content . "\n"; // on empty template just return if ($_content == '') { return true; - } + } // init the lexer/parser to compile the config file $lex = new Smarty_Internal_Configfilelexer($_content, $this->smarty); $parser = new Smarty_Internal_Configfileparser($lex, $this); - if (isset($this->smarty->_parserdebug)) $parser->PrintTrace(); + if ($this->smarty->_parserdebug) $parser->PrintTrace(); // get tokens from lexer and parse them while ($lex->yylex()) { - if (isset($this->smarty->_parserdebug)) echo "<br>Parsing {$parser->yyTokenName[$lex->token]} Token {$lex->value} Line {$lex->line} \n"; + if ($this->smarty->_parserdebug) echo "<br>Parsing {$parser->yyTokenName[$lex->token]} Token {$lex->value} Line {$lex->line} \n"; $parser->doParse($lex->token, $lex->value); - } + } // finish parsing process $parser->doParse(0, 0); $config->compiled_config = '<?php $_config_vars = ' . var_export($this->config_data, true) . '; ?>'; - } + } + /** * display compiler error messages without dying - * + * * If parameter $args is empty it is a parser detected syntax error. * In this case the parser is called to obtain information about exspected tokens. - * + * * If parameter $args contains a string this is used as error message - * - * @todo output exact position of parse error in source line - * @param $args string individual error message or null + * + * @param string $args individual error message or null */ public function trigger_config_file_error($args = null) { $this->lex = Smarty_Internal_Configfilelexer::instance(); - $this->parser = Smarty_Internal_Configfileparser::instance(); + $this->parser = Smarty_Internal_Configfileparser::instance(); // get template 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->getConfigFilepath()}' on line {$line} '{$match[$line-1]}' "; + $error_text = "Syntax error in config file '{$this->config->source->filepath}' on line {$line} '{$match[$line-1]}' "; if (isset($args)) { // individual error message $error_text .= $args; @@ -94,13 +131,14 @@ class Smarty_Internal_Config_File_Compiler { } else { // otherwise internal token name $expect[] = $this->parser->yyTokenName[$token]; - } - } + } + } // output parser error message $error_text .= ' - Unexpected "' . $this->lex->value . '", expected one of: ' . implode(' , ', $expect); - } + } throw new SmartyCompilerException($error_text); - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_configfilelexer.php b/libs/sysplugins/smarty_internal_configfilelexer.php index 86143bcf..9180aecf 100644 --- a/libs/sysplugins/smarty_internal_configfilelexer.php +++ b/libs/sysplugins/smarty_internal_configfilelexer.php @@ -84,15 +84,15 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= strlen($this->data)) { return false; // end of input } - $yy_global_pattern = "/^(#)|^(\\[)|^(\\])|^(=)|^([ \t\r]+)|^(\n)|^([0-9]*[a-zA-Z_]\\w*)/iS"; + $yy_global_pattern = "/\G(#|;)|\G(\\[)|\G(\\])|\G(=)|\G([ \t\r]+)|\G(\n)|\G([0-9]*[a-zA-Z_]\\w*)/iS"; do { - if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) { + if (preg_match($yy_global_pattern,$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, + ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state START'); } next($yymatches); // skip global match @@ -191,15 +191,15 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= strlen($this->data)) { return false; // end of input } - $yy_global_pattern = "/^([ \t\r]+)|^(\\d+\\.\\d+(?=[ \t\r]*[\n#]))|^(\\d+(?=[ \t\r]*[\n#]))|^('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#]))|^(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#]))|^(\"\"\"([^\"]|\\\\\"|\"{1,2}[^\"])*\"\"\"(?=[ \t\r]*[\n#]))|^([a-zA-Z]+(?=[ \t\r]*[\n#]))|^([^\n]+?(?=[ \t\r]*\n))|^(\n)/iS"; + $yy_global_pattern = "/\G([ \t\r]+)|\G(\\d+\\.\\d+(?=[ \t\r]*[\n#;]))|\G(\\d+(?=[ \t\r]*[\n#;]))|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#;]))|\G(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#;]))|\G(\"\"\"([^\"]|\\\\\"|\"{1,2}[^\"])*\"\"\"(?=[ \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, substr($this->data, $this->counter), $yymatches)) { + if (preg_match($yy_global_pattern,$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, + ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state VALUE'); } next($yymatches); // skip global match @@ -312,15 +312,15 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= strlen($this->data)) { return false; // end of input } - $yy_global_pattern = "/^([^\n]+?(?=[ \t\r]*\n))/iS"; + $yy_global_pattern = "/\G([^\n]+?(?=[ \t\r]*\n))/iS"; do { - if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) { + if (preg_match($yy_global_pattern,$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, + ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state NAKED_STRING_VALUE'); } next($yymatches); // skip global match @@ -381,15 +381,15 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= strlen($this->data)) { return false; // end of input } - $yy_global_pattern = "/^([ \t\r]+)|^([^\n]+?(?=[ \t\r]*\n))|^(\n)/iS"; + $yy_global_pattern = "/\G([ \t\r]+)|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/iS"; do { - if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) { + if (preg_match($yy_global_pattern,$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, + ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state COMMENT'); } next($yymatches); // skip global match @@ -459,15 +459,15 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= strlen($this->data)) { return false; // end of input } - $yy_global_pattern = "/^(\\.)|^(.*?(?=[\.=[\]\r\n]))/iS"; + $yy_global_pattern = "/\G(\\.)|\G(.*?(?=[\.=[\]\r\n]))/iS"; do { - if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) { + if (preg_match($yy_global_pattern,$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, + ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state SECTION'); } next($yymatches); // skip global match diff --git a/libs/sysplugins/smarty_internal_configfileparser.php b/libs/sysplugins/smarty_internal_configfileparser.php index 0b5a5734..8824603c 100644 --- a/libs/sysplugins/smarty_internal_configfileparser.php +++ b/libs/sysplugins/smarty_internal_configfileparser.php @@ -96,9 +96,9 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser function __construct($lex, $compiler) { // set instance object - self::instance($this); + self::instance($this); $this->lex = $lex; - $this->smarty = $compiler->smarty; + $this->smarty = $compiler->smarty; $this->compiler = $compiler; } public static function &instance($new_instance = null) @@ -163,7 +163,7 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser private function add_global_vars(Array $vars) { if (!isset($this->compiler->config_data['vars'])) { - $this->compiler->config_data['vars'] = Array(); + $this->compiler->config_data['vars'] = Array(); } foreach ($vars as $var) { $this->set_var($var, $this->compiler->config_data); @@ -296,14 +296,14 @@ static public $yy_action = array( 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', + public $yyTokenName = array( + '$', 'OPENB', 'SECTION', 'CLOSEB', + 'DOT', 'ID', 'EQUAL', 'FLOAT', 'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING', 'TRIPPLE_DOUBLE_QUOTED_STRING', 'NAKED_STRING', 'NEWLINE', 'COMMENTSTART', - 'error', 'start', 'global_vars', 'sections', - 'var_list', 'section', 'newline', 'var', - 'value', + 'error', 'start', 'global_vars', 'sections', + 'var_list', 'section', 'newline', 'var', + 'value', ); static public $yyRuleName = array( @@ -517,7 +517,7 @@ static public $yy_action = array( function yy_find_shift_action($iLookAhead) { $stateno = $this->yystack[$this->yyidx]->stateno; - + /* if ($this->yyidx < 0) return self::YY_NO_ACTION; */ if (!isset(self::$yy_shift_ofst[$stateno])) { // no shift actions @@ -652,57 +652,91 @@ static public $yy_action = array( 16 => 16, ); #line 132 "smarty_internal_configfileparser.y" - function yy_r0(){ $this->_retvalue = null; } -#line 652 "smarty_internal_configfileparser.php" -#line 135 "smarty_internal_configfileparser.y" - function yy_r1(){ $this->add_global_vars($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = null; } -#line 655 "smarty_internal_configfileparser.php" -#line 141 "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 658 "smarty_internal_configfileparser.php" -#line 142 "smarty_internal_configfileparser.y" - function yy_r5(){ if ($this->smarty->config_read_hidden) { $this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor); } $this->_retvalue = null; } -#line 661 "smarty_internal_configfileparser.php" -#line 145 "smarty_internal_configfileparser.y" - function yy_r6(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; } -#line 664 "smarty_internal_configfileparser.php" -#line 146 "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 667 "smarty_internal_configfileparser.php" -#line 147 "smarty_internal_configfileparser.y" - function yy_r8(){ $this->_retvalue = Array(); } -#line 670 "smarty_internal_configfileparser.php" -#line 151 "smarty_internal_configfileparser.y" - function yy_r9(){ $this->_retvalue = Array("key" => $this->yystack[$this->yyidx + -2]->minor, "value" => $this->yystack[$this->yyidx + 0]->minor); } -#line 673 "smarty_internal_configfileparser.php" -#line 153 "smarty_internal_configfileparser.y" - function yy_r10(){ $this->_retvalue = (float) $this->yystack[$this->yyidx + 0]->minor; } -#line 676 "smarty_internal_configfileparser.php" -#line 154 "smarty_internal_configfileparser.y" - function yy_r11(){ $this->_retvalue = (int) $this->yystack[$this->yyidx + 0]->minor; } -#line 679 "smarty_internal_configfileparser.php" + function yy_r0(){ + $this->_retvalue = null; + } +#line 654 "smarty_internal_configfileparser.php" +#line 137 "smarty_internal_configfileparser.y" + function yy_r1(){ + $this->add_global_vars($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = null; + } +#line 659 "smarty_internal_configfileparser.php" +#line 150 "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 665 "smarty_internal_configfileparser.php" #line 155 "smarty_internal_configfileparser.y" - function yy_r12(){ $this->_retvalue = $this->parse_bool($this->yystack[$this->yyidx + 0]->minor); } -#line 682 "smarty_internal_configfileparser.php" -#line 156 "smarty_internal_configfileparser.y" - function yy_r13(){ $this->_retvalue = self::parse_single_quoted_string($this->yystack[$this->yyidx + 0]->minor); } -#line 685 "smarty_internal_configfileparser.php" -#line 157 "smarty_internal_configfileparser.y" - function yy_r14(){ $this->_retvalue = self::parse_double_quoted_string($this->yystack[$this->yyidx + 0]->minor); } + function yy_r5(){ + if ($this->smarty->config_read_hidden) { + $this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor); + } + $this->_retvalue = null; + } +#line 673 "smarty_internal_configfileparser.php" +#line 163 "smarty_internal_configfileparser.y" + function yy_r6(){ + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; + } +#line 678 "smarty_internal_configfileparser.php" +#line 167 "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 683 "smarty_internal_configfileparser.php" +#line 171 "smarty_internal_configfileparser.y" + function yy_r8(){ + $this->_retvalue = Array(); + } #line 688 "smarty_internal_configfileparser.php" -#line 158 "smarty_internal_configfileparser.y" - function yy_r15(){ $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[$this->yyidx + 0]->minor); } -#line 691 "smarty_internal_configfileparser.php" -#line 159 "smarty_internal_configfileparser.y" - function yy_r16(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 694 "smarty_internal_configfileparser.php" +#line 177 "smarty_internal_configfileparser.y" + function yy_r9(){ + $this->_retvalue = Array("key" => $this->yystack[$this->yyidx + -2]->minor, "value" => $this->yystack[$this->yyidx + 0]->minor); + } +#line 693 "smarty_internal_configfileparser.php" +#line 182 "smarty_internal_configfileparser.y" + function yy_r10(){ + $this->_retvalue = (float) $this->yystack[$this->yyidx + 0]->minor; + } +#line 698 "smarty_internal_configfileparser.php" +#line 186 "smarty_internal_configfileparser.y" + function yy_r11(){ + $this->_retvalue = (int) $this->yystack[$this->yyidx + 0]->minor; + } +#line 703 "smarty_internal_configfileparser.php" +#line 190 "smarty_internal_configfileparser.y" + function yy_r12(){ + $this->_retvalue = $this->parse_bool($this->yystack[$this->yyidx + 0]->minor); + } +#line 708 "smarty_internal_configfileparser.php" +#line 194 "smarty_internal_configfileparser.y" + function yy_r13(){ + $this->_retvalue = self::parse_single_quoted_string($this->yystack[$this->yyidx + 0]->minor); + } +#line 713 "smarty_internal_configfileparser.php" +#line 198 "smarty_internal_configfileparser.y" + function yy_r14(){ + $this->_retvalue = self::parse_double_quoted_string($this->yystack[$this->yyidx + 0]->minor); + } +#line 718 "smarty_internal_configfileparser.php" +#line 202 "smarty_internal_configfileparser.y" + function yy_r15(){ + $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[$this->yyidx + 0]->minor); + } +#line 723 "smarty_internal_configfileparser.php" +#line 206 "smarty_internal_configfileparser.y" + function yy_r16(){ + $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; + } +#line 728 "smarty_internal_configfileparser.php" private $_retvalue; function yy_reduce($yyruleno) { $yymsp = $this->yystack[$this->yyidx]; - if (self::$yyTraceFILE && $yyruleno >= 0 + if (self::$yyTraceFILE && $yyruleno >= 0 && $yyruleno < count(self::$yyRuleName)) { fprintf(self::$yyTraceFILE, "%sReduce (%d) [%s].\n", self::$yyTracePrompt, $yyruleno, @@ -757,7 +791,7 @@ static public $yy_action = array( $this->internalError = true; $this->yymajor = $yymajor; $this->compiler->trigger_config_file_error(); -#line 757 "smarty_internal_configfileparser.php" +#line 791 "smarty_internal_configfileparser.php" } function yy_accept() @@ -774,13 +808,13 @@ static public $yy_action = array( $this->internalError = false; $this->retvalue = $this->_retvalue; //echo $this->retvalue."\n\n"; -#line 775 "smarty_internal_configfileparser.php" +#line 809 "smarty_internal_configfileparser.php" } function doParse($yymajor, $yytokenvalue) { $yyerrorhit = 0; /* True if yymajor has invoked an error */ - + if ($this->yyidx === null || $this->yyidx < 0) { $this->yyidx = 0; $this->yyerrcnt = -1; @@ -791,12 +825,12 @@ static public $yy_action = array( array_push($this->yystack, $x); } $yyendofinput = ($yymajor==0); - + if (self::$yyTraceFILE) { fprintf(self::$yyTraceFILE, "%sInput %s\n", self::$yyTracePrompt, $this->yyTokenName[$yymajor]); } - + do { $yyact = $this->yy_find_shift_action($yymajor); if ($yymajor < self::YYERRORSYMBOL && @@ -863,7 +897,7 @@ static public $yy_action = array( } else { $this->yy_accept(); $yymajor = self::YYNOCODE; - } + } } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0); } } diff --git a/libs/sysplugins/smarty_internal_data.php b/libs/sysplugins/smarty_internal_data.php index 16726269..09791152 100644 --- a/libs/sysplugins/smarty_internal_data.php +++ b/libs/sysplugins/smarty_internal_data.php @@ -1,28 +1,53 @@ <?php - /** * Smarty Internal Plugin Data * * This file contains the basic classes and methodes for template and variable creation * * @package Smarty - * @subpackage Templates + * @subpackage Template * @author Uwe Tews */ /** * Base class with template and variable methodes + * + * @package Smarty + * @subpackage Template */ class Smarty_Internal_Data { - // class used for templates + + /** + * name of class used for templates + * + * @var string + */ public $template_class = 'Smarty_Internal_Template'; + /** + * template variables + * + * @var array + */ + public $tpl_vars = array(); + /** + * parent template (if any) + * + * @var Smarty_Internal_Template + */ + public $parent = null; + /** + * configuration settings + * + * @var array + */ + public $config_vars = array(); /** * assigns a Smarty variable * - * @param array $ |string $tpl_var the template variable name(s) - * @param mixed $value the value to assign - * @param boolean $nocache if true any output of this variable will be not cached + * @param array|string $tpl_var the template variable name(s) + * @param mixed $value the value to assign + * @param boolean $nocache if true any output of this variable will be not cached * @param boolean $scope the scope the variable will have (local,parent or root) */ public function assign($tpl_var, $value = null, $nocache = false) @@ -30,20 +55,31 @@ 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); + if (isset($this->tpl_vars[$_key])) { + $this->tpl_vars[$_key]->value = $_val; + $this->tpl_vars[$_key]->nocache = $nocache; + } else { + $this->tpl_vars[$_key] = new Smarty_variable($_val, $nocache); + } } } } else { if ($tpl_var != '') { - $this->tpl_vars[$tpl_var] = new Smarty_variable($value, $nocache); + if (isset($this->tpl_vars[$tpl_var])) { + $this->tpl_vars[$tpl_var]->value = $value; + $this->tpl_vars[$tpl_var]->nocache = $nocache; + } else { + $this->tpl_vars[$tpl_var] = new Smarty_variable($value, $nocache); + } } } } + /** * assigns a global Smarty variable * * @param string $varname the global variable name - * @param mixed $value the value to assign + * @param mixed $value the value to assign * @param boolean $nocache if true any output of this variable will be not cached */ public function assignGlobal($varname, $value = null, $nocache = false) @@ -68,23 +104,11 @@ class Smarty_Internal_Data { } /** - * wrapper function for Smarty 2 BC - * - * @param string $tpl_var the template variable name - * @param mixed $ &$value the referenced value to assign - */ - public function assign_by_ref($tpl_var, &$value) - { - if($this->smarty->deprecation_notices) - trigger_error("function call 'assign_by_ref' is unknown or deprecated, use 'assignByRef'", E_USER_NOTICE); - $this->assignByRef($tpl_var, $value); - } - /** * appends values to template variables * - * @param array $ |string $tpl_var the template variable name(s) - * @param mixed $value the value to append - * @param boolean $merge flag if array elements shall be merged + * @param array|string $tpl_var the template variable name(s) + * @param mixed $value the value to append + * @param boolean $merge flag if array elements shall be merged * @param boolean $nocache if true any output of this variable will be not cached */ public function append($tpl_var, $value = null, $merge = false, $nocache = false) @@ -141,8 +165,8 @@ class Smarty_Internal_Data { * appends values to template variables by reference * * @param string $tpl_var the template variable name - * @param mixed $ &$value the referenced value to append - * @param boolean $merge flag if array elements shall be merged + * @param mixed &$value the referenced value to append + * @param boolean $merge flag if array elements shall be merged */ public function appendByRef($tpl_var, &$value, $merge = false) { @@ -163,25 +187,15 @@ class Smarty_Internal_Data { } } - /** - * - * @param string $tpl_var the template variable name - * @param mixed $ &$value the referenced value to append - * @param boolean $merge flag if array elements shall be merged - */ - public function append_by_ref($tpl_var, &$value, $merge = false) - { - if($this->smarty->deprecation_notices) - trigger_error("function call 'append_by_ref' is unknown or deprecated, use 'appendByRef'", E_USER_NOTICE); - $this->appendByRef($tpl_var, $value, $merge); - } /** * Returns a single or all template variables * - * @param string $varname variable name or null + * @param string $varname variable name or null + * @param string $_ptr optional pointer to data object + * @param boolean $search_parents include parent templates? * @return string variable value or or array of variables */ - function getTemplateVars($varname = null, $_ptr = null, $search_parents = true) + public function getTemplateVars($varname = null, $_ptr = null, $search_parents = true) { if (isset($varname)) { $_var = $this->getVariable($varname, $_ptr, $search_parents, false); @@ -221,7 +235,7 @@ class Smarty_Internal_Data { /** * clear the given assigned template variable. * - * @param string $ |array $tpl_var the template variable(s) to clear + * @param string|array $tpl_var the template variable(s) to clear */ public function clearAssign($tpl_var) { @@ -246,7 +260,7 @@ class Smarty_Internal_Data { * load a config file, optionally load just selected sections * * @param string $config_file filename - * @param mixed $sections array of section names, single section or null + * @param mixed $sections array of section names, single section or null */ public function configLoad($config_file, $sections = null) { @@ -258,19 +272,19 @@ class Smarty_Internal_Data { /** * gets the object of a Smarty variable * - * @param string $variable the name of the Smarty variable - * @param object $_ptr optional pointer to data object + * @param string $variable the name of the Smarty variable + * @param object $_ptr optional pointer to data object * @param boolean $search_parents search also in parent data * @return object the object of the variable */ - public function getVariable($_variable, $_ptr = null, $search_parents = true, $error_enable = true) + public function getVariable($variable, $_ptr = null, $search_parents = true, $error_enable = true) { if ($_ptr === null) { $_ptr = $this; } while ($_ptr !== null) { - if (isset($_ptr->tpl_vars[$_variable])) { + if (isset($_ptr->tpl_vars[$variable])) { // found it, return it - return $_ptr->tpl_vars[$_variable]; + return $_ptr->tpl_vars[$variable]; } // not found, try at parent if ($search_parents) { @@ -279,44 +293,39 @@ class Smarty_Internal_Data { $_ptr = null; } } - if (isset(Smarty::$global_tpl_vars[$_variable])) { + if (isset(Smarty::$global_tpl_vars[$variable])) { // found it, return it - return Smarty::$global_tpl_vars[$_variable]; + return Smarty::$global_tpl_vars[$variable]; } if ($this->smarty->error_unassigned && $error_enable) { - throw new SmartyException('Undefined Smarty variable "' . $_variable . '"'); - } else { - if ($error_enable) { - // force a notice - $x = $$_variable; - } - return new Undefined_Smarty_Variable; + // force a notice + $x = $$variable; } + return new Undefined_Smarty_Variable; } + /** * gets a config variable * * @param string $variable the name of the config variable * @return mixed the value of the config variable */ - public function getConfigVariable($_variable) + public function getConfigVariable($variable, $error_enable = true) { $_ptr = $this; while ($_ptr !== null) { - if (isset($_ptr->config_vars[$_variable])) { + if (isset($_ptr->config_vars[$variable])) { // found it, return it - return $_ptr->config_vars[$_variable]; + return $_ptr->config_vars[$variable]; } // not found, try at parent $_ptr = $_ptr->parent; } - if ($this->smarty->error_unassigned) { - throw new SmartyException('Undefined config variable "' . $_variable . '"'); - } else { - // force a notice - $x = $$_variable; - return null; + if ($this->smarty->error_unassigned && $error_enable) { + // force a notice + $x = $$variable; } + return null; } /** @@ -328,7 +337,8 @@ class Smarty_Internal_Data { public function getStreamVariable($variable) { $_result = ''; - if ($fp = fopen($variable, 'r+')) { + $fp = fopen($variable, 'r+'); + if ($fp) { while (!feof($fp) && ($current_line = fgets($fp)) !== false ) { $_result .= $current_line; } @@ -349,28 +359,27 @@ class Smarty_Internal_Data { * @param string $varname variable name or null * @return string variable value or or array of variables */ - function getConfigVars($varname = null, $search_parents = true) + public function getConfigVars($varname = null, $search_parents = true) { - // var_dump($this); $_ptr = $this; $var_array = array(); while ($_ptr !== null) { - if (isset($varname)) { - if (isset($_ptr->config_vars[$varname])) { - return $_ptr->config_vars[$varname]; + if (isset($varname)) { + if (isset($_ptr->config_vars[$varname])) { + return $_ptr->config_vars[$varname]; } } else { - $var_array = array_merge($_ptr->config_vars, $var_array); - } + $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 ''; + return ''; } else { return $var_array; } @@ -381,14 +390,12 @@ class Smarty_Internal_Data { * * @param string $varname variable name or null */ - function clearConfig($varname = null) + public function clearConfig($varname = null) { if (isset($varname)) { unset($this->config_vars[$varname]); - return; } else { $this->config_vars = array(); - return; } } @@ -399,19 +406,23 @@ class Smarty_Internal_Data { * * The Smarty data object will hold Smarty variables in the current scope * - * @param object $parent tpl_vars next higher level of Smarty variables + * @package Smarty + * @subpackage Template */ class Smarty_Data extends Smarty_Internal_Data { - // array of variable objects - public $tpl_vars = array(); - // back pointer to parent object - public $parent = null; - // config vars - public $config_vars = array(); - // Smarty object + + /** + * Smarty object + * + * @var Smarty + */ public $smarty = null; + /** * create Smarty data object + * + * @param Smarty|array $_parent parent template + * @param Smarty $smarty global smarty instance */ public function __construct ($_parent = null, $smarty = null) { @@ -428,45 +439,81 @@ class Smarty_Data extends Smarty_Internal_Data { 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 - public $value; - public $nocache; - public $scope; + + /** + * 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 mixed $value the value to assign * @param boolean $nocache if true any output of this variable will be not cached - * @param boolean $scope the scope the variable will have (local,parent or root) + * @param int $scope the scope the variable will have (local,parent or root) */ - public function __construct ($value = null, $nocache = false, $scope = Smarty::SCOPE_LOCAL) + public function __construct($value = null, $nocache = false, $scope = Smarty::SCOPE_LOCAL) { $this->value = $value; $this->nocache = $nocache; $this->scope = $scope; } - public function __toString () + /** + * <<magic>> String conversion + * + * @return string + */ + public function __toString() { - return $this->value; + return (string) $this->value; } + } /** * class for undefined variable object * * This class defines an object for undefined variable handling + * + * @package Smarty + * @subpackage Template */ class Undefined_Smarty_Variable { - // return always false - public function __get ($name) + + /** + * Returns FALSE for 'nocache' and NULL otherwise. + * + * @param string $name + * @return bool + */ + public function __get($name) { if ($name == 'nocache') { return false; @@ -474,6 +521,17 @@ class Undefined_Smarty_Variable { return null; } } + + /** + * Always returns an empty string. + * + * @return string + */ + public function __toString() + { + return ""; + } + } ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_debug.php b/libs/sysplugins/smarty_internal_debug.php index e605ca8b..83d9fef2 100644 --- a/libs/sysplugins/smarty_internal_debug.php +++ b/libs/sysplugins/smarty_internal_debug.php @@ -1,169 +1,205 @@ <?php - /** -* Smarty Internal Plugin Debug -* -* Class to collect data for the Smarty Debugging Consol -* -* @package Smarty -* @subpackage Debug -* @author Uwe Tews -*/ + * Smarty Internal Plugin Debug + * + * Class to collect data for the Smarty Debugging Consol + * + * @package Smarty + * @subpackage Debug + * @author Uwe Tews + */ /** -* Smarty Internal Plugin Debug Class -*/ + * Smarty Internal Plugin Debug Class + * + * @package Smarty + * @subpackage Debug + */ class Smarty_Internal_Debug extends Smarty_Internal_Data { - // template data - static $template_data = array(); - /** - * Start logging of compile time - */ - public static function start_compile($template) - { - $key = self::get_key($template); - self::$template_data[$key]['start_time'] = microtime(true); - } + /** + * template data + * + * @var array + */ + public static $template_data = array(); + + /** + * Start logging of compile time + * + * @param object $template + */ + public static function start_compile($template) + { + $key = self::get_key($template); + self::$template_data[$key]['start_time'] = microtime(true); + } + + /** + * End logging of compile time + * + * @param object $template + */ + public static function end_compile($template) + { + $key = self::get_key($template); + self::$template_data[$key]['compile_time'] += microtime(true) - self::$template_data[$key]['start_time']; + } + + /** + * Start logging of render time + * + * @param object $template + */ + public static function start_render($template) + { + $key = self::get_key($template); + self::$template_data[$key]['start_time'] = microtime(true); + } + + /** + * End logging of compile time + * + * @param object $template + */ + public static function end_render($template) + { + $key = self::get_key($template); + self::$template_data[$key]['render_time'] += microtime(true) - self::$template_data[$key]['start_time']; + } - /** - * End logging of compile time - */ - public static function end_compile($template) - { - $key = self::get_key($template); - self::$template_data[$key]['compile_time'] += microtime(true) - self::$template_data[$key]['start_time']; - } + /** + * Start logging of cache time + * + * @param object $template cached template + */ + public static function start_cache($template) + { + $key = self::get_key($template); + self::$template_data[$key]['start_time'] = microtime(true); + } - /** - * Start logging of render time - */ - public static function start_render($template) - { - $key = self::get_key($template); - self::$template_data[$key]['start_time'] = microtime(true); - } + /** + * End logging of cache time + * + * @param object $template cached template + */ + public static function end_cache($template) + { + $key = self::get_key($template); + self::$template_data[$key]['cache_time'] += microtime(true) - self::$template_data[$key]['start_time']; + } - /** - * End logging of compile time - */ - public static function end_render($template) - { - $key = self::get_key($template); - self::$template_data[$key]['render_time'] += microtime(true) - self::$template_data[$key]['start_time']; - } + /** + * Opens a window for the Smarty Debugging Consol and display the data + * + * @param Smarty_Internal_Template|Smarty $obj object to debug + */ + public static function display_debug($obj) + { + // prepare information of assigned variables + $ptr = self::get_debug_vars($obj); + if ($obj instanceof Smarty) { + $smarty = clone $obj; + } else { + $smarty = clone $obj->smarty; + } + $_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->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; + 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); + } 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); + echo $_template->fetch(); + } - /** - * Start logging of cache time - */ - public static function start_cache($template) - { - $key = self::get_key($template); - self::$template_data[$key]['start_time'] = microtime(true); - } + /** + * Recursively gets variables from all template/data scopes + * + * @param Smarty_Internal_Template|Smarty_Data $obj object to debug + * @return StdClass + */ + public static function get_debug_vars($obj) + { + $config_vars = $obj->config_vars; + $tpl_vars = array(); + foreach ($obj->tpl_vars as $key => $var) { + $tpl_vars[$key] = clone $var; + if ($obj instanceof Smarty_Internal_Template) { + $tpl_vars[$key]->scope = $obj->source->type . ':' . $obj->source->name; + } elseif ($obj instanceof Smarty_Data) { + $tpl_vars[$key]->scope = 'Data object'; + } else { + $tpl_vars[$key]->scope = 'Smarty root'; + } + } - /** - * End logging of cache time - */ - public static function end_cache($template) - { - $key = self::get_key($template); - self::$template_data[$key]['cache_time'] += microtime(true) - self::$template_data[$key]['start_time']; - } - /** - * Opens a window for the Smarty Debugging Consol and display the data - */ - public static function display_debug($obj) - { - // prepare information of assigned variables - $ptr = self::get_debug_vars($obj); - if ($obj instanceof Smarty) { - $smarty = clone $obj; - } else { - $smarty = clone $obj->smarty; - } - $_assigned_vars = $ptr->tpl_vars; - ksort($_assigned_vars); - $_config_vars = $ptr->config_vars; - ksort($_config_vars); - $smarty->left_delimiter = '{'; - $smarty->right_delimiter = '}'; - $smarty->registered_filters = array(); - $smarty->autoload_filters = array(); - $smarty->default_modifiers = array(); - $_template = new Smarty_Internal_Template ($smarty->debug_tpl, $smarty); - $_template->caching = false; - $_template->force_compile = false; - $_template->disableSecurity(); - $_template->cache_id = null; - $_template->compile_id = null; - if ($obj instanceof Smarty_Internal_Template) { - $_template->assign('template_name',$obj->resource_type.':'.$obj->resource_name); - } - if ($obj instanceof Smarty) { - $_template->assign('template_data', self::$template_data); - } 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); - echo $_template->getRenderedTemplate(); - } - /* - * Recursively gets variables from all template/data scopes - */ - public static function get_debug_vars($obj) - { - $config_vars = $obj->config_vars; - $tpl_vars = array(); - foreach ($obj->tpl_vars as $key => $var) { - $tpl_vars[$key] = clone $var; - if ($obj instanceof Smarty_Internal_Template) { - $tpl_vars[$key]->scope = $obj->resource_type.':'.$obj->resource_name; - } elseif ($obj instanceof Smarty_Data) { - $tpl_vars[$key]->scope = 'Data object'; - } else { - $tpl_vars[$key]->scope = 'Smarty root'; - } - } + if (isset($obj->parent)) { + $parent = self::get_debug_vars($obj->parent); + $tpl_vars = array_merge($parent->tpl_vars, $tpl_vars); + $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; + } + } + } + return (object) array('tpl_vars' => $tpl_vars, 'config_vars' => $config_vars); + } - if (isset($obj->parent)) { - $parent = self::get_debug_vars($obj->parent); - $tpl_vars = array_merge($parent->tpl_vars, $tpl_vars); - $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; - } - } - } - return (object) array('tpl_vars' => $tpl_vars, 'config_vars' => $config_vars); - } + /** + * Return key into $template_data for template + * + * @param object $template template object + * @return string key into $template_data + */ + private static function get_key($template) + { + // calculate Uid if not already done + if ($template->source->uid == '') { + $template->source->filepath; + } + $key = $template->source->uid; + if (isset(self::$template_data[$key])) { + return $key; + } else { + if (in_array($template->source->type, array('string','eval'))) { + self::$template_data[$key]['name'] = '\''.substr($template->source->name,0,25).'...\''; + } else { + self::$template_data[$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; + return $key; + } + } - /** - * get_key - */ - static function get_key($template) - { - // calculate Uid if not already done - if ($template->templateUid == '') { - $template->getTemplateFilepath(); - } - $key = $template->templateUid; - if (isset(self::$template_data[$key])) { - return $key; - } else { - self::$template_data[$key]['name'] = $template->getTemplateFilepath(); - self::$template_data[$key]['compile_time'] = 0; - self::$template_data[$key]['render_time'] = 0; - self::$template_data[$key]['cache_time'] = 0; - return $key; - } - } } ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_filter.php b/libs/sysplugins/smarty_internal_filter.php deleted file mode 100644 index 90214ad4..00000000 --- a/libs/sysplugins/smarty_internal_filter.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php - -/** - * Smarty Internal Plugin Filter - * - * External Smarty filter methods - * - * @package Smarty - * @author Uwe Tews - */ - -/** - * Class for filter methods - */ -class Smarty_Internal_Filter { - - function __construct($smarty) - { - $this->smarty = $smarty; - } - /** - * Registers a filter function - * - * @param string $type filter type - * @param callback $callback - */ - public function registerFilter($type, $callback) - { - $this->smarty->registered_filters[$type][$this->_get_filter_name($callback)] = $callback; - } - - /** - * Unregisters a filter function - * - * @param string $type filter type - * @param callback $callback - */ - 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 internal filter name - * - * @param callback $function_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 - * @return bool - */ - 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)) { - return $this->smarty->registered_filters[$type][$_filter_name] = $_plugin; - } - } - throw new SmartyException("{$type}filter \"{$name}\" not callable"); - return false; - } - - -} -?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_filter_handler.php b/libs/sysplugins/smarty_internal_filter_handler.php index fbd88460..c9370e1a 100644 --- a/libs/sysplugins/smarty_internal_filter_handler.php +++ b/libs/sysplugins/smarty_internal_filter_handler.php @@ -1,67 +1,70 @@ <?php - /** * Smarty Internal Plugin Filter Handler - * + * * Smarty filter handler class - * + * * @package Smarty * @subpackage PluginsInternal - * @author Uwe Tews + * @author Uwe Tews */ /** * Class for filter processing + * + * @package Smarty + * @subpackage PluginsInternal */ class Smarty_Internal_Filter_Handler { + /** * Run filters over content - * + * * The filters will be lazy loaded if required * class name format: Smarty_FilterType_FilterName * plugin filename format: filtertype.filtername.php * Smarty2 filter plugins could be used - * - * @param string $type the type of filter ('pre','post','output' or 'variable') which shall run - * @param string $content the content which shall be processed by the filters + * + * @param string $type the type of filter ('pre','post','output') which shall run + * @param string $content the content which shall be processed by the filters + * @param Smarty_Internal_Template $template template object * @return string the filtered content */ - static function runFilter($type, $content, $template, $flag = null) + public static function runFilter($type, $content, Smarty_Internal_Template $template) { $output = $content; - if ($type != 'variable' || ($template->smarty->variable_filter && $flag !== false) || $flag === true) { - // loop over autoload filters of specified type - if (!empty($template->smarty->autoload_filters[$type])) { - foreach ((array)$template->smarty->autoload_filters[$type] as $name) { - $plugin_name = "Smarty_{$type}filter_{$name}"; - if ($template->smarty->loadPlugin($plugin_name)) { - if (function_exists($plugin_name)) { - // use loaded Smarty2 style plugin - $output = $plugin_name($output, $template); - } elseif (class_exists($plugin_name, false)) { - // loaded class of filter plugin - $output = call_user_func(array($plugin_name, 'execute'), $output, $template); - } - } else { - // nothing found, throw exception - throw new SmartyException("Unable to load filter {$plugin_name}"); - } - } - } - // loop over registerd filters of specified type - if (!empty($template->smarty->registered_filters[$type])) { - foreach ($template->smarty->registered_filters[$type] as $key => $name) { - if (is_array($template->smarty->registered_filters[$type][$key])) { - $output = call_user_func($template->smarty->registered_filters[$type][$key], $output, $template); - } else { - $output = $template->smarty->registered_filters[$type][$key]($output, $template); - } - } - } - } + // loop over autoload filters of specified type + if (!empty($template->smarty->autoload_filters[$type])) { + foreach ((array)$template->smarty->autoload_filters[$type] as $name) { + $plugin_name = "Smarty_{$type}filter_{$name}"; + if ($template->smarty->loadPlugin($plugin_name)) { + if (function_exists($plugin_name)) { + // use loaded Smarty2 style plugin + $output = $plugin_name($output, $template); + } elseif (class_exists($plugin_name, false)) { + // loaded class of filter plugin + $output = call_user_func(array($plugin_name, 'execute'), $output, $template); + } + } else { + // nothing found, throw exception + throw new SmartyException("Unable to load filter {$plugin_name}"); + } + } + } + // loop over registerd filters of specified type + if (!empty($template->smarty->registered_filters[$type])) { + foreach ($template->smarty->registered_filters[$type] as $key => $name) { + if (is_array($template->smarty->registered_filters[$type][$key])) { + $output = call_user_func($template->smarty->registered_filters[$type][$key], $output, $template); + } else { + $output = $template->smarty->registered_filters[$type][$key]($output, $template); + } + } + } // return filtered output return $output; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_function_call_handler.php b/libs/sysplugins/smarty_internal_function_call_handler.php index 928f0447..8be744c9 100644 --- a/libs/sysplugins/smarty_internal_function_call_handler.php +++ b/libs/sysplugins/smarty_internal_function_call_handler.php @@ -9,24 +9,38 @@ /**
* This class does call function defined with the {function} tag
+ *
+ * @package Smarty
+ * @subpackage PluginsInternal
*/
-class Smarty_Internal_Function_Call_Handler extends Smarty_Internal_Template {
- static function call ($_name, $_template, $_params, $_hash, $_nocache)
+class Smarty_Internal_Function_Call_Handler {
+
+ /**
+ * This function handles calls to template functions defined by {function}
+ * It does create a PHP function at the first call
+ *
+ * @param string $_name template function name
+ * @param Smarty_Internal_Template $_template template object
+ * @param array $_params Smarty variables passed as call paramter
+ * @param string $_hash nocache hash value
+ * @param bool $_nocache nocache flag
+ */
+ public static function call($_name, Smarty_Internal_Template $_template, $_params, $_hash, $_nocache)
{
if ($_nocache) {
$_function = "smarty_template_function_{$_name}_nocache";
- $_template->smarty->template_functions[$_name]['called_nocache'] = true;
} 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->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);};
+ 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']);
}
@@ -35,6 +49,7 @@ class Smarty_Internal_Function_Call_Handler extends Smarty_Internal_Template { }
$_function($_template, $_params);
}
+
}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_get_include_path.php b/libs/sysplugins/smarty_internal_get_include_path.php index b9f19316..7a9739e9 100644 --- a/libs/sysplugins/smarty_internal_get_include_path.php +++ b/libs/sysplugins/smarty_internal_get_include_path.php @@ -1,44 +1,43 @@ <?php
-
/**
* Smarty read include path plugin
- *
+ *
* @package Smarty
* @subpackage PluginsInternal
- * @author Monte Ohrt
+ * @author Monte Ohrt
*/
/**
* Smarty Internal Read Include Path Class
+ *
+ * @package Smarty
+ * @subpackage PluginsInternal
*/
class Smarty_Internal_Get_Include_Path {
+
/**
* Return full file path from PHP include_path
- *
+ *
* @param string $filepath filepath
- * @return mixed full filepath or false
+ * @return string|boolean full filepath or false
*/
public static function getIncludePath($filepath)
{
- static $_path_array = null;
+ static $_include_path = null;
- if(!isset($_path_array)) {
- $_ini_include_path = ini_get('include_path');
-
- if(strstr($_ini_include_path,';')) {
- // windows pathnames
- $_path_array = explode(';',$_ini_include_path);
- } else {
- $_path_array = explode(':',$_ini_include_path);
+ if ($_path_array === null) {
+ $_include_path = explode(PATH_SEPARATOR, get_include_path());
}
- }
- foreach ($_path_array as $_include_path) {
- if (file_exists($_include_path . DS . $filepath)) {
- return $_include_path . DS . $filepath;
+
+ foreach ($_include_path as $_path) {
+ if (file_exists($_path . DS . $filepath)) {
+ return $_path . DS . $filepath;
+ }
}
+
+ return false;
}
- return false;
- }
-}
+
+}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_nocache_insert.php b/libs/sysplugins/smarty_internal_nocache_insert.php index 76e97816..741efe33 100644 --- a/libs/sysplugins/smarty_internal_nocache_insert.php +++ b/libs/sysplugins/smarty_internal_nocache_insert.php @@ -1,49 +1,53 @@ <?php
-
/**
* Smarty Internal Plugin Nocache Insert
- *
+ *
* Compiles the {insert} tag into the cache file
- *
+ *
* @package Smarty
* @subpackage Compiler
- * @author Uwe Tews
+ * @author Uwe Tews
*/
/**
* Smarty Internal Plugin Compile Insert Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
*/
class Smarty_Internal_Nocache_Insert {
+
/**
* Compiles code for the {insert} tag into cache file
- *
- * @param string $_function insert function name
- * @param array $_attr array with paramter
- * @param object $template template object
- * @param string $_script script name to load or 'null'
- * @param string $_assign soptinal variable name
+ *
+ * @param string $_function insert function name
+ * @param array $_attr array with paramter
+ * @param Smarty_Internal_Template $_template template object
+ * @param string $_script script name to load or 'null'
+ * @param string $_assign optional variable name
* @return string compiled code
*/
- static function compile($_function, $_attr, $_template, $_script, $_assign = null)
+ public static function compile($_function, $_attr, $_template, $_script, $_assign = null)
{
$_output = '<?php ';
if ($_script != 'null') {
// script which must be included
// code for script file loading
$_output .= "require_once '{$_script}';";
- }
+ }
// call insert
if (isset($_assign)) {
$_output .= "\$_smarty_tpl->assign('{$_assign}' , {$_function} (" . var_export($_attr, true) . ",\$_smarty_tpl), true);?>";
} else {
$_output .= "echo {$_function}(" . var_export($_attr, true) . ",\$_smarty_tpl);?>";
- }
+ }
$_tpl = $_template;
while ($_tpl->parent instanceof Smarty_Internal_Template) {
$_tpl = $_tpl->parent;
- }
+ }
return "/*%%SmartyNocache:{$_tpl->properties['nocache_hash']}%%*/" . $_output . "/*/%%SmartyNocache:{$_tpl->properties['nocache_hash']}%%*/";
- }
-}
+ }
+
+}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_parsetree.php b/libs/sysplugins/smarty_internal_parsetree.php index d3bcb22d..c9fb1f76 100644 --- a/libs/sysplugins/smarty_internal_parsetree.php +++ b/libs/sysplugins/smarty_internal_parsetree.php @@ -1,84 +1,160 @@ <?php
/**
* Smarty Internal Plugin Templateparser Parsetrees
- *
+ *
* These are classes to build parsetrees in the template parser
- *
+ *
* @package Smarty
* @subpackage Compiler
- * @author Thue Kristensen
- * @author Uwe Tews
+ * @author Thue Kristensen
+ * @author Uwe Tews
+ */
+
+/**
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
*/
-
abstract class _smarty_parsetree {
- abstract public function to_smarty_php();
+
+ /**
+ * Parser object
+ * @var object
+ */
+ public $parser;
+ /**
+ * Buffer content
+ * @var mixed
+ */
+ public $data;
+
+ /**
+ * Return buffer
+ *
+ * @return string buffer content
+ */
+ abstract public function to_smarty_php();
+
}
/**
* A complete smarty tag.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
*/
-class _smarty_tag extends _smarty_parsetree
-{
- public $parser;
- public $data;
+class _smarty_tag extends _smarty_parsetree {
+
+ /**
+ * Saved block nesting level
+ * @var int
+ */
public $saved_block_nesting;
- function __construct($parser, $data)
+
+ /**
+ * 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 outout of buffer content into a temporary variable
+ *
+ * @return string template code
+ */
public function assign_to_var()
{
$var = sprintf('$_tmp%d', ++$this->parser->prefix_number);
- $this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>',
- $this->data, $var);
+ $this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>', $this->data, $var);
return $var;
- }
-}
+ }
+
+}
/**
* Code fragment inside a tag.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
*/
class _smarty_code extends _smarty_parsetree {
- public $parser;
- public $data;
- function __construct($parser, $data)
+
+
+ /**
+ * 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 {
- public $parser;
- public $subtrees = Array();
- function __construct($parser, _smarty_parsetree $subtree)
+
+ /**
+ * 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);
- }
- }
+ }
+ }
- function append_subtree(_smarty_parsetree $subtree)
+ /**
+ * Append buffer to subtree
+ *
+ * @param _smarty_parsetree $subtree parsetree buffer
+ */
+ public function append_subtree(_smarty_parsetree $subtree)
{
- $last_subtree = count($this->subtrees)-1;
+ $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 . ';?>';
@@ -86,70 +162,119 @@ class _smarty_doublequoted extends _smarty_parsetree { $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 {
- public $data;
- function __construct($parser, $data)
+
+
+ /**
+ * 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();
- function __construct($parser)
+
+ /**
+ * Create root of parse tree for template elements
+ *
+ * @param object $parser parse object
+ */
+ public function __construct($parser)
{
$this->parser = $parser;
- }
+ }
- function append_subtree(_smarty_parsetree $subtree)
+ /**
+ * Append buffer to subtree
+ *
+ * @param _smarty_parsetree $subtree
+ */
+ public function append_subtree(_smarty_parsetree $subtree)
{
$this->subtrees[] = $subtree;
- }
+ }
+ /**
+ * Sanitize and merge subtree buffers together
+ *
+ * @return string template code content
+ */
public function to_smarty_php()
{
$code = '';
@@ -158,79 +283,113 @@ class _smarty_template_buffer extends _smarty_parsetree { if ($this->subtrees[$key] instanceof _smarty_linebreak && $this->subtrees[$key + 1] instanceof _smarty_tag && $this->subtrees[$key + 1]->data == '' && $this->subtrees[$key + 2] instanceof _smarty_linebreak) {
$key = $key + 1;
continue;
- }
+ }
if (substr($this->subtrees[$key]->data, -1) == '<' && $this->subtrees[$key + 1]->data == '' && substr($this->subtrees[$key + 2]->data, -1) == '?') {
$key = $key + 2;
continue;
- }
- }
+ }
+ }
if (substr($code, -1) == '<') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '?') {
- $code = substr($code, 0, strlen($code)-1) . '<<?php ?>?' . substr($subtree, 1);
+ $code = substr($code, 0, strlen($code) - 1) . '<<?php ?>?' . substr($subtree, 1);
} elseif ($this->parser->asp_tags && substr($subtree, 0, 1) == '%') {
- $code = substr($code, 0, strlen($code)-1) . '<<?php ?>%' . substr($subtree, 1);
- } else {
+ $code = substr($code, 0, strlen($code) - 1) . '<<?php ?>%' . substr($subtree, 1);
+ } else {
$code .= $subtree;
- }
+ }
continue;
- }
+ }
if ($this->parser->asp_tags && substr($code, -1) == '%') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '>') {
- $code = substr($code, 0, strlen($code)-1) . '%<?php ?>>' . substr($subtree, 1);
- } else {
+ $code = substr($code, 0, strlen($code) - 1) . '%<?php ?>>' . substr($subtree, 1);
+ } else {
$code .= $subtree;
- }
+ }
continue;
- }
+ }
if (substr($code, -1) == '?') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '>') {
- $code = substr($code, 0, strlen($code)-1) . '?<?php ?>>' . substr($subtree, 1);
- } else {
+ $code = substr($code, 0, strlen($code) - 1) . '?<?php ?>>' . substr($subtree, 1);
+ } else {
$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 {
- public $data;
- function __construct($parser, $data)
+
+
+ /**
+ * 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;
- }
-}
+ }
+
+}
/**
* template linebreaks
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
*/
class _smarty_linebreak extends _smarty_parsetree {
- public $data;
- function __construct($parser, $data)
+
+ /**
+ * Create buffer with linebreak content
+ *
+ * @param object $parser parser object
+ * @param string $data linebreak string
+ */
+ public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
- }
+ }
+ /**
+ * Return linebrak
+ *
+ * @return string linebreak
+ */
public function to_smarty_php()
{
return $this->data;
- }
-}
+ }
+
+}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_register.php b/libs/sysplugins/smarty_internal_register.php deleted file mode 100644 index edaa7ff1..00000000 --- a/libs/sysplugins/smarty_internal_register.php +++ /dev/null @@ -1,156 +0,0 @@ -<?php - -/** - * Smarty Internal Plugin Register - * - * External Smarty methods register/unregister - * - * @package Smarty - * @author Uwe Tews - */ - -/** - * Class for register/unregister methods - */ -class Smarty_Internal_Register { - - function __construct($smarty) - { - $this->smarty = $smarty; - } - /** - * 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 - */ - - public function registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = null) - { - if (isset($this->smarty->registered_plugins[$type][$tag])) { - throw new Exception("Plugin tag \"{$tag}\" already registered"); - } elseif (!is_callable($callback)) { - throw new Exception("Plugin \"{$tag}\" not callable"); - } else { - $this->smarty->registered_plugins[$type][$tag] = array($callback, (bool) $cacheable, (array) $cache_attr); - } - } - - /** - * Unregister Plugin - * - * @param string $type of plugin - * @param string $tag name of plugin - */ - function unregisterPlugin($type, $tag) - { - if (isset($this->smarty->registered_plugins[$type][$tag])) { - unset($this->smarty->registered_plugins[$type][$tag]); - } - } - - /** - * Registers a resource to fetch a template - * - * @param string $type name of resource type - * @param array $callback array of callbacks to handle resource - */ - public function registerResource($type, $callback) - { - $this->smarty->registered_resources[$type] = array($callback, false); - } - - /** - * Unregisters a resource - * - * @param string $type name of resource type - */ - function unregisterResource($type) - { - if (isset($this->smarty->registered_resources[$type])) { - unset($this->smarty->registered_resources[$type]); - } - } - - - /** - * 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 mixed $ null | array $allowed list of allowed methods (empty = all) - * @param boolean $smarty_args smarty argument format, else traditional - * @param mixed $ null | array $block_functs list of methods that are block format - */ - function registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) - { - // test if allowed methodes callable - if (!empty($allowed)) { - foreach ((array)$allowed as $method) { - if (!is_callable(array($object_impl, $method))) { - throw new SmartyException("Undefined method '$method' in registered object"); - } - } - } - // test if block methodes 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); - } - - /** - * Registers static classes to be used in templates - * - * @param string $class name of template class - * @param string $class_impl the referenced PHP class to register - */ - 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; - } - - /** - * Registers a default plugin handler - * - * @param $callback mixed string | array $plugin class/methode name - */ - function registerDefaultPluginHandler($callback) - { - if (is_callable($callback)) { - $this->smarty->default_plugin_handler_func = $callback; - } else { - throw new SmartyException("Default plugin handler '$callback' not callable"); - } - } - - /** - * Registers a default template handler - * - * @param $callback mixed string | array class/method name - */ - function registerDefaultTemplateHandler($callback) - { - if (is_callable($callback)) { - $this->smarty->default_template_handler_func = $callback; - } else { - throw new SmartyException("Default template handler '$callback' not callable"); - } - } - -} -?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_resource_eval.php b/libs/sysplugins/smarty_internal_resource_eval.php index c4a75f58..8b30f03d 100644 --- a/libs/sysplugins/smarty_internal_resource_eval.php +++ b/libs/sysplugins/smarty_internal_resource_eval.php @@ -1,89 +1,72 @@ <?php
-
/**
* Smarty Internal Plugin Resource Eval
- *
- * Implements the strings as resource for Smarty template
- *
+ *
* @package Smarty
* @subpackage TemplateResources
- * @author Uwe Tews
+ * @author Uwe Tews
+ * @author Rodney Rehm
*/
-
+
/**
* Smarty Internal Plugin Resource Eval
+ *
+ * Implements the strings as resource for Smarty template
+ *
+ * {@internal unlike string-resources the compiled state of eval-resources is NOT saved for subsequent access}}
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
*/
-class Smarty_Internal_Resource_Eval {
- public function __construct($smarty)
- {
- $this->smarty = $smarty;
- }
- // classes used for compiling Smarty templates from file resource
- public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler';
- public $template_lexer_class = 'Smarty_Internal_Templatelexer';
- public $template_parser_class = 'Smarty_Internal_Templateparser';
- // properties
- public $usesCompiler = true;
- public $isEvaluated = true;
+class Smarty_Internal_Resource_Eval extends Smarty_Resource_Recompiled {
/**
- * Return flag if template source is existing
- *
- * @return boolean true
+ * 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 isExisting($template)
+ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
{
- return true;
- }
+ $source->uid = $source->filepath = sha1($source->name);
+ $source->timestamp = false;
+ $source->exists = true;
+ }
/**
- * Get filepath to template source
- *
- * @param object $_template template object
- * @return string return 'string' as template source is not a file
+ * Load template's source from $resource_name into current template object
+ *
+ * {@internal if source begins with "base64:" or "urlencode:", the source is decoded accordingly}}
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string template source
*/
- public function getTemplateFilepath($_template)
- {
- // no filepath for evaluated strings
- // return "string" for compiler error messages
- return 'eval:';
- }
+ public function getContent(Smarty_Template_Source $source)
+ {
+ // decode if specified
+ if (($pos = strpos($source->name, ':')) !== false) {
+ if (!strncmp($source->name, 'base64', 6)) {
+ return base64_decode(substr($source->name, 7));
+ } elseif (!strncmp($source->name, 'urlencode', 9)) {
+ return urldecode(substr($source->name, 10));
+ }
+ }
- /**
- * Get timestamp to template source
- *
- * @param object $_template template object
- * @return boolean false as string resources have no timestamp
- */
- public function getTemplateTimestamp($_template)
- {
- // evaluated strings must always be compiled and have no timestamp
- return false;
- }
+ return $source->name;
+ }
/**
- * Retuen template source from resource name
- *
- * @param object $_template template object
- * @return string content of template source
+ * Determine basename for compiled filename
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string resource's basename
*/
- public function getTemplateSource($_template)
- {
- // return template string
- $_template->template_source = $_template->resource_name;
- return true;
- }
+ protected function getBasename(Smarty_Template_Source $source)
+ {
+ return '';
+ }
+
+}
- /**
- * Get filepath to compiled template
- *
- * @param object $_template template object
- * @return boolean return false as compiled template is not stored
- */
- public function getCompiledFilepath($_template)
- {
- // no filepath for strings
- return false;
- }
-}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_resource_extends.php b/libs/sysplugins/smarty_internal_resource_extends.php index 7f972c69..23aee5dd 100644 --- a/libs/sysplugins/smarty_internal_resource_extends.php +++ b/libs/sysplugins/smarty_internal_resource_extends.php @@ -1,176 +1,149 @@ <?php - /** - * Smarty Internal Plugin Resource Extends - * - * Implements the file system as resource for Smarty which does extend a chain of template files templates - * - * @package Smarty - * @subpackage TemplateResources - * @author Uwe Tews - */ +* Smarty Internal Plugin Resource Extends +* +* @package Smarty +* @subpackage TemplateResources +* @author Uwe Tews +* @author Rodney Rehm +*/ /** - * Smarty Internal Plugin Resource Extends - */ -class Smarty_Internal_Resource_Extends { - public function __construct($smarty) - { - $this->smarty = $smarty; - $this->_rdl = preg_quote($smarty->right_delimiter); - $this->_ldl = preg_quote($smarty->left_delimiter); - } - // classes used for compiling Smarty templates from file resource - public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler'; - public $template_lexer_class = 'Smarty_Internal_Templatelexer'; - public $template_parser_class = 'Smarty_Internal_Templateparser'; - // properties - public $usesCompiler = true; - public $isEvaluated = false; - public $allFilepaths = array(); +* Smarty Internal Plugin Resource Extends +* +* Implements the file system as resource for Smarty which {extend}s a chain of template files templates +* +* @package Smarty +* @subpackage TemplateResources +*/ +class Smarty_Internal_Resource_Extends extends Smarty_Resource { /** - * Return flag if template source is existing - * - * @param object $_template template object - * @return boolean result - */ - public function isExisting($_template) + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null) { - $_template->getTemplateFilepath(); - foreach ($this->allFilepaths as $_filepath) { - if ($_filepath === false) { - return false; - } + $uid = ''; + $sources = array(); + $components = explode('|', $source->name); + $exists = true; + foreach ($components as $component) { + $s = Smarty_Resource::source(null, $source->smarty, $component); + if ($s->type == 'php') { + throw new SmartyException("Resource type {$s->type} cannot be used with the extends resource type"); + } + $sources[$s->uid] = $s; + $uid .= $s->filepath; + if ($_template && $_template->smarty->compile_check) { + $exists == $exists && $s->exists; + } } - return true; - } - /** - * Get filepath to template source - * - * @param object $_template template object - * @return string filepath to template source file - */ - public function getTemplateFilepath($_template) - { - $sha1String = ''; - $_files = explode('|', $_template->resource_name); - foreach ($_files as $_file) { - $_filepath = $_template->buildTemplateFilepath ($_file); - if ($_filepath !== false) { - if (is_object($_template->smarty->security_policy)) { - $_template->smarty->security_policy->isTrustedResourceDir($_filepath); - } - } - $sha1String .= $_filepath; - $this->allFilepaths[$_file] = $_filepath; - } - $_template->templateUid = sha1($sha1String); - return $_filepath; - } + $source->components = $sources; + $source->filepath = $s->filepath; + $source->uid = sha1($uid); + if ($_template && $_template->smarty->compile_check) { + $source->timestamp = $s->timestamp; + $source->exists = $exists; + } + // need the template at getContent() + $source->template = $_template; + } /** - * Get timestamp to template source - * - * @param object $_template template object - * @return integer timestamp of template source file - */ - public function getTemplateTimestamp($_template) + * populate Source Object with timestamp and exists from Resource + * + * @param Smarty_Template_Source $source source object + */ + public function populateTimestamp(Smarty_Template_Source $source) { - return filemtime($_template->getTemplateFilepath()); - } + $source->exists = true; + foreach ($source->components as $s) { + $source->exists == $source->exists && $s->exists; + } + $source->timestamp = $s->timestamp; + } /** - * Read template source from file - * - * @param object $_template template object - * @return string content of template source file - */ - public function getTemplateSource($_template) + * Load template's source from files into current template object + * + * @param Smarty_Template_Source $source source object + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + public function getContent(Smarty_Template_Source $source) { - $this->template = $_template; - $_files = array_reverse($this->allFilepaths); - $_first = reset($_files); - $_last = end($_files); - foreach ($_files as $_file => $_filepath) { - if ($_filepath === false) { - throw new SmartyException("Unable to load template 'file : {$_file}'"); - } - // read template file - if ($_filepath != $_first) { - $_template->properties['file_dependency'][sha1($_filepath)] = array($_filepath, filemtime($_filepath),'file'); - } - $_template->template_filepath = $_filepath; - $_content = file_get_contents($_filepath); - if ($_filepath != $_last) { - if (preg_match_all("!({$this->_ldl}block\s(.+?){$this->_rdl})!", $_content, $_open) != - preg_match_all("!({$this->_ldl}/block{$this->_rdl})!", $_content, $_close)) { - throw new SmartyException("unmatched {block} {/block} pairs in file '$_filepath'"); - } - preg_match_all("!{$this->_ldl}block\s(.+?){$this->_rdl}|{$this->_ldl}/block{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE); + if (!$source->exists) { + throw new SmartyException("Unable to read template {$source->type} '{$source->name}'"); + } + + $_rdl = preg_quote($source->smarty->right_delimiter); + $_ldl = preg_quote($source->smarty->left_delimiter); + $_components = array_reverse($source->components); + $_first = reset($_components); + $_last = end($_components); + + foreach ($_components as $_component) { + // register dependency + if ($_component != $_first) { + $source->template->properties['file_dependency'][$_component->uid] = array($_component->filepath, $_component->timestamp, $_component->type); + } + + // read content + $source->filepath = $_component->filepath; + $_content = $_component->content; + + // extend sources + if ($_component != $_last) { + if (preg_match_all("!({$_ldl}block\s(.+?){$_rdl})!", $_content, $_open) != + preg_match_all("!({$_ldl}/block{$_rdl})!", $_content, $_close)) { + throw new SmartyException("unmatched {block} {/block} pairs in template {$_component->type} '{$_component->name}'"); + } + preg_match_all("!{$_ldl}block\s(.+?){$_rdl}|{$_ldl}/block{$_rdl}|{$_ldl}\*([\S\s]*?)\*{$_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE); $_result_count = count($_result[0]); $_start = 0; - while ($_start < $_result_count) { + while ($_start+1 < $_result_count) { $_end = 0; $_level = 1; + if (substr($_result[0][$_start][0],0,strlen($source->smarty->left_delimiter)+1) == $source->smarty->left_delimiter.'*') { + echo 'lll'; + $_start++; + continue; + } while ($_level != 0) { $_end++; + if (substr($_result[0][$_start + $_end][0],0,strlen($source->smarty->left_delimiter)+1) == $source->smarty->left_delimiter.'*') { + continue; + } if (!strpos($_result[0][$_start + $_end][0], '/')) { $_level++; } else { $_level--; - } - } - $_block_content = str_replace($this->smarty->left_delimiter . '$smarty.block.parent' . $this->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%', - substr($_content, $_result[0][$_start][1] + strlen($_result[0][$_start][0]), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + strlen($_result[0][$_start][0]))); - Smarty_Internal_Compile_Block::saveBlockData($_block_content, $_result[0][$_start][0], $_template, $_filepath); + } + } + $_block_content = str_replace($source->smarty->left_delimiter . '$smarty.block.parent' . $source->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%', substr($_content, $_result[0][$_start][1] + strlen($_result[0][$_start][0]), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + strlen($_result[0][$_start][0]))); + Smarty_Internal_Compile_Block::saveBlockData($_block_content, $_result[0][$_start][0], $source->template, $_component->filepath); $_start = $_start + $_end + 1; - } + } } else { - $_template->template_source = $_content; - return true; - } - } + return $_content; + } + } } - /** - * Get filepath to compiled template - * - * @param object $_template template object - * @return string return path to compiled template - */ - public function getCompiledFilepath($_template) + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * @return string resource's basename + */ + public function getBasename(Smarty_Template_Source $source) { - $_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null; - $_files = explode('|', $_template->resource_name); - // calculate Uid if not already done - if ($_template->templateUid == '') { - $_template->getTemplateFilepath(); - } - $_filepath = $_template->templateUid; - // 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; - } - if ($_template->caching) { - $_cache = '.cache'; - } else { - $_cache = ''; - } - $_compile_dir = $_template->smarty->compile_dir; - if (substr($_compile_dir, -1) != DS) { - $_compile_dir .= DS; - } - return $_compile_dir . $_filepath . '.' . $_template->resource_type . '.' . basename($_files[count($_files)-1]) . $_cache . '.php'; - } -} + return str_replace(':', '.', basename($source->filepath)); + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_resource_file.php b/libs/sysplugins/smarty_internal_resource_file.php index 79decc59..48b391d2 100644 --- a/libs/sysplugins/smarty_internal_resource_file.php +++ b/libs/sysplugins/smarty_internal_resource_file.php @@ -1,128 +1,90 @@ <?php - /** * Smarty Internal Plugin Resource File - * - * Implements the file system as resource for Smarty templates - * + * * @package Smarty * @subpackage TemplateResources - * @author Uwe Tews + * @author Uwe Tews + * @author Rodney Rehm */ -/** +/** * Smarty Internal Plugin Resource File + * + * Implements the file system as resource for Smarty templates + * + * @package Smarty + * @subpackage TemplateResources */ -class Smarty_Internal_Resource_File { - public function __construct($smarty) - { - $this->smarty = $smarty; - } - // classes used for compiling Smarty templates from file resource - public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler'; - public $template_lexer_class = 'Smarty_Internal_Templatelexer'; - public $template_parser_class = 'Smarty_Internal_Templateparser'; - // properties - public $usesCompiler = true; - public $isEvaluated = false; +class Smarty_Internal_Resource_File extends Smarty_Resource { /** - * Return flag if template source is existing - * - * @return boolean true + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object */ - public function isExisting($template) + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null) { - if ($template->getTemplateFilepath() === false) { - return false; - } else { - return true; - } - } + $source->filepath = $this->buildFilepath($source, $_template); - /** - * Get filepath to template source - * - * @param object $_template template object - * @return string filepath to template source file - */ - public function getTemplateFilepath($_template) - { - $_filepath = $_template->buildTemplateFilepath (); + if ($source->filepath !== false) { + if (is_object($source->smarty->security_policy)) { + $source->smarty->security_policy->isTrustedResourceDir($source->filepath); + } - if ($_filepath !== false) { - if (is_object($_template->smarty->security_policy)) { - $_template->smarty->security_policy->isTrustedResourceDir($_filepath); - } - } - $_template->templateUid = sha1($_filepath); - return $_filepath; - } + $source->uid = sha1($source->filepath); + if ($source->smarty->compile_check && !isset($source->timestamp)) { + $source->timestamp = @filemtime($source->filepath); + $source->exists = !!$source->timestamp; + } + } + } /** - * Get timestamp to template source - * - * @param object $_template template object - * @return integer timestamp of template source file + * populate Source Object with timestamp and exists from Resource + * + * @param Smarty_Template_Source $source source object */ - public function getTemplateTimestamp($_template) + public function populateTimestamp(Smarty_Template_Source $source) { - return filemtime($_template->getTemplateFilepath()); - } + $source->timestamp = @filemtime($source->filepath); + $source->exists = !!$source->timestamp; + } /** - * Read template source from file - * - * @param object $_template template object - * @return string content of template source file + * Load template's source from file into current template object + * + * @param Smarty_Template_Source $source source object + * @return string template source + * @throws SmartyException if source cannot be loaded */ - public function getTemplateSource($_template) - { - // read template file - if (file_exists($_tfp = $_template->getTemplateFilepath())) { - $_template->template_source = file_get_contents($_tfp); - return true; - } else { - return false; - } - } + public function getContent(Smarty_Template_Source $source) + { + if ($source->timestamp) { + return file_get_contents($source->filepath); + } + if ($source instanceof Smarty_Config_Source) { + throw new SmartyException("Unable to read config {$source->type} '{$source->name}'"); + } + throw new SmartyException("Unable to read template {$source->type} '{$source->name}'"); + } /** - * Get filepath to compiled template - * - * @param object $_template template object - * @return string return path to compiled template + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * @return string resource's basename */ - public function getCompiledFilepath($_template) + public function getBasename(Smarty_Template_Source $source) { - $_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null; - // calculate Uid if not already done - if ($_template->templateUid == '') { - $_template->getTemplateFilepath(); - } - $_filepath = $_template->templateUid; - // 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; - } - if ($_template->caching) { - $_cache = '.cache'; - } else { - $_cache = ''; - } - $_compile_dir = $_template->smarty->compile_dir; - if (strpos('/\\', substr($_compile_dir, -1)) === false) { - $_compile_dir .= DS; - } - return $_compile_dir . $_filepath . '.' . $_template->resource_type . '.' . basename($_template->resource_name) . $_cache . '.php'; - } -} + $_file = $source->name; + if (($_pos = strpos($_file, ']')) !== false) { + $_file = substr($_file, $_pos + 1); + } + return basename($_file); + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_resource_php.php b/libs/sysplugins/smarty_internal_resource_php.php index 16c77446..bfa74d05 100644 --- a/libs/sysplugins/smarty_internal_resource_php.php +++ b/libs/sysplugins/smarty_internal_resource_php.php @@ -8,119 +8,101 @@ * @package Smarty * @subpackage TemplateResources * @author Uwe Tews + * @author Rodney Rehm */ - -/** - * Smarty Internal Plugin Resource PHP - */ -class Smarty_Internal_Resource_PHP { +class Smarty_Internal_Resource_PHP extends Smarty_Resource_Uncompiled { /** - * Class constructor, enable short open tags + * container for short_open_tag directive's value before executing PHP templates + * @var string */ - public function __construct($smarty) - { - $this->smarty = $smarty; - ini_set('short_open_tag', '1'); - } - // properties - public $usesCompiler = false; - public $isEvaluated = false; - + protected $short_open_tag; + /** - * Return flag if template source is existing - * - * @return boolean true + * Create a new PHP Resource + * */ - public function isExisting($template) + public function __construct() { - if ($template->getTemplateFilepath() === false) { - return false; - } else { - return true; - } + $this->short_open_tag = ini_get( 'short_open_tag' ); } - + /** - * Get filepath to template source - * - * @param object $_template template object - * @return string filepath to template source file + * 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 getTemplateFilepath($_template) + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null) { - $_filepath = $_template->buildTemplateFilepath (); - - if (is_object($_template->smarty->security_policy)) { - $_template->smarty->security_policy->isTrustedResourceDir($_filepath); - } - $_template->templateUid = sha1($_filepath); - return $_filepath; - } + $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; + } + } + } + /** - * Get timestamp to template source - * - * @param object $_template template object - * @return integer timestamp of template source file + * populate Source Object with timestamp and exists from Resource + * + * @param Smarty_Template_Source $source source object + * @return void */ - public function getTemplateTimestamp($_template) + public function populateTimestamp(Smarty_Template_Source $source) { - return filemtime($_template->getTemplateFilepath()); - } + $source->timestamp = @filemtime($source->filepath); + $source->exists = !!$source->timestamp; + } /** - * Read template source from file + * Load template's source from file into current template object * - * @param object $_template template object - * @return string content of template source file + * @param Smarty_Template_Source $source source object + * @return string template source + * @throws SmartyException if source cannot be loaded */ - public function getTemplateSource($_template) + public function getContent(Smarty_Template_Source $source) { - if (file_exists($_tfp = $_template->getTemplateFilepath())) { - $_template->template_source = file_get_contents($_tfp); - return true; - } else { - return false; - } - } - - /** - * Get filepath to compiled template - * - * @param object $_template template object - * @return boolean return false as compiled template is not stored - */ - public function getCompiledFilepath($_template) - { - // no filepath for PHP templates - return false; + if ($source->timestamp) { + return ''; + } + throw new SmartyException("Unable to read template {$source->type} '{$source->name}'"); } /** - * renders the PHP template + * Render and output the template (without using the compiler) + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * @return void + * @throws SmartyException if template cannot be loaded or allow_php_templates is disabled */ - public function renderUncompiled($_smarty_template) + public function renderUncompiled(Smarty_Template_Source $source, Smarty_Internal_Template $_template) { - if (!$this->smarty->allow_php_templates) { + $_smarty_template = $_template; + + if (!$source->smarty->allow_php_templates) { throw new SmartyException("PHP templates are disabled"); } - if ($this->getTemplateFilepath($_smarty_template) === false) { - throw new SmartyException("Unable to load template \"{$_smarty_template->resource_type} : {$_smarty_template->resource_name}\""); + if (!$source->exists) { + throw new SmartyException("Unable to load template \"{$source->type} : {$source->name}\""); } + // prepare variables - $_smarty_ptr = $_smarty_template; - do { - foreach ($_smarty_ptr->tpl_vars as $_smarty_var => $_smarty_var_object) { - if (isset($_smarty_var_object->value)) { - $$_smarty_var = $_smarty_var_object->value; - } - } - $_smarty_ptr = $_smarty_ptr->parent; - } while ($_smarty_ptr != null); - unset ($_smarty_var, $_smarty_var_object, $_smarty_ptr); - // include PHP template - include($this->getTemplateFilepath($_smarty_template)); - return; + extract($_template->getTemplateVars()); + + // include PHP template with short open tags enabled + ini_set( 'short_open_tag', '1' ); + include($source->filepath); + ini_set( 'short_open_tag', $this->short_open_tag ); } } diff --git a/libs/sysplugins/smarty_internal_resource_registered.php b/libs/sysplugins/smarty_internal_resource_registered.php index 467da11a..44497b92 100644 --- a/libs/sysplugins/smarty_internal_resource_registered.php +++ b/libs/sysplugins/smarty_internal_resource_registered.php @@ -1,143 +1,95 @@ <?php - /** * Smarty Internal Plugin Resource Registered - * - * Implements the registered resource for Smarty template - * + * * @package Smarty * @subpackage TemplateResources - * @author Uwe Tews + * @author Uwe Tews + * @author Rodney Rehm */ - + /** * Smarty Internal Plugin Resource Registered + * + * Implements the registered resource for Smarty template + * + * @package Smarty + * @subpackage TemplateResources + * @deprecated */ -class Smarty_Internal_Resource_Registered { - public function __construct($template, $resource_type = null) - { - $this->smarty = $template->smarty; - if (isset($resource_type)) { - $template->smarty->registerResource($resource_type, - array("smarty_resource_{$resource_type}_source", - "smarty_resource_{$resource_type}_timestamp", - "smarty_resource_{$resource_type}_secure", - "smarty_resource_{$resource_type}_trusted")); - } - } - // classes used for compiling Smarty templates from file resource - public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler'; - public $template_lexer_class = 'Smarty_Internal_Templatelexer'; - public $template_parser_class = 'Smarty_Internal_Templateparser'; - // properties - public $usesCompiler = true; - public $isEvaluated = false; +class Smarty_Internal_Resource_Registered extends Smarty_Resource { /** - * Return flag if template source is existing - * - * @return boolean true + * 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 isExisting($_template) + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null) { - if (is_integer($_template->getTemplateTimestamp())) { - return true; - } else { - return false; - } - } - /** - * Get filepath to template source - * - * @param object $_template template object - * @return string return 'string' as template source is not a file - */ - public function getTemplateFilepath($_template) - { - $_filepath = $_template->resource_type .':'.$_template->resource_name; - $_template->templateUid = sha1($_filepath); - return $_filepath; - } + $source->filepath = $source->type . ':' . $source->name; + $source->uid = sha1($source->filepath); + if ($source->smarty->compile_check) { + $source->timestamp = $this->getTemplateTimestamp($source); + $source->exists = !!$source->timestamp; + } + } /** - * Get timestamp of template source - * - * @param object $_template template object - * @return int timestamp + * populate Source Object with timestamp and exists from Resource + * + * @param Smarty_Template_Source $source source object + * @return void */ - public function getTemplateTimestamp($_template) - { - // return timestamp - $time_stamp = false; - call_user_func_array($this->smarty->registered_resources[$_template->resource_type][0][1], - array($_template->resource_name, &$time_stamp, $this->smarty)); - return is_numeric($time_stamp) ? (int)$time_stamp : $time_stamp; + public function populateTimestamp(Smarty_Template_Source $source) + { + $source->timestamp = $this->getTemplateTimestamp($source); + $source->exists = !!$source->timestamp; } - + /** - * Get timestamp of template source by type and name - * - * @param object $_template template object - * @return int timestamp + * Get timestamp (epoch) the template source was modified + * + * @param Smarty_Template_Source $source source object + * @return integer|boolean timestamp (epoch) the template was modified, false if resources has no timestamp */ - public function getTemplateTimestampTypeName($_resource_type, $_resource_name) - { + public function getTemplateTimestamp(Smarty_Template_Source $source) + { // return timestamp $time_stamp = false; - call_user_func_array($this->smarty->registered_resources[$_resource_type][0][1], - array($_resource_name, &$time_stamp, $this->smarty)); - return is_numeric($time_stamp) ? (int)$time_stamp : $time_stamp; - } + call_user_func_array($source->smarty->registered_resources[$source->type][0][1], array($source->name, &$time_stamp, $source->smarty)); + return is_numeric($time_stamp) ? (int) $time_stamp : $time_stamp; + } /** - * Retuen template source from resource name - * - * @param object $_template template object - * @return string content of template source + * Load template's source by invoking the registered callback into current template object + * + * @param Smarty_Template_Source $source source object + * @return string template source + * @throws SmartyException if source cannot be loaded */ - public function getTemplateSource($_template) - { + public function getContent(Smarty_Template_Source $source) + { // return template string - return call_user_func_array($this->smarty->registered_resources[$_template->resource_type][0][0], - array($_template->resource_name, &$_template->template_source, $this->smarty)); - } + $t = call_user_func_array($source->smarty->registered_resources[$source->type][0][0], array($source->name, &$source->content, $source->smarty)); + if (is_bool($t) && !$t) { + throw new SmartyException("Unable to read template {$source->type} '{$source->name}'"); + } + return $source->content; + } /** - * Get filepath to compiled template - * - * @param object $_template template object - * @return boolean return false as compiled template is not stored + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * @return string resource's basename */ - public function getCompiledFilepath($_template) - { - $_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!','_',$_template->compile_id) : null; - // calculate Uid if not already done - if ($_template->templateUid == '') { - $_template->getTemplateFilepath(); - } - $_filepath = $_template->templateUid; - // 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; - } - if ($_template->caching) { - $_cache = '.cache'; - } else { - $_cache = ''; - } - $_compile_dir = $_template->smarty->compile_dir; - if (strpos('/\\', substr($_compile_dir, -1)) === false) { - $_compile_dir .= DS; - } - return $_compile_dir . $_filepath . '.' . $_template->resource_type . '.' . basename($_template->resource_name) . $_cache . '.php'; - } -} + protected function getBasename(Smarty_Template_Source $source) + { + return basename($source->name); + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_resource_stream.php b/libs/sysplugins/smarty_internal_resource_stream.php index 1878002b..cba8adb8 100644 --- a/libs/sysplugins/smarty_internal_resource_stream.php +++ b/libs/sysplugins/smarty_internal_resource_stream.php @@ -1,101 +1,65 @@ <?php - /** -* Smarty Internal Plugin Resource Stream -* -* Implements the streams as resource for Smarty template -* -* @package Smarty -* @subpackage TemplateResources -* @author Uwe Tews -*/ + * Smarty Internal Plugin Resource Stream + * + * Implements the streams as resource for Smarty template + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + * @author Rodney Rehm + */ /** -* Smarty Internal Plugin Resource Stream -*/ -class Smarty_Internal_Resource_Stream { - public function __construct($smarty) - { - $this->smarty = $smarty; - } - // classes used for compiling Smarty templates from file resource - public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler'; - public $template_lexer_class = 'Smarty_Internal_Templatelexer'; - public $template_parser_class = 'Smarty_Internal_Templateparser'; - // properties - public $usesCompiler = true; - public $isEvaluated = true; - - /** - * Return flag if template source is existing - * - * @return boolean true - */ - public function isExisting($template) - { - if ($template->getTemplateSource() == '') { - return false; - } else { - return true; - } - } - /** - * Get filepath to template source - * - * @param object $_template template object - * @return string return 'string' as template source is not a file - */ - public function getTemplateFilepath($_template) - { - // no filepath for strings - // return resource name for compiler error messages - return str_replace(':', '://', $_template->template_resource); - } + * Smarty Internal Plugin Resource Stream + * + * Implements the streams as resource for Smarty template + * + * @link http://php.net/streams + * @package Smarty + * @subpackage TemplateResources + */ +class Smarty_Internal_Resource_Stream extends Smarty_Resource_Recompiled { /** - * Get timestamp to template source - * - * @param object $_template template object - * @return boolean false as string resources have no timestamp - */ - public function getTemplateTimestamp($_template) + * 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) { - // strings must always be compiled and have no timestamp - return false; + $source->filepath = str_replace(':', '://', $source->resource); + $source->uid = false; + $source->content = $this->getContent($source); + $source->timestamp = false; + $source->exists = !!$source->content; } /** - * Retuen template source from resource name - * - * @param object $_template template object - * @return string content of template source - */ - public function getTemplateSource($_template) + * Load template's source from stream into current template object + * + * @param Smarty_Template_Source $source source object + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + public function getContent(Smarty_Template_Source $source) { - // return template string - $_template->template_source = ''; - if ($fp = fopen(str_replace(':', '://', $_template->template_resource),'r+')) { - while (!feof($fp) && ($current_line = fgets($fp)) !== false ) { - $_template->template_source .= $current_line; + $t = ''; + // the availability of the stream has already been checked in Smarty_Resource::fetch() + $fp = fopen($source->filepath, 'r+'); + if ($fp) { + while (!feof($fp) && ($current_line = fgets($fp)) !== false) { + $t .= $current_line; } fclose($fp); - return true; + return $t; } else { return false; } } - /** - * Get filepath to compiled template - * - * @param object $_template template object - * @return boolean return false as compiled template is not stored - */ - public function getCompiledFilepath($_template) - { - // no filepath for strings - return false; - } } ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_resource_string.php b/libs/sysplugins/smarty_internal_resource_string.php index 9368f040..45b720d6 100644 --- a/libs/sysplugins/smarty_internal_resource_string.php +++ b/libs/sysplugins/smarty_internal_resource_string.php @@ -1,133 +1,75 @@ <?php - /** * Smarty Internal Plugin Resource String - * - * Implements the strings as resource for Smarty template - * + * * @package Smarty * @subpackage TemplateResources - * @author Uwe Tews + * @author Uwe Tews + * @author Rodney Rehm */ - + /** * Smarty Internal Plugin Resource String + * + * Implements the strings as resource for Smarty template + * + * {@internal unlike eval-resources the compiled state of string-resources is saved for subsequent access}} + * + * @package Smarty + * @subpackage TemplateResources */ -class Smarty_Internal_Resource_String { - public function __construct($smarty) - { - $this->smarty = $smarty; - } - // classes used for compiling Smarty templates from file resource - public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler'; - public $template_lexer_class = 'Smarty_Internal_Templatelexer'; - public $template_parser_class = 'Smarty_Internal_Templateparser'; - // properties - public $usesCompiler = true; - public $isEvaluated = false; +class Smarty_Internal_Resource_String extends Smarty_Resource { /** - * Return flag if template source is existing - * - * @return boolean true + * 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 isExisting($template) + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null) { - return true; - } - - /** - * Get filepath to template source - * - * @param object $_template template object - * @return string return 'string' as template source is not a file - */ - public function getTemplateFilepath($_template) - { - $_template->templateUid = sha1($_template->resource_name); - // no filepath for strings - // return "string" for compiler error messages - return 'string:'; - } + $source->uid = $source->filepath = sha1($source->name); + $source->timestamp = 0; + $source->exists = true; + } /** - * Get timestamp to template source - * - * @param object $_template template object - * @return boolean false as string resources have no timestamp + * Load template's source from $resource_name into current template object + * + * {@internal if source begins with "base64:" or "urlencode:", the source is decoded accordingly}} + * + * @param Smarty_Template_Source $source source object + * @return string template source + * @throws SmartyException if source cannot be loaded */ - public function getTemplateTimestamp($_template) - { - if ($this->isEvaluated) { - //must always be compiled and have no timestamp - return false; - } else { - return 0; + public function getContent(Smarty_Template_Source $source) + { + // decode if specified + if (($pos = strpos($source->name, ':')) !== false) { + if (!strncmp($source->name, 'base64', 6)) { + return base64_decode(substr($source->name, 7)); + } elseif (!strncmp($source->name, 'urlencode', 9)) { + return urldecode(substr($source->name, 10)); + } } - } - - /** - * Get timestamp of template source by type and name - * - * @param object $_template template object - * @return int timestamp (always 0) - */ - public function getTemplateTimestampTypeName($_resource_type, $_resource_name) - { - // return timestamp 0 - return 0; - } + return $source->name; + } /** - * Retuen template source from resource name - * - * @param object $_template template object - * @return string content of template source + * Determine basename for compiled filename + * + * Always returns an empty string. + * + * @param Smarty_Template_Source $source source object + * @return string resource's basename */ - public function getTemplateSource($_template) - { - // return template string - $_template->template_source = $_template->resource_name; - return true; - } - - /** - * Get filepath to compiled template - * - * @param object $_template template object - * @return boolean return false as compiled template is not stored - */ - public function getCompiledFilepath($_template) + protected function getBasename(Smarty_Template_Source $source) { - $_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null; - // calculate Uid if not already done - if ($_template->templateUid == '') { - $_template->getTemplateFilepath(); - } - $_filepath = $_template->templateUid; - // 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; - } - if ($_template->caching) { - $_cache = '.cache'; - } else { - $_cache = ''; - } - $_compile_dir = $_template->smarty->compile_dir; - if (strpos('/\\', substr($_compile_dir, -1)) === false) { - $_compile_dir .= DS; - } - return $_compile_dir . $_filepath . '.' . $_template->resource_type . $_cache . '.php'; - } -} + return ''; + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_smartytemplatecompiler.php b/libs/sysplugins/smarty_internal_smartytemplatecompiler.php index dcc89c67..1ec1aa43 100644 --- a/libs/sysplugins/smarty_internal_smartytemplatecompiler.php +++ b/libs/sysplugins/smarty_internal_smartytemplatecompiler.php @@ -1,72 +1,127 @@ <?php - /** * Smarty Internal Plugin Smarty Template Compiler Base - * + * * This file contains the basic classes and methodes for compiling Smarty templates with lexer/parser - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ -require_once("smarty_internal_parsetree.php"); +/** + * @ignore + */ +include ("smarty_internal_parsetree.php"); /** * Class SmartyTemplateCompiler + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCompilerBase { - // array of vars which can be compiled in local scope + + /** + * Lexer class name + * + * @var string + */ + public $lexer_class; + + /** + * Parser class name + * + * @var string + */ + public $parser_class; + + /** + * Lexer object + * + * @var object + */ + public $lex; + + /** + * Parser object + * + * @var object + */ + public $parser; + + /** + * Smarty object + * + * @var object + */ + public $smarty; + + /** + * array of vars which can be compiled in local scope + * + * @var array + */ public $local_var = array(); + /** * Initialize compiler + * + * @param string $lexer_class class name + * @param string $parser_class class name + * @param Smarty $smarty global instance */ public function __construct($lexer_class, $parser_class, $smarty) { $this->smarty = $smarty; - parent::__construct(); + parent::__construct(); // get required plugins $this->lexer_class = $lexer_class; $this->parser_class = $parser_class; - } + } /** * Methode to compile a Smarty template - * - * @param $_content template source + * + * @param mixed $_content template source * @return bool true if compiling succeeded, false if it failed */ protected function doCompile($_content) { /* here is where the compiling takes place. Smarty - tags in the templates are replaces with PHP code, - then written to compiled files. */ + 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->parser = new $this->parser_class($this->lex, $this); - if (isset($this->smarty->_parserdebug)) $this->parser->PrintTrace(); + if ($this->smarty->_parserdebug) + $this->parser->PrintTrace(); // get tokens from lexer and parse them while ($this->lex->yylex() && !$this->abort_and_recompile) { - if (isset($this->smarty->_parserdebug)) echo "<pre>Line {$this->lex->line} Parsing {$this->parser->yyTokenName[$this->lex->token]} Token " . htmlentities($this->lex->value) . "</pre>"; + if ($this->smarty->_parserdebug) { + echo "<pre>Line {$this->lex->line} Parsing {$this->parser->yyTokenName[$this->lex->token]} Token " . + htmlentities($this->lex->value) . "</pre>"; + } $this->parser->doParse($this->lex->token, $this->lex->value); - } + } if ($this->abort_and_recompile) { // exit here on abort return false; - } + } // finish parsing process - $this->parser->doParse(0, 0); + $this->parser->doParse(0, 0); // check for unclosed tags if (count($this->_tag_stack) > 0) { // get stacked info - list($_open_tag, $_data) = array_pop($this->_tag_stack); - $this->trigger_template_error("unclosed {" . $_open_tag . "} tag"); - } + list($openTag, $_data) = array_pop($this->_tag_stack); + $this->trigger_template_error("unclosed {" . $openTag . "} tag"); + } // return compiled code // return str_replace(array("? >\n<?php","? ><?php"), array('',''), $this->parser->retvalue); return $this->parser->retvalue; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_template.php b/libs/sysplugins/smarty_internal_template.php index 4ddf2986..8efb95d0 100644 --- a/libs/sysplugins/smarty_internal_template.php +++ b/libs/sysplugins/smarty_internal_template.php @@ -1,87 +1,120 @@ <?php - /** * Smarty Internal Plugin Template * * This file contains the Smarty template engine * * @package Smarty - * @subpackage Templates + * @subpackage Template * @author Uwe Tews */ /** * Main class with template data structures and methods + * + * @package Smarty + * @subpackage Template + * + * @property Smarty_Template_Source $source + * @property Smarty_Template_Compiled $compiled + * @property Smarty_Template_Cached $cached */ -class Smarty_Internal_Template extends Smarty_Internal_Data { - // object cache - public $compiler_object = null; - public $cacher_object = null; - // Smarty parameter +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 + * @var integer + */ public $cache_lifetime = null; + /** + * Class name + * @var string + */ public $cacher_class = null; + /** + * caching type + * + * Must be an element of $cache_resource_types. + * + * @var string + */ public $caching_type = null; - public $forceNocache = false; - // Template resource + /** + * Template resource + * @var string + */ public $template_resource = null; - public $resource_type = null; - public $resource_name = null; -// public $resource_object = null; - private $isExisting = null; - public $templateUid = ''; - // Template source - public $template_filepath = null; - public $template_source = null; - private $template_timestamp = null; - // Compiled template - private $compiled_filepath = null; - public $compiled_template = null; - private $compiled_timestamp = null; + /** + * flag if compiled template is invalid and must be (re)compiled + * @var bool + */ public $mustCompile = null; - public $suppressHeader = false; - public $suppressFileDependency = false; + /** + * flag if template does contain nocache code sections + * @var bool + */ public $has_nocache_code = false; - public $write_compiled_code = true; - // Rendered content - public $rendered_content = null; - // Cache file - private $cached_filepath = null; - public $cached_timestamp = null; - private $isCached = null; -// private $cache_resource_object = null; - private $cacheFileChecked = false; - // template variables - public $tpl_vars = array(); - public $parent = null; - public $config_vars = array(); - // storage for plugin - public $plugin_data = array(); - // special properties - public $properties = array ('file_dependency' => array(), + /** + * special compiled and cached template properties + * @var array + */ + public $properties = array('file_dependency' => array(), 'nocache_hash' => '', 'function' => array()); - // required plugins + /** + * required plugins + * @var array + */ public $required_plugins = array('compiled' => array(), 'nocache' => array()); - public $saved_modifier = null; + /** + * Global smarty instance + * @var Smarty + */ public $smarty = null; - // blocks for template inheritance + /** + * blocks for template inheritance + * @var array + */ public $block_data = array(); - public $wrapper = null; - // optional log of tag/attributes + /** + * variable filters + * @var array + */ + public $variable_filters = array(); + /** + * optional log of tag/attributes + * @var array + */ public $used_tags = array(); + /** * Create template data object * * Some of the global Smarty settings copied to template scope * It load the required template resources and cacher plugins * - * @param string $template_resource template resource string - * @param object $_parent back pointer to parent object with variables or null - * @param mixed $_cache_id cache id or null - * @param mixed $_compile_id compile id or null + * @param string $template_resource template resource string + * @param Smarty $smarty Smarty instance + * @param Smarty_Internal_Template $_parent back pointer to parent object with variables or null + * @param mixed $_cache_id cache id or null + * @param mixed $_compile_id compile id or null + * @param bool $_caching use caching? + * @param int $_cache_lifetime cache life-time in seconds */ public function __construct($template_resource, $smarty, $_parent = null, $_cache_id = null, $_compile_id = null, $_caching = null, $_cache_lifetime = null) { @@ -90,81 +123,16 @@ class Smarty_Internal_Template extends Smarty_Internal_Data { $this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id; $this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id; $this->caching = $_caching === null ? $this->smarty->caching : $_caching; - if ($this->caching === true) $this->caching = Smarty::CACHING_LIFETIME_CURRENT; - $this->cache_lifetime = $_cache_lifetime === null ?$this->smarty->cache_lifetime : $_cache_lifetime; + if ($this->caching === true) + $this->caching = Smarty::CACHING_LIFETIME_CURRENT; + $this->cache_lifetime = $_cache_lifetime === null ? $this->smarty->cache_lifetime : $_cache_lifetime; $this->parent = $_parent; - // dummy local smarty variable - $this->tpl_vars['smarty'] = new Smarty_Variable; // Template resource $this->template_resource = $template_resource; // copy block data of template inheritance if ($this->parent instanceof Smarty_Internal_Template) { - $this->block_data = $this->parent->block_data; + $this->block_data = $this->parent->block_data; } - - } - - /** - * Returns the template filepath - * - * The template filepath is determined by the actual resource handler - * - * @return string the template filepath - */ - public function getTemplateFilepath () - { - return $this->template_filepath === null ? - $this->template_filepath = $this->resource_object->getTemplateFilepath($this) : - $this->template_filepath; - } - - /** - * Returns the timpestamp of the template source - * - * The template timestamp is determined by the actual resource handler - * - * @return integer the template timestamp - */ - public function getTemplateTimestamp () - { - return $this->template_timestamp === null ? - $this->template_timestamp = $this->resource_object->getTemplateTimestamp($this) : - $this->template_timestamp; - } - - /** - * Returns the template source code - * - * The template source is being read by the actual resource handler - * - * @return string the template source - */ - public function getTemplateSource () - { - if ($this->template_source === null) { - if (!$this->resource_object->getTemplateSource($this)) { - throw new SmartyException("Unable to read template {$this->resource_type} '{$this->resource_name}'"); - } - } - return $this->template_source; - } - - /** - * Returns if the template is existing - * - * The status is determined by the actual resource handler - * - * @return boolean true if the template exists - */ - public function isExisting ($error = false) - { - if ($this->isExisting === null) { - $this->isExisting = $this->resource_object->isExisting($this); - } - if (!$this->isExisting && $error) { - throw new SmartyException("Unable to load template {$this->resource_type} '{$this->resource_name}'"); - } - return $this->isExisting; } /** @@ -174,609 +142,195 @@ class Smarty_Internal_Template extends Smarty_Internal_Data { * * @return boolean true if the template must be compiled */ - public function mustCompile () + public function mustCompile() { - $this->isExisting(true); + if (!$this->source->exists) { + throw new SmartyException("Unable to load template {$this->source->type} '{$this->source->name}'"); + } if ($this->mustCompile === null) { - $this->mustCompile = ($this->resource_object->usesCompiler && ($this->smarty->force_compile || $this->resource_object->isEvaluated || $this->getCompiledTimestamp () === false || - // ($this->smarty->compile_check && $this->getCompiledTimestamp () !== $this->getTemplateTimestamp ()))); - ($this->smarty->compile_check && $this->getCompiledTimestamp () < $this->getTemplateTimestamp ()))); + $this->mustCompile = (!$this->source->uncompiled && ($this->smarty->force_compile || $this->source->recompiled || $this->compiled->timestamp === false || + ($this->smarty->compile_check && $this->compiled->timestamp < $this->source->timestamp))); } return $this->mustCompile; } /** - * Returns the compiled template filepath - * - * @return string the template filepath - */ - public function getCompiledFilepath () - { - return $this->compiled_filepath === null ? - ($this->compiled_filepath = !$this->resource_object->isEvaluated ? $this->resource_object->getCompiledFilepath($this) : false) : - $this->compiled_filepath; - } - - /** - * Returns the timpestamp of the compiled template - * - * @return integer the template timestamp - */ - public function getCompiledTimestamp () - { - return $this->compiled_timestamp === null ? - ($this->compiled_timestamp = (!$this->resource_object->isEvaluated && file_exists($this->getCompiledFilepath())) ? filemtime($this->getCompiledFilepath()) : false) : - $this->compiled_timestamp; - } - - /** - * Returns the compiled template - * - * It checks if the template must be compiled or just read from the template resource - * - * @return string the compiled template - */ - public function getCompiledTemplate () - { - if ($this->compiled_template === null) { - // see if template needs compiling. - if ($this->mustCompile()) { - $this->compileTemplateSource(); - } else { - if ($this->compiled_template === null) { - $this->compiled_template = !$this->resource_object->isEvaluated && $this->resource_object->usesCompiler ? file_get_contents($this->getCompiledFilepath()) : false; - } - } - } - return $this->compiled_template; - } - - /** * Compiles the template * * If the template is not evaluated the compiled template is saved on disk */ - public function compileTemplateSource () + public function compileTemplateSource() { - if (!$this->resource_object->isEvaluated) { + if (!$this->source->recompiled) { $this->properties['file_dependency'] = array(); - $this->properties['file_dependency'][$this->templateUid] = array($this->getTemplateFilepath(), $this->getTemplateTimestamp(),$this->resource_type); + if ($this->source->components) { + // 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); + } } if ($this->smarty->debugging) { Smarty_Internal_Debug::start_compile($this); } - // compile template - if (!is_object($this->compiler_object)) { - // load compiler - $this->smarty->loadPlugin($this->resource_object->compiler_class); - $this->compiler_object = new $this->resource_object->compiler_class($this->resource_object->template_lexer_class, $this->resource_object->template_parser_class, $this->smarty); - } // compile locking - if ($this->smarty->compile_locking && !$this->resource_object->isEvaluated) { - if ($saved_timestamp = $this->getCompiledTimestamp()) { - touch($this->getCompiledFilepath()); + if ($this->smarty->compile_locking && !$this->source->recompiled) { + if ($saved_timestamp = $this->compiled->timestamp) { + touch($this->compiled->filepath); } } // call compiler try { - $this->compiler_object->compileTemplate($this); - } - catch (Exception $e) { + $code = $this->compiler->compileTemplate($this); + } catch (Exception $e) { // restore old timestamp in case of error - if ($this->smarty->compile_locking && !$this->resource_object->isEvaluated && $saved_timestamp) { - touch($this->getCompiledFilepath(), $saved_timestamp); + if ($this->smarty->compile_locking && !$this->source->recompiled && $saved_timestamp) { + touch($this->compiled->filepath, $saved_timestamp); } throw $e; } // compiling succeded - if (!$this->resource_object->isEvaluated && $this->write_compiled_code) { + if (!$this->source->recompiled && $this->compiler->write_compiled_code) { // write compiled template - Smarty_Internal_Write_File::writeFile($this->getCompiledFilepath(), $this->compiled_template, $this->smarty); + $_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; } if ($this->smarty->debugging) { Smarty_Internal_Debug::end_compile($this); } - // release objects to free memory - Smarty_Internal_TemplateCompilerBase::$_tag_objects = array(); - unset($this->compiler_object->parser->root_buffer, - $this->compiler_object->parser->current_buffer, - $this->compiler_object->parser, - $this->compiler_object->lex, - $this->compiler_object->template - ); - $this->compiler_object = null; - } - - /** - * Returns the filepath of the cached template output - * - * The filepath is determined by the actual cache resource - * - * @return string the cache filepath - */ - public function getCachedFilepath () - { - return $this->cached_filepath === null ? - $this->cached_filepath = ($this->resource_object->isEvaluated || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) ? false : $this->cache_resource_object->getCachedFilepath($this) : - $this->cached_filepath; - } - - /** - * Returns the timpestamp of the cached template output - * - * The timestamp is determined by the actual cache resource - * - * @return integer the template timestamp - */ - public function getCachedTimestamp () - { - return $this->cached_timestamp === null ? - $this->cached_timestamp = ($this->resource_object->isEvaluated || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) ? false : $this->cache_resource_object->getCachedTimestamp($this) : - $this->cached_timestamp; - } - - /** - * Returns the cached template output - * - * @return string |booelan the template content or false if the file does not exist - */ - public function getCachedContent () - { - return $this->rendered_content === null ? - $this->rendered_content = ($this->resource_object->isEvaluated || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) ? false : $this->cache_resource_object->getCachedContents($this) : - $this->rendered_content; + // release compiler object to free memory + unset($this->compiler); } /** * Writes the cached template output + * + * @return bool */ - public function writeCachedContent ($content) + public function writeCachedContent($content) { - if ($this->resource_object->isEvaluated || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) { + if ($this->source->recompiled || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) { // don't write cache file return false; } $this->properties['cache_lifetime'] = $this->cache_lifetime; - return $this->cache_resource_object->writeCachedContent($this, $this->createPropertyHeader(true) .$content); + $this->properties['unifunc'] = 'content_' . uniqid(); + $content = $this->createTemplateCodeFrame($content, true); + $_smarty_tpl = $this; + eval("?>" . $content); + $this->cached->valid = true; + $this->cached->processed = true; + return $this->cached->write($this, $content); } /** - * Checks of a valid version redered HTML output is in the cache - * - * If the cache is valid the contents is stored in the template object + * Template code runtime function to get subtemplate content * - * @return boolean true if cache is valid + * @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 $vars optional variables to assign + * @param int $parent_scope scope in which {include} should execute + * @returns string template content */ - public function isCached ($template = null, $cache_id = null, $compile_id = null, $parent = null) + public function getSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope) { - if ($template === null) { - $no_render = true; - } elseif ($template === false) { - $no_render = false; - } else { - if ($parent === null) { - $parent = $this; - } - $this->smarty->isCached ($template, $cache_id, $compile_id, $parent); - } - if ($this->isCached === null) { - $this->isCached = false; - if (($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED) && !$this->resource_object->isEvaluated) { - $cachedTimestamp = $this->getCachedTimestamp(); - if ($cachedTimestamp === false || $this->smarty->force_compile || $this->smarty->force_cache) { - return $this->isCached; - } - if ($this->caching === Smarty::CACHING_LIFETIME_SAVED || ($this->caching == Smarty::CACHING_LIFETIME_CURRENT && (time() <= ($cachedTimestamp + $this->cache_lifetime) || $this->cache_lifetime < 0))) { - if ($this->smarty->debugging) { - Smarty_Internal_Debug::start_cache($this); - } - $this->rendered_content = $this->cache_resource_object->getCachedContents($this, $no_render); - if ($this->smarty->debugging) { - Smarty_Internal_Debug::end_cache($this); - } - if ($this->cacheFileChecked) { - $this->isCached = true; - return $this->isCached; - } - $this->cacheFileChecked = true; - if ($this->caching === Smarty::CACHING_LIFETIME_SAVED && $this->properties['cache_lifetime'] >= 0 && (time() > ($this->getCachedTimestamp() + $this->properties['cache_lifetime']))) { - $this->tpl_vars = array(); - $this->tpl_vars['smarty'] = new Smarty_Variable; - $this->rendered_content = null; - return $this->isCached; - } - if (!empty($this->properties['file_dependency']) && $this->smarty->compile_check) { - $resource_type = null; - $resource_name = null; - foreach ($this->properties['file_dependency'] as $_file_to_check) { - If ($_file_to_check[2] == 'file' || $_file_to_check[2] == 'extends' || $_file_to_check[2] == 'php') { - $mtime = filemtime($_file_to_check[0]); - } else { - $this->getResourceTypeName($_file_to_check[0], $resource_type, $resource_name); - $resource_handler = $this->loadTemplateResourceHandler($resource_type); - $mtime = $resource_handler->getTemplateTimestampTypeName($resource_type, $resource_name); - } - // If ($mtime > $this->getCachedTimestamp()) { - If ($mtime > $_file_to_check[1]) { - $this->tpl_vars = array(); - $this->tpl_vars['smarty'] = new Smarty_Variable; - $this->rendered_content = null; - return $this->isCached; - } - } - } - $this->isCached = true; - } - } - } - return $this->isCached; - } - - /** - * Render the output using the compiled template or the PHP template source - * - * The rendering process is accomplished by just including the PHP files. - * The only exceptions are evaluated templates (string template). Their code has - * to be evaluated - */ - public function renderTemplate () - { - if ($this->resource_object->usesCompiler) { - if ($this->mustCompile() && $this->compiled_template === null) { - $this->compileTemplateSource(); - } - if ($this->smarty->debugging) { - Smarty_Internal_Debug::start_render($this); - } - $_smarty_tpl = $this; - ob_start(); - if ($this->resource_object->isEvaluated) { - eval("?>" . $this->compiled_template); - } else { - include($this->getCompiledFilepath ()); - // check file dependencies at compiled code - if ($this->smarty->compile_check) { - if (!empty($this->properties['file_dependency'])) { - $this->mustCompile = false; - $resource_type = null; - $resource_name = null; - foreach ($this->properties['file_dependency'] as $_file_to_check) { - If ($_file_to_check[2] == 'file' || $_file_to_check[2] == 'extends' || $_file_to_check[2] == 'php') { - $mtime = filemtime($_file_to_check[0]); - } else { - $this->getResourceTypeName($_file_to_check[0], $resource_type, $resource_name); - $resource_handler = $this->loadTemplateResourceHandler($resource_type); - $mtime = $resource_handler->getTemplateTimestampTypeName($resource_type, $resource_name); - } - // If ($mtime != $_file_to_check[1]) { - If ($mtime > $_file_to_check[1]) { - $this->mustCompile = true; - break; - } - } - if ($this->mustCompile) { - // recompile and render again - ob_get_clean(); - $this->compileTemplateSource(); - ob_start(); - include($this->getCompiledFilepath ()); - } - } - } - } + // already in template cache? + $_templateId = sha1($template . $cache_id . $compile_id); + 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; + $tpl->caching = $caching; + $tpl->cache_lifetime = $cache_lifetime; } else { - if (is_callable(array($this->resource_object, 'renderUncompiled'))) { - if ($this->smarty->debugging) { - Smarty_Internal_Debug::start_render($this); - } - ob_start(); - $this->resource_object->renderUncompiled($this); - } else { - throw new SmartyException("Resource '$this->resource_type' must have 'renderUncompiled' methode"); - } - } - $this->rendered_content = ob_get_clean(); - if (!$this->resource_object->isEvaluated && empty($this->properties['file_dependency'][$this->templateUid])) { - $this->properties['file_dependency'][$this->templateUid] = array($this->getTemplateFilepath(), $this->getTemplateTimestamp(),$this->resource_type); + $tpl = new $this->smarty->template_class($template, $this->smarty, $this, $cache_id, $compile_id, $caching, $cache_lifetime); } - if ($this->parent instanceof Smarty_Internal_Template) { - $this->parent->properties['file_dependency'] = array_merge($this->parent->properties['file_dependency'], $this->properties['file_dependency']); - 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; - } - } - } - } - if ($this->smarty->debugging) { - Smarty_Internal_Debug::end_render($this); - } - // write to cache when nessecary - if (!$this->resource_object->isEvaluated && ($this->caching == Smarty::CACHING_LIFETIME_SAVED || $this->caching == Smarty::CACHING_LIFETIME_CURRENT)) { - if ($this->smarty->debugging) { - Smarty_Internal_Debug::start_cache($this); - } - $this->properties['has_nocache_code'] = false; - // get text between non-cached items - $cache_split = preg_split("!/\*%%SmartyNocache:{$this->properties['nocache_hash']}%%\*\/(.+?)/\*/%%SmartyNocache:{$this->properties['nocache_hash']}%%\*/!s", $this->rendered_content); - // get non-cached items - preg_match_all("!/\*%%SmartyNocache:{$this->properties['nocache_hash']}%%\*\/(.+?)/\*/%%SmartyNocache:{$this->properties['nocache_hash']}%%\*/!s", $this->rendered_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|<\?|\?>)/', '<?php echo \'$1\'; ?>', $curr_split); - if (isset($cache_parts[0][$curr_idx])) { - $this->properties['has_nocache_code'] = true; - // remove nocache tags from cache output - $output .= preg_replace("!/\*/?%%SmartyNocache:{$this->properties['nocache_hash']}%%\*/!", '', $cache_parts[0][$curr_idx]); - } - } - if (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output'])) { - $output = Smarty_Internal_Filter_Handler::runFilter('output', $output, $this); - } - // rendering (must be done before writing cache file because of {function} nocache handling) - $_smarty_tpl = $this; - ob_start(); - eval("?>" . $output); - $this->rendered_content = ob_get_clean(); - // write cache file content - $this->writeCachedContent('<?php if (!$no_render) {?>'. $output. '<?php } ?>'); - if ($this->smarty->debugging) { - Smarty_Internal_Debug::end_cache($this); - } + // get variables from calling scope + if ($parent_scope == Smarty::SCOPE_LOCAL) { + $tpl->tpl_vars = $this->tpl_vars; + } 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 { - // var_dump('renderTemplate', $this->has_nocache_code, $this->template_resource, $this->properties['nocache_hash'], $this->parent->properties['nocache_hash'], $this->rendered_content); - if ($this->has_nocache_code && !empty($this->properties['nocache_hash']) && !empty($this->parent->properties['nocache_hash'])) { - // replace nocache_hash - $this->rendered_content = preg_replace("/{$this->properties['nocache_hash']}/", $this->parent->properties['nocache_hash'], $this->rendered_content); - $this->parent->has_nocache_code = $this->has_nocache_code; - } + $tpl->tpl_vars = &$scope_ptr->tpl_vars; } - } - - /** - * Returns the rendered HTML output - * - * If the cache is valid the cached content is used, otherwise - * the output is rendered from the compiled template or PHP template source - * - * @return string rendered HTML output - */ - public function getRenderedTemplate () - { - // disable caching for evaluated code - if ($this->resource_object->isEvaluated) { - $this->caching = false; - } - // checks if template exists - $this->isExisting(true); - // read from cache or render - if ($this->rendered_content === null) { - if ($this->isCached) { - if ($this->smarty->debugging) { - Smarty_Internal_Debug::start_cache($this); - } - $this->rendered_content = $this->cache_resource_object->getCachedContents($this, false); - if ($this->smarty->debugging) { - Smarty_Internal_Debug::end_cache($this); + $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->isCached === null) { - $this->isCached(false); - } - if (!$this->isCached) { - // render template (not loaded and not in cache) - $this->renderTemplate(); - } } - $this->updateParentVariables(); - $this->isCached = null; - return $this->rendered_content; + return $tpl->fetch(null, null, null, null, false, false); } /** - * Parse a template resource in its name and type - * Load required resource handler + * Template code runtime function to set up an inline subtemplate * - * @param string $template_resource template resource specification - * @param string $resource_type return resource type - * @param string $resource_name return resource name - * @param object $resource_handler return resource handler object + * @param string $template the resource handle of the template file + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param integer $caching cache mode + * @param integer $cache_lifetime life time of cache data + * @param array $vars optional variables to assign + * @param int $parent_scope scope in which {include} should execute + * @param string $hash nocache hash code + * @returns string template content */ - public function parseResourceName($template_resource, &$resource_type, &$resource_name, &$resource_handler) + public function setupInlineSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope, $hash) { - if (empty($template_resource)) - return false; - $this->getResourceTypeName($template_resource, $resource_type, $resource_name); - $resource_handler = $this->loadTemplateResourceHandler($resource_type); - // cache template object under a unique ID - // do not cache eval resources - if ($resource_type != 'eval') { - $this->smarty->template_objects[sha1($this->template_resource . $this->cache_id . $this->compile_id)] = $this; - } - return true; - } - - /** - * get system filepath to template - */ - public function buildTemplateFilepath ($file = null) - { - if ($file == null) { - $file = $this->resource_name; - } - // relative file name? - if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) { - foreach((array)$this->smarty->template_dir as $_template_dir) { - if (strpos('/\\', substr($_template_dir, -1)) === false) { - $_template_dir .= DS; - } - $_filepath = $_template_dir . $file; - if (file_exists($_filepath)) { - return $_filepath; - } - if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_template_dir)) { - // try PHP include_path - if (($_filepath = Smarty_Internal_Get_Include_Path::getIncludePath($_filepath)) !== false) { - return $_filepath; - } - } - } - } - // try absolute filepath - if (file_exists($file)) return $file; - // no tpl file found - if (!empty($this->smarty->default_template_handler_func)) { - if (!is_callable($this->smarty->default_template_handler_func)) { - throw new SmartyException("Default template handler not callable"); - } else { - $_return = call_user_func_array($this->smarty->default_template_handler_func, - array($this->resource_type, $this->resource_name, &$this->template_source, &$this->template_timestamp, $this)); - if (is_string($_return)) { - return $_return; - } elseif ($_return === true) { - return $file; - } - } + $tpl = new $this->smarty->template_class($template, $this->smarty, $this, $cache_id, $compile_id, $caching, $cache_lifetime); + $tpl->properties['nocache_hash'] = $hash; + // get variables from calling scope + if ($parent_scope == Smarty::SCOPE_LOCAL ) { + $tpl->tpl_vars = $this->tpl_vars; + } 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; } - return false; - } - - /** - * Update Smarty variables in other scopes - */ - public function updateParentVariables ($scope = Smarty::SCOPE_LOCAL) - { - $has_root = false; - foreach ($this->tpl_vars as $_key => $_variable) { - $_variable_scope = $this->tpl_vars[$_key]->scope; - if (($scope == Smarty::SCOPE_LOCAL && $_variable_scope == Smarty::SCOPE_LOCAL) || $_key == 'smarty') { - continue; - } - if (isset($this->parent) && ($scope == Smarty::SCOPE_PARENT || $_variable_scope == Smarty::SCOPE_PARENT)) { - if (isset($this->parent->tpl_vars[$_key])) { - // variable is already defined in parent, copy value - $this->parent->tpl_vars[$_key]->value = $this->tpl_vars[$_key]->value; - } else { - // create variable in parent - $this->parent->tpl_vars[$_key] = clone $_variable; - $this->parent->tpl_vars[$_key]->scope = Smarty::SCOPE_LOCAL; - } - } - if ($scope == Smarty::SCOPE_ROOT || $_variable_scope == Smarty::SCOPE_ROOT) { - if ($this->parent == null) { - continue; - } - if (!$has_root) { - // find root - $root_ptr = $this; - while ($root_ptr->parent != null) { - $root_ptr = $root_ptr->parent; - $has_root = true; - } - } - if (isset($root_ptr->tpl_vars[$_key])) { - // variable is already defined in root, copy value - $root_ptr->tpl_vars[$_key]->value = $this->tpl_vars[$_key]->value; - } else { - // create variable in root - $root_ptr->tpl_vars[$_key] = clone $_variable; - $root_ptr->tpl_vars[$_key]->scope = Smarty::SCOPE_LOCAL; - } - } - if ($scope == Smarty::SCOPE_GLOBAL || $_variable_scope == Smarty::SCOPE_GLOBAL) { - if (isset(Smarty::$global_tpl_vars[$_key])) { - // variable is already defined in root, copy value - Smarty::$global_tpl_vars[$_key]->value = $this->tpl_vars[$_key]->value; - } else { - // create global variable - Smarty::$global_tpl_vars[$_key] = clone $_variable; - } - Smarty::$global_tpl_vars[$_key]->scope = Smarty::SCOPE_LOCAL; + $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); } } + return $tpl; } - /** - * Split a template resource in its name and type - * - * @param string $template_resource template resource specification - * @param string $resource_type return resource type - * @param string $resource_name return resource name - */ - protected function getResourceTypeName ($template_resource, &$resource_type, &$resource_name) - { - if (strpos($template_resource, ':') === false) { - // no resource given, use default - $resource_type = $this->smarty->default_resource_type; - $resource_name = $template_resource; - } else { - // get type and name from path - list($resource_type, $resource_name) = explode(':', $template_resource, 2); - if (strlen($resource_type) == 1) { - // 1 char is not resource type, but part of filepath - $resource_type = 'file'; - $resource_name = $template_resource; - } - } - } /** - * Load template resource handler by type + * Create code frame for compiled and cached templates * - * @param string $resource_type template resource type - * @return object resource handler object - */ - protected function loadTemplateResourceHandler ($resource_type) - { - // try registered resource - if (isset($this->smarty->registered_resources[$resource_type])) { - return new Smarty_Internal_Resource_Registered($this); - } else { - // try sysplugins dir - if (in_array($resource_type, array('file', 'string', 'extends', 'php', 'stream', 'eval'))) { - $_resource_class = 'Smarty_Internal_Resource_' . ucfirst($resource_type); - return new $_resource_class($this->smarty); - } else { - // try plugins dir - $_resource_class = 'Smarty_Resource_' . ucfirst($resource_type); - if ($this->smarty->loadPlugin($_resource_class)) { - if (class_exists($_resource_class, false)) { - return new $_resource_class($this->smarty); - } else { - return new Smarty_Internal_Resource_Registered($this, $resource_type); - } - } else { - // try streams - $_known_stream = stream_get_wrappers(); - if (in_array($resource_type, $_known_stream)) { - // is known stream - if (is_object($this->smarty->security_policy)) { - $this->smarty->security_policy->isTrustedStream($resource_type); - } - return new Smarty_Internal_Resource_Stream($this->smarty); - } else { - throw new SmartyException('Unkown resource type \'' . $resource_type . '\''); - } - } - } - } - } - - /** - * Create property header + * @param string $content optional template content + * @param bool $cache flag for cache file + * @return string */ - public function createPropertyHeader ($cache = false) + public function createTemplateCodeFrame($content = '', $cache = false) { $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) { + foreach ($this->required_plugins['compiled'] as $tmp) { + foreach ($tmp as $data) { $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$data['file']}';\n"; } } @@ -784,9 +338,9 @@ class Smarty_Internal_Template extends Smarty_Internal_Data { } if (!empty($this->required_plugins['nocache'])) { $this->has_nocache_code = true; - $plugins_string .= "<?php echo '/*%%SmartyNocache:{$this->properties['nocache_hash']}%%*/<?php "; - foreach($this->required_plugins['nocache'] as $tmp) { - foreach($tmp as $data) { + $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) { $plugins_string .= "if (!is_callable(\'{$data['function']}\')) include \'{$data['file']}\';\n"; } } @@ -795,9 +349,12 @@ class Smarty_Internal_Template extends Smarty_Internal_Data { } // build property code $this->properties['has_nocache_code'] = $this->has_nocache_code; - $properties_string = "<?php /*%%SmartyHeaderCode:{$this->properties['nocache_hash']}%%*/" ; - if ($this->smarty->direct_access_security) { - $properties_string .= "if(!defined('SMARTY_DIR')) exit('no direct access allowed');\n"; + $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 ($cache) { // remove compiled code of{function} definition @@ -812,14 +369,35 @@ class Smarty_Internal_Template extends Smarty_Internal_Data { } } } - $properties_string .= "\$_smarty_tpl->decodeProperties(" . var_export($this->properties, true) . "); /*/%%SmartyHeaderCode%%*/?>\n"; - return $properties_string . $plugins_string; + $this->properties['version'] = Smarty::SMARTY_VERSION; + if (!isset($this->properties['unifunc'])) { + $this->properties['unifunc'] = 'content_' . uniqid(); + } + if (!$this->source->recompiled) { + $output .= "\$_valid = \$_smarty_tpl->decodeProperties(" . var_export($this->properties, true) . ',' . ($cache ? 'true' : 'false') . "); /*/%%SmartyHeaderCode%%*/?>\n"; + } + if (!$this->source->recompiled) { + $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 }} ?>'; + } + return $output; } /** - * Decode saved properties from compiled template and cache files + * This function is executed automatically when a compiled or cached template file is included + * + * - Decode saved properties from compiled template and cache files + * - Check if compiled or cache file is valid + * + * @param array $properties special template properties + * @param bool $cache flag if called from cache file + * @return bool flag if compiled or cache file is valid */ - public function decodeProperties ($properties) + public function decodeProperties($properties, $cache = false) { $this->has_nocache_code = $properties['has_nocache_code']; $this->properties['nocache_hash'] = $properties['nocache_hash']; @@ -833,31 +411,114 @@ class Smarty_Internal_Template extends Smarty_Internal_Data { $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 + $is_valid = true; + if ($this->properties['version'] != Smarty::SMARTY_VERSION) { + $is_valid = false; + } else if (((!$cache && $this->smarty->compile_check && empty($this->compiled->_properties)) || $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) { + 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]); + } + } elseif ($_file_to_check[2] == 'string') { + continue; + } else { + $source = Smarty_Resource::source($this, $this->smarty, $_file_to_check[0]); + $mtime = $source->timestamp; + } + if ($mtime > $_file_to_check[1]) { + $is_valid = false; + break; + } + } + } + if ($cache) { + $this->cached->valid = $is_valid; + } else { + $this->mustCompile = !$is_valid; + } + // store data in reusable Smarty_Template_Compiled + if (!$cache) { + $this->compiled->_properties = $properties; + } + return $is_valid; } /** - * creates a local Smarty variable for array assignments + * Template code runtime function to create a local Smarty variable for array assignments + * + * @param string $tpl_var tempate 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])) { - $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(array(), $nocache, $scope); - } else { - $this->tpl_vars[$tpl_var] = clone $tpl_var_inst; - if ($scope != Smarty::SCOPE_LOCAL) { - $this->tpl_vars[$tpl_var]->scope = $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) { + $this->tpl_vars[$tpl_var]->scope = $scope; + } + if (!(is_array($this->tpl_vars[$tpl_var]->value) || $this->tpl_vars[$tpl_var]->value instanceof ArrayAccess)) { + settype($this->tpl_vars[$tpl_var]->value, 'array'); } } - if (!(is_array($this->tpl_vars[$tpl_var]->value) || $this->tpl_vars[$tpl_var]->value instanceof ArrayAccess)) { - settype($this->tpl_vars[$tpl_var]->value, 'array'); + } + + /** + * Template code runtime function to get pointer to template variable array of requested scope + * + * @param int $scope requested variable scope + * @return array array of template variables + */ + public function &getScope($scope) + { + if ($scope == Smarty::SCOPE_PARENT && !empty($this->parent)) { + return $this->parent->tpl_vars; + } elseif ($scope == Smarty::SCOPE_ROOT && !empty($this->parent)) { + $ptr = $this->parent; + while (!empty($ptr->parent)) { + $ptr = $ptr->parent; + } + return $ptr->tpl_vars; + } elseif ($scope == Smarty::SCOPE_GLOBAL) { + return Smarty::$global_tpl_vars; } + $null = null; + return $null; + } + + /** + * Get parent or root of template parent chain + * + * @param int $scope pqrent or root scope + * @return mixed object + */ + public function getScopePointer($scope) + { + if ($scope == Smarty::SCOPE_PARENT && !empty($this->parent)) { + return $this->parent; + } elseif ($scope == Smarty::SCOPE_ROOT && !empty($this->parent)) { + $ptr = $this->parent; + while (!empty($ptr->parent)) { + $ptr = $ptr->parent; + } + return $ptr; + } + return null; } /** * [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 */ @@ -865,11 +526,12 @@ class Smarty_Internal_Template extends Smarty_Internal_Data { { if (is_array($value) === true || $value instanceof Countable) { return count($value); + } elseif ($value instanceof IteratorAggregate) { + // Note: getIterator() returns a Traversable, not an Iterator + // thus rewind() and valid() methods may not be present + return iterator_count($value->getIterator()); } elseif ($value instanceof Iterator) { - $value->rewind(); - if ($value->valid()) { - return iterator_count($value); - } + return iterator_count($value); } elseif ($value instanceof PDOStatement) { return $value->rowCount(); } elseif ($value instanceof Traversable) { @@ -878,125 +540,96 @@ class Smarty_Internal_Template extends Smarty_Internal_Data { if ($value->offsetExists(0)) { return 1; } - } elseif (is_object($value)) { + } elseif (is_object($value)) { return count($value); - } - return 0; - } - - /** - * wrapper for fetch - */ - public function fetch ($template = null, $cache_id = null, $compile_id = null, $parent = null, $display = false) - { - if ($template == null) { - return $this->smarty->fetch($this); - } else { - if (!isset($parent)) { - $parent = $this; - } - return $this->smarty->fetch($template, $cache_id, $compile_id, $parent, $display); } - - } - - /** - * wrapper for display - */ - public function display ($template = null, $cache_id = null, $compile_id = null, $parent = null) - { - if ($template == null) { - return $this->smarty->display($this); - } else { - if (!isset($parent)) { - $parent = $this; - } - return $this->smarty->display($template, $cache_id, $compile_id, $parent); - } - + return 0; } /** * set Smarty property in template context + * * @param string $property_name property name - * @param mixed $value value + * @param mixed $value value */ public function __set($property_name, $value) { - if ($property_name == 'resource_object' || $property_name == 'cache_resource_object') { - $this->$property_name = $value; - } elseif (property_exists($this->smarty, $property_name)) { - $this->smarty->$property_name = $value; - } else { - throw new SmartyException("invalid template property '$property_name'."); + switch ($property_name) { + case 'source': + case 'compiled': + case 'cached': + case 'compiler': + $this->$property_name = $value; + return; + + // FIXME: routing of template -> smarty attributes + default: + if (property_exists($this->smarty, $property_name)) { + $this->smarty->$property_name = $value; + return; + } } + + throw new SmartyException("invalid template property '$property_name'."); } /** * get Smarty property in template context + * * @param string $property_name property name */ public function __get($property_name) { - if ($property_name == 'resource_object') { - // load template resource - $this->resource_object = null; - if (!$this->parseResourceName ($this->template_resource, $this->resource_type, $this->resource_name, $this->resource_object)) { - throw new SmartyException ("Unable to parse resource name \"{$this->template_resource}\""); - } - return $this->resource_object; - } - if ($property_name == 'cache_resource_object') { - // load cache resource - $this->cache_resource_object = $this->loadCacheResource(); - return $this->cache_resource_object; - } - if (property_exists($this->smarty, $property_name)) { - return $this->smarty->$property_name; - } else { - throw new SmartyException("template property '$property_name' does not exist."); + switch ($property_name) { + case 'source': + if (empty($this->template_resource)) { + throw new SmartyException("Unable to parse resource name \"{$this->template_resource}\""); + } + $this->source = Smarty_Resource::source($this); + // cache template object under a unique ID + // do not cache eval resources + if ($this->source->type != 'eval') { + $this->smarty->template_objects[sha1($this->template_resource . $this->cache_id . $this->compile_id)] = $this; + } + return $this->source; + + case 'compiled': + $this->compiled = $this->source->getCompiled($this); + 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); + 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); + return $this->compiler; + + // FIXME: routing of template -> smarty attributes + default: + if (property_exists($this->smarty, $property_name)) { + return $this->smarty->$property_name; + } } - } + throw new SmartyException("template property '$property_name' does not exist."); + } /** - * Takes unknown class methods and lazy loads sysplugin files for them - * class name format: Smarty_Method_MethodName - * plugin filename format: method.methodname.php + * Template data object destrutor * - * @param string $name unknown methode name - * @param array $args aurgument array */ - public function __call($name, $args) + public function __destruct() { - static $camel_func; - if (!isset($camel_func)) - $camel_func = create_function('$c', 'return "_" . strtolower($c[1]);'); - // see if this is a set/get for a property - $first3 = strtolower(substr($name, 0, 3)); - if (in_array($first3, array('set', 'get')) && substr($name, 3, 1) !== '_') { - // 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])/', $camel_func, $property_name); - if (property_exists($this, $property_name)) { - if ($first3 == 'get') - return $this->$property_name; - else - return $this->$property_name = $args[0]; - } + if ($this->smarty->cache_locking && isset($this->cached) && $this->cached->is_locked) { + $this->cached->handler->releaseLock($this->smarty, $this->cached); } - // Smarty Backward Compatible wrapper - if (strpos($name,'_') !== false) { - if (!isset($this->wrapper)) { - $this->wrapper = new Smarty_Internal_Wrapper($this); - } - return $this->wrapper->convert($name, $args); - } - // pass call to Smarty object - return call_user_func_array(array($this->smarty,$name),$args); } } + ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_templatebase.php b/libs/sysplugins/smarty_internal_templatebase.php new file mode 100644 index 00000000..de056fa2 --- /dev/null +++ b/libs/sysplugins/smarty_internal_templatebase.php @@ -0,0 +1,697 @@ +<?php
+/**
+ * Smarty Internal Plugin Smarty Template Base
+ *
+ * This file contains the basic shared methodes for template handling
+ *
+ * @package Smarty
+ * @subpackage Template
+ * @author Uwe Tews
+ */
+
+/**
+ * Class with shared template methodes
+ *
+ * @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
+ * @return string rendered template output
+ */
+ public function fetch($template = null, $cache_id = null, $compile_id = null, $parent = null, $display = false, $merge_tpl_vars = true)
+ {
+ if ($template === null && $this instanceof $this->template_class) {
+ $template = $this;
+ }
+ if (!empty($cache_id) && is_object($cache_id)) {
+ $parent = $cache_id;
+ $cache_id = null;
+ }
+ if ($parent === null && $this instanceof Smarty) {
+ // get default Smarty data object
+ $parent = $this;
+ }
+ // create template object if necessary
+ $_template = ($template instanceof $this->template_class)
+ ? $template
+ : $this->createTemplate($template, $cache_id, $compile_id, $parent, false);
+ // 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;
+ }
+ }
+ }
+ // get rendered template
+ // disable caching for evaluated code
+ if ($_template->source->recompiled) {
+ $_template->caching = false;
+ }
+ // checks if template exists
+ if (!$_template->source->exists) {
+ throw new SmartyException("Unable to load template {$_template->source->type} '{$_template->source->name}'");
+ }
+ // 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) {
+ $_smarty_tpl = $_template;
+ if ($_template->source->recompiled) {
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_compile($_template);
+ }
+ $code = $_template->compiler->compileTemplate($_template);
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_compile($_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();
+ }
+ 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();
+ include($_template->compiled->filepath);
+ }
+ $_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}'");
+ }
+ $_template->properties['unifunc']($_template);
+ } 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|<\?|\?>)/', '<?php echo \'$1\'; ?>', $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 (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)
+ $_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 ($_template->has_nocache_code && !empty($_template->properties['nocache_hash']) && !empty($_template->parent->properties['nocache_hash'])) {
+ // replace nocache_hash
+ $_output = preg_replace("/{$_template->properties['nocache_hash']}/", $_template->parent->properties['nocache_hash'], $_output);
+ $_template->parent->has_nocache_code = $_template->has_nocache_code;
+ }
+ }
+ } else {
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_cache($_template);
+ }
+ try {
+ ob_start();
+ $_template->properties['unifunc']($_template);
+ $_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->source->recompiled) && (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('HTTP/1.1 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($this);
+ }
+ 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
+ * @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);
+ }
+ }
+
+ /**
+ * Unregister Plugin
+ *
+ * @param string $type of plugin
+ * @param string $tag name of plugin
+ */
+ public function unregisterPlugin($type, $tag)
+ {
+ if (isset($this->smarty->registered_plugins[$type][$tag])) {
+ unset($this->smarty->registered_plugins[$type][$tag]);
+ }
+ }
+
+ /**
+ * 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)
+ */
+ public function registerResource($type, $callback)
+ {
+ $this->smarty->registered_resources[$type] = $callback instanceof Smarty_Resource ? $callback : array($callback, false);
+ }
+
+ /**
+ * Unregisters a resource
+ *
+ * @param string $type name of resource type
+ */
+ public function unregisterResource($type)
+ {
+ if (isset($this->smarty->registered_resources[$type])) {
+ unset($this->smarty->registered_resources[$type]);
+ }
+ }
+
+ /**
+ * 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
+ */
+ public function registerCacheResource($type, Smarty_CacheResource $callback)
+ {
+ $this->smarty->registered_cache_resources[$type] = $callback;
+ }
+
+ /**
+ * Unregisters a cache resource
+ *
+ * @param string $type name of cache resource type
+ */
+ public function unregisterCacheResource($type)
+ {
+ if (isset($this->smarty->registered_cache_resources[$type])) {
+ unset($this->smarty->registered_cache_resources[$type]);
+ }
+ }
+
+ /**
+ * 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 array $block_methods list of block-methods
+ * @param array $block_functs list of methods that are block format
+ * @throws SmartyException if any of the methods in $allowed or $block_methods are invalid
+ */
+ public function registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+ {
+ // test if allowed methodes callable
+ if (!empty($allowed)) {
+ foreach ((array) $allowed as $method) {
+ if (!is_callable(array($object_impl, $method))) {
+ throw new SmartyException("Undefined method '$method' in registered object");
+ }
+ }
+ }
+ // test if block methodes 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 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
+ * @throws SmartyException if no such object is found
+ */
+ public function unregisterObject($name)
+ {
+ unset($this->smarty->registered_objects[$name]);
+ return;
+ }
+
+ /**
+ * Registers static classes to be used in templates
+ *
+ * @param string $class name of template class
+ * @param string $class_impl the referenced PHP class to register
+ * @throws SmartyException if $class_impl does not refer to an existing class
+ */
+ 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;
+ }
+
+ /**
+ * Registers a default plugin handler
+ *
+ * @param callable $callback class/method name
+ * @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");
+ }
+ }
+
+ /**
+ * Registers a default template handler
+ *
+ * @param callable $callback class/method name
+ * @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");
+ }
+ }
+
+ /**
+ * Registers a default template handler
+ *
+ * @param callable $callback class/method name
+ * @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");
+ }
+ }
+
+ /**
+ * Registers a filter function
+ *
+ * @param string $type filter type
+ * @param callback $callback
+ */
+ public function registerFilter($type, $callback)
+ {
+ $this->smarty->registered_filters[$type][$this->_get_filter_name($callback)] = $callback;
+ }
+
+ /**
+ * Unregisters a filter function
+ *
+ * @param string $type filter type
+ * @param callback $callback
+ */
+ 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 internal filter name
+ *
+ * @param callback $function_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
+ * @return bool
+ */
+ 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)) {
+ return $this->smarty->registered_filters[$type][$_filter_name] = $_plugin;
+ }
+ }
+ throw new SmartyException("{$type}filter \"{$name}\" not callable");
+ return false;
+ }
+
+ /**
+ * Handle unknown class methods
+ *
+ * @param string $name unknown method-name
+ * @param array $args argument array
+ */
+ public function __call($name, $args)
+ {
+ static $camel_func;
+ // methode of Smarty object?
+ if (method_exists($this->smarty, $name)) {
+ return call_user_func_array(array($this->smarty, $name), $args);
+ }
+ if (!isset($camel_func))
+ $camel_func = create_function('$c', 'return "_" . strtolower($c[1]);');
+ // see if this is a set/get for a property
+ $first3 = strtolower(substr($name, 0, 3));
+ if (in_array($first3, array('set', 'get')) && substr($name, 3, 1) !== '_') {
+ // 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])/', $camel_func, $property_name);
+ if (property_exists($this, $property_name)) {
+ if ($first3 == 'get')
+ return $this->$property_name;
+ else
+ return $this->$property_name = $args[0];
+ } else if (property_exists($this->smarty, $property_name)) {
+ 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.");
+ return false;
+ }
+ }
+ // must be unknown
+ throw new SmartyException("Call of unknown function '$name'.");
+ }
+
+}
+
+?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_templatecompilerbase.php b/libs/sysplugins/smarty_internal_templatecompilerbase.php index 32da800c..53948aba 100644 --- a/libs/sysplugins/smarty_internal_templatecompilerbase.php +++ b/libs/sysplugins/smarty_internal_templatecompilerbase.php @@ -10,19 +10,98 @@ */
/**
- * Main compiler class
+ * Main abstract compiler class
+ *
+ * @package Smarty
+ * @subpackage Compiler
*/
-class Smarty_Internal_TemplateCompilerBase {
- // hash for nocache sections
+abstract class Smarty_Internal_TemplateCompilerBase {
+
+ /**
+ * hash for nocache sections
+ *
+ * @var mixed
+ */
private $nocache_hash = null;
- // suppress generation of nocache code
+ /**
+ * suppress generation of nocache code
+ *
+ * @var bool
+ */
public $suppressNocacheProcessing = false;
- // compile tag objects
- static $_tag_objects = array();
- // tag stack
+ /**
+ * suppress generation of merged template code
+ *
+ * @var bool
+ */
+ public $suppressMergedTemplates = false;
+ /**
+ * compile tag objects
+ *
+ * @var array
+ */
+ public static $_tag_objects = array();
+ /**
+ * tag stack
+ *
+ * @var array
+ */
public $_tag_stack = array();
- // current template
+ /**
+ * current template
+ *
+ * @var Smarty_Internal_Template
+ */
public $template = null;
+ /**
+ * merged templates
+ *
+ * @var array
+ */
+ public $merged_templates = array();
+ /**
+ * flag when compiling {block}
+ *
+ * @var bool
+ */
+ public $inheritance = false;
+ /**
+ * plugins loaded by default plugin handler
+ *
+ * @var array
+ */
+ public $default_handler_plugins = array();
+ /**
+ * saved preprocessed modifier list
+ *
+ * @var mixed
+ */
+ public $default_modifier_list = null;
+ /**
+ * force compilation of complete template as nocache
+ * @var boolean
+ */
+ public $forceNocache = false;
+ /**
+ * suppress Smarty header code in compiled template
+ * @var bool
+ */
+ public $suppressHeader = false;
+ /**
+ * suppress template property header code in compiled template
+ * @var bool
+ */
+ public $suppressTemplatePropertyHeader = false;
+ /**
+ * flag if compiled template file shall we written
+ * @var bool
+ */
+ public $write_compiled_code = true;
+ /**
+ * flags for used modifier plugins
+ * @var array
+ */
+ public $modifier_plugins = array();
/**
* Initialize compiler
@@ -33,12 +112,12 @@ class Smarty_Internal_TemplateCompilerBase { }
/**
- * Methode to compile a Smarty template
+ * Method to compile a Smarty template
*
- * @param $template template object to compile
+ * @param Smarty_Internal_Template $template template object to compile
* @return bool true if compiling succeeded, false if it failed
*/
- public function compileTemplate($template)
+ public function compileTemplate(Smarty_Internal_Template $template)
{
if (empty($template->properties['nocache_hash'])) {
$template->properties['nocache_hash'] = $this->nocache_hash;
@@ -50,47 +129,56 @@ class Smarty_Internal_TemplateCompilerBase { $this->tag_nocache = false;
// save template object in compiler class
$this->template = $template;
- $this->smarty->_current_file = $saved_filepath = $this->template->getTemplateFilepath();
+ $this->smarty->_current_file = $saved_filepath = $this->template->source->filepath;
// template header code
$template_header = '';
- if (!$template->suppressHeader) {
+ if (!$this->suppressHeader) {
$template_header .= "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . "\n";
- $template_header .= " compiled from \"" . $this->template->getTemplateFilepath() . "\" */ ?>\n";
+ $template_header .= " compiled from \"" . $this->template->source->filepath . "\" */ ?>\n";
}
do {
// flag for aborting current and start recompile
$this->abort_and_recompile = false;
// get template source
- $_content = $template->getTemplateSource();
+ $_content = $template->source->content;
// run prefilter if required
if (isset($this->smarty->autoload_filters['pre']) || isset($this->smarty->registered_filters['pre'])) {
- $template->template_source = $_content = Smarty_Internal_Filter_Handler::runFilter('pre', $_content, $template);
+ $template->source->content = $_content = Smarty_Internal_Filter_Handler::runFilter('pre', $_content, $template);
}
// on empty template just return header
if ($_content == '') {
- if ($template->suppressFileDependency) {
- $template->compiled_template = '';
+ if ($this->suppressTemplatePropertyHeader) {
+ $code = '';
} else {
- $template->compiled_template = $template_header . $template->createPropertyHeader();
+ $code = $template_header . $template->createTemplateCodeFrame();
}
- return true;
+ return $code;
}
// call compiler
$_compiled_code = $this->doCompile($_content);
} while ($this->abort_and_recompile);
- // restore original filepath which could have been modified by template inheritance
- $this->template->template_filepath = $saved_filepath;
+ $this->template->source->filepath = $saved_filepath;
+ // free memory
+ unset($this->parser->root_buffer, $this->parser->current_buffer, $this->parser, $this->lex, $this->template);
+ self::$_tag_objects = array();
// return compiled code to template object
- if ($template->suppressFileDependency) {
- $template->compiled_template = $_compiled_code;
+ $merged_code = '';
+ if (!$this->suppressMergedTemplates) {
+ foreach ($this->merged_templates as $code) {
+ $merged_code .= $code;
+ }
+ }
+ if ($this->suppressTemplatePropertyHeader) {
+ $code = $_compiled_code . $merged_code;
} else {
- $template->compiled_template = $template_header . $template->createPropertyHeader() . $_compiled_code;
+ $code = $template_header . $template->createTemplateCodeFrame($_compiled_code) . $merged_code;
}
// run postfilter if required
if (isset($this->smarty->autoload_filters['post']) || isset($this->smarty->registered_filters['post'])) {
- $template->compiled_template = Smarty_Internal_Filter_Handler::runFilter('post', $template->compiled_template, $template);
+ $code = Smarty_Internal_Filter_Handler::runFilter('post', $code, $template);
}
+ return $code;
}
/**
@@ -99,9 +187,9 @@ class Smarty_Internal_TemplateCompilerBase { * This is a call back from the lexer/parser
* It executes the required compile plugin for the Smarty tag
*
- * @param string $tag tag name
- * @param array $args array with tag attributes
- * @param array $parameter array with compilation parameter
+ * @param string $tag tag name
+ * @param array $args array with tag attributes
+ * @param array $parameter array with compilation parameter
* @return string compiled code
*/
public function compileTag($tag, $args, $parameter = array())
@@ -112,12 +200,12 @@ class Smarty_Internal_TemplateCompilerBase { $this->has_output = false;
// log tag/attributes
if (isset($this->smarty->get_used_tags) && $this->smarty->get_used_tags) {
- $this->template->used_tags[] = array($tag,$args);
+ $this->template->used_tags[] = array($tag, $args);
}
- // check nocache option flag
+ // 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)) {
- $this->tag_nocache = true;
+ || 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) {
@@ -156,7 +244,7 @@ class Smarty_Internal_TemplateCompilerBase { if (isset($this->smarty->registered_objects[$tag]) && isset($parameter['object_methode'])) {
$methode = $parameter['object_methode'];
if (!in_array($methode, $this->smarty->registered_objects[$tag][3]) &&
- (empty($this->smarty->registered_objects[$tag][1]) || in_array($methode, $this->smarty->registered_objects[$tag][1]))) {
+ (empty($this->smarty->registered_objects[$tag][1]) || in_array($methode, $this->smarty->registered_objects[$tag][1]))) {
return $this->callTagCompiler('private_object_function', $args, $parameter, $tag, $methode);
} elseif (in_array($methode, $this->smarty->registered_objects[$tag][3])) {
return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag, $methode);
@@ -165,49 +253,42 @@ class Smarty_Internal_TemplateCompilerBase { }
}
// check if tag is registered
- foreach (array(Smarty::PLUGIN_COMPILER, Smarty::PLUGIN_FUNCTION, Smarty::PLUGIN_BLOCK) as $type) {
- if (isset($this->smarty->registered_plugins[$type][$tag])) {
+ foreach (array(Smarty::PLUGIN_COMPILER, Smarty::PLUGIN_FUNCTION, Smarty::PLUGIN_BLOCK) as $plugin_type) {
+ if (isset($this->smarty->registered_plugins[$plugin_type][$tag])) {
// if compiler function plugin call it now
- if ($type == Smarty::PLUGIN_COMPILER) {
+ if ($plugin_type == Smarty::PLUGIN_COMPILER) {
$new_args = array();
- foreach ($args as $key => $mixed) {
- if (is_array($mixed)) {
- $new_args = array_merge($new_args, $mixed);
- } else {
- $new_args[$key] = $mixed;
- }
+ foreach ($args as $mixed) {
+ $new_args = array_merge($new_args, $mixed);
}
- if (!$this->smarty->registered_plugins[$type][$tag][1]) {
+ if (!$this->smarty->registered_plugins[$plugin_type][$tag][1]) {
$this->tag_nocache = true;
}
- $function = $this->smarty->registered_plugins[$type][$tag][0];
+ $function = $this->smarty->registered_plugins[$plugin_type][$tag][0];
if (!is_array($function)) {
return $function($new_args, $this);
} else if (is_object($function[0])) {
- return $this->smarty->registered_plugins[$type][$tag][0][0]->$function[1]($new_args, $this);
+ return $this->smarty->registered_plugins[$plugin_type][$tag][0][0]->$function[1]($new_args, $this);
} else {
- return call_user_func_array($this->smarty->registered_plugins[$type][$tag][0], array($new_args, $this));
+ return call_user_func_array($function, array($new_args, $this));
}
}
// compile registered function or block function
- if ($type == Smarty::PLUGIN_FUNCTION || $type == Smarty::PLUGIN_BLOCK) {
- return $this->callTagCompiler('private_registered_' . $type, $args, $parameter, $tag);
+ if ($plugin_type == Smarty::PLUGIN_FUNCTION || $plugin_type == Smarty::PLUGIN_BLOCK) {
+ return $this->callTagCompiler('private_registered_' . $plugin_type, $args, $parameter, $tag);
}
+
}
}
// check plugins from plugins folder
foreach ($this->smarty->plugin_search_order as $plugin_type) {
- if ($plugin_type == Smarty::PLUGIN_BLOCK && $this->smarty->loadPlugin('smarty_compiler_' . $tag)) {
+ if ($plugin_type == Smarty::PLUGIN_BLOCK && $this->smarty->loadPlugin('smarty_compiler_' . $tag) && (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this))) {
$plugin = 'smarty_compiler_' . $tag;
if (is_callable($plugin)) {
- // convert arguments format for old compiler plugins
+ // convert arguments format for old compiler plugins
$new_args = array();
- foreach ($args as $key => $mixed) {
- if (is_array($mixed)) {
- $new_args = array_merge($new_args, $mixed);
- } else {
- $new_args[$key] = $mixed;
- }
+ foreach ($args as $mixed) {
+ $new_args = array_merge($new_args, $mixed);
}
return $plugin($new_args, $this->smarty);
}
@@ -220,7 +301,47 @@ class Smarty_Internal_TemplateCompilerBase { throw new SmartyException("Plugin \"{$tag}\" not callable");
} else {
if ($function = $this->getPlugin($tag, $plugin_type)) {
- return $this->callTagCompiler('private_' . $plugin_type . '_plugin', $args, $parameter, $tag, $function);
+ if(!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) {
+ return $this->callTagCompiler('private_' . $plugin_type . '_plugin', $args, $parameter, $tag, $function);
+ }
+ }
+ }
+ }
+ if (is_callable($this->smarty->default_plugin_handler_func)) {
+ $found = false;
+ // look for already resolved tags
+ foreach ($this->smarty->plugin_search_order as $plugin_type) {
+ if (isset($this->default_handler_plugins[$plugin_type][$tag])) {
+ $found = true;
+ break;
+ }
+ }
+ if (!$found) {
+ // call default handler
+ foreach ($this->smarty->plugin_search_order as $plugin_type) {
+ if ($this->getPluginFromDefaultHandler($tag, $plugin_type)) {
+ $found = true;
+ break;
+ }
+ }
+ }
+ if ($found) {
+ // if compiler function plugin call it now
+ if ($plugin_type == Smarty::PLUGIN_COMPILER) {
+ $new_args = array();
+ foreach ($args as $mixed) {
+ $new_args = array_merge($new_args, $mixed);
+ }
+ $function = $this->default_handler_plugins[$plugin_type][$tag][0];
+ if (!is_array($function)) {
+ return $function($new_args, $this);
+ } else if (is_object($function[0])) {
+ return $this->default_handler_plugins[$plugin_type][$tag][0][0]->$function[1]($new_args, $this);
+ } else {
+ return call_user_func_array($function, array($new_args, $this));
+ }
+ } else {
+ return $this->callTagCompiler('private_registered_' . $plugin_type, $args, $parameter, $tag);
}
}
}
@@ -237,7 +358,7 @@ class Smarty_Internal_TemplateCompilerBase { }
}
// registered block tag ?
- if (isset($this->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag])) {
+ if (isset($this->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag]) || isset($this->default_handler_plugins[Smarty::PLUGIN_BLOCK][$base_tag])) {
return $this->callTagCompiler('private_registered_block', $args, $parameter, $tag);
}
// block plugin?
@@ -269,11 +390,11 @@ class Smarty_Internal_TemplateCompilerBase { * class name format: Smarty_Internal_Compile_TagName
* plugin filename format: Smarty_Internal_Tagname.php
*
- * @param $tag string tag name
- * @param $args array with tag attributes
- * @param $param1 optional parameter
- * @param $param2 optional parameter
- * @param $param3 optional parameter
+ * @param string $tag tag name
+ * @param array $args list of tag attributes
+ * @param mixed $param1 optional parameter
+ * @param mixed $param2 optional parameter
+ * @param mixed $param3 optional parameter
* @return string compiled code
*/
public function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null)
@@ -286,10 +407,13 @@ class Smarty_Internal_TemplateCompilerBase { // 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;
@@ -298,55 +422,48 @@ class Smarty_Internal_TemplateCompilerBase { /**
* Check for plugins and return function name
*
- * @param $pugin_name string name of plugin or function
- * @param $type string type of plugin
+ * @param string $pugin_name name of plugin or function
+ * @param string $plugin_type type of plugin
* @return string call name of function
*/
- public function getPlugin($plugin_name, $type)
+ public function getPlugin($plugin_name, $plugin_type)
{
$function = null;
if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
- if (isset($this->template->required_plugins['nocache'][$plugin_name][$type])) {
- $function = $this->template->required_plugins['nocache'][$plugin_name][$type]['function'];
- } else if (isset($this->template->required_plugins['compiled'][$plugin_name][$type])) {
- $this->template->required_plugins['nocache'][$plugin_name][$type] = $this->template->required_plugins['compiled'][$plugin_name][$type];
- $function = $this->template->required_plugins['nocache'][$plugin_name][$type]['function'];
+ if (isset($this->template->required_plugins['nocache'][$plugin_name][$plugin_type])) {
+ $function = $this->template->required_plugins['nocache'][$plugin_name][$plugin_type]['function'];
+ } else if (isset($this->template->required_plugins['compiled'][$plugin_name][$plugin_type])) {
+ $this->template->required_plugins['nocache'][$plugin_name][$plugin_type] = $this->template->required_plugins['compiled'][$plugin_name][$plugin_type];
+ $function = $this->template->required_plugins['nocache'][$plugin_name][$plugin_type]['function'];
}
} else {
- if (isset($this->template->required_plugins['compiled'][$plugin_name][$type])) {
- $function = $this->template->required_plugins['compiled'][$plugin_name][$type]['function'];
- } else if (isset($this->template->required_plugins['nocache'][$plugin_name][$type])) {
- $this->template->required_plugins['compiled'][$plugin_name][$type] = $this->template->required_plugins['nocache'][$plugin_name][$type];
- $function = $this->template->required_plugins['compiled'][$plugin_name][$type]['function'];
+ if (isset($this->template->required_plugins['compiled'][$plugin_name][$plugin_type])) {
+ $function = $this->template->required_plugins['compiled'][$plugin_name][$plugin_type]['function'];
+ } else if (isset($this->template->required_plugins['nocache'][$plugin_name][$plugin_type])) {
+ $this->template->required_plugins['compiled'][$plugin_name][$plugin_type] = $this->template->required_plugins['nocache'][$plugin_name][$plugin_type];
+ $function = $this->template->required_plugins['compiled'][$plugin_name][$plugin_type]['function'];
}
}
if (isset($function)) {
- if ($type == 'modifier') {
- $this->template->saved_modifier[$plugin_name] = true;
+ if ($plugin_type == 'modifier') {
+ $this->modifier_plugins[$plugin_name] = true;
}
return $function;
}
// loop through plugin dirs and find the plugin
- $function = 'smarty_' . $type . '_' . $plugin_name;
- $found = false;
- foreach((array)$this->smarty->plugins_dir as $_plugin_dir) {
- $file = rtrim($_plugin_dir, '/\\') . DS . $type . '.' . $plugin_name . '.php';
- if (file_exists($file)) {
- // require_once($file);
- $found = true;
- break;
- }
- }
- if ($found) {
+ $function = 'smarty_' . $plugin_type . '_' . $plugin_name;
+ $file = $this->smarty->loadPlugin($function, false);
+
+ if (is_string($file)) {
if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
- $this->template->required_plugins['nocache'][$plugin_name][$type]['file'] = $file;
- $this->template->required_plugins['nocache'][$plugin_name][$type]['function'] = $function;
+ $this->template->required_plugins['nocache'][$plugin_name][$plugin_type]['file'] = $file;
+ $this->template->required_plugins['nocache'][$plugin_name][$plugin_type]['function'] = $function;
} else {
- $this->template->required_plugins['compiled'][$plugin_name][$type]['file'] = $file;
- $this->template->required_plugins['compiled'][$plugin_name][$type]['function'] = $function;
+ $this->template->required_plugins['compiled'][$plugin_name][$plugin_type]['file'] = $file;
+ $this->template->required_plugins['compiled'][$plugin_name][$plugin_type]['function'] = $function;
}
- if ($type == 'modifier') {
- $this->template->saved_modifier[$plugin_name] = true;
+ if ($plugin_type == 'modifier') {
+ $this->modifier_plugins[$plugin_name] = true;
}
return $function;
}
@@ -356,6 +473,47 @@ class Smarty_Internal_TemplateCompilerBase { }
return false;
}
+
+ /**
+ * Check for plugins by default plugin handler
+ *
+ * @param string $tag name of tag
+ * @param string $plugin_type type of plugin
+ * @return boolean true if found
+ */
+ public function getPluginFromDefaultHandler($tag, $plugin_type)
+ {
+ $callback = null;
+ $script = null;
+ $result = call_user_func_array(
+ $this->smarty->default_plugin_handler_func,
+ array($tag, $plugin_type, $this->template, &$callback, &$script)
+ );
+ if ($result) {
+ if ($script !== null) {
+ if (is_file($script)) {
+ if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
+ $this->template->required_plugins['nocache'][$tag][$plugin_type]['file'] = $script;
+ $this->template->required_plugins['nocache'][$tag][$plugin_type]['function'] = $callback;
+ } else {
+ $this->template->required_plugins['compiled'][$tag][$plugin_type]['file'] = $script;
+ $this->template->required_plugins['compiled'][$tag][$plugin_type]['function'] = $callback;
+ }
+ include_once $script;
+ } else {
+ throw new SmartyCompilerException("Plugin or modifer script file $script not found");
+ }
+ }
+ if (is_callable($callback)) {
+ $this->default_handler_plugins[$plugin_type][$tag] = array($callback, true, array());
+ return true;
+ } else {
+ throw new SmartyCompilerException("Function for plugin or modifier $tag not callable");
+ }
+ }
+ return false;
+ }
+
/**
* Inject inline code for nocache template sections
*
@@ -363,30 +521,27 @@ class Smarty_Internal_TemplateCompilerBase { * If the content is compiled code and it should be not cached the code is injected
* into the rendered output.
*
- * @param string $content content of template element
- * @param boolean $tag_nocache true if the parser detected a nocache situation
+ * @param string $content content of template element
* @param boolean $is_code true if content is compiled code
* @return string content
*/
- public function processNocacheCode ($content, $is_code)
+ public function processNocacheCode($content, $is_code)
{
// 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->resource_object->isEvaluated || $this->template->forceNocache) && $this->template->caching && !$this->suppressNocacheProcessing &&
- ($this->nocache || $this->tag_nocache || $this->template->forceNocache == 2)) {
+ if ((!($this->template->source->recompiled) || $this->forceNocache) && $this->template->caching && !$this->suppressNocacheProcessing &&
+ ($this->nocache || $this->tag_nocache || $this->forceNocache == 2)) {
$this->template->has_nocache_code = true;
$_output = str_replace("'", "\'", $content);
+ $_output = str_replace('\\\\', '\\\\\\\\', $_output);
$_output = str_replace("^#^", "'", $_output);
$_output = "<?php echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/" . $_output . "/*/%%SmartyNocache:{$this->nocache_hash}%%*/';?>\n";
// make sure we include modifer plugins for nocache code
- if (isset($this->template->saved_modifier)) {
- foreach ($this->template->saved_modifier as $plugin_name => $dummy) {
- if (isset($this->template->required_plugins['compiled'][$plugin_name]['modifier'])) {
- $this->template->required_plugins['nocache'][$plugin_name]['modifier'] = $this->template->required_plugins['compiled'][$plugin_name]['modifier'];
- }
+ foreach ($this->modifier_plugins as $plugin_name => $dummy) {
+ if (isset($this->template->required_plugins['compiled'][$plugin_name]['modifier'])) {
+ $this->template->required_plugins['nocache'][$plugin_name]['modifier'] = $this->template->required_plugins['compiled'][$plugin_name]['modifier'];
}
- $this->template->saved_modifier = null;
}
} else {
$_output = $content;
@@ -398,6 +553,7 @@ class Smarty_Internal_TemplateCompilerBase { $this->tag_nocache = false;
return $_output;
}
+
/**
* display compiler error messages without dying
*
@@ -406,7 +562,9 @@ class Smarty_Internal_TemplateCompilerBase { *
* If parameter $args contains a string this is used as error message
*
- * @param $args string individual error message or null
+ * @param string $args individual error message or null
+ * @param string $line line-number
+ * @throws SmartyCompilerException when an unexpected token is found
*/
public function trigger_template_error($args = null, $line = null)
{
@@ -415,7 +573,7 @@ class Smarty_Internal_TemplateCompilerBase { $line = $this->lex->line;
}
$match = preg_split("/\n/", $this->lex->data);
- $error_text = 'Syntax Error in template "' . $this->template->getTemplateFilepath() . '" on line ' . $line . ' "' . htmlspecialchars(trim(preg_replace('![\t\r\n]+!',' ',$match[$line-1]))) . '" ';
+ $error_text = 'Syntax Error in template "' . $this->template->source->filepath . '" on line ' . $line . ' "' . htmlspecialchars(trim(preg_replace('![\t\r\n]+!',' ',$match[$line-1]))) . '" ';
if (isset($args)) {
// individual error message
$error_text .= $args;
@@ -423,21 +581,22 @@ class Smarty_Internal_TemplateCompilerBase { // expected token from parser
$error_text .= ' - Unexpected "' . $this->lex->value.'"';
if (count($this->parser->yy_get_expected_tokens($this->parser->yymajor)) <= 4 ) {
- foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {
- $exp_token = $this->parser->yyTokenName[$token];
- if (isset($this->lex->smarty_token_names[$exp_token])) {
- // token type from lexer
- $expect[] = '"' . $this->lex->smarty_token_names[$exp_token] . '"';
- } else {
- // otherwise internal token name
- $expect[] = $this->parser->yyTokenName[$token];
- }
- }
- $error_text .= ', expected one of: ' . implode(' , ', $expect);
- }
+ foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {
+ $exp_token = $this->parser->yyTokenName[$token];
+ if (isset($this->lex->smarty_token_names[$exp_token])) {
+ // token type from lexer
+ $expect[] = '"' . $this->lex->smarty_token_names[$exp_token] . '"';
+ } else {
+ // otherwise internal token name
+ $expect[] = $this->parser->yyTokenName[$token];
+ }
+ }
+ $error_text .= ', expected one of: ' . implode(' , ', $expect);
+ }
}
throw new SmartyCompilerException($error_text);
}
+
}
?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_templatelexer.php b/libs/sysplugins/smarty_internal_templatelexer.php index 09bd67a3..a3bc0b15 100644 --- a/libs/sysplugins/smarty_internal_templatelexer.php +++ b/libs/sysplugins/smarty_internal_templatelexer.php @@ -71,7 +71,6 @@ class Smarty_Internal_Templatelexer 'LITERALEND' => 'Literal end', 'LDELSLASH' => 'closing tag', 'COMMENT' => 'comment', - 'LITERALEND' => 'literal close', 'AS' => 'as', 'TO' => 'to', ); @@ -142,22 +141,23 @@ class Smarty_Internal_Templatelexer 20 => 0, 21 => 0, 22 => 0, - 23 => 2, - 26 => 0, + 23 => 0, + 24 => 2, 27 => 0, + 28 => 0, ); if ($this->counter >= strlen($this->data)) { return false; // end of input } - $yy_global_pattern = "/^(".$this->ldel."[$]smarty\\.block\\.child".$this->rdel.")|^(\\{\\})|^(".$this->ldel."\\*([\S\s]*?)\\*".$this->rdel.")|^([\t ]*[\r\n]+[\t ]*)|^(".$this->ldel."strip".$this->rdel.")|^(".$this->ldel."\\s{1,}strip\\s{1,}".$this->rdel.")|^(".$this->ldel."\/strip".$this->rdel.")|^(".$this->ldel."\\s{1,}\/strip\\s{1,}".$this->rdel.")|^(".$this->ldel."\\s*literal\\s*".$this->rdel.")|^(".$this->ldel."\\s{1,}\/)|^(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|^(".$this->ldel."\\s*for\\s+)|^(".$this->ldel."\\s*foreach(?![^\s]))|^(".$this->ldel."\\s{1,})|^(".$this->ldel."\/)|^(".$this->ldel.")|^(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|^(\\?>)|^(<%)|^(%>)|^(([\S\s]*?)(?=([\t ]*[\r\n]+[\t ]*|".$this->ldel."|<\\?|\\?>|<%|%>)))|^([\S\s]+)|^(.)/iS"; + $yy_global_pattern = "/\G(".$this->ldel."[$]smarty\\.block\\.child".$this->rdel.")|\G(\\{\\})|\G(".$this->ldel."\\*([\S\s]*?)\\*".$this->rdel.")|\G([\t ]*[\r\n]+[\t ]*)|\G(".$this->ldel."strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\/strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\\s*literal\\s*".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/)|\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{1,})|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|\G(\\?>)|\G(<%)|\G(%>)|\G(([\S\s]*?)(?=([\t ]*[\r\n]+[\t ]*|".$this->ldel."|<\\?|\\?>|<%|%>)))|\G([\S\s]+)|\G(.)/iS"; do { - if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) { + if (preg_match($yy_global_pattern,$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, + ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state TEXT'); } next($yymatches); // skip global match @@ -308,6 +308,17 @@ class Smarty_Internal_Templatelexer function yy_r1_16($yy_subpatterns) { + if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') { + $this->token = Smarty_Internal_Templateparser::TP_OTHER; + } else { + $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER; + $this->yypushstate(self::SMARTY); + $this->taglineno = $this->line; + } + } + function yy_r1_17($yy_subpatterns) + { + if ($this->smarty->auto_literal) { $this->token = Smarty_Internal_Templateparser::TP_OTHER; } else { @@ -316,21 +327,21 @@ class Smarty_Internal_Templatelexer $this->taglineno = $this->line; } } - function yy_r1_17($yy_subpatterns) + function yy_r1_18($yy_subpatterns) { $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH; $this->yypushstate(self::SMARTY); $this->taglineno = $this->line; } - function yy_r1_18($yy_subpatterns) + function yy_r1_19($yy_subpatterns) { $this->token = Smarty_Internal_Templateparser::TP_LDEL; $this->yypushstate(self::SMARTY); $this->taglineno = $this->line; } - function yy_r1_19($yy_subpatterns) + function yy_r1_20($yy_subpatterns) { if (in_array($this->value, Array('<?', '<?=', '<?php'))) { @@ -342,32 +353,32 @@ class Smarty_Internal_Templatelexer $this->value = substr($this->value, 0, 2); } } - function yy_r1_20($yy_subpatterns) + function yy_r1_21($yy_subpatterns) { $this->token = Smarty_Internal_Templateparser::TP_PHPENDTAG; } - function yy_r1_21($yy_subpatterns) + function yy_r1_22($yy_subpatterns) { $this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG; } - function yy_r1_22($yy_subpatterns) + function yy_r1_23($yy_subpatterns) { $this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG; } - function yy_r1_23($yy_subpatterns) + function yy_r1_24($yy_subpatterns) { $this->token = Smarty_Internal_Templateparser::TP_OTHER; } - function yy_r1_26($yy_subpatterns) + function yy_r1_27($yy_subpatterns) { $this->token = Smarty_Internal_Templateparser::TP_OTHER; } - function yy_r1_27($yy_subpatterns) + function yy_r1_28($yy_subpatterns) { $this->token = Smarty_Internal_Templateparser::TP_OTHER; @@ -448,15 +459,15 @@ class Smarty_Internal_Templatelexer if ($this->counter >= strlen($this->data)) { return false; // end of input } - $yy_global_pattern = "/^('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|^(".$this->ldel."\\s{1,}\/)|^(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|^(".$this->ldel."\\s*for\\s+)|^(".$this->ldel."\\s*foreach(?![^\s]))|^(".$this->ldel."\\s{1,})|^(\\s{1,}".$this->rdel.")|^(".$this->ldel."\/)|^(".$this->ldel.")|^(".$this->rdel.")|^(\\s+is\\s+in\\s+)|^(\\s+as\\s+)|^(\\s+to\\s+)|^(\\s+step\\s+)|^(\\s+instanceof\\s+)|^(\\s*===\\s*)|^(\\s*!==\\s*)|^(\\s*==\\s*|\\s+eq\\s+)|^(\\s*!=\\s*|\\s*<>\\s*|\\s+(ne|neq)\\s+)|^(\\s*>=\\s*|\\s+(ge|gte)\\s+)|^(\\s*<=\\s*|\\s+(le|lte)\\s+)|^(\\s*>\\s*|\\s+gt\\s+)|^(\\s*<\\s*|\\s+lt\\s+)|^(\\s+mod\\s+)|^(!\\s*|not\\s+)|^(\\s*&&\\s*|\\s*and\\s+)|^(\\s*\\|\\|\\s*|\\s*or\\s+)|^(\\s*xor\\s+)|^(\\s+is\\s+odd\\s+by\\s+)|^(\\s+is\\s+not\\s+odd\\s+by\\s+)|^(\\s+is\\s+odd)|^(\\s+is\\s+not\\s+odd)|^(\\s+is\\s+even\\s+by\\s+)|^(\\s+is\\s+not\\s+even\\s+by\\s+)|^(\\s+is\\s+even)|^(\\s+is\\s+not\\s+even)|^(\\s+is\\s+div\\s+by\\s+)|^(\\s+is\\s+not\\s+div\\s+by\\s+)|^(\\((int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)\\)\\s*)|^(\\(\\s*)|^(\\s*\\))|^(\\[\\s*)|^(\\s*\\])|^(\\s*->\\s*)|^(\\s*=>\\s*)|^(\\s*=\\s*)|^(\\+\\+|--)|^(\\s*(\\+|-)\\s*)|^(\\s*(\\*|\/|%)\\s*)|^(\\$)|^(\\s*;)|^(::)|^(\\s*:\\s*)|^(@)|^(#)|^(\")|^(`)|^(\\|)|^(\\.)|^(\\s*,\\s*)|^(\\s*&\\s*)|^(\\s*\\?\\s*)|^(0[xX][0-9a-fA-F]+)|^([0-9]*[a-zA-Z_]\\w*)|^(\\d+)|^(\\s+)|^(.)/iS"; + $yy_global_pattern = "/\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G(".$this->ldel."\\s{1,}\/)|\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{1,})|\G(\\s{1,}".$this->rdel.")|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(".$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*)|\G(\\s*\\))|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*->\\s*)|\G(\\s*=>\\s*)|\G(\\s*=\\s*)|\G(\\+\\+|--)|\G(\\s*(\\+|-)\\s*)|\G(\\s*(\\*|\/|%)\\s*)|\G(\\$)|\G(\\s*;)|\G(::)|\G(\\s*:\\s*)|\G(@)|\G(#)|\G(\")|\G(`)|\G(\\|)|\G(\\.)|\G(\\s*,\\s*)|\G(\\s*&\\s*)|\G(\\s*\\?\\s*)|\G(0[xX][0-9a-fA-F]+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G(\\s+)|\G(.)/iS"; do { - if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) { + if (preg_match($yy_global_pattern,$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, + ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state SMARTY'); } next($yymatches); // skip global match @@ -561,8 +572,8 @@ class Smarty_Internal_Templatelexer function yy_r2_8($yy_subpatterns) { - $this->token = Smarty_Internal_Templateparser::TP_RDEL; - $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_RDEL; + $this->yypopstate(); } function yy_r2_9($yy_subpatterns) { @@ -890,15 +901,15 @@ class Smarty_Internal_Templatelexer if ($this->counter >= strlen($this->data)) { return false; // end of input } - $yy_global_pattern = "/^(".$this->ldel."\\s*literal\\s*".$this->rdel.")|^(".$this->ldel."\\s*\/literal\\s*".$this->rdel.")|^([\t ]*[\r\n]+[\t ]*)|^(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|^(\\?>)|^(<%)|^(%>)|^(([\S\s]*?)(?=([\t ]*[\r\n]+[\t ]*|".$this->ldel."\/?literal".$this->rdel."|<\\?|<%)))|^(.)/iS"; + $yy_global_pattern = "/\G(".$this->ldel."\\s*literal\\s*".$this->rdel.")|\G(".$this->ldel."\\s*\/literal\\s*".$this->rdel.")|\G([\t ]*[\r\n]+[\t ]*)|\G(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|\G(\\?>)|\G(<%)|\G(%>)|\G(([\S\s]*?)(?=([\t ]*[\r\n]+[\t ]*|".$this->ldel."\/?literal".$this->rdel."|<\\?|<%)))|\G(.)/iS"; do { - if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) { + if (preg_match($yy_global_pattern,$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, + ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state LITERAL'); } next($yymatches); // skip global match @@ -1015,15 +1026,15 @@ class Smarty_Internal_Templatelexer if ($this->counter >= strlen($this->data)) { return false; // end of input } - $yy_global_pattern = "/^(".$this->ldel."\\s{1,}\/)|^(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|^(".$this->ldel."\\s*for\\s+)|^(".$this->ldel."\\s*foreach(?![^\s]))|^(".$this->ldel."\\s{1,})|^(".$this->ldel."\/)|^(".$this->ldel.")|^(\")|^(`\\$)|^(\\$[0-9]*[a-zA-Z_]\\w*)|^(\\$)|^(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=(".$this->ldel."|\\$|`\\$|\")))|^([\S\s]+)|^(.)/iS"; + $yy_global_pattern = "/\G(".$this->ldel."\\s{1,}\/)|\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{1,})|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(\")|\G(`\\$)|\G(\\$[0-9]*[a-zA-Z_]\\w*)|\G(\\$)|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=(".$this->ldel."|\\$|`\\$|\")))|\G([\S\s]+)|\G(.)/iS"; do { - if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) { + if (preg_match($yy_global_pattern,$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, + ' an empty string. Input "' . substr($this->data, $this->counter, 5) . '... state DOUBLEQUOTEDSTRING'); } next($yymatches); // skip global match diff --git a/libs/sysplugins/smarty_internal_templateparser.php b/libs/sysplugins/smarty_internal_templateparser.php index 18c35a87..1f19d2d6 100644 --- a/libs/sysplugins/smarty_internal_templateparser.php +++ b/libs/sysplugins/smarty_internal_templateparser.php @@ -88,8 +88,9 @@ class Smarty_Internal_Templateparser#line 79 "smarty_internal_templateparser.php { #line 14 "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 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 public $successful = true; public $retvalue = 0; @@ -102,30 +103,39 @@ class Smarty_Internal_Templateparser#line 79 "smarty_internal_templateparser.php $this->smarty = $this->compiler->smarty; $this->template = $this->compiler->template; $this->compiler->has_variable_string = false; - $this->compiler->prefix_code = array(); - $this->prefix_number = 0; - $this->block_nesting_level = 0; - if ($this->security = isset($this->smarty->security_policy)) { - $this->php_handling = $this->smarty->security_policy->php_handling; + $this->compiler->prefix_code = array(); + $this->prefix_number = 0; + $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->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->is_xml = false; + $this->asp_tags = (ini_get('asp_tags') != '0'); + $this->current_buffer = $this->root_buffer = new _smarty_template_buffer($this); } public static function escape_start_tag($tag_text) { - $tag = preg_replace('/\A<\?(.*)\z/', '<<?php ?>?\1', $tag_text, -1 , $count); //Escape tag - return $tag; + $tag = preg_replace('/\A<\?(.*)\z/', '<<?php ?>?\1', $tag_text, -1 , $count); //Escape tag + return $tag; } public static function escape_end_tag($tag_text) { - return '?<?php ?>>'; + return '?<?php ?>>'; } - -#line 121 "smarty_internal_templateparser.php" + public function compileVariable($variable) { + 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'; + } +#line 131 "smarty_internal_templateparser.php" const TP_VERT = 1; const TP_COLON = 2; @@ -157,899 +167,852 @@ class Smarty_Internal_Templateparser#line 79 "smarty_internal_templateparser.php const TP_SPACE = 28; const TP_AS = 29; const TP_APTR = 30; - const TP_SMARTYBLOCKCHILD = 31; - const TP_LDELSLASH = 32; - const TP_INTEGER = 33; - const TP_COMMA = 34; - const TP_OPENP = 35; - const TP_CLOSEP = 36; - const TP_MATH = 37; - const TP_UNIMATH = 38; - const TP_ANDSYM = 39; - const TP_ISIN = 40; - const TP_ISDIVBY = 41; - const TP_ISNOTDIVBY = 42; - const TP_ISEVEN = 43; - const TP_ISNOTEVEN = 44; - const TP_ISEVENBY = 45; - const TP_ISNOTEVENBY = 46; - const TP_ISODD = 47; - const TP_ISNOTODD = 48; - const TP_ISODDBY = 49; - const TP_ISNOTODDBY = 50; - const TP_INSTANCEOF = 51; - const TP_QMARK = 52; - const TP_NOT = 53; - const TP_TYPECAST = 54; - const TP_HEX = 55; - const TP_DOT = 56; - const TP_SINGLEQUOTESTRING = 57; - const TP_DOUBLECOLON = 58; - const TP_AT = 59; - const TP_HATCH = 60; - const TP_OPENB = 61; - const TP_CLOSEB = 62; - const TP_EQUALS = 63; - const TP_NOTEQUALS = 64; - const TP_GREATERTHAN = 65; - const TP_LESSTHAN = 66; - const TP_GREATEREQUAL = 67; - const TP_LESSEQUAL = 68; - const TP_IDENTITY = 69; - const TP_NONEIDENTITY = 70; - const TP_MOD = 71; - const TP_LAND = 72; - const TP_LOR = 73; - const TP_LXOR = 74; - const TP_QUOTE = 75; - const TP_BACKTICK = 76; - const TP_DOLLARID = 77; + const TP_LDELSETFILTER = 31; + const TP_SMARTYBLOCKCHILD = 32; + const TP_LDELSLASH = 33; + const TP_INTEGER = 34; + const TP_COMMA = 35; + const TP_OPENP = 36; + const TP_CLOSEP = 37; + const TP_MATH = 38; + const TP_UNIMATH = 39; + const TP_ANDSYM = 40; + const TP_ISIN = 41; + const TP_ISDIVBY = 42; + const TP_ISNOTDIVBY = 43; + const TP_ISEVEN = 44; + const TP_ISNOTEVEN = 45; + const TP_ISEVENBY = 46; + const TP_ISNOTEVENBY = 47; + const TP_ISODD = 48; + const TP_ISNOTODD = 49; + const TP_ISODDBY = 50; + const TP_ISNOTODDBY = 51; + const TP_INSTANCEOF = 52; + const TP_QMARK = 53; + const TP_NOT = 54; + const TP_TYPECAST = 55; + const TP_HEX = 56; + const TP_DOT = 57; + const TP_SINGLEQUOTESTRING = 58; + const TP_DOUBLECOLON = 59; + const TP_AT = 60; + const TP_HATCH = 61; + const TP_OPENB = 62; + const TP_CLOSEB = 63; + const TP_EQUALS = 64; + const TP_NOTEQUALS = 65; + const TP_GREATERTHAN = 66; + const TP_LESSTHAN = 67; + const TP_GREATEREQUAL = 68; + const TP_LESSEQUAL = 69; + const TP_IDENTITY = 70; + const TP_NONEIDENTITY = 71; + const TP_MOD = 72; + const TP_LAND = 73; + const TP_LOR = 74; + const TP_LXOR = 75; + const TP_QUOTE = 76; + const TP_BACKTICK = 77; + const TP_DOLLARID = 78; const YY_NO_ACTION = 590; const YY_ACCEPT_ACTION = 589; const YY_ERROR_ACTION = 588; - const YY_SZ_ACTTAB = 2637; + const YY_SZ_ACTTAB = 2393; static public $yy_action = array( - /* 0 */ 223, 300, 294, 293, 288, 287, 286, 290, 291, 301, - /* 10 */ 197, 13, 211, 40, 283, 373, 284, 8, 13, 7, - /* 20 */ 107, 283, 41, 203, 16, 147, 234, 16, 16, 276, - /* 30 */ 245, 589, 97, 296, 297, 299, 50, 46, 48, 45, - /* 40 */ 14, 28, 330, 352, 38, 32, 353, 371, 36, 34, - /* 50 */ 223, 311, 306, 307, 285, 303, 295, 297, 299, 197, - /* 60 */ 312, 316, 379, 359, 358, 357, 366, 319, 274, 270, - /* 70 */ 267, 255, 256, 258, 362, 35, 21, 16, 141, 169, - /* 80 */ 223, 199, 17, 3, 146, 337, 50, 46, 48, 45, - /* 90 */ 14, 28, 330, 352, 38, 32, 353, 371, 36, 34, - /* 100 */ 341, 109, 180, 25, 242, 161, 137, 206, 3, 26, - /* 110 */ 360, 259, 379, 359, 358, 357, 366, 319, 274, 270, - /* 120 */ 267, 255, 256, 258, 223, 304, 347, 206, 172, 142, - /* 130 */ 47, 137, 244, 75, 127, 454, 262, 259, 19, 356, - /* 140 */ 13, 329, 266, 283, 41, 343, 321, 454, 310, 104, - /* 150 */ 163, 16, 383, 203, 3, 217, 236, 237, 220, 259, - /* 160 */ 50, 46, 48, 45, 14, 28, 330, 352, 38, 32, - /* 170 */ 353, 371, 36, 34, 191, 206, 13, 137, 4, 283, - /* 180 */ 24, 200, 332, 259, 227, 263, 379, 359, 358, 357, - /* 190 */ 366, 319, 274, 270, 267, 255, 256, 258, 223, 304, - /* 200 */ 110, 162, 223, 142, 192, 332, 244, 75, 127, 451, - /* 210 */ 259, 13, 223, 260, 283, 329, 266, 384, 161, 343, - /* 220 */ 321, 451, 310, 108, 183, 16, 206, 268, 3, 216, - /* 230 */ 27, 246, 174, 259, 50, 46, 48, 45, 14, 28, - /* 240 */ 330, 352, 38, 32, 353, 371, 36, 34, 173, 206, - /* 250 */ 5, 137, 47, 13, 211, 227, 283, 259, 381, 8, - /* 260 */ 379, 359, 358, 357, 366, 319, 274, 270, 267, 255, - /* 270 */ 256, 258, 223, 304, 170, 181, 324, 142, 196, 332, - /* 280 */ 244, 66, 118, 238, 259, 13, 335, 204, 283, 329, - /* 290 */ 266, 39, 161, 343, 321, 281, 310, 243, 16, 232, - /* 300 */ 239, 3, 23, 23, 386, 365, 251, 231, 50, 46, - /* 310 */ 48, 45, 14, 28, 330, 352, 38, 32, 353, 371, - /* 320 */ 36, 34, 111, 326, 137, 23, 13, 376, 223, 283, - /* 330 */ 136, 198, 42, 161, 379, 359, 358, 357, 366, 319, - /* 340 */ 274, 270, 267, 255, 256, 258, 223, 304, 166, 188, - /* 350 */ 178, 142, 281, 298, 244, 75, 127, 259, 259, 13, - /* 360 */ 223, 368, 283, 329, 266, 16, 278, 343, 321, 281, - /* 370 */ 310, 136, 16, 203, 2, 272, 13, 215, 16, 252, - /* 380 */ 138, 247, 50, 46, 48, 45, 14, 28, 330, 352, - /* 390 */ 38, 32, 353, 371, 36, 34, 223, 177, 317, 223, - /* 400 */ 314, 190, 327, 236, 238, 248, 259, 148, 379, 359, - /* 410 */ 358, 357, 366, 319, 274, 270, 267, 255, 256, 258, - /* 420 */ 195, 310, 203, 106, 236, 261, 13, 206, 184, 218, - /* 430 */ 103, 250, 50, 46, 48, 45, 14, 28, 330, 352, - /* 440 */ 38, 32, 353, 371, 36, 34, 223, 22, 176, 47, - /* 450 */ 235, 362, 132, 13, 206, 320, 226, 259, 379, 359, - /* 460 */ 358, 357, 366, 319, 274, 270, 267, 255, 256, 258, - /* 470 */ 133, 322, 185, 203, 13, 223, 345, 230, 149, 241, - /* 480 */ 145, 259, 50, 46, 48, 45, 14, 28, 330, 352, - /* 490 */ 38, 32, 353, 371, 36, 34, 223, 203, 175, 134, - /* 500 */ 281, 354, 16, 121, 131, 37, 202, 119, 379, 359, - /* 510 */ 358, 357, 366, 319, 274, 270, 267, 255, 256, 258, - /* 520 */ 338, 171, 377, 96, 382, 385, 305, 31, 328, 149, - /* 530 */ 259, 367, 50, 46, 48, 45, 14, 28, 330, 352, - /* 540 */ 38, 32, 353, 371, 36, 34, 223, 224, 9, 374, - /* 550 */ 228, 140, 5, 129, 42, 139, 372, 370, 379, 359, - /* 560 */ 358, 357, 366, 319, 274, 270, 267, 255, 256, 258, - /* 570 */ 193, 309, 168, 279, 324, 12, 281, 20, 16, 44, - /* 580 */ 378, 135, 50, 46, 48, 45, 14, 28, 330, 352, - /* 590 */ 38, 32, 353, 371, 36, 34, 223, 112, 313, 323, - /* 600 */ 323, 323, 323, 323, 323, 323, 323, 99, 379, 359, - /* 610 */ 358, 357, 366, 319, 274, 270, 267, 255, 256, 258, - /* 620 */ 338, 348, 323, 16, 323, 323, 323, 323, 323, 323, - /* 630 */ 323, 323, 50, 46, 48, 45, 14, 28, 330, 352, - /* 640 */ 38, 32, 353, 371, 36, 34, 323, 323, 323, 323, - /* 650 */ 323, 323, 323, 323, 323, 323, 323, 323, 379, 359, - /* 660 */ 358, 357, 366, 319, 274, 270, 267, 255, 256, 258, - /* 670 */ 223, 223, 323, 304, 101, 165, 223, 142, 228, 323, - /* 680 */ 244, 53, 118, 126, 259, 11, 456, 29, 15, 329, - /* 690 */ 266, 456, 201, 343, 321, 30, 310, 323, 456, 233, - /* 700 */ 206, 323, 323, 456, 323, 223, 50, 46, 48, 45, - /* 710 */ 14, 28, 330, 352, 38, 32, 353, 371, 36, 34, - /* 720 */ 269, 47, 224, 323, 323, 323, 47, 323, 323, 323, - /* 730 */ 323, 323, 379, 359, 358, 357, 366, 319, 274, 270, - /* 740 */ 267, 255, 256, 258, 223, 323, 323, 323, 194, 186, - /* 750 */ 323, 257, 363, 289, 323, 325, 264, 254, 259, 205, - /* 760 */ 43, 29, 15, 16, 16, 16, 7, 107, 16, 16, - /* 770 */ 323, 323, 147, 323, 206, 323, 276, 245, 323, 323, - /* 780 */ 50, 46, 48, 45, 14, 28, 330, 352, 38, 32, - /* 790 */ 353, 371, 36, 34, 223, 323, 323, 323, 323, 323, - /* 800 */ 323, 323, 323, 323, 323, 124, 379, 359, 358, 357, - /* 810 */ 366, 319, 274, 270, 267, 255, 256, 258, 338, 323, - /* 820 */ 344, 18, 336, 323, 323, 323, 323, 323, 323, 323, - /* 830 */ 50, 46, 48, 45, 14, 28, 330, 352, 38, 32, - /* 840 */ 353, 371, 36, 34, 323, 323, 323, 323, 323, 323, - /* 850 */ 323, 323, 323, 323, 323, 369, 379, 359, 358, 357, - /* 860 */ 366, 319, 274, 270, 267, 255, 256, 258, 223, 304, - /* 870 */ 323, 164, 361, 142, 323, 339, 244, 80, 127, 167, - /* 880 */ 259, 342, 375, 275, 16, 329, 266, 16, 259, 343, - /* 890 */ 321, 281, 310, 16, 16, 323, 323, 323, 323, 281, - /* 900 */ 323, 323, 323, 323, 50, 46, 48, 45, 14, 28, - /* 910 */ 330, 352, 38, 32, 353, 371, 36, 34, 223, 323, - /* 920 */ 323, 323, 323, 323, 323, 323, 323, 323, 323, 117, - /* 930 */ 379, 359, 358, 357, 366, 319, 274, 270, 267, 255, - /* 940 */ 256, 258, 338, 323, 323, 323, 240, 323, 323, 323, - /* 950 */ 323, 323, 323, 323, 50, 46, 48, 45, 14, 28, - /* 960 */ 330, 352, 38, 32, 353, 371, 36, 34, 223, 323, - /* 970 */ 323, 323, 323, 323, 323, 323, 323, 323, 323, 102, - /* 980 */ 379, 359, 358, 357, 366, 319, 274, 270, 267, 255, - /* 990 */ 256, 258, 338, 323, 323, 323, 323, 323, 323, 323, - /* 1000 */ 323, 323, 323, 323, 50, 46, 48, 45, 14, 28, - /* 1010 */ 330, 352, 38, 32, 353, 371, 36, 34, 323, 335, - /* 1020 */ 323, 323, 323, 323, 323, 323, 161, 323, 323, 323, - /* 1030 */ 379, 359, 358, 357, 366, 319, 274, 270, 267, 255, - /* 1040 */ 256, 258, 50, 46, 48, 45, 14, 28, 330, 352, - /* 1050 */ 38, 32, 353, 371, 36, 34, 351, 323, 323, 323, - /* 1060 */ 323, 323, 323, 323, 136, 323, 223, 323, 379, 359, - /* 1070 */ 358, 357, 366, 319, 274, 270, 267, 255, 256, 258, - /* 1080 */ 150, 271, 160, 323, 40, 323, 143, 210, 323, 323, - /* 1090 */ 7, 107, 281, 302, 253, 338, 147, 323, 325, 323, - /* 1100 */ 276, 245, 229, 43, 33, 16, 16, 51, 323, 7, - /* 1110 */ 107, 323, 323, 323, 323, 147, 323, 323, 323, 276, - /* 1120 */ 245, 194, 52, 49, 380, 225, 349, 105, 323, 106, - /* 1130 */ 1, 355, 323, 223, 29, 15, 323, 280, 315, 40, - /* 1140 */ 338, 143, 214, 223, 98, 7, 107, 206, 453, 16, - /* 1150 */ 16, 147, 323, 323, 323, 276, 245, 229, 450, 33, - /* 1160 */ 453, 265, 51, 350, 18, 336, 362, 304, 323, 115, - /* 1170 */ 16, 152, 323, 16, 244, 323, 127, 52, 49, 380, - /* 1180 */ 225, 349, 338, 47, 106, 1, 323, 343, 321, 223, - /* 1190 */ 310, 318, 323, 323, 40, 323, 138, 214, 304, 98, - /* 1200 */ 7, 107, 159, 16, 346, 244, 147, 127, 249, 323, - /* 1210 */ 276, 245, 229, 340, 10, 273, 16, 51, 343, 321, - /* 1220 */ 323, 310, 304, 3, 323, 16, 153, 323, 323, 244, - /* 1230 */ 323, 127, 52, 49, 380, 225, 349, 323, 331, 106, - /* 1240 */ 1, 323, 343, 321, 223, 310, 137, 223, 277, 40, - /* 1250 */ 16, 128, 92, 223, 98, 7, 107, 323, 323, 450, - /* 1260 */ 16, 147, 282, 323, 292, 276, 245, 229, 308, 33, - /* 1270 */ 362, 16, 51, 323, 16, 16, 16, 304, 323, 144, - /* 1280 */ 16, 157, 323, 323, 244, 323, 127, 52, 49, 380, - /* 1290 */ 225, 349, 338, 323, 106, 1, 323, 343, 321, 100, - /* 1300 */ 310, 323, 323, 47, 40, 323, 143, 212, 323, 98, - /* 1310 */ 7, 107, 338, 323, 323, 323, 147, 323, 323, 323, - /* 1320 */ 276, 245, 229, 323, 33, 323, 323, 51, 323, 323, - /* 1330 */ 323, 323, 304, 323, 323, 323, 151, 323, 323, 244, - /* 1340 */ 323, 127, 52, 49, 380, 225, 349, 323, 323, 106, - /* 1350 */ 1, 323, 343, 321, 323, 310, 323, 323, 323, 40, - /* 1360 */ 323, 125, 214, 323, 98, 7, 107, 323, 323, 323, - /* 1370 */ 323, 147, 323, 323, 323, 276, 245, 229, 323, 33, - /* 1380 */ 323, 323, 51, 323, 323, 323, 323, 304, 323, 323, - /* 1390 */ 323, 155, 323, 323, 244, 323, 127, 52, 49, 380, - /* 1400 */ 225, 349, 323, 323, 106, 1, 323, 343, 321, 323, - /* 1410 */ 310, 323, 323, 323, 40, 323, 130, 214, 323, 98, - /* 1420 */ 7, 107, 323, 323, 323, 323, 147, 323, 323, 323, - /* 1430 */ 276, 245, 229, 323, 6, 323, 323, 51, 323, 323, - /* 1440 */ 323, 323, 304, 323, 323, 323, 154, 323, 323, 244, - /* 1450 */ 323, 127, 52, 49, 380, 225, 349, 323, 323, 106, - /* 1460 */ 1, 323, 343, 321, 323, 310, 323, 323, 323, 40, - /* 1470 */ 323, 143, 209, 323, 98, 7, 107, 323, 323, 323, - /* 1480 */ 323, 147, 323, 323, 323, 276, 245, 229, 323, 33, - /* 1490 */ 323, 323, 51, 323, 323, 323, 323, 304, 323, 323, - /* 1500 */ 323, 158, 323, 323, 244, 323, 127, 52, 49, 380, - /* 1510 */ 225, 349, 323, 323, 106, 1, 323, 343, 321, 323, - /* 1520 */ 310, 323, 323, 323, 40, 323, 143, 208, 323, 98, - /* 1530 */ 7, 107, 323, 323, 323, 323, 147, 323, 323, 323, - /* 1540 */ 276, 245, 222, 323, 33, 323, 323, 51, 323, 323, - /* 1550 */ 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - /* 1560 */ 323, 323, 52, 49, 380, 225, 349, 323, 323, 106, - /* 1570 */ 1, 323, 323, 323, 323, 323, 323, 323, 323, 40, - /* 1580 */ 323, 143, 207, 323, 98, 7, 107, 323, 323, 323, - /* 1590 */ 323, 147, 323, 323, 323, 276, 245, 229, 323, 33, - /* 1600 */ 323, 323, 51, 323, 323, 323, 323, 323, 323, 323, - /* 1610 */ 323, 323, 323, 323, 323, 323, 323, 52, 49, 380, - /* 1620 */ 225, 349, 323, 323, 106, 1, 323, 323, 323, 323, - /* 1630 */ 323, 323, 323, 323, 40, 323, 138, 214, 323, 98, - /* 1640 */ 7, 107, 323, 323, 323, 323, 147, 323, 323, 323, - /* 1650 */ 276, 245, 229, 323, 10, 323, 323, 51, 323, 323, - /* 1660 */ 323, 323, 323, 323, 323, 323, 323, 194, 182, 323, - /* 1670 */ 323, 323, 52, 49, 380, 225, 349, 259, 323, 106, - /* 1680 */ 29, 15, 323, 323, 323, 323, 323, 323, 323, 40, - /* 1690 */ 323, 138, 213, 206, 98, 7, 107, 323, 323, 323, - /* 1700 */ 323, 147, 323, 323, 323, 276, 245, 229, 323, 10, - /* 1710 */ 323, 323, 51, 323, 323, 323, 323, 323, 323, 323, - /* 1720 */ 323, 323, 323, 323, 323, 323, 499, 52, 49, 380, - /* 1730 */ 225, 349, 323, 499, 106, 499, 499, 323, 499, 499, - /* 1740 */ 323, 323, 323, 323, 499, 3, 499, 323, 323, 98, - /* 1750 */ 323, 323, 323, 323, 323, 323, 323, 323, 304, 323, - /* 1760 */ 323, 499, 120, 323, 323, 244, 73, 127, 137, 323, - /* 1770 */ 323, 323, 499, 323, 329, 266, 323, 323, 343, 321, - /* 1780 */ 323, 310, 323, 323, 323, 323, 499, 323, 323, 323, - /* 1790 */ 304, 323, 219, 334, 120, 323, 323, 244, 73, 127, - /* 1800 */ 323, 323, 323, 323, 323, 323, 329, 266, 323, 323, - /* 1810 */ 343, 321, 304, 310, 323, 323, 114, 323, 323, 244, - /* 1820 */ 77, 127, 323, 323, 323, 333, 194, 187, 329, 266, - /* 1830 */ 323, 323, 343, 321, 323, 310, 259, 323, 323, 29, - /* 1840 */ 15, 304, 323, 323, 323, 142, 323, 323, 221, 68, - /* 1850 */ 127, 323, 206, 194, 179, 323, 323, 329, 266, 323, - /* 1860 */ 323, 343, 321, 259, 310, 323, 29, 15, 323, 304, - /* 1870 */ 323, 323, 323, 142, 323, 323, 244, 64, 127, 206, - /* 1880 */ 323, 194, 189, 323, 323, 329, 266, 323, 323, 343, - /* 1890 */ 321, 259, 310, 304, 29, 15, 323, 113, 323, 323, - /* 1900 */ 244, 62, 127, 323, 323, 323, 323, 206, 323, 329, - /* 1910 */ 266, 304, 323, 343, 321, 142, 310, 323, 244, 69, - /* 1920 */ 127, 323, 323, 323, 323, 323, 323, 329, 266, 323, - /* 1930 */ 323, 343, 321, 304, 310, 323, 323, 142, 323, 323, - /* 1940 */ 244, 88, 127, 323, 323, 323, 323, 323, 323, 329, - /* 1950 */ 266, 323, 323, 343, 321, 323, 310, 323, 323, 304, - /* 1960 */ 323, 323, 323, 142, 323, 323, 244, 90, 127, 323, - /* 1970 */ 323, 323, 323, 323, 323, 329, 266, 323, 323, 343, - /* 1980 */ 321, 323, 310, 304, 323, 323, 323, 116, 323, 323, - /* 1990 */ 244, 82, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2000 */ 266, 304, 323, 343, 321, 142, 310, 323, 244, 72, - /* 2010 */ 127, 323, 323, 323, 323, 323, 323, 329, 266, 323, - /* 2020 */ 323, 343, 321, 304, 310, 323, 323, 142, 323, 323, - /* 2030 */ 244, 63, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2040 */ 266, 323, 323, 343, 321, 323, 310, 323, 323, 304, - /* 2050 */ 323, 323, 323, 142, 323, 323, 244, 91, 127, 323, - /* 2060 */ 323, 323, 323, 323, 323, 329, 266, 323, 323, 343, - /* 2070 */ 321, 323, 310, 304, 323, 323, 323, 142, 323, 323, - /* 2080 */ 244, 60, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2090 */ 266, 304, 323, 343, 321, 142, 310, 323, 244, 89, - /* 2100 */ 127, 323, 323, 323, 323, 323, 323, 329, 266, 323, - /* 2110 */ 323, 343, 321, 304, 310, 323, 323, 142, 323, 323, - /* 2120 */ 244, 70, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2130 */ 266, 323, 323, 343, 321, 323, 310, 323, 323, 304, - /* 2140 */ 323, 323, 323, 142, 323, 323, 244, 78, 127, 323, - /* 2150 */ 323, 323, 323, 323, 323, 329, 266, 323, 323, 343, - /* 2160 */ 321, 323, 310, 304, 323, 323, 323, 142, 323, 323, - /* 2170 */ 244, 61, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2180 */ 266, 304, 323, 343, 321, 142, 310, 323, 244, 76, - /* 2190 */ 127, 323, 323, 323, 323, 323, 323, 329, 266, 323, - /* 2200 */ 323, 343, 321, 304, 310, 323, 323, 142, 323, 323, - /* 2210 */ 244, 74, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2220 */ 266, 323, 323, 343, 321, 323, 310, 323, 323, 304, - /* 2230 */ 323, 323, 323, 142, 323, 323, 244, 87, 127, 323, - /* 2240 */ 323, 323, 323, 323, 323, 329, 266, 323, 323, 343, - /* 2250 */ 321, 323, 310, 304, 323, 323, 323, 142, 323, 323, - /* 2260 */ 244, 67, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2270 */ 266, 304, 323, 343, 321, 142, 310, 323, 244, 83, - /* 2280 */ 127, 323, 323, 323, 323, 323, 323, 329, 266, 323, - /* 2290 */ 323, 343, 321, 304, 310, 323, 323, 142, 323, 323, - /* 2300 */ 244, 58, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2310 */ 266, 323, 323, 343, 321, 323, 310, 323, 323, 304, - /* 2320 */ 323, 323, 323, 94, 323, 323, 93, 59, 123, 323, - /* 2330 */ 323, 323, 323, 323, 323, 329, 266, 323, 323, 343, - /* 2340 */ 321, 323, 310, 304, 323, 323, 323, 142, 323, 323, - /* 2350 */ 244, 86, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2360 */ 266, 304, 323, 343, 321, 142, 310, 323, 244, 85, - /* 2370 */ 127, 323, 323, 323, 323, 323, 323, 329, 266, 323, - /* 2380 */ 323, 343, 321, 304, 310, 323, 323, 142, 323, 323, - /* 2390 */ 244, 57, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2400 */ 266, 323, 323, 343, 321, 323, 310, 323, 323, 304, - /* 2410 */ 323, 323, 323, 142, 323, 323, 244, 66, 127, 323, - /* 2420 */ 323, 323, 323, 323, 323, 329, 266, 323, 323, 343, - /* 2430 */ 321, 323, 310, 304, 323, 323, 323, 142, 323, 323, - /* 2440 */ 244, 79, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2450 */ 266, 304, 323, 343, 321, 142, 310, 323, 244, 65, - /* 2460 */ 127, 323, 323, 323, 323, 323, 323, 329, 266, 323, - /* 2470 */ 323, 343, 321, 304, 310, 323, 323, 142, 323, 323, - /* 2480 */ 244, 81, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2490 */ 266, 323, 323, 343, 321, 323, 310, 323, 323, 304, - /* 2500 */ 323, 323, 323, 94, 323, 323, 95, 56, 123, 323, - /* 2510 */ 323, 323, 323, 323, 323, 329, 266, 323, 323, 343, - /* 2520 */ 321, 323, 310, 304, 323, 323, 323, 142, 323, 323, - /* 2530 */ 244, 71, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2540 */ 266, 304, 323, 343, 321, 142, 310, 323, 244, 54, - /* 2550 */ 127, 323, 323, 323, 323, 323, 323, 329, 266, 323, - /* 2560 */ 323, 343, 321, 304, 310, 323, 323, 122, 323, 323, - /* 2570 */ 244, 55, 127, 323, 323, 323, 323, 323, 323, 329, - /* 2580 */ 266, 323, 323, 343, 321, 323, 310, 323, 323, 304, - /* 2590 */ 323, 323, 323, 142, 323, 323, 244, 84, 127, 323, - /* 2600 */ 323, 323, 323, 323, 323, 329, 266, 323, 323, 343, - /* 2610 */ 321, 323, 310, 304, 323, 323, 323, 156, 323, 323, - /* 2620 */ 244, 323, 127, 323, 323, 323, 323, 323, 323, 323, - /* 2630 */ 364, 323, 323, 343, 321, 323, 310, + /* 0 */ 211, 316, 317, 319, 318, 315, 314, 310, 309, 311, + /* 10 */ 312, 313, 320, 189, 304, 161, 38, 589, 95, 265, + /* 20 */ 317, 319, 7, 106, 289, 37, 26, 30, 146, 283, + /* 30 */ 10, 285, 250, 286, 238, 280, 287, 49, 48, 46, + /* 40 */ 45, 20, 29, 365, 366, 28, 32, 373, 374, 15, + /* 50 */ 11, 328, 323, 322, 324, 327, 231, 211, 4, 189, + /* 60 */ 329, 332, 211, 382, 383, 384, 385, 381, 380, 376, + /* 70 */ 375, 377, 281, 378, 379, 211, 360, 450, 180, 251, + /* 80 */ 117, 144, 196, 74, 135, 260, 17, 451, 26, 30, + /* 90 */ 307, 283, 299, 361, 35, 158, 225, 368, 362, 451, + /* 100 */ 343, 30, 30, 226, 44, 203, 285, 4, 47, 203, + /* 110 */ 218, 259, 49, 48, 46, 45, 20, 29, 365, 366, + /* 120 */ 28, 32, 373, 374, 15, 11, 351, 108, 176, 334, + /* 130 */ 144, 193, 337, 23, 129, 134, 371, 289, 382, 383, + /* 140 */ 384, 385, 381, 380, 376, 375, 377, 281, 378, 379, + /* 150 */ 211, 360, 372, 26, 203, 142, 283, 31, 68, 122, + /* 160 */ 242, 26, 109, 353, 283, 346, 454, 299, 361, 25, + /* 170 */ 185, 225, 368, 362, 30, 343, 239, 30, 454, 289, + /* 180 */ 4, 41, 26, 143, 165, 283, 4, 49, 48, 46, + /* 190 */ 45, 20, 29, 365, 366, 28, 32, 373, 374, 15, + /* 200 */ 11, 101, 160, 144, 26, 208, 34, 283, 31, 144, + /* 210 */ 8, 289, 4, 382, 383, 384, 385, 381, 380, 376, + /* 220 */ 375, 377, 281, 378, 379, 211, 360, 227, 203, 357, + /* 230 */ 142, 197, 19, 73, 135, 144, 211, 302, 9, 158, + /* 240 */ 340, 26, 299, 361, 283, 158, 225, 368, 362, 228, + /* 250 */ 343, 294, 30, 6, 331, 235, 330, 221, 195, 337, + /* 260 */ 126, 240, 49, 48, 46, 45, 20, 29, 365, 366, + /* 270 */ 28, 32, 373, 374, 15, 11, 211, 16, 129, 244, + /* 280 */ 249, 219, 208, 192, 337, 302, 228, 8, 382, 383, + /* 290 */ 384, 385, 381, 380, 376, 375, 377, 281, 378, 379, + /* 300 */ 163, 211, 107, 188, 105, 40, 40, 266, 277, 289, + /* 310 */ 241, 232, 289, 49, 48, 46, 45, 20, 29, 365, + /* 320 */ 366, 28, 32, 373, 374, 15, 11, 211, 168, 203, + /* 330 */ 40, 2, 278, 167, 175, 244, 242, 289, 350, 382, + /* 340 */ 383, 384, 385, 381, 380, 376, 375, 377, 281, 378, + /* 350 */ 379, 191, 47, 184, 204, 234, 169, 198, 287, 386, + /* 360 */ 203, 203, 289, 124, 49, 48, 46, 45, 20, 29, + /* 370 */ 365, 366, 28, 32, 373, 374, 15, 11, 211, 204, + /* 380 */ 182, 26, 26, 26, 283, 212, 224, 118, 131, 289, + /* 390 */ 382, 383, 384, 385, 381, 380, 376, 375, 377, 281, + /* 400 */ 378, 379, 370, 172, 244, 270, 204, 130, 211, 164, + /* 410 */ 26, 287, 289, 229, 178, 49, 48, 46, 45, 20, + /* 420 */ 29, 365, 366, 28, 32, 373, 374, 15, 11, 204, + /* 430 */ 364, 298, 5, 26, 100, 30, 247, 148, 148, 99, + /* 440 */ 159, 382, 383, 384, 385, 381, 380, 376, 375, 377, + /* 450 */ 281, 378, 379, 211, 354, 370, 360, 174, 26, 369, + /* 460 */ 142, 283, 360, 73, 135, 158, 157, 123, 24, 155, + /* 470 */ 135, 30, 299, 361, 211, 190, 225, 368, 362, 272, + /* 480 */ 343, 252, 225, 368, 362, 343, 343, 222, 223, 306, + /* 490 */ 49, 48, 46, 45, 20, 29, 365, 366, 28, 32, + /* 500 */ 373, 374, 15, 11, 129, 43, 236, 9, 269, 258, + /* 510 */ 199, 133, 33, 14, 202, 103, 382, 383, 384, 385, + /* 520 */ 381, 380, 376, 375, 377, 281, 378, 379, 211, 360, + /* 530 */ 370, 170, 262, 142, 360, 36, 73, 135, 151, 141, + /* 540 */ 289, 245, 135, 276, 211, 299, 361, 211, 44, 225, + /* 550 */ 368, 362, 287, 343, 225, 368, 362, 119, 343, 295, + /* 560 */ 216, 267, 282, 296, 211, 49, 48, 46, 45, 20, + /* 570 */ 29, 365, 366, 28, 32, 373, 374, 15, 11, 284, + /* 580 */ 181, 223, 333, 138, 302, 236, 297, 6, 127, 289, + /* 590 */ 116, 382, 383, 384, 385, 381, 380, 376, 375, 377, + /* 600 */ 281, 378, 379, 211, 360, 370, 177, 94, 142, 303, + /* 610 */ 292, 54, 122, 139, 162, 289, 150, 261, 264, 293, + /* 620 */ 299, 361, 30, 289, 225, 368, 362, 287, 343, 30, + /* 630 */ 287, 30, 132, 300, 308, 287, 158, 211, 30, 334, + /* 640 */ 49, 48, 46, 45, 20, 29, 365, 366, 28, 32, + /* 650 */ 373, 374, 15, 11, 211, 204, 166, 12, 275, 287, + /* 660 */ 273, 248, 342, 98, 97, 113, 382, 383, 384, 385, + /* 670 */ 381, 380, 376, 375, 377, 281, 378, 379, 370, 370, + /* 680 */ 370, 110, 18, 321, 324, 324, 324, 324, 324, 324, + /* 690 */ 246, 49, 48, 46, 45, 20, 29, 365, 366, 28, + /* 700 */ 32, 373, 374, 15, 11, 211, 324, 324, 324, 324, + /* 710 */ 324, 324, 324, 324, 112, 136, 104, 382, 383, 384, + /* 720 */ 385, 381, 380, 376, 375, 377, 281, 378, 379, 370, + /* 730 */ 370, 370, 324, 324, 324, 324, 324, 324, 324, 324, + /* 740 */ 324, 256, 49, 48, 46, 45, 20, 29, 365, 366, + /* 750 */ 28, 32, 373, 374, 15, 11, 211, 324, 324, 324, + /* 760 */ 324, 324, 324, 324, 324, 324, 324, 324, 382, 383, + /* 770 */ 384, 385, 381, 380, 376, 375, 377, 281, 378, 379, + /* 780 */ 351, 324, 324, 30, 324, 324, 324, 324, 324, 324, + /* 790 */ 324, 324, 324, 49, 48, 46, 45, 20, 29, 365, + /* 800 */ 366, 28, 32, 373, 374, 15, 11, 211, 324, 324, + /* 810 */ 324, 324, 324, 324, 324, 324, 324, 355, 324, 382, + /* 820 */ 383, 384, 385, 381, 380, 376, 375, 377, 281, 378, + /* 830 */ 379, 324, 324, 324, 324, 324, 324, 324, 324, 324, + /* 840 */ 324, 324, 324, 324, 49, 48, 46, 45, 20, 29, + /* 850 */ 365, 366, 28, 32, 373, 374, 15, 11, 324, 324, + /* 860 */ 324, 324, 324, 324, 324, 324, 324, 324, 324, 257, + /* 870 */ 382, 383, 384, 385, 381, 380, 376, 375, 377, 281, + /* 880 */ 378, 379, 211, 324, 324, 324, 194, 360, 211, 288, + /* 890 */ 255, 145, 324, 352, 336, 135, 324, 200, 42, 22, + /* 900 */ 27, 30, 30, 341, 7, 106, 30, 225, 368, 362, + /* 910 */ 146, 343, 324, 203, 250, 286, 238, 324, 211, 49, + /* 920 */ 48, 46, 45, 20, 29, 365, 366, 28, 32, 373, + /* 930 */ 374, 15, 11, 305, 324, 324, 324, 324, 324, 47, + /* 940 */ 324, 324, 324, 324, 324, 382, 383, 384, 385, 381, + /* 950 */ 380, 376, 375, 377, 281, 378, 379, 211, 324, 359, + /* 960 */ 39, 349, 360, 326, 348, 291, 156, 324, 352, 344, + /* 970 */ 135, 324, 201, 42, 324, 30, 30, 30, 324, 7, + /* 980 */ 106, 30, 225, 368, 362, 146, 343, 324, 324, 250, + /* 990 */ 286, 238, 324, 324, 49, 48, 46, 45, 20, 29, + /* 1000 */ 365, 366, 28, 32, 373, 374, 15, 11, 211, 324, + /* 1010 */ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, + /* 1020 */ 382, 383, 384, 385, 381, 380, 376, 375, 377, 281, + /* 1030 */ 378, 379, 324, 324, 358, 39, 349, 324, 324, 324, + /* 1040 */ 324, 324, 324, 324, 324, 49, 48, 46, 45, 20, + /* 1050 */ 29, 365, 366, 28, 32, 373, 374, 15, 11, 324, + /* 1060 */ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, + /* 1070 */ 324, 382, 383, 384, 385, 381, 380, 376, 375, 377, + /* 1080 */ 281, 378, 379, 324, 49, 48, 46, 45, 20, 29, + /* 1090 */ 365, 366, 28, 32, 373, 374, 15, 11, 324, 324, + /* 1100 */ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, + /* 1110 */ 382, 383, 384, 385, 381, 380, 376, 375, 377, 281, + /* 1120 */ 378, 379, 324, 324, 324, 324, 38, 324, 140, 207, + /* 1130 */ 324, 360, 7, 106, 290, 147, 324, 356, 146, 135, + /* 1140 */ 324, 324, 250, 286, 238, 230, 30, 13, 367, 30, + /* 1150 */ 51, 225, 368, 362, 324, 343, 360, 324, 324, 324, + /* 1160 */ 152, 324, 324, 324, 135, 50, 52, 301, 237, 363, + /* 1170 */ 324, 360, 105, 1, 254, 154, 225, 368, 362, 135, + /* 1180 */ 343, 324, 38, 324, 140, 214, 324, 96, 7, 106, + /* 1190 */ 279, 225, 368, 362, 146, 343, 347, 345, 250, 286, + /* 1200 */ 238, 230, 30, 13, 274, 324, 51, 338, 30, 30, + /* 1210 */ 360, 324, 324, 324, 121, 324, 30, 53, 135, 30, + /* 1220 */ 211, 50, 52, 301, 237, 363, 299, 361, 105, 1, + /* 1230 */ 225, 368, 362, 211, 343, 453, 324, 268, 38, 324, + /* 1240 */ 128, 214, 324, 96, 7, 106, 253, 453, 339, 30, + /* 1250 */ 146, 335, 233, 324, 250, 286, 238, 230, 30, 3, + /* 1260 */ 30, 324, 51, 30, 271, 324, 360, 324, 4, 324, + /* 1270 */ 142, 47, 324, 84, 135, 324, 30, 50, 52, 301, + /* 1280 */ 237, 363, 299, 361, 105, 1, 225, 368, 362, 324, + /* 1290 */ 343, 144, 324, 324, 38, 324, 125, 92, 324, 96, + /* 1300 */ 7, 106, 324, 324, 324, 324, 146, 324, 324, 324, + /* 1310 */ 250, 286, 238, 230, 324, 13, 324, 324, 51, 324, + /* 1320 */ 324, 324, 360, 324, 324, 324, 142, 324, 324, 89, + /* 1330 */ 135, 324, 211, 50, 52, 301, 237, 363, 299, 361, + /* 1340 */ 105, 1, 225, 368, 362, 324, 343, 456, 324, 324, + /* 1350 */ 38, 324, 126, 214, 324, 96, 7, 106, 324, 456, + /* 1360 */ 243, 324, 146, 324, 324, 324, 250, 286, 238, 230, + /* 1370 */ 324, 21, 324, 324, 51, 324, 324, 324, 360, 324, + /* 1380 */ 324, 324, 142, 47, 324, 87, 135, 324, 211, 50, + /* 1390 */ 52, 301, 237, 363, 299, 361, 105, 1, 225, 368, + /* 1400 */ 362, 324, 343, 456, 324, 324, 38, 324, 140, 210, + /* 1410 */ 324, 96, 7, 106, 324, 456, 324, 324, 146, 324, + /* 1420 */ 324, 324, 250, 286, 238, 230, 324, 13, 324, 324, + /* 1430 */ 51, 324, 324, 324, 360, 324, 324, 324, 142, 47, + /* 1440 */ 324, 63, 135, 324, 211, 50, 52, 301, 237, 363, + /* 1450 */ 299, 361, 105, 1, 225, 368, 362, 324, 343, 325, + /* 1460 */ 324, 324, 38, 324, 137, 214, 324, 96, 7, 106, + /* 1470 */ 324, 30, 324, 324, 146, 324, 324, 324, 250, 286, + /* 1480 */ 238, 230, 324, 13, 324, 324, 51, 324, 324, 324, + /* 1490 */ 360, 324, 324, 324, 142, 47, 324, 80, 135, 324, + /* 1500 */ 324, 50, 52, 301, 237, 363, 299, 361, 105, 1, + /* 1510 */ 225, 368, 362, 324, 343, 324, 324, 324, 38, 324, + /* 1520 */ 140, 206, 324, 96, 7, 106, 324, 324, 324, 324, + /* 1530 */ 146, 324, 324, 324, 250, 286, 238, 220, 324, 13, + /* 1540 */ 324, 324, 51, 324, 324, 324, 360, 324, 324, 324, + /* 1550 */ 114, 324, 324, 75, 135, 324, 324, 50, 52, 301, + /* 1560 */ 237, 363, 299, 361, 105, 1, 225, 368, 362, 324, + /* 1570 */ 343, 324, 324, 324, 38, 324, 140, 205, 324, 96, + /* 1580 */ 7, 106, 324, 324, 324, 324, 146, 324, 324, 324, + /* 1590 */ 250, 286, 238, 230, 324, 13, 324, 324, 51, 324, + /* 1600 */ 324, 324, 360, 324, 324, 324, 142, 324, 324, 77, + /* 1610 */ 135, 324, 324, 50, 52, 301, 237, 363, 299, 361, + /* 1620 */ 105, 1, 225, 368, 362, 324, 343, 324, 324, 324, + /* 1630 */ 38, 324, 140, 209, 324, 96, 7, 106, 324, 324, + /* 1640 */ 324, 324, 146, 324, 324, 324, 250, 286, 238, 230, + /* 1650 */ 324, 13, 324, 324, 51, 324, 324, 324, 360, 324, + /* 1660 */ 324, 324, 142, 324, 324, 85, 135, 324, 324, 50, + /* 1670 */ 52, 301, 237, 363, 299, 361, 105, 1, 225, 368, + /* 1680 */ 362, 324, 343, 324, 324, 324, 38, 324, 126, 213, + /* 1690 */ 324, 96, 7, 106, 324, 324, 324, 324, 146, 324, + /* 1700 */ 324, 324, 250, 286, 238, 230, 324, 21, 324, 324, + /* 1710 */ 51, 324, 324, 324, 360, 324, 324, 324, 142, 324, + /* 1720 */ 324, 71, 135, 324, 324, 50, 52, 301, 237, 363, + /* 1730 */ 299, 361, 105, 324, 225, 368, 362, 324, 343, 324, + /* 1740 */ 324, 324, 38, 324, 126, 214, 324, 96, 7, 106, + /* 1750 */ 324, 324, 324, 324, 146, 324, 324, 324, 250, 286, + /* 1760 */ 238, 230, 324, 21, 102, 186, 51, 324, 324, 324, + /* 1770 */ 324, 324, 324, 324, 289, 324, 324, 22, 27, 324, + /* 1780 */ 499, 50, 52, 301, 237, 363, 324, 499, 105, 499, + /* 1790 */ 499, 203, 499, 499, 324, 324, 324, 324, 324, 499, + /* 1800 */ 4, 499, 324, 96, 324, 324, 324, 324, 324, 324, + /* 1810 */ 324, 324, 324, 360, 324, 324, 499, 117, 324, 324, + /* 1820 */ 74, 135, 324, 144, 324, 324, 324, 499, 324, 299, + /* 1830 */ 361, 324, 324, 225, 368, 362, 324, 343, 360, 324, + /* 1840 */ 324, 499, 142, 324, 324, 66, 135, 324, 263, 324, + /* 1850 */ 324, 324, 324, 324, 299, 361, 324, 324, 225, 368, + /* 1860 */ 362, 324, 343, 324, 360, 324, 324, 324, 142, 324, + /* 1870 */ 324, 79, 135, 324, 360, 324, 324, 324, 149, 324, + /* 1880 */ 299, 361, 135, 360, 225, 368, 362, 142, 343, 324, + /* 1890 */ 81, 135, 324, 324, 225, 368, 362, 324, 343, 299, + /* 1900 */ 361, 324, 324, 225, 368, 362, 324, 343, 324, 324, + /* 1910 */ 324, 360, 324, 324, 324, 115, 324, 324, 83, 135, + /* 1920 */ 324, 324, 360, 324, 324, 324, 142, 299, 361, 72, + /* 1930 */ 135, 225, 368, 362, 324, 343, 324, 324, 299, 361, + /* 1940 */ 324, 324, 225, 368, 362, 324, 343, 324, 360, 324, + /* 1950 */ 324, 324, 142, 324, 324, 70, 135, 324, 360, 324, + /* 1960 */ 324, 324, 153, 324, 299, 361, 135, 360, 225, 368, + /* 1970 */ 362, 142, 343, 324, 68, 135, 324, 324, 225, 368, + /* 1980 */ 362, 324, 343, 299, 361, 324, 324, 225, 368, 362, + /* 1990 */ 324, 343, 324, 324, 324, 360, 324, 324, 324, 142, + /* 2000 */ 324, 324, 90, 135, 324, 324, 360, 324, 324, 324, + /* 2010 */ 142, 299, 361, 86, 135, 225, 368, 362, 324, 343, + /* 2020 */ 324, 324, 299, 361, 324, 324, 225, 368, 362, 324, + /* 2030 */ 343, 324, 360, 194, 183, 324, 142, 324, 324, 91, + /* 2040 */ 135, 324, 324, 289, 324, 324, 22, 27, 299, 361, + /* 2050 */ 324, 360, 225, 368, 362, 142, 343, 324, 61, 135, + /* 2060 */ 203, 324, 324, 324, 194, 171, 324, 299, 361, 324, + /* 2070 */ 324, 225, 368, 362, 289, 343, 324, 22, 27, 360, + /* 2080 */ 324, 324, 324, 142, 324, 324, 88, 135, 324, 324, + /* 2090 */ 360, 203, 324, 324, 142, 299, 361, 69, 135, 225, + /* 2100 */ 368, 362, 324, 343, 324, 324, 299, 361, 324, 324, + /* 2110 */ 225, 368, 362, 324, 343, 324, 360, 194, 179, 324, + /* 2120 */ 142, 324, 324, 76, 135, 324, 324, 289, 324, 324, + /* 2130 */ 22, 27, 299, 361, 324, 360, 225, 368, 362, 142, + /* 2140 */ 343, 324, 65, 135, 203, 324, 324, 324, 194, 187, + /* 2150 */ 324, 299, 361, 324, 324, 225, 368, 362, 289, 343, + /* 2160 */ 324, 22, 27, 360, 324, 324, 324, 111, 324, 324, + /* 2170 */ 64, 135, 324, 324, 360, 203, 324, 324, 142, 299, + /* 2180 */ 361, 62, 135, 225, 368, 362, 324, 343, 324, 324, + /* 2190 */ 299, 361, 324, 324, 225, 368, 362, 324, 343, 324, + /* 2200 */ 360, 194, 173, 324, 142, 324, 324, 82, 135, 324, + /* 2210 */ 324, 289, 324, 324, 22, 27, 299, 361, 324, 360, + /* 2220 */ 225, 368, 362, 142, 343, 324, 60, 135, 203, 324, + /* 2230 */ 324, 324, 324, 324, 324, 299, 361, 324, 324, 225, + /* 2240 */ 368, 362, 324, 343, 324, 324, 324, 360, 324, 324, + /* 2250 */ 324, 93, 324, 324, 57, 120, 324, 324, 360, 324, + /* 2260 */ 324, 324, 142, 299, 361, 58, 135, 225, 368, 362, + /* 2270 */ 324, 343, 324, 324, 299, 361, 324, 324, 225, 368, + /* 2280 */ 362, 324, 343, 324, 360, 324, 324, 324, 142, 324, + /* 2290 */ 324, 59, 135, 324, 324, 324, 324, 324, 324, 324, + /* 2300 */ 299, 361, 324, 360, 225, 368, 362, 93, 343, 324, + /* 2310 */ 55, 120, 324, 324, 324, 324, 324, 324, 324, 299, + /* 2320 */ 361, 324, 324, 215, 368, 362, 324, 343, 324, 324, + /* 2330 */ 324, 360, 324, 324, 324, 142, 324, 324, 56, 135, + /* 2340 */ 324, 324, 360, 324, 324, 324, 142, 299, 361, 78, + /* 2350 */ 135, 225, 368, 362, 324, 343, 324, 324, 299, 361, + /* 2360 */ 324, 324, 225, 368, 362, 324, 343, 324, 360, 324, + /* 2370 */ 324, 324, 142, 324, 324, 67, 135, 324, 324, 324, + /* 2380 */ 324, 324, 324, 324, 299, 361, 324, 324, 217, 368, + /* 2390 */ 362, 324, 343, ); static public $yy_lookahead = array( - /* 0 */ 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, - /* 10 */ 12, 15, 56, 15, 18, 16, 16, 61, 15, 21, - /* 20 */ 22, 18, 19, 113, 28, 27, 30, 28, 28, 31, - /* 30 */ 32, 79, 80, 81, 82, 83, 37, 38, 39, 40, + /* 0 */ 1, 82, 83, 84, 3, 4, 5, 6, 7, 8, + /* 10 */ 9, 10, 11, 12, 18, 89, 15, 80, 81, 82, + /* 20 */ 83, 84, 21, 22, 98, 26, 15, 28, 27, 18, + /* 30 */ 19, 116, 31, 32, 33, 24, 110, 38, 39, 40, /* 40 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - /* 50 */ 1, 4, 5, 6, 7, 8, 81, 82, 83, 12, - /* 60 */ 13, 14, 63, 64, 65, 66, 67, 68, 69, 70, - /* 70 */ 71, 72, 73, 74, 24, 26, 15, 28, 17, 18, - /* 80 */ 1, 87, 15, 35, 17, 18, 37, 38, 39, 40, - /* 90 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - /* 100 */ 33, 87, 88, 30, 56, 20, 58, 113, 35, 30, - /* 110 */ 62, 97, 63, 64, 65, 66, 67, 68, 69, 70, - /* 120 */ 71, 72, 73, 74, 1, 82, 76, 113, 88, 86, - /* 130 */ 51, 58, 89, 90, 91, 16, 28, 97, 19, 16, - /* 140 */ 15, 98, 99, 18, 19, 102, 103, 28, 105, 87, - /* 150 */ 88, 28, 110, 113, 35, 112, 91, 92, 93, 97, - /* 160 */ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - /* 170 */ 47, 48, 49, 50, 88, 113, 15, 58, 35, 18, - /* 180 */ 19, 109, 110, 97, 59, 24, 63, 64, 65, 66, - /* 190 */ 67, 68, 69, 70, 71, 72, 73, 74, 1, 82, - /* 200 */ 87, 88, 1, 86, 109, 110, 89, 90, 91, 16, - /* 210 */ 97, 15, 1, 16, 18, 98, 99, 16, 20, 102, - /* 220 */ 103, 28, 105, 87, 88, 28, 113, 16, 35, 112, - /* 230 */ 15, 20, 106, 97, 37, 38, 39, 40, 41, 42, - /* 240 */ 43, 44, 45, 46, 47, 48, 49, 50, 88, 113, - /* 250 */ 35, 58, 51, 15, 56, 59, 18, 97, 18, 61, - /* 260 */ 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - /* 270 */ 73, 74, 1, 82, 106, 88, 107, 86, 109, 110, - /* 280 */ 89, 90, 91, 92, 97, 15, 82, 16, 18, 98, - /* 290 */ 99, 19, 20, 102, 103, 108, 105, 59, 28, 59, - /* 300 */ 30, 35, 34, 34, 36, 36, 17, 18, 37, 38, - /* 310 */ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - /* 320 */ 49, 50, 118, 119, 58, 34, 15, 36, 1, 18, - /* 330 */ 58, 114, 19, 20, 63, 64, 65, 66, 67, 68, - /* 340 */ 69, 70, 71, 72, 73, 74, 1, 82, 88, 88, - /* 350 */ 106, 86, 108, 16, 89, 90, 91, 97, 97, 15, - /* 360 */ 1, 16, 18, 98, 99, 28, 16, 102, 103, 108, - /* 370 */ 105, 58, 28, 113, 34, 16, 15, 112, 28, 18, - /* 380 */ 17, 18, 37, 38, 39, 40, 41, 42, 43, 44, - /* 390 */ 45, 46, 47, 48, 49, 50, 1, 88, 83, 1, - /* 400 */ 85, 87, 62, 91, 92, 89, 97, 91, 63, 64, - /* 410 */ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - /* 420 */ 114, 105, 113, 60, 91, 92, 15, 113, 87, 18, - /* 430 */ 106, 36, 37, 38, 39, 40, 41, 42, 43, 44, - /* 440 */ 45, 46, 47, 48, 49, 50, 1, 2, 88, 51, - /* 450 */ 94, 24, 17, 15, 113, 18, 18, 97, 63, 64, - /* 460 */ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - /* 470 */ 35, 104, 88, 113, 15, 1, 18, 18, 111, 18, - /* 480 */ 17, 97, 37, 38, 39, 40, 41, 42, 43, 44, - /* 490 */ 45, 46, 47, 48, 49, 50, 1, 113, 106, 17, - /* 500 */ 108, 62, 28, 18, 18, 52, 18, 95, 63, 64, - /* 510 */ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - /* 520 */ 108, 88, 104, 18, 60, 60, 36, 25, 18, 111, - /* 530 */ 97, 36, 37, 38, 39, 40, 41, 42, 43, 44, - /* 540 */ 45, 46, 47, 48, 49, 50, 1, 56, 2, 33, - /* 550 */ 2, 17, 35, 17, 19, 17, 33, 18, 63, 64, - /* 560 */ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - /* 570 */ 23, 115, 106, 97, 107, 94, 108, 28, 28, 2, - /* 580 */ 111, 34, 37, 38, 39, 40, 41, 42, 43, 44, - /* 590 */ 45, 46, 47, 48, 49, 50, 1, 84, 13, 120, - /* 600 */ 120, 120, 120, 120, 120, 120, 120, 95, 63, 64, - /* 610 */ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - /* 620 */ 108, 76, 120, 28, 120, 120, 120, 120, 120, 120, - /* 630 */ 120, 120, 37, 38, 39, 40, 41, 42, 43, 44, - /* 640 */ 45, 46, 47, 48, 49, 50, 120, 120, 120, 120, - /* 650 */ 120, 120, 120, 120, 120, 120, 120, 120, 63, 64, - /* 660 */ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - /* 670 */ 1, 1, 120, 82, 87, 88, 1, 86, 2, 120, - /* 680 */ 89, 90, 91, 92, 97, 19, 16, 100, 101, 98, - /* 690 */ 99, 16, 23, 102, 103, 19, 105, 120, 28, 29, - /* 700 */ 113, 120, 120, 28, 120, 1, 37, 38, 39, 40, - /* 710 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - /* 720 */ 16, 51, 56, 120, 120, 120, 51, 120, 120, 120, - /* 730 */ 120, 120, 63, 64, 65, 66, 67, 68, 69, 70, - /* 740 */ 71, 72, 73, 74, 1, 120, 120, 120, 87, 88, - /* 750 */ 120, 16, 16, 16, 120, 10, 16, 16, 97, 16, - /* 760 */ 15, 100, 101, 28, 28, 28, 21, 22, 28, 28, - /* 770 */ 120, 120, 27, 120, 113, 120, 31, 32, 120, 120, - /* 780 */ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - /* 790 */ 47, 48, 49, 50, 1, 120, 120, 120, 120, 120, - /* 800 */ 120, 120, 120, 120, 120, 95, 63, 64, 65, 66, - /* 810 */ 67, 68, 69, 70, 71, 72, 73, 74, 108, 120, - /* 820 */ 75, 76, 77, 120, 120, 120, 120, 120, 120, 120, - /* 830 */ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - /* 840 */ 47, 48, 49, 50, 120, 120, 120, 120, 120, 120, - /* 850 */ 120, 120, 120, 120, 120, 62, 63, 64, 65, 66, - /* 860 */ 67, 68, 69, 70, 71, 72, 73, 74, 1, 82, - /* 870 */ 120, 88, 16, 86, 120, 16, 89, 90, 91, 88, - /* 880 */ 97, 16, 16, 16, 28, 98, 99, 28, 97, 102, - /* 890 */ 103, 108, 105, 28, 28, 120, 120, 120, 120, 108, - /* 900 */ 120, 120, 120, 120, 37, 38, 39, 40, 41, 42, - /* 910 */ 43, 44, 45, 46, 47, 48, 49, 50, 1, 120, - /* 920 */ 120, 120, 120, 120, 120, 120, 120, 120, 120, 95, - /* 930 */ 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - /* 940 */ 73, 74, 108, 120, 120, 120, 29, 120, 120, 120, - /* 950 */ 120, 120, 120, 120, 37, 38, 39, 40, 41, 42, - /* 960 */ 43, 44, 45, 46, 47, 48, 49, 50, 1, 120, - /* 970 */ 120, 120, 120, 120, 120, 120, 120, 120, 120, 95, - /* 980 */ 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - /* 990 */ 73, 74, 108, 120, 120, 120, 120, 120, 120, 120, - /* 1000 */ 120, 120, 120, 120, 37, 38, 39, 40, 41, 42, - /* 1010 */ 43, 44, 45, 46, 47, 48, 49, 50, 120, 82, - /* 1020 */ 120, 120, 120, 120, 120, 120, 20, 120, 120, 120, - /* 1030 */ 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - /* 1040 */ 73, 74, 37, 38, 39, 40, 41, 42, 43, 44, - /* 1050 */ 45, 46, 47, 48, 49, 50, 119, 120, 120, 120, - /* 1060 */ 120, 120, 120, 120, 58, 120, 1, 120, 63, 64, - /* 1070 */ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - /* 1080 */ 96, 16, 95, 120, 15, 120, 17, 18, 120, 120, - /* 1090 */ 21, 22, 108, 16, 16, 108, 27, 120, 10, 120, - /* 1100 */ 31, 32, 33, 15, 35, 28, 28, 38, 120, 21, - /* 1110 */ 22, 120, 120, 120, 120, 27, 120, 120, 120, 31, - /* 1120 */ 32, 87, 53, 54, 55, 56, 57, 95, 120, 60, - /* 1130 */ 61, 62, 120, 1, 100, 101, 120, 16, 16, 15, - /* 1140 */ 108, 17, 18, 1, 75, 21, 22, 113, 16, 28, - /* 1150 */ 28, 27, 120, 120, 120, 31, 32, 33, 16, 35, - /* 1160 */ 28, 16, 38, 75, 76, 77, 24, 82, 120, 95, - /* 1170 */ 28, 86, 120, 28, 89, 120, 91, 53, 54, 55, - /* 1180 */ 56, 57, 108, 51, 60, 61, 120, 102, 103, 1, - /* 1190 */ 105, 16, 120, 120, 15, 120, 17, 18, 82, 75, - /* 1200 */ 21, 22, 86, 28, 16, 89, 27, 91, 20, 120, - /* 1210 */ 31, 32, 33, 16, 35, 99, 28, 38, 102, 103, - /* 1220 */ 120, 105, 82, 35, 120, 28, 86, 120, 120, 89, - /* 1230 */ 120, 91, 53, 54, 55, 56, 57, 120, 16, 60, - /* 1240 */ 61, 120, 102, 103, 1, 105, 58, 1, 16, 15, - /* 1250 */ 28, 17, 18, 1, 75, 21, 22, 120, 120, 16, - /* 1260 */ 28, 27, 16, 16, 16, 31, 32, 33, 16, 35, - /* 1270 */ 24, 28, 38, 120, 28, 28, 28, 82, 120, 95, - /* 1280 */ 28, 86, 120, 120, 89, 120, 91, 53, 54, 55, - /* 1290 */ 56, 57, 108, 120, 60, 61, 120, 102, 103, 95, - /* 1300 */ 105, 120, 120, 51, 15, 120, 17, 18, 120, 75, - /* 1310 */ 21, 22, 108, 120, 120, 120, 27, 120, 120, 120, - /* 1320 */ 31, 32, 33, 120, 35, 120, 120, 38, 120, 120, - /* 1330 */ 120, 120, 82, 120, 120, 120, 86, 120, 120, 89, - /* 1340 */ 120, 91, 53, 54, 55, 56, 57, 120, 120, 60, - /* 1350 */ 61, 120, 102, 103, 120, 105, 120, 120, 120, 15, - /* 1360 */ 120, 17, 18, 120, 75, 21, 22, 120, 120, 120, - /* 1370 */ 120, 27, 120, 120, 120, 31, 32, 33, 120, 35, - /* 1380 */ 120, 120, 38, 120, 120, 120, 120, 82, 120, 120, - /* 1390 */ 120, 86, 120, 120, 89, 120, 91, 53, 54, 55, - /* 1400 */ 56, 57, 120, 120, 60, 61, 120, 102, 103, 120, - /* 1410 */ 105, 120, 120, 120, 15, 120, 17, 18, 120, 75, - /* 1420 */ 21, 22, 120, 120, 120, 120, 27, 120, 120, 120, - /* 1430 */ 31, 32, 33, 120, 35, 120, 120, 38, 120, 120, - /* 1440 */ 120, 120, 82, 120, 120, 120, 86, 120, 120, 89, - /* 1450 */ 120, 91, 53, 54, 55, 56, 57, 120, 120, 60, - /* 1460 */ 61, 120, 102, 103, 120, 105, 120, 120, 120, 15, - /* 1470 */ 120, 17, 18, 120, 75, 21, 22, 120, 120, 120, - /* 1480 */ 120, 27, 120, 120, 120, 31, 32, 33, 120, 35, - /* 1490 */ 120, 120, 38, 120, 120, 120, 120, 82, 120, 120, - /* 1500 */ 120, 86, 120, 120, 89, 120, 91, 53, 54, 55, - /* 1510 */ 56, 57, 120, 120, 60, 61, 120, 102, 103, 120, - /* 1520 */ 105, 120, 120, 120, 15, 120, 17, 18, 120, 75, - /* 1530 */ 21, 22, 120, 120, 120, 120, 27, 120, 120, 120, - /* 1540 */ 31, 32, 33, 120, 35, 120, 120, 38, 120, 120, - /* 1550 */ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - /* 1560 */ 120, 120, 53, 54, 55, 56, 57, 120, 120, 60, - /* 1570 */ 61, 120, 120, 120, 120, 120, 120, 120, 120, 15, - /* 1580 */ 120, 17, 18, 120, 75, 21, 22, 120, 120, 120, - /* 1590 */ 120, 27, 120, 120, 120, 31, 32, 33, 120, 35, - /* 1600 */ 120, 120, 38, 120, 120, 120, 120, 120, 120, 120, - /* 1610 */ 120, 120, 120, 120, 120, 120, 120, 53, 54, 55, - /* 1620 */ 56, 57, 120, 120, 60, 61, 120, 120, 120, 120, - /* 1630 */ 120, 120, 120, 120, 15, 120, 17, 18, 120, 75, - /* 1640 */ 21, 22, 120, 120, 120, 120, 27, 120, 120, 120, - /* 1650 */ 31, 32, 33, 120, 35, 120, 120, 38, 120, 120, - /* 1660 */ 120, 120, 120, 120, 120, 120, 120, 87, 88, 120, - /* 1670 */ 120, 120, 53, 54, 55, 56, 57, 97, 120, 60, - /* 1680 */ 100, 101, 120, 120, 120, 120, 120, 120, 120, 15, - /* 1690 */ 120, 17, 18, 113, 75, 21, 22, 120, 120, 120, - /* 1700 */ 120, 27, 120, 120, 120, 31, 32, 33, 120, 35, - /* 1710 */ 120, 120, 38, 120, 120, 120, 120, 120, 120, 120, - /* 1720 */ 120, 120, 120, 120, 120, 120, 16, 53, 54, 55, - /* 1730 */ 56, 57, 120, 23, 60, 25, 26, 120, 28, 29, - /* 1740 */ 120, 120, 120, 120, 34, 35, 36, 120, 120, 75, - /* 1750 */ 120, 120, 120, 120, 120, 120, 120, 120, 82, 120, - /* 1760 */ 120, 51, 86, 120, 120, 89, 90, 91, 58, 120, - /* 1770 */ 120, 120, 62, 120, 98, 99, 120, 120, 102, 103, - /* 1780 */ 120, 105, 120, 120, 120, 120, 76, 120, 120, 120, - /* 1790 */ 82, 120, 116, 117, 86, 120, 120, 89, 90, 91, - /* 1800 */ 120, 120, 120, 120, 120, 120, 98, 99, 120, 120, - /* 1810 */ 102, 103, 82, 105, 120, 120, 86, 120, 120, 89, - /* 1820 */ 90, 91, 120, 120, 120, 117, 87, 88, 98, 99, - /* 1830 */ 120, 120, 102, 103, 120, 105, 97, 120, 120, 100, - /* 1840 */ 101, 82, 120, 120, 120, 86, 120, 120, 89, 90, - /* 1850 */ 91, 120, 113, 87, 88, 120, 120, 98, 99, 120, - /* 1860 */ 120, 102, 103, 97, 105, 120, 100, 101, 120, 82, - /* 1870 */ 120, 120, 120, 86, 120, 120, 89, 90, 91, 113, - /* 1880 */ 120, 87, 88, 120, 120, 98, 99, 120, 120, 102, - /* 1890 */ 103, 97, 105, 82, 100, 101, 120, 86, 120, 120, - /* 1900 */ 89, 90, 91, 120, 120, 120, 120, 113, 120, 98, - /* 1910 */ 99, 82, 120, 102, 103, 86, 105, 120, 89, 90, - /* 1920 */ 91, 120, 120, 120, 120, 120, 120, 98, 99, 120, - /* 1930 */ 120, 102, 103, 82, 105, 120, 120, 86, 120, 120, - /* 1940 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 1950 */ 99, 120, 120, 102, 103, 120, 105, 120, 120, 82, - /* 1960 */ 120, 120, 120, 86, 120, 120, 89, 90, 91, 120, - /* 1970 */ 120, 120, 120, 120, 120, 98, 99, 120, 120, 102, - /* 1980 */ 103, 120, 105, 82, 120, 120, 120, 86, 120, 120, - /* 1990 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2000 */ 99, 82, 120, 102, 103, 86, 105, 120, 89, 90, - /* 2010 */ 91, 120, 120, 120, 120, 120, 120, 98, 99, 120, - /* 2020 */ 120, 102, 103, 82, 105, 120, 120, 86, 120, 120, - /* 2030 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2040 */ 99, 120, 120, 102, 103, 120, 105, 120, 120, 82, - /* 2050 */ 120, 120, 120, 86, 120, 120, 89, 90, 91, 120, - /* 2060 */ 120, 120, 120, 120, 120, 98, 99, 120, 120, 102, - /* 2070 */ 103, 120, 105, 82, 120, 120, 120, 86, 120, 120, - /* 2080 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2090 */ 99, 82, 120, 102, 103, 86, 105, 120, 89, 90, - /* 2100 */ 91, 120, 120, 120, 120, 120, 120, 98, 99, 120, - /* 2110 */ 120, 102, 103, 82, 105, 120, 120, 86, 120, 120, - /* 2120 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2130 */ 99, 120, 120, 102, 103, 120, 105, 120, 120, 82, - /* 2140 */ 120, 120, 120, 86, 120, 120, 89, 90, 91, 120, - /* 2150 */ 120, 120, 120, 120, 120, 98, 99, 120, 120, 102, - /* 2160 */ 103, 120, 105, 82, 120, 120, 120, 86, 120, 120, - /* 2170 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2180 */ 99, 82, 120, 102, 103, 86, 105, 120, 89, 90, - /* 2190 */ 91, 120, 120, 120, 120, 120, 120, 98, 99, 120, - /* 2200 */ 120, 102, 103, 82, 105, 120, 120, 86, 120, 120, - /* 2210 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2220 */ 99, 120, 120, 102, 103, 120, 105, 120, 120, 82, - /* 2230 */ 120, 120, 120, 86, 120, 120, 89, 90, 91, 120, - /* 2240 */ 120, 120, 120, 120, 120, 98, 99, 120, 120, 102, - /* 2250 */ 103, 120, 105, 82, 120, 120, 120, 86, 120, 120, - /* 2260 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2270 */ 99, 82, 120, 102, 103, 86, 105, 120, 89, 90, - /* 2280 */ 91, 120, 120, 120, 120, 120, 120, 98, 99, 120, - /* 2290 */ 120, 102, 103, 82, 105, 120, 120, 86, 120, 120, - /* 2300 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2310 */ 99, 120, 120, 102, 103, 120, 105, 120, 120, 82, - /* 2320 */ 120, 120, 120, 86, 120, 120, 89, 90, 91, 120, - /* 2330 */ 120, 120, 120, 120, 120, 98, 99, 120, 120, 102, - /* 2340 */ 103, 120, 105, 82, 120, 120, 120, 86, 120, 120, - /* 2350 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2360 */ 99, 82, 120, 102, 103, 86, 105, 120, 89, 90, - /* 2370 */ 91, 120, 120, 120, 120, 120, 120, 98, 99, 120, - /* 2380 */ 120, 102, 103, 82, 105, 120, 120, 86, 120, 120, - /* 2390 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2400 */ 99, 120, 120, 102, 103, 120, 105, 120, 120, 82, - /* 2410 */ 120, 120, 120, 86, 120, 120, 89, 90, 91, 120, - /* 2420 */ 120, 120, 120, 120, 120, 98, 99, 120, 120, 102, - /* 2430 */ 103, 120, 105, 82, 120, 120, 120, 86, 120, 120, - /* 2440 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2450 */ 99, 82, 120, 102, 103, 86, 105, 120, 89, 90, - /* 2460 */ 91, 120, 120, 120, 120, 120, 120, 98, 99, 120, - /* 2470 */ 120, 102, 103, 82, 105, 120, 120, 86, 120, 120, - /* 2480 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2490 */ 99, 120, 120, 102, 103, 120, 105, 120, 120, 82, - /* 2500 */ 120, 120, 120, 86, 120, 120, 89, 90, 91, 120, - /* 2510 */ 120, 120, 120, 120, 120, 98, 99, 120, 120, 102, - /* 2520 */ 103, 120, 105, 82, 120, 120, 120, 86, 120, 120, - /* 2530 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2540 */ 99, 82, 120, 102, 103, 86, 105, 120, 89, 90, - /* 2550 */ 91, 120, 120, 120, 120, 120, 120, 98, 99, 120, - /* 2560 */ 120, 102, 103, 82, 105, 120, 120, 86, 120, 120, - /* 2570 */ 89, 90, 91, 120, 120, 120, 120, 120, 120, 98, - /* 2580 */ 99, 120, 120, 102, 103, 120, 105, 120, 120, 82, - /* 2590 */ 120, 120, 120, 86, 120, 120, 89, 90, 91, 120, - /* 2600 */ 120, 120, 120, 120, 120, 98, 99, 120, 120, 102, - /* 2610 */ 103, 120, 105, 82, 120, 120, 120, 86, 120, 120, - /* 2620 */ 89, 120, 91, 120, 120, 120, 120, 120, 120, 120, - /* 2630 */ 99, 120, 120, 102, 103, 120, 105, + /* 50 */ 51, 4, 5, 6, 7, 8, 60, 1, 36, 12, + /* 60 */ 13, 14, 1, 64, 65, 66, 67, 68, 69, 70, + /* 70 */ 71, 72, 73, 74, 75, 1, 83, 16, 88, 57, + /* 80 */ 87, 59, 88, 90, 91, 63, 30, 16, 15, 28, + /* 90 */ 16, 18, 99, 100, 19, 20, 103, 104, 105, 28, + /* 100 */ 107, 28, 28, 30, 2, 115, 116, 36, 52, 115, + /* 110 */ 117, 118, 38, 39, 40, 41, 42, 43, 44, 45, + /* 120 */ 46, 47, 48, 49, 50, 51, 83, 88, 89, 109, + /* 130 */ 59, 111, 112, 15, 59, 17, 18, 98, 64, 65, + /* 140 */ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + /* 150 */ 1, 83, 34, 15, 115, 87, 18, 19, 90, 91, + /* 160 */ 92, 15, 119, 120, 18, 16, 16, 99, 100, 19, + /* 170 */ 89, 103, 104, 105, 28, 107, 30, 28, 28, 98, + /* 180 */ 36, 15, 15, 17, 18, 18, 36, 38, 39, 40, + /* 190 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + /* 200 */ 51, 88, 89, 59, 15, 57, 30, 18, 19, 59, + /* 210 */ 62, 98, 36, 64, 65, 66, 67, 68, 69, 70, + /* 220 */ 71, 72, 73, 74, 75, 1, 83, 60, 115, 16, + /* 230 */ 87, 97, 15, 90, 91, 59, 1, 24, 19, 20, + /* 240 */ 16, 15, 99, 100, 18, 20, 103, 104, 105, 60, + /* 250 */ 107, 16, 28, 36, 84, 20, 86, 114, 111, 112, + /* 260 */ 17, 18, 38, 39, 40, 41, 42, 43, 44, 45, + /* 270 */ 46, 47, 48, 49, 50, 51, 1, 2, 59, 91, + /* 280 */ 92, 93, 57, 111, 112, 24, 60, 62, 64, 65, + /* 290 */ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + /* 300 */ 89, 1, 88, 89, 61, 35, 35, 37, 37, 98, + /* 310 */ 17, 18, 98, 38, 39, 40, 41, 42, 43, 44, + /* 320 */ 45, 46, 47, 48, 49, 50, 51, 1, 89, 115, + /* 330 */ 35, 35, 37, 88, 88, 91, 92, 98, 77, 64, + /* 340 */ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + /* 350 */ 75, 23, 52, 89, 115, 29, 108, 97, 110, 63, + /* 360 */ 115, 115, 98, 35, 38, 39, 40, 41, 42, 43, + /* 370 */ 44, 45, 46, 47, 48, 49, 50, 51, 1, 115, + /* 380 */ 89, 15, 15, 15, 18, 18, 18, 95, 17, 98, + /* 390 */ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + /* 400 */ 74, 75, 110, 89, 91, 92, 115, 36, 1, 108, + /* 410 */ 15, 110, 98, 18, 108, 38, 39, 40, 41, 42, + /* 420 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 115, + /* 430 */ 106, 106, 36, 15, 97, 28, 18, 113, 113, 108, + /* 440 */ 95, 64, 65, 66, 67, 68, 69, 70, 71, 72, + /* 450 */ 73, 74, 75, 1, 77, 110, 83, 108, 15, 18, + /* 460 */ 87, 18, 83, 90, 91, 20, 87, 17, 19, 91, + /* 470 */ 91, 28, 99, 100, 1, 23, 103, 104, 105, 100, + /* 480 */ 107, 103, 103, 104, 105, 107, 107, 114, 2, 16, + /* 490 */ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + /* 500 */ 48, 49, 50, 51, 59, 19, 57, 19, 37, 61, + /* 510 */ 18, 17, 53, 2, 18, 95, 64, 65, 66, 67, + /* 520 */ 68, 69, 70, 71, 72, 73, 74, 75, 1, 83, + /* 530 */ 110, 89, 63, 87, 83, 25, 90, 91, 87, 17, + /* 540 */ 98, 18, 91, 16, 1, 99, 100, 1, 2, 103, + /* 550 */ 104, 105, 110, 107, 103, 104, 105, 18, 107, 16, + /* 560 */ 114, 61, 16, 34, 1, 38, 39, 40, 41, 42, + /* 570 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 16, + /* 580 */ 89, 2, 18, 17, 24, 57, 34, 36, 17, 98, + /* 590 */ 95, 64, 65, 66, 67, 68, 69, 70, 71, 72, + /* 600 */ 73, 74, 75, 1, 83, 110, 89, 18, 87, 18, + /* 610 */ 16, 90, 91, 92, 89, 98, 96, 16, 16, 16, + /* 620 */ 99, 100, 28, 98, 103, 104, 105, 110, 107, 28, + /* 630 */ 110, 28, 18, 18, 98, 110, 20, 1, 28, 109, + /* 640 */ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + /* 650 */ 48, 49, 50, 51, 1, 115, 108, 28, 113, 110, + /* 660 */ 28, 94, 112, 95, 95, 95, 64, 65, 66, 67, + /* 670 */ 68, 69, 70, 71, 72, 73, 74, 75, 110, 110, + /* 680 */ 110, 85, 94, 13, 121, 121, 121, 121, 121, 121, + /* 690 */ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + /* 700 */ 47, 48, 49, 50, 51, 1, 121, 121, 121, 121, + /* 710 */ 121, 121, 121, 121, 95, 95, 95, 64, 65, 66, + /* 720 */ 67, 68, 69, 70, 71, 72, 73, 74, 75, 110, + /* 730 */ 110, 110, 121, 121, 121, 121, 121, 121, 121, 121, + /* 740 */ 121, 37, 38, 39, 40, 41, 42, 43, 44, 45, + /* 750 */ 46, 47, 48, 49, 50, 51, 1, 121, 121, 121, + /* 760 */ 121, 121, 121, 121, 121, 121, 121, 121, 64, 65, + /* 770 */ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + /* 780 */ 83, 121, 121, 28, 121, 121, 121, 121, 121, 121, + /* 790 */ 121, 121, 121, 38, 39, 40, 41, 42, 43, 44, + /* 800 */ 45, 46, 47, 48, 49, 50, 51, 1, 121, 121, + /* 810 */ 121, 121, 121, 121, 121, 121, 121, 120, 121, 64, + /* 820 */ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + /* 830 */ 75, 121, 121, 121, 121, 121, 121, 121, 121, 121, + /* 840 */ 121, 121, 121, 121, 38, 39, 40, 41, 42, 43, + /* 850 */ 44, 45, 46, 47, 48, 49, 50, 51, 121, 121, + /* 860 */ 121, 121, 121, 121, 121, 121, 121, 121, 121, 63, + /* 870 */ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + /* 880 */ 74, 75, 1, 121, 121, 121, 88, 83, 1, 16, + /* 890 */ 16, 87, 121, 10, 16, 91, 121, 16, 15, 101, + /* 900 */ 102, 28, 28, 16, 21, 22, 28, 103, 104, 105, + /* 910 */ 27, 107, 121, 115, 31, 32, 33, 121, 1, 38, + /* 920 */ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + /* 930 */ 49, 50, 51, 16, 121, 121, 121, 121, 121, 52, + /* 940 */ 121, 121, 121, 121, 121, 64, 65, 66, 67, 68, + /* 950 */ 69, 70, 71, 72, 73, 74, 75, 1, 121, 76, + /* 960 */ 77, 78, 83, 16, 16, 16, 87, 121, 10, 16, + /* 970 */ 91, 121, 16, 15, 121, 28, 28, 28, 121, 21, + /* 980 */ 22, 28, 103, 104, 105, 27, 107, 121, 121, 31, + /* 990 */ 32, 33, 121, 121, 38, 39, 40, 41, 42, 43, + /* 1000 */ 44, 45, 46, 47, 48, 49, 50, 51, 1, 121, + /* 1010 */ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + /* 1020 */ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + /* 1030 */ 74, 75, 121, 121, 76, 77, 78, 121, 121, 121, + /* 1040 */ 121, 121, 121, 121, 121, 38, 39, 40, 41, 42, + /* 1050 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 121, + /* 1060 */ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + /* 1070 */ 121, 64, 65, 66, 67, 68, 69, 70, 71, 72, + /* 1080 */ 73, 74, 75, 121, 38, 39, 40, 41, 42, 43, + /* 1090 */ 44, 45, 46, 47, 48, 49, 50, 51, 121, 121, + /* 1100 */ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + /* 1110 */ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + /* 1120 */ 74, 75, 121, 121, 121, 121, 15, 121, 17, 18, + /* 1130 */ 121, 83, 21, 22, 16, 87, 121, 16, 27, 91, + /* 1140 */ 121, 121, 31, 32, 33, 34, 28, 36, 100, 28, + /* 1150 */ 39, 103, 104, 105, 121, 107, 83, 121, 121, 121, + /* 1160 */ 87, 121, 121, 121, 91, 54, 55, 56, 57, 58, + /* 1170 */ 121, 83, 61, 62, 63, 87, 103, 104, 105, 91, + /* 1180 */ 107, 121, 15, 121, 17, 18, 121, 76, 21, 22, + /* 1190 */ 16, 103, 104, 105, 27, 107, 16, 16, 31, 32, + /* 1200 */ 33, 34, 28, 36, 16, 121, 39, 16, 28, 28, + /* 1210 */ 83, 121, 121, 121, 87, 121, 28, 90, 91, 28, + /* 1220 */ 1, 54, 55, 56, 57, 58, 99, 100, 61, 62, + /* 1230 */ 103, 104, 105, 1, 107, 16, 121, 16, 15, 121, + /* 1240 */ 17, 18, 121, 76, 21, 22, 16, 28, 16, 28, + /* 1250 */ 27, 16, 20, 121, 31, 32, 33, 34, 28, 36, + /* 1260 */ 28, 121, 39, 28, 16, 121, 83, 121, 36, 121, + /* 1270 */ 87, 52, 121, 90, 91, 121, 28, 54, 55, 56, + /* 1280 */ 57, 58, 99, 100, 61, 62, 103, 104, 105, 121, + /* 1290 */ 107, 59, 121, 121, 15, 121, 17, 18, 121, 76, + /* 1300 */ 21, 22, 121, 121, 121, 121, 27, 121, 121, 121, + /* 1310 */ 31, 32, 33, 34, 121, 36, 121, 121, 39, 121, + /* 1320 */ 121, 121, 83, 121, 121, 121, 87, 121, 121, 90, + /* 1330 */ 91, 121, 1, 54, 55, 56, 57, 58, 99, 100, + /* 1340 */ 61, 62, 103, 104, 105, 121, 107, 16, 121, 121, + /* 1350 */ 15, 121, 17, 18, 121, 76, 21, 22, 121, 28, + /* 1360 */ 29, 121, 27, 121, 121, 121, 31, 32, 33, 34, + /* 1370 */ 121, 36, 121, 121, 39, 121, 121, 121, 83, 121, + /* 1380 */ 121, 121, 87, 52, 121, 90, 91, 121, 1, 54, + /* 1390 */ 55, 56, 57, 58, 99, 100, 61, 62, 103, 104, + /* 1400 */ 105, 121, 107, 16, 121, 121, 15, 121, 17, 18, + /* 1410 */ 121, 76, 21, 22, 121, 28, 121, 121, 27, 121, + /* 1420 */ 121, 121, 31, 32, 33, 34, 121, 36, 121, 121, + /* 1430 */ 39, 121, 121, 121, 83, 121, 121, 121, 87, 52, + /* 1440 */ 121, 90, 91, 121, 1, 54, 55, 56, 57, 58, + /* 1450 */ 99, 100, 61, 62, 103, 104, 105, 121, 107, 16, + /* 1460 */ 121, 121, 15, 121, 17, 18, 121, 76, 21, 22, + /* 1470 */ 121, 28, 121, 121, 27, 121, 121, 121, 31, 32, + /* 1480 */ 33, 34, 121, 36, 121, 121, 39, 121, 121, 121, + /* 1490 */ 83, 121, 121, 121, 87, 52, 121, 90, 91, 121, + /* 1500 */ 121, 54, 55, 56, 57, 58, 99, 100, 61, 62, + /* 1510 */ 103, 104, 105, 121, 107, 121, 121, 121, 15, 121, + /* 1520 */ 17, 18, 121, 76, 21, 22, 121, 121, 121, 121, + /* 1530 */ 27, 121, 121, 121, 31, 32, 33, 34, 121, 36, + /* 1540 */ 121, 121, 39, 121, 121, 121, 83, 121, 121, 121, + /* 1550 */ 87, 121, 121, 90, 91, 121, 121, 54, 55, 56, + /* 1560 */ 57, 58, 99, 100, 61, 62, 103, 104, 105, 121, + /* 1570 */ 107, 121, 121, 121, 15, 121, 17, 18, 121, 76, + /* 1580 */ 21, 22, 121, 121, 121, 121, 27, 121, 121, 121, + /* 1590 */ 31, 32, 33, 34, 121, 36, 121, 121, 39, 121, + /* 1600 */ 121, 121, 83, 121, 121, 121, 87, 121, 121, 90, + /* 1610 */ 91, 121, 121, 54, 55, 56, 57, 58, 99, 100, + /* 1620 */ 61, 62, 103, 104, 105, 121, 107, 121, 121, 121, + /* 1630 */ 15, 121, 17, 18, 121, 76, 21, 22, 121, 121, + /* 1640 */ 121, 121, 27, 121, 121, 121, 31, 32, 33, 34, + /* 1650 */ 121, 36, 121, 121, 39, 121, 121, 121, 83, 121, + /* 1660 */ 121, 121, 87, 121, 121, 90, 91, 121, 121, 54, + /* 1670 */ 55, 56, 57, 58, 99, 100, 61, 62, 103, 104, + /* 1680 */ 105, 121, 107, 121, 121, 121, 15, 121, 17, 18, + /* 1690 */ 121, 76, 21, 22, 121, 121, 121, 121, 27, 121, + /* 1700 */ 121, 121, 31, 32, 33, 34, 121, 36, 121, 121, + /* 1710 */ 39, 121, 121, 121, 83, 121, 121, 121, 87, 121, + /* 1720 */ 121, 90, 91, 121, 121, 54, 55, 56, 57, 58, + /* 1730 */ 99, 100, 61, 121, 103, 104, 105, 121, 107, 121, + /* 1740 */ 121, 121, 15, 121, 17, 18, 121, 76, 21, 22, + /* 1750 */ 121, 121, 121, 121, 27, 121, 121, 121, 31, 32, + /* 1760 */ 33, 34, 121, 36, 88, 89, 39, 121, 121, 121, + /* 1770 */ 121, 121, 121, 121, 98, 121, 121, 101, 102, 121, + /* 1780 */ 16, 54, 55, 56, 57, 58, 121, 23, 61, 25, + /* 1790 */ 26, 115, 28, 29, 121, 121, 121, 121, 121, 35, + /* 1800 */ 36, 37, 121, 76, 121, 121, 121, 121, 121, 121, + /* 1810 */ 121, 121, 121, 83, 121, 121, 52, 87, 121, 121, + /* 1820 */ 90, 91, 121, 59, 121, 121, 121, 63, 121, 99, + /* 1830 */ 100, 121, 121, 103, 104, 105, 121, 107, 83, 121, + /* 1840 */ 121, 77, 87, 121, 121, 90, 91, 121, 118, 121, + /* 1850 */ 121, 121, 121, 121, 99, 100, 121, 121, 103, 104, + /* 1860 */ 105, 121, 107, 121, 83, 121, 121, 121, 87, 121, + /* 1870 */ 121, 90, 91, 121, 83, 121, 121, 121, 87, 121, + /* 1880 */ 99, 100, 91, 83, 103, 104, 105, 87, 107, 121, + /* 1890 */ 90, 91, 121, 121, 103, 104, 105, 121, 107, 99, + /* 1900 */ 100, 121, 121, 103, 104, 105, 121, 107, 121, 121, + /* 1910 */ 121, 83, 121, 121, 121, 87, 121, 121, 90, 91, + /* 1920 */ 121, 121, 83, 121, 121, 121, 87, 99, 100, 90, + /* 1930 */ 91, 103, 104, 105, 121, 107, 121, 121, 99, 100, + /* 1940 */ 121, 121, 103, 104, 105, 121, 107, 121, 83, 121, + /* 1950 */ 121, 121, 87, 121, 121, 90, 91, 121, 83, 121, + /* 1960 */ 121, 121, 87, 121, 99, 100, 91, 83, 103, 104, + /* 1970 */ 105, 87, 107, 121, 90, 91, 121, 121, 103, 104, + /* 1980 */ 105, 121, 107, 99, 100, 121, 121, 103, 104, 105, + /* 1990 */ 121, 107, 121, 121, 121, 83, 121, 121, 121, 87, + /* 2000 */ 121, 121, 90, 91, 121, 121, 83, 121, 121, 121, + /* 2010 */ 87, 99, 100, 90, 91, 103, 104, 105, 121, 107, + /* 2020 */ 121, 121, 99, 100, 121, 121, 103, 104, 105, 121, + /* 2030 */ 107, 121, 83, 88, 89, 121, 87, 121, 121, 90, + /* 2040 */ 91, 121, 121, 98, 121, 121, 101, 102, 99, 100, + /* 2050 */ 121, 83, 103, 104, 105, 87, 107, 121, 90, 91, + /* 2060 */ 115, 121, 121, 121, 88, 89, 121, 99, 100, 121, + /* 2070 */ 121, 103, 104, 105, 98, 107, 121, 101, 102, 83, + /* 2080 */ 121, 121, 121, 87, 121, 121, 90, 91, 121, 121, + /* 2090 */ 83, 115, 121, 121, 87, 99, 100, 90, 91, 103, + /* 2100 */ 104, 105, 121, 107, 121, 121, 99, 100, 121, 121, + /* 2110 */ 103, 104, 105, 121, 107, 121, 83, 88, 89, 121, + /* 2120 */ 87, 121, 121, 90, 91, 121, 121, 98, 121, 121, + /* 2130 */ 101, 102, 99, 100, 121, 83, 103, 104, 105, 87, + /* 2140 */ 107, 121, 90, 91, 115, 121, 121, 121, 88, 89, + /* 2150 */ 121, 99, 100, 121, 121, 103, 104, 105, 98, 107, + /* 2160 */ 121, 101, 102, 83, 121, 121, 121, 87, 121, 121, + /* 2170 */ 90, 91, 121, 121, 83, 115, 121, 121, 87, 99, + /* 2180 */ 100, 90, 91, 103, 104, 105, 121, 107, 121, 121, + /* 2190 */ 99, 100, 121, 121, 103, 104, 105, 121, 107, 121, + /* 2200 */ 83, 88, 89, 121, 87, 121, 121, 90, 91, 121, + /* 2210 */ 121, 98, 121, 121, 101, 102, 99, 100, 121, 83, + /* 2220 */ 103, 104, 105, 87, 107, 121, 90, 91, 115, 121, + /* 2230 */ 121, 121, 121, 121, 121, 99, 100, 121, 121, 103, + /* 2240 */ 104, 105, 121, 107, 121, 121, 121, 83, 121, 121, + /* 2250 */ 121, 87, 121, 121, 90, 91, 121, 121, 83, 121, + /* 2260 */ 121, 121, 87, 99, 100, 90, 91, 103, 104, 105, + /* 2270 */ 121, 107, 121, 121, 99, 100, 121, 121, 103, 104, + /* 2280 */ 105, 121, 107, 121, 83, 121, 121, 121, 87, 121, + /* 2290 */ 121, 90, 91, 121, 121, 121, 121, 121, 121, 121, + /* 2300 */ 99, 100, 121, 83, 103, 104, 105, 87, 107, 121, + /* 2310 */ 90, 91, 121, 121, 121, 121, 121, 121, 121, 99, + /* 2320 */ 100, 121, 121, 103, 104, 105, 121, 107, 121, 121, + /* 2330 */ 121, 83, 121, 121, 121, 87, 121, 121, 90, 91, + /* 2340 */ 121, 121, 83, 121, 121, 121, 87, 99, 100, 90, + /* 2350 */ 91, 103, 104, 105, 121, 107, 121, 121, 99, 100, + /* 2360 */ 121, 121, 103, 104, 105, 121, 107, 121, 83, 121, + /* 2370 */ 121, 121, 87, 121, 121, 90, 91, 121, 121, 121, + /* 2380 */ 121, 121, 121, 121, 99, 100, 121, 121, 103, 104, + /* 2390 */ 105, 121, 107, ); - const YY_SHIFT_USE_DFLT = -45; + const YY_SHIFT_USE_DFLT = -5; const YY_SHIFT_MAX = 252; static public $yy_shift_ofst = array( - /* 0 */ -2, 1289, 1289, 1124, 1124, 1124, 1399, 1399, 1069, 1564, - /* 10 */ 1124, 1124, 1124, 1124, 1124, 1124, 1509, 1124, 1124, 1454, - /* 20 */ 1509, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, - /* 30 */ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1344, 1124, 1124, - /* 40 */ 1234, 1124, 1124, 1234, 1179, 1179, 1619, 1674, 1619, 1619, - /* 50 */ 1619, 1619, 1619, 197, 49, -1, 123, 595, 595, 595, - /* 60 */ 793, 867, 917, 495, 345, 271, 395, 445, 545, 743, - /* 70 */ 669, 967, 967, 967, 967, 967, 967, 967, 967, 967, - /* 80 */ 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, - /* 90 */ 1005, 1005, 1188, 1142, 1252, 1246, 474, -2, 745, 270, - /* 100 */ -4, 1243, 344, 198, 1243, 344, 363, 435, 474, 474, - /* 110 */ 474, 1088, 47, 670, 1132, 161, 675, 125, 313, 3, - /* 120 */ 79, 211, 201, 272, 196, 361, 1248, 1006, 411, 311, - /* 130 */ 438, 1065, 311, 435, 311, 435, 289, 289, 311, 311, - /* 140 */ 311, 459, 398, 438, 311, 311, 311, 549, 85, 85, - /* 150 */ 550, 327, 327, 327, 327, 327, 327, 327, 327, -45, - /* 160 */ 238, 61, 350, 337, 0, 856, 736, 741, -44, 215, - /* 170 */ -44, 737, 740, 735, -44, -44, 1197, 1175, -44, 1222, - /* 180 */ 1247, 1232, 1145, 865, 359, 859, 866, 1122, 1121, 1077, - /* 190 */ 704, 1078, 85, 108, 327, 577, 85, 585, 577, 327, - /* 200 */ 85, 108, 143, -45, -45, -45, -45, 1710, 119, 193, - /* 210 */ 48, 67, 73, 266, 266, 268, 269, 291, 676, 340, - /* 220 */ 547, 50, 666, 240, 523, 516, 548, 437, 510, 491, - /* 230 */ 143, 517, 539, 538, 536, 534, 535, 502, 490, 463, - /* 240 */ 482, 439, 461, 458, 427, 485, 486, 465, 464, 505, - /* 250 */ 453, 488, 546, + /* 0 */ 1, 1391, 1391, 1223, 1167, 1167, 1167, 1223, 1111, 1167, + /* 10 */ 1167, 1167, 1503, 1167, 1559, 1167, 1167, 1167, 1167, 1167, + /* 20 */ 1167, 1167, 1167, 1167, 1167, 1615, 1167, 1167, 1167, 1167, + /* 30 */ 1503, 1167, 1167, 1447, 1167, 1167, 1167, 1167, 1279, 1167, + /* 40 */ 1167, 1167, 1279, 1167, 1335, 1335, 1727, 1671, 1727, 1727, + /* 50 */ 1727, 1727, 1727, 224, 74, 149, -1, 755, 755, 755, + /* 60 */ 956, 881, 806, 527, 326, 704, 275, 377, 653, 602, + /* 70 */ 452, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, + /* 80 */ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, + /* 90 */ 1046, 1046, 1232, 1443, 407, 1, 958, 73, 146, 225, + /* 100 */ 546, 61, 61, 443, 443, 243, 371, 407, 407, 883, + /* 110 */ 47, 1331, 11, 189, 1387, 1219, 226, 56, 138, 235, + /* 120 */ 75, 887, 219, 366, 371, 367, 366, 366, 368, 293, + /* 130 */ 371, 366, 917, 366, 366, 445, 366, 418, 366, 1248, + /* 140 */ 368, 366, 300, 395, 293, 636, 629, 636, 616, 636, + /* 150 */ 610, 636, 636, 636, 636, 616, 636, -5, 166, 167, + /* 160 */ 601, 603, 873, 594, 148, 217, 148, 473, 947, 148, + /* 170 */ 874, 878, 948, 1235, 148, 543, 1191, 1221, 148, 1230, + /* 180 */ 563, 1188, 1121, 1118, 953, 949, 1181, 1174, 1180, 670, + /* 190 */ 632, 632, 616, 616, 636, 616, 636, 102, 102, 396, + /* 200 */ -5, -5, -5, -5, -5, 1764, 150, 22, 118, 71, + /* 210 */ 176, -4, 486, 144, 144, 213, 270, 261, 296, 328, + /* 220 */ 449, 271, 295, 615, 579, 560, 566, 441, 564, 396, + /* 230 */ 528, 591, 551, 589, 571, 614, 552, 529, 539, 494, + /* 240 */ 448, 492, 471, 450, 488, 469, 459, 511, 522, 510, + /* 250 */ 496, 523, 500, ); - const YY_REDUCE_USE_DFLT = -91; - const YY_REDUCE_MAX = 206; + const YY_REDUCE_USE_DFLT = -86; + const YY_REDUCE_MAX = 204; static public $yy_reduce_ofst = array( - /* 0 */ -48, 1676, 1708, 117, 43, 265, 191, 591, 1991, 1967, - /* 10 */ 1941, 2009, 2031, 2081, 2057, 1919, 1901, 1787, 1759, 1730, - /* 20 */ 1811, 1829, 1877, 1851, 2099, 2121, 2391, 2369, 2351, 2441, - /* 30 */ 2481, 2459, 2507, 2327, 787, 2301, 2189, 2171, 2147, 2211, - /* 40 */ 2237, 2279, 2261, 2417, 1116, 2531, 1250, 1305, 1085, 1195, - /* 50 */ 1140, 1360, 1415, 1580, 1739, 661, 587, 1794, 1766, 587, - /* 60 */ 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, - /* 70 */ 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, - /* 80 */ 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, - /* 90 */ 1034, 1034, 14, 113, 62, 113, 136, -25, 204, 187, - /* 100 */ 783, 260, 261, 169, 309, 791, 316, 65, 360, 384, - /* 110 */ 40, 937, 315, -6, -6, 984, -6, 244, 95, 244, - /* 120 */ -6, 341, -6, 95, 244, 710, 433, 95, 710, 884, - /* 130 */ 834, 314, 412, 312, 512, 333, 367, 418, 710, 1204, - /* 140 */ 1074, 1184, -6, 710, 392, 1032, 987, 160, 95, 72, - /* 150 */ 86, -6, -6, -6, -6, -6, -6, -6, -6, -6, - /* 160 */ 468, 469, 476, 476, 476, 476, 476, 476, 467, 466, - /* 170 */ 467, 476, 476, 476, 467, 467, 476, 476, 467, 476, - /* 180 */ 476, 476, 476, 476, -90, 476, 476, 476, 476, 476, - /* 190 */ -90, 476, 42, 481, -90, 456, 42, 513, 456, -90, - /* 200 */ 42, 356, 324, 217, 126, 168, 306, + /* 0 */ -63, -7, 1730, 68, 446, 373, 143, 521, 2091, 2117, + /* 10 */ 1800, 1407, 2080, 1884, 1912, 1575, 1949, 1923, 1865, 1968, + /* 20 */ 1996, 2052, 2033, 2007, 1839, 1828, 1351, 1295, 1183, 1239, + /* 30 */ 1463, 1519, 1781, 1755, 1631, 2175, 2248, 2201, 2164, 2285, + /* 40 */ 2259, 2136, 2220, 1127, 379, 1048, 451, 1073, 804, 879, + /* 50 */ 1875, 1791, 1088, 1976, 1945, 1676, 2060, 1676, 2113, 2029, + /* 60 */ 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, + /* 70 */ 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, + /* 80 */ 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, + /* 90 */ 798, 798, 39, 113, 214, -81, 43, 442, -74, 20, + /* 100 */ -10, 239, 264, 525, 517, 378, 188, 314, 291, 697, + /* 110 */ 170, -6, 520, 248, -6, -6, 248, -6, 248, 246, + /* 120 */ 172, -6, 172, 568, 313, 495, 495, 569, 570, 324, + /* 130 */ 244, 292, 245, 420, 345, 172, 301, 495, 621, 491, + /* 140 */ 495, 619, -6, 620, 325, -6, 211, -6, 147, -6, + /* 150 */ 81, -6, -6, -6, -6, 172, -6, -6, 545, 549, + /* 160 */ 536, 536, 536, 536, 530, 548, 530, 540, 536, 530, + /* 170 */ 536, 536, 536, 536, 530, 540, 536, 536, 530, 536, + /* 180 */ 540, 536, 536, 536, 536, 536, 536, 536, 536, 596, + /* 190 */ 567, 588, 550, 550, 540, 550, 540, -85, -85, 331, + /* 200 */ 306, 349, 337, 260, 134, ); static public $yyExpectedTokens = array( - /* 0 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 21, 22, 27, 31, 32, ), - /* 1 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 2 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 3 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 4 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 5 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 6 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 7 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 8 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 62, 75, ), - /* 9 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 10 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 11 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 12 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 13 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 14 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 15 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 16 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 17 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 18 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 19 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 20 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 21 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 22 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 23 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 24 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 25 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 26 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 27 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 28 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 29 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 30 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 31 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 32 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 33 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 34 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 35 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 36 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 37 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 38 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 39 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 40 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 41 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 42 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 43 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 44 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 45 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 61, 75, ), - /* 46 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 75, ), - /* 47 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 75, ), - /* 48 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 75, ), - /* 49 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 75, ), - /* 50 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 75, ), - /* 51 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 75, ), - /* 52 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 35, 38, 53, 54, 55, 56, 57, 60, 75, ), - /* 53 */ array(1, 16, 28, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 54 */ array(1, 26, 28, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 55 */ array(1, 16, 28, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 56 */ array(1, 16, 28, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 57 */ array(1, 28, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 58 */ array(1, 28, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 59 */ array(1, 28, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 60 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 61 */ array(1, 16, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 62 */ array(1, 29, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 63 */ array(1, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 64 */ array(1, 16, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 65 */ array(1, 16, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 66 */ array(1, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 67 */ array(1, 2, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 68 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76, ), - /* 69 */ array(1, 16, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 70 */ array(1, 23, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 71 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 72 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 73 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 74 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 75 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 76 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 77 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 78 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 79 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 80 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 81 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 82 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 83 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 84 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 85 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 86 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 87 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 88 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 89 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 90 */ array(37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 91 */ array(37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ), - /* 92 */ array(1, 16, 20, 28, 35, 58, ), - /* 93 */ array(1, 16, 24, 28, ), - /* 94 */ array(1, 16, 28, 51, ), - /* 95 */ array(1, 16, 24, 28, ), - /* 96 */ array(1, 28, ), - /* 97 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 21, 22, 27, 31, 32, ), - /* 98 */ array(10, 15, 21, 22, 27, 31, 32, 75, 76, 77, ), - /* 99 */ array(15, 18, 28, 30, ), - /* 100 */ array(15, 18, 28, 30, ), + /* 0 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 21, 22, 27, 31, 32, 33, ), + /* 1 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 2 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 3 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 4 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 5 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 6 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 7 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 8 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 63, 76, ), + /* 9 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 10 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 11 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 12 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 13 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 14 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 15 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 16 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 17 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 18 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 19 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 20 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 21 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 22 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 23 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 24 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 25 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 26 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 27 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 28 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 29 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 30 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 31 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 32 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 33 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 34 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 35 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 36 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 37 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 38 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 39 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 40 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 41 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 42 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 43 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 44 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 45 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 62, 76, ), + /* 46 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 76, ), + /* 47 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 76, ), + /* 48 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 76, ), + /* 49 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 76, ), + /* 50 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 76, ), + /* 51 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 76, ), + /* 52 */ array(15, 17, 18, 21, 22, 27, 31, 32, 33, 34, 36, 39, 54, 55, 56, 57, 58, 61, 76, ), + /* 53 */ array(1, 16, 28, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 54 */ array(1, 16, 28, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 55 */ array(1, 16, 28, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 56 */ array(1, 26, 28, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 57 */ array(1, 28, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 58 */ array(1, 28, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 59 */ array(1, 28, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 60 */ array(1, 16, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 61 */ array(1, 16, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 62 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 63 */ array(1, 16, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 64 */ array(1, 29, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 65 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 66 */ array(1, 2, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 67 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, ), + /* 68 */ array(1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 69 */ array(1, 16, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 70 */ array(1, 23, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 71 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 72 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 73 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 74 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 75 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 76 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 77 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 78 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 79 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 80 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 81 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 82 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 83 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 84 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 85 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 86 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 87 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 88 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 89 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 90 */ array(38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 91 */ array(38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ), + /* 92 */ array(1, 16, 20, 28, 36, 59, ), + /* 93 */ array(1, 16, 28, 52, ), + /* 94 */ array(1, 28, ), + /* 95 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 21, 22, 27, 31, 32, 33, ), + /* 96 */ array(10, 15, 21, 22, 27, 31, 32, 33, 76, 77, 78, ), + /* 97 */ array(15, 18, 28, 30, ), + /* 98 */ array(15, 18, 28, 30, ), + /* 99 */ array(20, 57, 62, ), + /* 100 */ array(1, 2, 16, ), /* 101 */ array(1, 16, 28, ), - /* 102 */ array(15, 18, 28, ), - /* 103 */ array(20, 56, 61, ), - /* 104 */ array(1, 16, 28, ), - /* 105 */ array(15, 18, 28, ), - /* 106 */ array(17, 18, 60, ), - /* 107 */ array(17, 35, ), + /* 102 */ array(1, 16, 28, ), + /* 103 */ array(15, 18, 28, ), + /* 104 */ array(15, 18, 28, ), + /* 105 */ array(17, 18, 61, ), + /* 106 */ array(17, 36, ), + /* 107 */ array(1, 28, ), /* 108 */ array(1, 28, ), - /* 109 */ array(1, 28, ), - /* 110 */ array(1, 28, ), - /* 111 */ array(10, 15, 21, 22, 27, 31, 32, 75, 76, 77, ), - /* 112 */ array(4, 5, 6, 7, 8, 12, 13, 14, ), - /* 113 */ array(1, 16, 28, 29, 51, ), - /* 114 */ array(1, 16, 28, 51, ), - /* 115 */ array(15, 18, 19, 24, ), - /* 116 */ array(1, 16, 28, 51, ), - /* 117 */ array(15, 18, 19, 59, ), - /* 118 */ array(19, 20, 58, ), - /* 119 */ array(15, 18, 19, ), - /* 120 */ array(1, 30, 51, ), - /* 121 */ array(1, 16, 20, ), - /* 122 */ array(1, 16, 51, ), - /* 123 */ array(19, 20, 58, ), - /* 124 */ array(15, 18, 59, ), + /* 109 */ array(10, 15, 21, 22, 27, 31, 32, 33, 76, 77, 78, ), + /* 110 */ array(4, 5, 6, 7, 8, 12, 13, 14, ), + /* 111 */ array(1, 16, 28, 29, 52, ), + /* 112 */ array(15, 18, 19, 24, ), + /* 113 */ array(15, 18, 19, 60, ), + /* 114 */ array(1, 16, 28, 52, ), + /* 115 */ array(1, 16, 28, 52, ), + /* 116 */ array(15, 18, 60, ), + /* 117 */ array(1, 30, 52, ), + /* 118 */ array(15, 18, 19, ), + /* 119 */ array(1, 16, 20, ), + /* 120 */ array(19, 20, 59, ), + /* 121 */ array(1, 16, 52, ), + /* 122 */ array(19, 20, 59, ), + /* 123 */ array(15, 18, ), + /* 124 */ array(17, 36, ), /* 125 */ array(15, 18, ), - /* 126 */ array(16, 28, ), - /* 127 */ array(20, 58, ), + /* 126 */ array(15, 18, ), + /* 127 */ array(15, 18, ), /* 128 */ array(15, 18, ), - /* 129 */ array(15, 18, ), - /* 130 */ array(15, 18, ), - /* 131 */ array(1, 16, ), - /* 132 */ array(15, 18, ), - /* 133 */ array(17, 35, ), + /* 129 */ array(17, 18, ), + /* 130 */ array(17, 36, ), + /* 131 */ array(15, 18, ), + /* 132 */ array(1, 16, ), + /* 133 */ array(15, 18, ), /* 134 */ array(15, 18, ), - /* 135 */ array(17, 35, ), - /* 136 */ array(17, 18, ), - /* 137 */ array(17, 18, ), + /* 135 */ array(20, 59, ), + /* 136 */ array(15, 18, ), + /* 137 */ array(15, 18, ), /* 138 */ array(15, 18, ), - /* 139 */ array(15, 18, ), + /* 139 */ array(16, 28, ), /* 140 */ array(15, 18, ), /* 141 */ array(15, 18, ), - /* 142 */ array(1, 51, ), + /* 142 */ array(1, 52, ), /* 143 */ array(15, 18, ), - /* 144 */ array(15, 18, ), - /* 145 */ array(15, 18, ), - /* 146 */ array(15, 18, ), - /* 147 */ array(28, ), + /* 144 */ array(17, 18, ), + /* 145 */ array(1, ), + /* 146 */ array(28, ), + /* 147 */ array(1, ), /* 148 */ array(20, ), - /* 149 */ array(20, ), + /* 149 */ array(1, ), /* 150 */ array(28, ), /* 151 */ array(1, ), /* 152 */ array(1, ), /* 153 */ array(1, ), /* 154 */ array(1, ), - /* 155 */ array(1, ), + /* 155 */ array(20, ), /* 156 */ array(1, ), - /* 157 */ array(1, ), - /* 158 */ array(1, ), - /* 159 */ array(), - /* 160 */ array(15, 18, 59, ), - /* 161 */ array(15, 17, 18, ), + /* 157 */ array(), + /* 158 */ array(15, 17, 18, ), + /* 159 */ array(15, 18, 60, ), + /* 160 */ array(16, 28, ), + /* 161 */ array(16, 28, ), /* 162 */ array(16, 28, ), /* 163 */ array(16, 28, ), - /* 164 */ array(16, 28, ), - /* 165 */ array(16, 28, ), - /* 166 */ array(16, 28, ), - /* 167 */ array(16, 28, ), - /* 168 */ array(56, 61, ), - /* 169 */ array(15, 35, ), - /* 170 */ array(56, 61, ), + /* 164 */ array(57, 62, ), + /* 165 */ array(15, 36, ), + /* 166 */ array(57, 62, ), + /* 167 */ array(1, 16, ), + /* 168 */ array(16, 28, ), + /* 169 */ array(57, 62, ), + /* 170 */ array(16, 28, ), /* 171 */ array(16, 28, ), /* 172 */ array(16, 28, ), /* 173 */ array(16, 28, ), - /* 174 */ array(56, 61, ), - /* 175 */ array(56, 61, ), + /* 174 */ array(57, 62, ), + /* 175 */ array(1, 16, ), /* 176 */ array(16, 28, ), /* 177 */ array(16, 28, ), - /* 178 */ array(56, 61, ), + /* 178 */ array(57, 62, ), /* 179 */ array(16, 28, ), - /* 180 */ array(16, 28, ), + /* 180 */ array(1, 16, ), /* 181 */ array(16, 28, ), /* 182 */ array(16, 28, ), /* 183 */ array(16, 28, ), - /* 184 */ array(1, 16, ), + /* 184 */ array(16, 28, ), /* 185 */ array(16, 28, ), /* 186 */ array(16, 28, ), /* 187 */ array(16, 28, ), /* 188 */ array(16, 28, ), - /* 189 */ array(16, 28, ), - /* 190 */ array(1, 16, ), - /* 191 */ array(16, 28, ), + /* 189 */ array(13, ), + /* 190 */ array(28, ), + /* 191 */ array(28, ), /* 192 */ array(20, ), - /* 193 */ array(28, ), + /* 193 */ array(20, ), /* 194 */ array(1, ), - /* 195 */ array(2, ), - /* 196 */ array(20, ), - /* 197 */ array(13, ), + /* 195 */ array(20, ), + /* 196 */ array(1, ), + /* 197 */ array(2, ), /* 198 */ array(2, ), - /* 199 */ array(1, ), - /* 200 */ array(20, ), - /* 201 */ array(28, ), - /* 202 */ array(35, ), + /* 199 */ array(36, ), + /* 200 */ array(), + /* 201 */ array(), + /* 202 */ array(), /* 203 */ array(), /* 204 */ array(), - /* 205 */ array(), - /* 206 */ array(), - /* 207 */ array(16, 23, 25, 26, 28, 29, 34, 35, 36, 51, 58, 62, 76, ), - /* 208 */ array(16, 19, 28, 35, 58, ), - /* 209 */ array(16, 28, 35, 58, ), - /* 210 */ array(35, 56, 58, 62, ), - /* 211 */ array(15, 17, 18, 33, ), - /* 212 */ array(30, 35, 58, ), - /* 213 */ array(35, 58, ), - /* 214 */ array(35, 58, ), - /* 215 */ array(34, 36, ), - /* 216 */ array(34, 36, ), - /* 217 */ array(34, 36, ), - /* 218 */ array(2, 19, ), - /* 219 */ array(34, 62, ), - /* 220 */ array(23, 34, ), - /* 221 */ array(24, 76, ), - /* 222 */ array(19, 56, ), - /* 223 */ array(18, 59, ), - /* 224 */ array(33, ), - /* 225 */ array(33, ), - /* 226 */ array(2, ), + /* 205 */ array(16, 23, 25, 26, 28, 29, 35, 36, 37, 52, 59, 63, 77, ), + /* 206 */ array(16, 19, 28, 36, 59, ), + /* 207 */ array(36, 57, 59, 63, ), + /* 208 */ array(15, 17, 18, 34, ), + /* 209 */ array(16, 28, 36, 59, ), + /* 210 */ array(30, 36, 59, ), + /* 211 */ array(18, 60, ), + /* 212 */ array(2, 19, ), + /* 213 */ array(36, 59, ), + /* 214 */ array(36, 59, ), + /* 215 */ array(16, 24, ), + /* 216 */ array(35, 37, ), + /* 217 */ array(24, 77, ), + /* 218 */ array(35, 63, ), + /* 219 */ array(23, 35, ), + /* 220 */ array(19, 57, ), + /* 221 */ array(35, 37, ), + /* 222 */ array(35, 37, ), + /* 223 */ array(18, ), + /* 224 */ array(2, ), + /* 225 */ array(24, ), + /* 226 */ array(17, ), /* 227 */ array(18, ), /* 228 */ array(18, ), - /* 229 */ array(56, ), - /* 230 */ array(35, ), - /* 231 */ array(35, ), - /* 232 */ array(18, ), - /* 233 */ array(17, ), + /* 229 */ array(36, ), + /* 230 */ array(57, ), + /* 231 */ array(18, ), + /* 232 */ array(36, ), + /* 233 */ array(18, ), /* 234 */ array(17, ), - /* 235 */ array(17, ), - /* 236 */ array(19, ), - /* 237 */ array(25, ), - /* 238 */ array(36, ), + /* 235 */ array(18, ), + /* 236 */ array(34, ), + /* 237 */ array(34, ), + /* 238 */ array(18, ), /* 239 */ array(17, ), - /* 240 */ array(17, ), - /* 241 */ array(62, ), - /* 242 */ array(18, ), - /* 243 */ array(18, ), - /* 244 */ array(24, ), - /* 245 */ array(18, ), - /* 246 */ array(18, ), - /* 247 */ array(60, ), - /* 248 */ array(60, ), - /* 249 */ array(18, ), - /* 250 */ array(52, ), + /* 240 */ array(61, ), + /* 241 */ array(18, ), + /* 242 */ array(37, ), + /* 243 */ array(17, ), + /* 244 */ array(19, ), + /* 245 */ array(63, ), + /* 246 */ array(53, ), + /* 247 */ array(2, ), + /* 248 */ array(17, ), + /* 249 */ array(25, ), + /* 250 */ array(18, ), /* 251 */ array(18, ), - /* 252 */ array(2, ), + /* 252 */ array(61, ), /* 253 */ array(), /* 254 */ array(), /* 255 */ array(), @@ -1186,51 +1149,51 @@ static public $yy_action = array( /* 386 */ array(), ); static public $yy_default = array( - /* 0 */ 390, 571, 588, 542, 542, 542, 588, 588, 588, 588, + /* 0 */ 390, 571, 588, 588, 542, 542, 542, 588, 588, 588, /* 10 */ 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, /* 20 */ 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, /* 30 */ 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, /* 40 */ 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, - /* 50 */ 588, 588, 588, 588, 450, 588, 588, 450, 450, 450, - /* 60 */ 588, 588, 455, 588, 588, 588, 588, 588, 588, 588, - /* 70 */ 588, 471, 474, 574, 573, 541, 434, 452, 475, 476, - /* 80 */ 484, 572, 455, 483, 480, 460, 461, 479, 540, 457, - /* 90 */ 488, 487, 499, 489, 463, 489, 450, 387, 588, 450, - /* 100 */ 450, 470, 450, 554, 507, 450, 588, 588, 450, 450, - /* 110 */ 450, 588, 588, 463, 463, 588, 463, 515, 508, 515, - /* 120 */ 463, 588, 463, 508, 515, 588, 588, 508, 588, 588, - /* 130 */ 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, - /* 140 */ 588, 588, 463, 588, 515, 588, 588, 450, 508, 551, - /* 150 */ 450, 467, 468, 466, 490, 486, 473, 492, 491, 549, - /* 160 */ 516, 588, 588, 588, 588, 588, 588, 588, 532, 515, - /* 170 */ 534, 588, 588, 588, 535, 533, 588, 588, 513, 588, - /* 180 */ 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, - /* 190 */ 588, 588, 529, 587, 470, 544, 555, 405, 543, 507, - /* 200 */ 552, 587, 515, 548, 515, 515, 548, 465, 499, 499, - /* 210 */ 499, 588, 499, 485, 499, 588, 588, 588, 527, 588, - /* 220 */ 588, 489, 495, 588, 497, 588, 527, 588, 588, 495, - /* 230 */ 527, 553, 588, 588, 588, 588, 588, 458, 588, 588, - /* 240 */ 588, 588, 588, 588, 489, 588, 588, 588, 588, 588, - /* 250 */ 501, 588, 527, 433, 442, 565, 566, 438, 567, 449, - /* 260 */ 429, 459, 586, 435, 416, 430, 469, 564, 444, 447, - /* 270 */ 563, 446, 445, 550, 562, 528, 443, 441, 417, 448, - /* 280 */ 440, 526, 582, 527, 439, 412, 398, 397, 396, 432, - /* 290 */ 399, 400, 431, 395, 394, 389, 388, 391, 415, 393, - /* 300 */ 392, 401, 437, 409, 506, 462, 410, 411, 413, 547, - /* 310 */ 510, 408, 403, 402, 404, 436, 407, 406, 414, 561, - /* 320 */ 509, 503, 505, 424, 514, 585, 578, 568, 465, 464, - /* 330 */ 477, 423, 530, 570, 569, 584, 581, 518, 525, 427, - /* 340 */ 428, 519, 426, 500, 575, 517, 425, 579, 580, 502, - /* 350 */ 576, 577, 478, 481, 522, 524, 583, 559, 558, 557, - /* 360 */ 521, 419, 493, 418, 472, 537, 560, 501, 520, 523, - /* 370 */ 545, 482, 496, 421, 498, 422, 539, 504, 536, 556, - /* 380 */ 494, 546, 512, 531, 420, 511, 538, + /* 50 */ 588, 588, 588, 588, 588, 588, 450, 450, 450, 450, + /* 60 */ 588, 588, 588, 588, 455, 588, 588, 588, 588, 588, + /* 70 */ 588, 573, 457, 541, 574, 455, 471, 460, 540, 480, + /* 80 */ 484, 432, 461, 452, 479, 483, 572, 474, 475, 476, + /* 90 */ 487, 488, 499, 463, 450, 387, 588, 450, 450, 554, + /* 100 */ 588, 507, 470, 450, 450, 588, 588, 450, 450, 588, + /* 110 */ 588, 463, 588, 515, 463, 463, 515, 463, 515, 588, + /* 120 */ 508, 463, 508, 588, 588, 588, 588, 588, 588, 588, + /* 130 */ 588, 588, 588, 588, 588, 508, 515, 588, 588, 588, + /* 140 */ 588, 588, 463, 588, 588, 467, 450, 473, 551, 490, + /* 150 */ 450, 468, 486, 491, 492, 508, 466, 549, 588, 516, + /* 160 */ 588, 588, 588, 588, 533, 515, 532, 588, 588, 513, + /* 170 */ 588, 588, 588, 588, 534, 588, 588, 588, 535, 588, + /* 180 */ 588, 588, 588, 588, 588, 588, 588, 588, 588, 405, + /* 190 */ 587, 587, 529, 555, 470, 552, 507, 543, 544, 515, + /* 200 */ 515, 515, 548, 548, 548, 465, 499, 499, 588, 499, + /* 210 */ 499, 588, 527, 485, 499, 489, 588, 489, 588, 588, + /* 220 */ 495, 588, 588, 588, 527, 489, 588, 588, 588, 527, + /* 230 */ 495, 588, 553, 588, 588, 588, 497, 588, 588, 588, + /* 240 */ 588, 588, 588, 588, 588, 588, 501, 527, 588, 458, + /* 250 */ 588, 588, 588, 435, 524, 439, 501, 523, 511, 569, + /* 260 */ 521, 415, 522, 570, 520, 388, 537, 512, 440, 462, + /* 270 */ 459, 429, 550, 586, 430, 536, 528, 538, 539, 434, + /* 280 */ 433, 565, 441, 527, 442, 547, 443, 526, 438, 449, + /* 290 */ 428, 431, 436, 437, 444, 445, 498, 496, 504, 464, + /* 300 */ 465, 494, 493, 545, 546, 446, 447, 427, 448, 397, + /* 310 */ 396, 398, 399, 400, 395, 394, 389, 391, 392, 393, + /* 320 */ 401, 402, 411, 410, 412, 413, 414, 409, 408, 403, + /* 330 */ 404, 406, 407, 509, 514, 421, 420, 530, 422, 423, + /* 340 */ 419, 418, 531, 510, 416, 417, 583, 424, 426, 581, + /* 350 */ 579, 584, 585, 578, 580, 577, 425, 582, 575, 576, + /* 360 */ 506, 469, 503, 502, 505, 477, 478, 472, 500, 517, + /* 370 */ 525, 518, 519, 481, 482, 563, 562, 564, 566, 567, + /* 380 */ 561, 560, 556, 557, 558, 559, 568, ); - const YYNOCODE = 121; + const YYNOCODE = 122; const YYSTACKDEPTH = 100; const YYNSTATE = 387; const YYNRULE = 201; - const YYERRORSYMBOL = 78; + const YYERRORSYMBOL = 79; const YYERRSYMDT = 'yy0'; const YYFALLBACK = 0; static public $yyFallback = array( @@ -1266,29 +1229,30 @@ static public $yy_action = array( 'RDEL', 'DOLLAR', 'ID', 'EQUAL', 'PTR', 'LDELIF', 'LDELFOR', 'SEMICOLON', 'INCDEC', 'TO', 'STEP', 'LDELFOREACH', - 'SPACE', 'AS', 'APTR', 'SMARTYBLOCKCHILD', - 'LDELSLASH', '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', 'variable', 'expr', 'varindexed', + 'SPACE', 'AS', 'APTR', 'LDELSETFILTER', + 'SMARTYBLOCKCHILD', 'LDELSLASH', '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', 'attribute', 'ternary', 'array', - 'ifcond', 'lop', 'function', 'doublequoted_with_quotes', - 'static_class_access', 'object', 'arrayindex', 'indexdef', - 'varvarele', 'objectchain', 'objectelement', 'method', - 'params', 'modifier', 'modparameters', 'modparameter', - 'arrayelements', 'arrayelement', 'doublequoted', 'doublequotedcontent', + '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', ); static public $yyRuleName = array( @@ -1321,33 +1285,33 @@ static public $yy_action = array( /* 26 */ "smartytag ::= LDEL value RDEL", /* 27 */ "smartytag ::= LDEL value modifierlist attributes RDEL", /* 28 */ "smartytag ::= LDEL value attributes RDEL", - /* 29 */ "smartytag ::= LDEL variable modifierlist attributes RDEL", - /* 30 */ "smartytag ::= LDEL variable attributes RDEL", - /* 31 */ "smartytag ::= LDEL expr modifierlist attributes RDEL", - /* 32 */ "smartytag ::= LDEL expr attributes RDEL", - /* 33 */ "smartytag ::= LDEL DOLLAR ID EQUAL value RDEL", - /* 34 */ "smartytag ::= LDEL DOLLAR ID EQUAL expr RDEL", - /* 35 */ "smartytag ::= LDEL DOLLAR ID EQUAL expr attributes RDEL", - /* 36 */ "smartytag ::= LDEL varindexed EQUAL expr attributes RDEL", - /* 37 */ "smartytag ::= LDEL ID attributes RDEL", - /* 38 */ "smartytag ::= LDEL ID RDEL", - /* 39 */ "smartytag ::= LDEL ID PTR ID attributes RDEL", - /* 40 */ "smartytag ::= LDEL ID modifierlist attributes RDEL", - /* 41 */ "smartytag ::= LDEL ID PTR ID modifierlist attributes RDEL", - /* 42 */ "smartytag ::= LDELIF expr RDEL", - /* 43 */ "smartytag ::= LDELIF expr attributes RDEL", - /* 44 */ "smartytag ::= LDELIF statement RDEL", - /* 45 */ "smartytag ::= LDELIF statement attributes RDEL", - /* 46 */ "smartytag ::= LDELFOR statements SEMICOLON optspace expr SEMICOLON optspace DOLLAR varvar foraction attributes RDEL", - /* 47 */ "foraction ::= EQUAL expr", - /* 48 */ "foraction ::= INCDEC", - /* 49 */ "smartytag ::= LDELFOR statement TO expr attributes RDEL", - /* 50 */ "smartytag ::= LDELFOR statement TO expr STEP expr attributes RDEL", - /* 51 */ "smartytag ::= LDELFOREACH attributes RDEL", - /* 52 */ "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar attributes RDEL", - /* 53 */ "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar APTR DOLLAR varvar attributes RDEL", - /* 54 */ "smartytag ::= LDELFOREACH SPACE expr AS DOLLAR varvar attributes RDEL", - /* 55 */ "smartytag ::= LDELFOREACH SPACE expr AS DOLLAR varvar APTR DOLLAR varvar attributes RDEL", + /* 29 */ "smartytag ::= LDEL expr modifierlist attributes RDEL", + /* 30 */ "smartytag ::= LDEL expr attributes RDEL", + /* 31 */ "smartytag ::= LDEL DOLLAR ID EQUAL value RDEL", + /* 32 */ "smartytag ::= LDEL DOLLAR ID EQUAL expr RDEL", + /* 33 */ "smartytag ::= LDEL DOLLAR ID EQUAL expr attributes RDEL", + /* 34 */ "smartytag ::= LDEL varindexed EQUAL expr attributes RDEL", + /* 35 */ "smartytag ::= LDEL ID attributes RDEL", + /* 36 */ "smartytag ::= LDEL ID RDEL", + /* 37 */ "smartytag ::= LDEL ID PTR ID attributes RDEL", + /* 38 */ "smartytag ::= LDEL ID modifierlist attributes RDEL", + /* 39 */ "smartytag ::= LDEL ID PTR ID modifierlist attributes RDEL", + /* 40 */ "smartytag ::= LDELIF expr RDEL", + /* 41 */ "smartytag ::= LDELIF expr attributes RDEL", + /* 42 */ "smartytag ::= LDELIF statement RDEL", + /* 43 */ "smartytag ::= LDELIF statement attributes RDEL", + /* 44 */ "smartytag ::= LDELFOR statements SEMICOLON optspace expr SEMICOLON optspace DOLLAR varvar foraction attributes RDEL", + /* 45 */ "foraction ::= EQUAL expr", + /* 46 */ "foraction ::= INCDEC", + /* 47 */ "smartytag ::= LDELFOR statement TO expr attributes RDEL", + /* 48 */ "smartytag ::= LDELFOR statement TO expr STEP expr attributes RDEL", + /* 49 */ "smartytag ::= LDELFOREACH attributes RDEL", + /* 50 */ "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar attributes RDEL", + /* 51 */ "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar APTR DOLLAR varvar attributes RDEL", + /* 52 */ "smartytag ::= LDELFOREACH SPACE expr AS DOLLAR varvar attributes RDEL", + /* 53 */ "smartytag ::= LDELFOREACH SPACE expr AS DOLLAR varvar APTR DOLLAR varvar attributes RDEL", + /* 54 */ "smartytag ::= LDELSETFILTER ID modparameters RDEL", + /* 55 */ "smartytag ::= LDELSETFILTER ID modparameters modifierlist RDEL", /* 56 */ "smartytag ::= SMARTYBLOCKCHILD", /* 57 */ "smartytag ::= LDELSLASH ID RDEL", /* 58 */ "smartytag ::= LDELSLASH ID modifierlist RDEL", @@ -1748,11 +1712,11 @@ static public $yy_action = array( while ($this->yyidx >= 0) { $this->yy_pop_parser_stack(); } -#line 73 "smarty_internal_templateparser.y" +#line 83 "smarty_internal_templateparser.y" $this->internalError = true; $this->compiler->trigger_template_error("Stack overflow in template parser"); -#line 1751 "smarty_internal_templateparser.php" +#line 1715 "smarty_internal_templateparser.php" return; } $yytos = new TP_yyStackEntry; @@ -1773,77 +1737,77 @@ static public $yy_action = array( } static public $yyRuleInfo = array( - array( 'lhs' => 79, 'rhs' => 1 ), array( 'lhs' => 80, 'rhs' => 1 ), - array( 'lhs' => 80, 'rhs' => 2 ), - array( 'lhs' => 80, 'rhs' => 0 ), - array( 'lhs' => 81, 'rhs' => 1 ), - array( 'lhs' => 81, 'rhs' => 1 ), - array( 'lhs' => 81, 'rhs' => 1 ), - array( 'lhs' => 81, 'rhs' => 1 ), - array( 'lhs' => 81, 'rhs' => 1 ), - array( 'lhs' => 81, 'rhs' => 1 ), - array( 'lhs' => 81, 'rhs' => 1 ), - array( 'lhs' => 81, 'rhs' => 1 ), array( 'lhs' => 81, 'rhs' => 1 ), - array( 'lhs' => 81, 'rhs' => 1 ), - array( 'lhs' => 81, 'rhs' => 1 ), - array( 'lhs' => 83, 'rhs' => 2 ), - array( 'lhs' => 83, 'rhs' => 3 ), + array( 'lhs' => 81, 'rhs' => 2 ), + array( 'lhs' => 81, 'rhs' => 0 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), array( 'lhs' => 84, 'rhs' => 2 ), - array( 'lhs' => 84, 'rhs' => 0 ), - 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' => 82, 'rhs' => 3 ), - array( 'lhs' => 82, 'rhs' => 5 ), - array( 'lhs' => 82, 'rhs' => 4 ), - array( 'lhs' => 82, 'rhs' => 5 ), - array( 'lhs' => 82, 'rhs' => 4 ), - array( 'lhs' => 82, 'rhs' => 5 ), - array( 'lhs' => 82, 'rhs' => 4 ), - array( 'lhs' => 82, 'rhs' => 6 ), - array( 'lhs' => 82, 'rhs' => 6 ), - array( 'lhs' => 82, 'rhs' => 7 ), - array( 'lhs' => 82, 'rhs' => 6 ), - array( 'lhs' => 82, 'rhs' => 4 ), - array( 'lhs' => 82, 'rhs' => 3 ), - array( 'lhs' => 82, 'rhs' => 6 ), - array( 'lhs' => 82, 'rhs' => 5 ), - array( 'lhs' => 82, 'rhs' => 7 ), - array( 'lhs' => 82, 'rhs' => 3 ), - array( 'lhs' => 82, 'rhs' => 4 ), - array( 'lhs' => 82, 'rhs' => 3 ), - array( 'lhs' => 82, 'rhs' => 4 ), - array( 'lhs' => 82, 'rhs' => 12 ), + array( 'lhs' => 84, 'rhs' => 3 ), + array( 'lhs' => 85, 'rhs' => 2 ), + array( 'lhs' => 85, 'rhs' => 0 ), + array( 'lhs' => 86, 'rhs' => 1 ), + array( 'lhs' => 86, 'rhs' => 1 ), + array( 'lhs' => 86, 'rhs' => 1 ), + array( 'lhs' => 86, 'rhs' => 1 ), + array( 'lhs' => 86, 'rhs' => 1 ), + array( 'lhs' => 86, 'rhs' => 1 ), + array( 'lhs' => 86, 'rhs' => 1 ), + array( 'lhs' => 83, 'rhs' => 3 ), + array( 'lhs' => 83, 'rhs' => 5 ), + array( 'lhs' => 83, 'rhs' => 4 ), + array( 'lhs' => 83, 'rhs' => 5 ), + array( 'lhs' => 83, 'rhs' => 4 ), + array( 'lhs' => 83, 'rhs' => 6 ), + array( 'lhs' => 83, 'rhs' => 6 ), + array( 'lhs' => 83, 'rhs' => 7 ), + array( 'lhs' => 83, 'rhs' => 6 ), + array( 'lhs' => 83, 'rhs' => 4 ), + array( 'lhs' => 83, 'rhs' => 3 ), + array( 'lhs' => 83, 'rhs' => 6 ), + array( 'lhs' => 83, 'rhs' => 5 ), + array( 'lhs' => 83, 'rhs' => 7 ), + array( 'lhs' => 83, 'rhs' => 3 ), + array( 'lhs' => 83, 'rhs' => 4 ), + array( 'lhs' => 83, 'rhs' => 3 ), + array( 'lhs' => 83, 'rhs' => 4 ), + array( 'lhs' => 83, 'rhs' => 12 ), array( 'lhs' => 96, 'rhs' => 2 ), array( 'lhs' => 96, 'rhs' => 1 ), - array( 'lhs' => 82, 'rhs' => 6 ), - array( 'lhs' => 82, 'rhs' => 8 ), - array( 'lhs' => 82, 'rhs' => 3 ), - array( 'lhs' => 82, 'rhs' => 8 ), - array( 'lhs' => 82, 'rhs' => 11 ), - array( 'lhs' => 82, 'rhs' => 8 ), - array( 'lhs' => 82, 'rhs' => 11 ), - array( 'lhs' => 82, 'rhs' => 1 ), - array( 'lhs' => 82, 'rhs' => 3 ), - array( 'lhs' => 82, 'rhs' => 4 ), - array( 'lhs' => 82, 'rhs' => 5 ), - array( 'lhs' => 82, 'rhs' => 6 ), - array( 'lhs' => 88, 'rhs' => 2 ), - array( 'lhs' => 88, 'rhs' => 1 ), - array( 'lhs' => 88, 'rhs' => 0 ), - array( 'lhs' => 97, 'rhs' => 4 ), - array( 'lhs' => 97, 'rhs' => 4 ), - array( 'lhs' => 97, 'rhs' => 4 ), - array( 'lhs' => 97, 'rhs' => 2 ), - array( 'lhs' => 97, 'rhs' => 2 ), - array( 'lhs' => 97, 'rhs' => 2 ), - array( 'lhs' => 97, 'rhs' => 4 ), + array( 'lhs' => 83, 'rhs' => 6 ), + array( 'lhs' => 83, 'rhs' => 8 ), + array( 'lhs' => 83, 'rhs' => 3 ), + array( 'lhs' => 83, 'rhs' => 8 ), + array( 'lhs' => 83, 'rhs' => 11 ), + array( 'lhs' => 83, 'rhs' => 8 ), + array( 'lhs' => 83, 'rhs' => 11 ), + array( 'lhs' => 83, 'rhs' => 4 ), + array( 'lhs' => 83, 'rhs' => 5 ), + array( 'lhs' => 83, 'rhs' => 1 ), + array( 'lhs' => 83, 'rhs' => 3 ), + array( 'lhs' => 83, 'rhs' => 4 ), + array( 'lhs' => 83, 'rhs' => 5 ), + array( 'lhs' => 83, 'rhs' => 6 ), + array( 'lhs' => 89, 'rhs' => 2 ), + array( 'lhs' => 89, 'rhs' => 1 ), + array( 'lhs' => 89, 'rhs' => 0 ), + array( 'lhs' => 98, 'rhs' => 4 ), + array( 'lhs' => 98, 'rhs' => 4 ), + array( 'lhs' => 98, 'rhs' => 4 ), + array( 'lhs' => 98, 'rhs' => 2 ), + array( 'lhs' => 98, 'rhs' => 2 ), + array( 'lhs' => 98, 'rhs' => 2 ), + array( 'lhs' => 98, 'rhs' => 4 ), array( 'lhs' => 93, 'rhs' => 1 ), array( 'lhs' => 93, 'rhs' => 3 ), array( 'lhs' => 92, 'rhs' => 4 ), @@ -1873,105 +1837,105 @@ static public $yy_action = array( array( 'lhs' => 90, 'rhs' => 3 ), array( 'lhs' => 90, 'rhs' => 3 ), array( 'lhs' => 90, 'rhs' => 3 ), - array( 'lhs' => 98, 'rhs' => 8 ), - array( 'lhs' => 98, 'rhs' => 7 ), - array( 'lhs' => 86, 'rhs' => 1 ), - array( 'lhs' => 86, 'rhs' => 2 ), - array( 'lhs' => 86, 'rhs' => 2 ), - array( 'lhs' => 86, 'rhs' => 2 ), - array( 'lhs' => 86, 'rhs' => 2 ), - array( 'lhs' => 86, 'rhs' => 1 ), - array( 'lhs' => 86, 'rhs' => 1 ), - array( 'lhs' => 86, 'rhs' => 3 ), - array( 'lhs' => 86, 'rhs' => 2 ), - array( 'lhs' => 86, 'rhs' => 2 ), - array( 'lhs' => 86, 'rhs' => 1 ), - array( 'lhs' => 86, 'rhs' => 1 ), - array( 'lhs' => 86, 'rhs' => 3 ), - array( 'lhs' => 86, 'rhs' => 1 ), - array( 'lhs' => 86, 'rhs' => 1 ), - array( 'lhs' => 86, 'rhs' => 3 ), - array( 'lhs' => 86, 'rhs' => 3 ), - array( 'lhs' => 86, 'rhs' => 1 ), - array( 'lhs' => 86, 'rhs' => 2 ), - array( 'lhs' => 89, 'rhs' => 1 ), - array( 'lhs' => 89, 'rhs' => 4 ), - array( 'lhs' => 89, 'rhs' => 1 ), - array( 'lhs' => 89, 'rhs' => 3 ), - array( 'lhs' => 89, 'rhs' => 3 ), + array( 'lhs' => 99, 'rhs' => 8 ), + array( 'lhs' => 99, 'rhs' => 7 ), + array( 'lhs' => 87, 'rhs' => 1 ), + array( 'lhs' => 87, 'rhs' => 2 ), + array( 'lhs' => 87, 'rhs' => 2 ), + array( 'lhs' => 87, 'rhs' => 2 ), + array( 'lhs' => 87, 'rhs' => 2 ), + array( 'lhs' => 87, 'rhs' => 1 ), + array( 'lhs' => 87, 'rhs' => 1 ), + array( 'lhs' => 87, 'rhs' => 3 ), + array( 'lhs' => 87, 'rhs' => 2 ), + array( 'lhs' => 87, 'rhs' => 2 ), + array( 'lhs' => 87, 'rhs' => 1 ), + array( 'lhs' => 87, 'rhs' => 1 ), + array( 'lhs' => 87, 'rhs' => 3 ), + array( 'lhs' => 87, 'rhs' => 1 ), + array( 'lhs' => 87, 'rhs' => 1 ), + array( 'lhs' => 87, 'rhs' => 3 ), + array( 'lhs' => 87, 'rhs' => 3 ), + array( 'lhs' => 87, 'rhs' => 1 ), + array( 'lhs' => 87, 'rhs' => 2 ), + array( 'lhs' => 103, 'rhs' => 1 ), + array( 'lhs' => 103, 'rhs' => 4 ), + array( 'lhs' => 103, 'rhs' => 1 ), + array( 'lhs' => 103, 'rhs' => 3 ), + array( 'lhs' => 103, 'rhs' => 3 ), array( 'lhs' => 91, 'rhs' => 3 ), - array( 'lhs' => 106, 'rhs' => 2 ), - array( 'lhs' => 106, 'rhs' => 0 ), - array( 'lhs' => 107, 'rhs' => 3 ), - array( 'lhs' => 107, 'rhs' => 5 ), - array( 'lhs' => 107, 'rhs' => 2 ), - array( 'lhs' => 107, 'rhs' => 2 ), - array( 'lhs' => 107, 'rhs' => 4 ), - array( 'lhs' => 107, 'rhs' => 3 ), - array( 'lhs' => 107, 'rhs' => 5 ), - array( 'lhs' => 107, 'rhs' => 3 ), - array( 'lhs' => 107, 'rhs' => 2 ), + array( 'lhs' => 108, 'rhs' => 2 ), + array( 'lhs' => 108, 'rhs' => 0 ), + array( 'lhs' => 109, 'rhs' => 3 ), + array( 'lhs' => 109, 'rhs' => 5 ), + array( 'lhs' => 109, 'rhs' => 2 ), + array( 'lhs' => 109, 'rhs' => 2 ), + array( 'lhs' => 109, 'rhs' => 4 ), + array( 'lhs' => 109, 'rhs' => 3 ), + array( 'lhs' => 109, 'rhs' => 5 ), + array( 'lhs' => 109, 'rhs' => 3 ), + array( 'lhs' => 109, 'rhs' => 2 ), array( 'lhs' => 95, 'rhs' => 1 ), array( 'lhs' => 95, 'rhs' => 2 ), - array( 'lhs' => 108, 'rhs' => 1 ), - array( 'lhs' => 108, 'rhs' => 3 ), - array( 'lhs' => 105, 'rhs' => 2 ), - array( 'lhs' => 109, 'rhs' => 1 ), - array( 'lhs' => 109, 'rhs' => 2 ), + array( 'lhs' => 110, 'rhs' => 1 ), array( 'lhs' => 110, 'rhs' => 3 ), - array( 'lhs' => 110, 'rhs' => 4 ), - array( 'lhs' => 110, 'rhs' => 5 ), - array( 'lhs' => 110, 'rhs' => 6 ), - array( 'lhs' => 110, 'rhs' => 2 ), - array( 'lhs' => 102, 'rhs' => 4 ), - array( 'lhs' => 111, 'rhs' => 4 ), - array( 'lhs' => 111, 'rhs' => 5 ), + array( 'lhs' => 107, 'rhs' => 2 ), + array( 'lhs' => 111, 'rhs' => 1 ), + array( 'lhs' => 111, 'rhs' => 2 ), array( 'lhs' => 112, 'rhs' => 3 ), - array( 'lhs' => 112, 'rhs' => 1 ), - array( 'lhs' => 112, 'rhs' => 0 ), - array( 'lhs' => 87, 'rhs' => 3 ), - array( 'lhs' => 87, 'rhs' => 2 ), - array( 'lhs' => 113, 'rhs' => 3 ), - array( 'lhs' => 113, 'rhs' => 2 ), - array( 'lhs' => 114, 'rhs' => 2 ), + array( 'lhs' => 112, 'rhs' => 4 ), + array( 'lhs' => 112, 'rhs' => 5 ), + array( 'lhs' => 112, 'rhs' => 6 ), + array( 'lhs' => 112, 'rhs' => 2 ), + array( 'lhs' => 104, 'rhs' => 4 ), + array( 'lhs' => 113, 'rhs' => 4 ), + array( 'lhs' => 113, 'rhs' => 5 ), + array( 'lhs' => 114, 'rhs' => 3 ), + array( 'lhs' => 114, 'rhs' => 1 ), array( 'lhs' => 114, 'rhs' => 0 ), + array( 'lhs' => 88, 'rhs' => 3 ), + array( 'lhs' => 88, 'rhs' => 2 ), + array( 'lhs' => 115, 'rhs' => 3 ), array( 'lhs' => 115, 'rhs' => 2 ), - array( 'lhs' => 115, 'rhs' => 2 ), - array( 'lhs' => 104, 'rhs' => 1 ), - array( 'lhs' => 104, 'rhs' => 2 ), - array( 'lhs' => 104, 'rhs' => 1 ), - array( 'lhs' => 104, 'rhs' => 3 ), - array( 'lhs' => 104, 'rhs' => 4 ), - array( 'lhs' => 100, 'rhs' => 1 ), - array( 'lhs' => 100, 'rhs' => 1 ), - array( 'lhs' => 100, 'rhs' => 1 ), - array( 'lhs' => 100, 'rhs' => 1 ), - array( 'lhs' => 100, 'rhs' => 1 ), - array( 'lhs' => 100, 'rhs' => 1 ), - array( 'lhs' => 100, 'rhs' => 1 ), - array( 'lhs' => 100, 'rhs' => 1 ), - array( 'lhs' => 100, 'rhs' => 1 ), + array( 'lhs' => 97, 'rhs' => 2 ), + array( 'lhs' => 97, 'rhs' => 0 ), + array( 'lhs' => 116, 'rhs' => 2 ), + array( 'lhs' => 116, 'rhs' => 2 ), + array( 'lhs' => 106, 'rhs' => 1 ), + array( 'lhs' => 106, 'rhs' => 2 ), + array( 'lhs' => 106, 'rhs' => 1 ), + array( 'lhs' => 106, 'rhs' => 3 ), + array( 'lhs' => 106, 'rhs' => 4 ), array( 'lhs' => 101, 'rhs' => 1 ), array( 'lhs' => 101, 'rhs' => 1 ), array( 'lhs' => 101, 'rhs' => 1 ), - array( 'lhs' => 99, 'rhs' => 3 ), - array( 'lhs' => 116, 'rhs' => 1 ), - array( 'lhs' => 116, 'rhs' => 3 ), - array( 'lhs' => 116, 'rhs' => 0 ), - array( 'lhs' => 117, 'rhs' => 3 ), - array( 'lhs' => 117, 'rhs' => 3 ), + array( 'lhs' => 101, 'rhs' => 1 ), + array( 'lhs' => 101, 'rhs' => 1 ), + array( 'lhs' => 101, 'rhs' => 1 ), + array( 'lhs' => 101, 'rhs' => 1 ), + array( 'lhs' => 101, 'rhs' => 1 ), + array( 'lhs' => 101, 'rhs' => 1 ), + array( 'lhs' => 102, 'rhs' => 1 ), + array( 'lhs' => 102, 'rhs' => 1 ), + array( 'lhs' => 102, 'rhs' => 1 ), + array( 'lhs' => 100, 'rhs' => 3 ), array( 'lhs' => 117, 'rhs' => 1 ), - array( 'lhs' => 103, 'rhs' => 2 ), - array( 'lhs' => 103, 'rhs' => 3 ), - array( 'lhs' => 118, 'rhs' => 2 ), + array( 'lhs' => 117, 'rhs' => 3 ), + array( 'lhs' => 117, 'rhs' => 0 ), + array( 'lhs' => 118, 'rhs' => 3 ), + array( 'lhs' => 118, 'rhs' => 3 ), array( 'lhs' => 118, 'rhs' => 1 ), - array( 'lhs' => 119, 'rhs' => 3 ), - array( 'lhs' => 119, 'rhs' => 3 ), - array( 'lhs' => 119, 'rhs' => 1 ), - array( 'lhs' => 119, 'rhs' => 3 ), - array( 'lhs' => 119, 'rhs' => 3 ), - array( 'lhs' => 119, 'rhs' => 1 ), + array( 'lhs' => 105, 'rhs' => 2 ), + array( 'lhs' => 105, 'rhs' => 3 ), + array( 'lhs' => 119, 'rhs' => 2 ), array( 'lhs' => 119, 'rhs' => 1 ), + array( 'lhs' => 120, 'rhs' => 3 ), + array( 'lhs' => 120, 'rhs' => 3 ), + array( 'lhs' => 120, 'rhs' => 1 ), + array( 'lhs' => 120, 'rhs' => 3 ), + array( 'lhs' => 120, 'rhs' => 3 ), + array( 'lhs' => 120, 'rhs' => 1 ), + array( 'lhs' => 120, 'rhs' => 1 ), array( 'lhs' => 94, 'rhs' => 1 ), array( 'lhs' => 94, 'rhs' => 0 ), ); @@ -1993,16 +1957,23 @@ static public $yy_action = array( 14 => 14, 15 => 15, 18 => 15, + 200 => 15, 16 => 16, + 75 => 16, 17 => 17, 103 => 17, 105 => 17, 106 => 17, + 127 => 17, 165 => 17, 19 => 19, 20 => 19, + 46 => 19, + 68 => 19, + 69 => 19, 76 => 19, 77 => 19, + 82 => 19, 102 => 19, 107 => 19, 108 => 19, @@ -2010,8 +1981,12 @@ static public $yy_action = array( 115 => 19, 116 => 19, 123 => 19, + 138 => 19, 164 => 19, + 166 => 19, 182 => 19, + 187 => 19, + 199 => 19, 21 => 21, 22 => 21, 23 => 23, @@ -2019,13 +1994,13 @@ static public $yy_action = array( 25 => 25, 26 => 26, 27 => 27, - 29 => 27, 28 => 28, 30 => 28, - 32 => 28, + 29 => 29, 31 => 31, + 32 => 31, 33 => 33, - 34 => 33, + 34 => 34, 35 => 35, 36 => 36, 37 => 37, @@ -2033,17 +2008,12 @@ static public $yy_action = array( 39 => 39, 40 => 40, 41 => 41, + 43 => 41, 42 => 42, - 44 => 42, - 43 => 43, - 45 => 43, - 46 => 46, + 44 => 44, + 45 => 45, 47 => 47, 48 => 48, - 68 => 48, - 69 => 48, - 166 => 48, - 187 => 48, 49 => 49, 50 => 50, 51 => 51, @@ -2061,24 +2031,23 @@ static public $yy_action = array( 71 => 62, 154 => 62, 158 => 62, + 162 => 62, + 163 => 62, 63 => 63, 155 => 63, + 161 => 63, 64 => 64, 65 => 65, 66 => 65, + 70 => 65, 67 => 67, - 70 => 70, 72 => 72, 73 => 73, 74 => 73, - 75 => 75, 78 => 78, 79 => 79, 80 => 79, 81 => 79, - 82 => 82, - 138 => 82, - 199 => 82, 83 => 83, 120 => 83, 84 => 84, @@ -2113,8 +2082,8 @@ static public $yy_action = array( 124 => 124, 125 => 125, 126 => 126, - 127 => 127, 128 => 128, + 184 => 128, 129 => 129, 130 => 130, 131 => 131, @@ -2143,9 +2112,6 @@ static public $yy_action = array( 157 => 157, 159 => 159, 160 => 160, - 161 => 161, - 162 => 162, - 163 => 162, 167 => 167, 168 => 168, 169 => 169, @@ -2162,7 +2128,6 @@ static public $yy_action = array( 180 => 180, 181 => 181, 183 => 183, - 184 => 184, 185 => 185, 186 => 186, 188 => 188, @@ -2176,656 +2141,909 @@ static public $yy_action = array( 196 => 196, 197 => 197, 198 => 198, - 200 => 200, ); -#line 84 "smarty_internal_templateparser.y" - function yy_r0(){ $this->_retvalue = $this->root_buffer->to_smarty_php(); } -#line 2179 "smarty_internal_templateparser.php" -#line 90 "smarty_internal_templateparser.y" - function yy_r1(){ $this->current_buffer->append_subtree($this->yystack[$this->yyidx + 0]->minor); } -#line 2182 "smarty_internal_templateparser.php" +#line 94 "smarty_internal_templateparser.y" + function yy_r0(){ + $this->_retvalue = $this->root_buffer->to_smarty_php(); + } +#line 2145 "smarty_internal_templateparser.php" #line 102 "smarty_internal_templateparser.y" + function yy_r1(){ + $this->current_buffer->append_subtree($this->yystack[$this->yyidx + 0]->minor); + } +#line 2150 "smarty_internal_templateparser.php" +#line 118 "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 + 0]->minor,true)); - } else { - $this->_retvalue = new _smarty_tag($this, $this->yystack[$this->yyidx + 0]->minor); - } - $this->compiler->has_variable_string = false; - $this->block_nesting_level = count($this->compiler->_tag_stack); - } -#line 2194 "smarty_internal_templateparser.php" -#line 114 "smarty_internal_templateparser.y" - function yy_r5(){ $this->_retvalue = new _smarty_tag($this, ''); } -#line 2197 "smarty_internal_templateparser.php" -#line 117 "smarty_internal_templateparser.y" - function yy_r6(){ $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor); } -#line 2200 "smarty_internal_templateparser.php" -#line 120 "smarty_internal_templateparser.y" + 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 + 0]->minor,true)); + } else { + $this->_retvalue = new _smarty_tag($this, $this->yystack[$this->yyidx + 0]->minor); + } + $this->compiler->has_variable_string = false; + $this->block_nesting_level = count($this->compiler->_tag_stack); + } +#line 2162 "smarty_internal_templateparser.php" +#line 130 "smarty_internal_templateparser.y" + function yy_r5(){ + $this->_retvalue = new _smarty_tag($this, ''); + } +#line 2167 "smarty_internal_templateparser.php" +#line 135 "smarty_internal_templateparser.y" + function yy_r6(){ + $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor); + } +#line 2172 "smarty_internal_templateparser.php" +#line 140 "smarty_internal_templateparser.y" function yy_r7(){ - if ($this->php_handling == Smarty::PHP_PASSTHRU) { - $this->_retvalue = new _smarty_text($this, self::escape_start_tag($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_text($this, $this->compiler->processNocacheCode('<?php', true)); - }elseif ($this->php_handling == Smarty::PHP_REMOVE) { - $this->_retvalue = new _smarty_text($this, ''); - } - } -#line 2213 "smarty_internal_templateparser.php" -#line 132 "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_text($this, $this->compiler->processNocacheCode("<?php echo '?>';?>", $this->compiler, true)); - $this->template->has_nocache_code = $save; - }elseif ($this->php_handling == Smarty::PHP_PASSTHRU) { - $this->_retvalue = new _smarty_text($this, '?<?php ?>>'); - } 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_text($this, $this->compiler->processNocacheCode('?>', true)); - }elseif ($this->php_handling == Smarty::PHP_REMOVE) { - $this->_retvalue = new _smarty_text($this, ''); - } - } -#line 2231 "smarty_internal_templateparser.php" -#line 150 "smarty_internal_templateparser.y" + if ($this->php_handling == Smarty::PHP_PASSTHRU) { + $this->_retvalue = new _smarty_text($this, self::escape_start_tag($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); + } + $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode('<?php', true)); + } elseif ($this->php_handling == Smarty::PHP_REMOVE) { + $this->_retvalue = new _smarty_text($this, ''); + } + } +#line 2188 "smarty_internal_templateparser.php" +#line 156 "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_text($this, $this->compiler->processNocacheCode("<?php echo '?>';?>", $this->compiler, true)); + $this->template->has_nocache_code = $save; + } elseif ($this->php_handling == Smarty::PHP_PASSTHRU) { + $this->_retvalue = new _smarty_text($this, '?<?php ?>>'); + } 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_text($this, $this->compiler->processNocacheCode('?>', true)); + } elseif ($this->php_handling == Smarty::PHP_REMOVE) { + $this->_retvalue = new _smarty_text($this, ''); + } + } +#line 2207 "smarty_internal_templateparser.php" +#line 175 "smarty_internal_templateparser.y" function yy_r9(){ - if ($this->php_handling == Smarty::PHP_PASSTHRU) { - $this->_retvalue = new _smarty_text($this, '<<?php ?>%'); - } 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) { - $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode('<%', true)); - } else { - $this->_retvalue = new _smarty_text($this, '<<?php ?>%'); - } - }elseif ($this->php_handling == Smarty::PHP_REMOVE) { - if ($this->asp_tags) { - $this->_retvalue = new _smarty_text($this, ''); - } else { - $this->_retvalue = new _smarty_text($this, '<<?php ?>%'); - } - } - } -#line 2252 "smarty_internal_templateparser.php" -#line 171 "smarty_internal_templateparser.y" - function yy_r10(){ - if ($this->php_handling == Smarty::PHP_PASSTHRU) { - $this->_retvalue = new _smarty_text($this, '%<?php ?>>'); - } 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_text($this, $this->compiler->processNocacheCode('%>', true)); - } else { - $this->_retvalue = new _smarty_text($this, '%<?php ?>>'); - } - }elseif ($this->php_handling == Smarty::PHP_REMOVE) { - if ($this->asp_tags) { - $this->_retvalue = new _smarty_text($this, ''); - } else { - $this->_retvalue = new _smarty_text($this, '%<?php ?>>'); - } - } - } -#line 2273 "smarty_internal_templateparser.php" -#line 191 "smarty_internal_templateparser.y" - function yy_r11(){if ($this->lex->strip) { - $this->_retvalue = new _smarty_text($this, preg_replace('![\$this->yystack[$this->yyidx + 0]->minor ]*[\r\n]+[\$this->yystack[$this->yyidx + 0]->minor ]*!', '', self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor))); - } else { - $this->_retvalue = new _smarty_text($this, self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor)); - } - } -#line 2281 "smarty_internal_templateparser.php" + if ($this->php_handling == Smarty::PHP_PASSTHRU) { + $this->_retvalue = new _smarty_text($this, '<<?php ?>%'); + } 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_text($this, $this->compiler->processNocacheCode('<%', true)); + } else { + $this->_retvalue = new _smarty_text($this, '<<?php ?>%'); + } + } elseif ($this->php_handling == Smarty::PHP_REMOVE) { + if ($this->asp_tags) { + $this->_retvalue = new _smarty_text($this, ''); + } else { + $this->_retvalue = new _smarty_text($this, '<<?php ?>%'); + } + } + } +#line 2231 "smarty_internal_templateparser.php" #line 199 "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_text($this, $this->compiler->processNocacheCode("<?php echo '<?xml';?>", $this->compiler, true)); - $this->template->has_nocache_code = $save; - } -#line 2289 "smarty_internal_templateparser.php" -#line 207 "smarty_internal_templateparser.y" - function yy_r13(){if ($this->lex->strip) { - $this->_retvalue = new _smarty_text($this, 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); - } - } -#line 2297 "smarty_internal_templateparser.php" -#line 213 "smarty_internal_templateparser.y" - function yy_r14(){ - $this->_retvalue = new _smarty_linebreak($this, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2302 "smarty_internal_templateparser.php" -#line 218 "smarty_internal_templateparser.y" - function yy_r15(){ $this->_retvalue = ''; } -#line 2305 "smarty_internal_templateparser.php" + function yy_r10(){ + if ($this->php_handling == Smarty::PHP_PASSTHRU) { + $this->_retvalue = new _smarty_text($this, '%<?php ?>>'); + } 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_text($this, $this->compiler->processNocacheCode('%>', true)); + } else { + $this->_retvalue = new _smarty_text($this, '%<?php ?>>'); + } + } elseif ($this->php_handling == Smarty::PHP_REMOVE) { + if ($this->asp_tags) { + $this->_retvalue = new _smarty_text($this, ''); + } else { + $this->_retvalue = new _smarty_text($this, '%<?php ?>>'); + } + } + } +#line 2252 "smarty_internal_templateparser.php" #line 219 "smarty_internal_templateparser.y" - function yy_r16(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; } -#line 2308 "smarty_internal_templateparser.php" -#line 221 "smarty_internal_templateparser.y" - function yy_r17(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } -#line 2311 "smarty_internal_templateparser.php" -#line 224 "smarty_internal_templateparser.y" - function yy_r19(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 2314 "smarty_internal_templateparser.php" -#line 226 "smarty_internal_templateparser.y" - function yy_r21(){ $this->_retvalue = self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor); } -#line 2317 "smarty_internal_templateparser.php" + function yy_r11(){ + if ($this->lex->strip) { + $this->_retvalue = new _smarty_text($this, preg_replace('![\$this->yystack[$this->yyidx + 0]->minor ]*[\r\n]+[\$this->yystack[$this->yyidx + 0]->minor ]*!', '', self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor))); + } else { + $this->_retvalue = new _smarty_text($this, self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor)); + } + } +#line 2261 "smarty_internal_templateparser.php" #line 228 "smarty_internal_templateparser.y" - function yy_r23(){ $this->_retvalue = self::escape_end_tag($this->yystack[$this->yyidx + 0]->minor); } -#line 2320 "smarty_internal_templateparser.php" -#line 229 "smarty_internal_templateparser.y" - function yy_r24(){ $this->_retvalue = '<<?php ?>%'; } -#line 2323 "smarty_internal_templateparser.php" -#line 230 "smarty_internal_templateparser.y" - function yy_r25(){ $this->_retvalue = '%<?php ?>>'; } -#line 2326 "smarty_internal_templateparser.php" -#line 238 "smarty_internal_templateparser.y" - function yy_r26(){ $this->_retvalue = $this->compiler->compileTag('private_print_expression',array(),array('value'=>$this->yystack[$this->yyidx + -1]->minor)); } -#line 2329 "smarty_internal_templateparser.php" -#line 239 "smarty_internal_templateparser.y" - function yy_r27(){ $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -3]->minor, 'modifierlist'=>$this->yystack[$this->yyidx + -2]->minor)); } -#line 2332 "smarty_internal_templateparser.php" -#line 240 "smarty_internal_templateparser.y" - function yy_r28(){ $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -2]->minor)); } -#line 2335 "smarty_internal_templateparser.php" -#line 243 "smarty_internal_templateparser.y" - function yy_r31(){ $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -3]->minor,'modifierlist'=>$this->yystack[$this->yyidx + -2]->minor)); } -#line 2338 "smarty_internal_templateparser.php" -#line 251 "smarty_internal_templateparser.y" - function yy_r33(){ $this->_retvalue = $this->compiler->compileTag('assign',array(array('value'=>$this->yystack[$this->yyidx + -1]->minor),array('var'=>"'".$this->yystack[$this->yyidx + -3]->minor."'"))); } -#line 2341 "smarty_internal_templateparser.php" -#line 253 "smarty_internal_templateparser.y" - function yy_r35(){ $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + -2]->minor),array('var'=>"'".$this->yystack[$this->yyidx + -4]->minor."'")),$this->yystack[$this->yyidx + -1]->minor)); } -#line 2344 "smarty_internal_templateparser.php" + function yy_r12(){ + $this->compiler->tag_nocache = true; + $this->is_xml = true; + $save = $this->template->has_nocache_code; + $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode("<?php echo '<?xml';?>", $this->compiler, true)); + $this->template->has_nocache_code = $save; + } +#line 2270 "smarty_internal_templateparser.php" +#line 237 "smarty_internal_templateparser.y" + function yy_r13(){ + if ($this->lex->strip) { + $this->_retvalue = new _smarty_text($this, 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); + } + } +#line 2279 "smarty_internal_templateparser.php" +#line 245 "smarty_internal_templateparser.y" + function yy_r14(){ + $this->_retvalue = new _smarty_linebreak($this, $this->yystack[$this->yyidx + 0]->minor); + } +#line 2284 "smarty_internal_templateparser.php" +#line 250 "smarty_internal_templateparser.y" + function yy_r15(){ + $this->_retvalue = ''; + } +#line 2289 "smarty_internal_templateparser.php" #line 254 "smarty_internal_templateparser.y" - function yy_r36(){ $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + -2]->minor),array('var'=>$this->yystack[$this->yyidx + -4]->minor['var'])),$this->yystack[$this->yyidx + -1]->minor),array('smarty_internal_index'=>$this->yystack[$this->yyidx + -4]->minor['smarty_internal_index'])); } -#line 2347 "smarty_internal_templateparser.php" -#line 256 "smarty_internal_templateparser.y" - function yy_r37(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor,$this->yystack[$this->yyidx + -1]->minor); } -#line 2350 "smarty_internal_templateparser.php" -#line 257 "smarty_internal_templateparser.y" - function yy_r38(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor,array()); } -#line 2353 "smarty_internal_templateparser.php" -#line 259 "smarty_internal_templateparser.y" - function yy_r39(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor,$this->yystack[$this->yyidx + -1]->minor,array('object_methode'=>$this->yystack[$this->yyidx + -2]->minor)); } -#line 2356 "smarty_internal_templateparser.php" -#line 261 "smarty_internal_templateparser.y" - function yy_r40(){ $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor,$this->yystack[$this->yyidx + -1]->minor).'<?php echo '; - $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>'; - } -#line 2361 "smarty_internal_templateparser.php" -#line 265 "smarty_internal_templateparser.y" - function yy_r41(){ $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -5]->minor,$this->yystack[$this->yyidx + -1]->minor,array('object_methode'=>$this->yystack[$this->yyidx + -3]->minor)).'<?php echo '; - $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>'; - } -#line 2366 "smarty_internal_templateparser.php" -#line 269 "smarty_internal_templateparser.y" - function yy_r42(){ $tag = trim(substr($this->yystack[$this->yyidx + -2]->minor,$this->lex->ldel_length)); $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array(),array('if condition'=>$this->yystack[$this->yyidx + -1]->minor)); } -#line 2369 "smarty_internal_templateparser.php" -#line 270 "smarty_internal_templateparser.y" - function yy_r43(){ $tag = trim(substr($this->yystack[$this->yyidx + -3]->minor,$this->lex->ldel_length)); $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,$this->yystack[$this->yyidx + -1]->minor,array('if condition'=>$this->yystack[$this->yyidx + -2]->minor)); } -#line 2372 "smarty_internal_templateparser.php" + function yy_r16(){ + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; + } +#line 2294 "smarty_internal_templateparser.php" +#line 258 "smarty_internal_templateparser.y" + function yy_r17(){ + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2299 "smarty_internal_templateparser.php" +#line 266 "smarty_internal_templateparser.y" + function yy_r19(){ + $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; + } +#line 2304 "smarty_internal_templateparser.php" #line 274 "smarty_internal_templateparser.y" - function yy_r46(){ - $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -10]->minor),array('ifexp'=>$this->yystack[$this->yyidx + -7]->minor),array('var'=>$this->yystack[$this->yyidx + -3]->minor),array('step'=>$this->yystack[$this->yyidx + -2]->minor))),1); } -#line 2376 "smarty_internal_templateparser.php" -#line 277 "smarty_internal_templateparser.y" - function yy_r47(){ $this->_retvalue = '='.$this->yystack[$this->yyidx + 0]->minor; } -#line 2379 "smarty_internal_templateparser.php" -#line 278 "smarty_internal_templateparser.y" - function yy_r48(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 2382 "smarty_internal_templateparser.php" -#line 279 "smarty_internal_templateparser.y" - function yy_r49(){ $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -4]->minor),array('to'=>$this->yystack[$this->yyidx + -2]->minor))),0); } -#line 2385 "smarty_internal_templateparser.php" -#line 280 "smarty_internal_templateparser.y" - function yy_r50(){ $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -6]->minor),array('to'=>$this->yystack[$this->yyidx + -4]->minor),array('step'=>$this->yystack[$this->yyidx + -2]->minor))),0); } -#line 2388 "smarty_internal_templateparser.php" + function yy_r21(){ + $this->_retvalue = self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor); + } +#line 2309 "smarty_internal_templateparser.php" #line 282 "smarty_internal_templateparser.y" - function yy_r51(){ $this->_retvalue = $this->compiler->compileTag('foreach',$this->yystack[$this->yyidx + -1]->minor); } -#line 2391 "smarty_internal_templateparser.php" -#line 284 "smarty_internal_templateparser.y" - function yy_r52(){ - $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor)))); } -#line 2395 "smarty_internal_templateparser.php" + function yy_r23(){ + $this->_retvalue = self::escape_end_tag($this->yystack[$this->yyidx + 0]->minor); + } +#line 2314 "smarty_internal_templateparser.php" #line 286 "smarty_internal_templateparser.y" - function yy_r53(){ - $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -8]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor),array('key'=>$this->yystack[$this->yyidx + -5]->minor)))); } -#line 2399 "smarty_internal_templateparser.php" -#line 288 "smarty_internal_templateparser.y" - function yy_r54(){ - $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor)))); } -#line 2403 "smarty_internal_templateparser.php" + function yy_r24(){ + $this->_retvalue = '<<?php ?>%'; + } +#line 2319 "smarty_internal_templateparser.php" #line 290 "smarty_internal_templateparser.y" - function yy_r55(){ - $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -8]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor),array('key'=>$this->yystack[$this->yyidx + -5]->minor)))); } -#line 2407 "smarty_internal_templateparser.php" -#line 294 "smarty_internal_templateparser.y" - function yy_r56(){ $this->_retvalue = SMARTY_INTERNAL_COMPILE_BLOCK::compileChildBlock($this->compiler); } -#line 2410 "smarty_internal_templateparser.php" -#line 298 "smarty_internal_templateparser.y" - function yy_r57(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor.'close',array()); } -#line 2413 "smarty_internal_templateparser.php" + function yy_r25(){ + $this->_retvalue = '%<?php ?>>'; + } +#line 2324 "smarty_internal_templateparser.php" #line 300 "smarty_internal_templateparser.y" - function yy_r58(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor.'close',array(),array('modifier_list'=>$this->yystack[$this->yyidx + -1]->minor)); - } -#line 2417 "smarty_internal_templateparser.php" -#line 303 "smarty_internal_templateparser.y" - function yy_r59(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor.'close',array(),array('object_methode'=>$this->yystack[$this->yyidx + -1]->minor)); } -#line 2420 "smarty_internal_templateparser.php" + function yy_r26(){ + $this->_retvalue = $this->compiler->compileTag('private_print_expression',array(),array('value'=>$this->yystack[$this->yyidx + -1]->minor)); + } +#line 2329 "smarty_internal_templateparser.php" #line 304 "smarty_internal_templateparser.y" - function yy_r60(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor.'close',array(),array('object_methode'=>$this->yystack[$this->yyidx + -2]->minor, 'modifier_list'=>$this->yystack[$this->yyidx + -1]->minor)); } -#line 2423 "smarty_internal_templateparser.php" -#line 310 "smarty_internal_templateparser.y" - function yy_r61(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor; } -#line 2426 "smarty_internal_templateparser.php" + function yy_r27(){ + $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -3]->minor, 'modifierlist'=>$this->yystack[$this->yyidx + -2]->minor)); + } +#line 2334 "smarty_internal_templateparser.php" +#line 308 "smarty_internal_templateparser.y" + function yy_r28(){ + $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -2]->minor)); + } +#line 2339 "smarty_internal_templateparser.php" #line 312 "smarty_internal_templateparser.y" - function yy_r62(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor); } -#line 2429 "smarty_internal_templateparser.php" -#line 314 "smarty_internal_templateparser.y" - function yy_r63(){ $this->_retvalue = array(); } -#line 2432 "smarty_internal_templateparser.php" -#line 317 "smarty_internal_templateparser.y" - function yy_r64(){ 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'); - } else - $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>"'".$this->yystack[$this->yyidx + 0]->minor."'"); } -#line 2442 "smarty_internal_templateparser.php" + function yy_r29(){ + $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -3]->minor,'modifierlist'=>$this->yystack[$this->yyidx + -2]->minor)); + } +#line 2344 "smarty_internal_templateparser.php" #line 325 "smarty_internal_templateparser.y" - function yy_r65(){ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor); } -#line 2445 "smarty_internal_templateparser.php" -#line 327 "smarty_internal_templateparser.y" - function yy_r67(){ $this->_retvalue = "'".$this->yystack[$this->yyidx + 0]->minor."'"; } -#line 2448 "smarty_internal_templateparser.php" -#line 330 "smarty_internal_templateparser.y" - function yy_r70(){$this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor); } -#line 2451 "smarty_internal_templateparser.php" + function yy_r31(){ + $this->_retvalue = $this->compiler->compileTag('assign',array(array('value'=>$this->yystack[$this->yyidx + -1]->minor),array('var'=>"'".$this->yystack[$this->yyidx + -3]->minor."'"))); + } +#line 2349 "smarty_internal_templateparser.php" +#line 333 "smarty_internal_templateparser.y" + function yy_r33(){ + $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + -2]->minor),array('var'=>"'".$this->yystack[$this->yyidx + -4]->minor."'")),$this->yystack[$this->yyidx + -1]->minor)); + } +#line 2354 "smarty_internal_templateparser.php" #line 337 "smarty_internal_templateparser.y" - function yy_r72(){ $this->yystack[$this->yyidx + -2]->minor[]=$this->yystack[$this->yyidx + 0]->minor; $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; } -#line 2454 "smarty_internal_templateparser.php" -#line 339 "smarty_internal_templateparser.y" - function yy_r73(){ $this->_retvalue = array('var' => $this->yystack[$this->yyidx + -2]->minor, 'value'=>$this->yystack[$this->yyidx + 0]->minor); } -#line 2457 "smarty_internal_templateparser.php" -#line 341 "smarty_internal_templateparser.y" - function yy_r75(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; } -#line 2460 "smarty_internal_templateparser.php" -#line 352 "smarty_internal_templateparser.y" - function yy_r78(){$this->_retvalue = '$_smarty_tpl->getStreamVariable(\''. $this->yystack[$this->yyidx + -2]->minor .'://'. $this->yystack[$this->yyidx + 0]->minor . '\')'; } -#line 2463 "smarty_internal_templateparser.php" -#line 354 "smarty_internal_templateparser.y" - function yy_r79(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor . trim($this->yystack[$this->yyidx + -1]->minor) . $this->yystack[$this->yyidx + 0]->minor; } -#line 2466 "smarty_internal_templateparser.php" -#line 360 "smarty_internal_templateparser.y" - function yy_r82(){$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 2469 "smarty_internal_templateparser.php" -#line 363 "smarty_internal_templateparser.y" - function yy_r83(){ $this->_retvalue = $this->compiler->compileTag('private_modifier',array(),array('value'=>$this->yystack[$this->yyidx + -1]->minor,'modifierlist'=>$this->yystack[$this->yyidx + 0]->minor)); } -#line 2472 "smarty_internal_templateparser.php" -#line 367 "smarty_internal_templateparser.y" - function yy_r84(){$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } -#line 2475 "smarty_internal_templateparser.php" + function yy_r34(){ + $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + -2]->minor),array('var'=>$this->yystack[$this->yyidx + -4]->minor['var'])),$this->yystack[$this->yyidx + -1]->minor),array('smarty_internal_index'=>$this->yystack[$this->yyidx + -4]->minor['smarty_internal_index'])); + } +#line 2359 "smarty_internal_templateparser.php" +#line 342 "smarty_internal_templateparser.y" + function yy_r35(){ + $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor,$this->yystack[$this->yyidx + -1]->minor); + } +#line 2364 "smarty_internal_templateparser.php" +#line 346 "smarty_internal_templateparser.y" + function yy_r36(){ + $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor,array()); + } +#line 2369 "smarty_internal_templateparser.php" +#line 351 "smarty_internal_templateparser.y" + function yy_r37(){ + $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor,$this->yystack[$this->yyidx + -1]->minor,array('object_methode'=>$this->yystack[$this->yyidx + -2]->minor)); + } +#line 2374 "smarty_internal_templateparser.php" +#line 356 "smarty_internal_templateparser.y" + function yy_r38(){ + $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor,$this->yystack[$this->yyidx + -1]->minor).'<?php echo '; + $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>'; + } +#line 2380 "smarty_internal_templateparser.php" +#line 362 "smarty_internal_templateparser.y" + function yy_r39(){ + $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -5]->minor,$this->yystack[$this->yyidx + -1]->minor,array('object_methode'=>$this->yystack[$this->yyidx + -3]->minor)).'<?php echo '; + $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>'; + } +#line 2386 "smarty_internal_templateparser.php" #line 368 "smarty_internal_templateparser.y" - function yy_r85(){$this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor.')'; } -#line 2478 "smarty_internal_templateparser.php" -#line 369 "smarty_internal_templateparser.y" - function yy_r86(){$this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.',(array)'.$this->yystack[$this->yyidx + 0]->minor.')'; } -#line 2481 "smarty_internal_templateparser.php" -#line 371 "smarty_internal_templateparser.y" - function yy_r88(){$this->_retvalue = '!('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')'; } -#line 2484 "smarty_internal_templateparser.php" -#line 372 "smarty_internal_templateparser.y" - function yy_r89(){$this->_retvalue = '('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')'; } -#line 2487 "smarty_internal_templateparser.php" + function yy_r40(){ + $tag = trim(substr($this->yystack[$this->yyidx + -2]->minor,$this->lex->ldel_length)); + $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array(),array('if condition'=>$this->yystack[$this->yyidx + -1]->minor)); + } +#line 2392 "smarty_internal_templateparser.php" #line 373 "smarty_internal_templateparser.y" - function yy_r90(){$this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -1]->minor.')'; } -#line 2490 "smarty_internal_templateparser.php" -#line 374 "smarty_internal_templateparser.y" - function yy_r91(){$this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -1]->minor.')'; } -#line 2493 "smarty_internal_templateparser.php" -#line 375 "smarty_internal_templateparser.y" - function yy_r92(){$this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')'; } -#line 2496 "smarty_internal_templateparser.php" -#line 376 "smarty_internal_templateparser.y" - function yy_r93(){$this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')'; } -#line 2499 "smarty_internal_templateparser.php" -#line 382 "smarty_internal_templateparser.y" - function yy_r99(){$this->prefix_number++; $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.$this->yystack[$this->yyidx + 0]->minor.';?>'; $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.'$_tmp'.$this->prefix_number; } -#line 2502 "smarty_internal_templateparser.php" -#line 388 "smarty_internal_templateparser.y" - function yy_r100(){ $this->_retvalue = $this->yystack[$this->yyidx + -6]->minor.' ? $_smarty_tpl->getVariable(\''. $this->yystack[$this->yyidx + -2]->minor .'\')->value : '.$this->yystack[$this->yyidx + 0]->minor; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable('$this->yystack[$this->yyidx + -2]->minor', null, true, false)->nocache; } -#line 2505 "smarty_internal_templateparser.php" + function yy_r41(){ + $tag = trim(substr($this->yystack[$this->yyidx + -3]->minor,$this->lex->ldel_length)); + $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,$this->yystack[$this->yyidx + -1]->minor,array('if condition'=>$this->yystack[$this->yyidx + -2]->minor)); + } +#line 2398 "smarty_internal_templateparser.php" +#line 378 "smarty_internal_templateparser.y" + function yy_r42(){ + $tag = trim(substr($this->yystack[$this->yyidx + -2]->minor,$this->lex->ldel_length)); + $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array(),array('if condition'=>$this->yystack[$this->yyidx + -1]->minor)); + } +#line 2404 "smarty_internal_templateparser.php" #line 389 "smarty_internal_templateparser.y" - function yy_r101(){ $this->_retvalue = $this->yystack[$this->yyidx + -5]->minor.' ? '.$this->yystack[$this->yyidx + -2]->minor.' : '.$this->yystack[$this->yyidx + 0]->minor; } -#line 2508 "smarty_internal_templateparser.php" -#line 396 "smarty_internal_templateparser.y" - function yy_r104(){ $this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor; } -#line 2511 "smarty_internal_templateparser.php" -#line 402 "smarty_internal_templateparser.y" - function yy_r109(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor; } -#line 2514 "smarty_internal_templateparser.php" -#line 403 "smarty_internal_templateparser.y" - function yy_r110(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'; } -#line 2517 "smarty_internal_templateparser.php" -#line 404 "smarty_internal_templateparser.y" - function yy_r111(){ $this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor; } -#line 2520 "smarty_internal_templateparser.php" -#line 406 "smarty_internal_templateparser.y" - function yy_r112(){ 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'; - } else - $this->_retvalue = "'".$this->yystack[$this->yyidx + 0]->minor."'"; } -#line 2530 "smarty_internal_templateparser.php" -#line 417 "smarty_internal_templateparser.y" - function yy_r114(){ $this->_retvalue = "(". $this->yystack[$this->yyidx + -1]->minor .")"; } -#line 2533 "smarty_internal_templateparser.php" + function yy_r44(){ + $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -10]->minor),array('ifexp'=>$this->yystack[$this->yyidx + -7]->minor),array('var'=>$this->yystack[$this->yyidx + -3]->minor),array('step'=>$this->yystack[$this->yyidx + -2]->minor))),1); + } +#line 2409 "smarty_internal_templateparser.php" +#line 393 "smarty_internal_templateparser.y" + function yy_r45(){ + $this->_retvalue = '='.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2414 "smarty_internal_templateparser.php" +#line 401 "smarty_internal_templateparser.y" + function yy_r47(){ + $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -4]->minor),array('to'=>$this->yystack[$this->yyidx + -2]->minor))),0); + } +#line 2419 "smarty_internal_templateparser.php" +#line 405 "smarty_internal_templateparser.y" + function yy_r48(){ + $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -6]->minor),array('to'=>$this->yystack[$this->yyidx + -4]->minor),array('step'=>$this->yystack[$this->yyidx + -2]->minor))),0); + } +#line 2424 "smarty_internal_templateparser.php" +#line 410 "smarty_internal_templateparser.y" + function yy_r49(){ + $this->_retvalue = $this->compiler->compileTag('foreach',$this->yystack[$this->yyidx + -1]->minor); + } +#line 2429 "smarty_internal_templateparser.php" +#line 415 "smarty_internal_templateparser.y" + function yy_r50(){ + $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor)))); + } +#line 2434 "smarty_internal_templateparser.php" +#line 419 "smarty_internal_templateparser.y" + function yy_r51(){ + $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -8]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor),array('key'=>$this->yystack[$this->yyidx + -5]->minor)))); + } +#line 2439 "smarty_internal_templateparser.php" #line 423 "smarty_internal_templateparser.y" - function yy_r117(){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; - } - } else { - $this->compiler->trigger_template_error ("static class '".$this->yystack[$this->yyidx + -2]->minor."' is undefined or not allowed by security setting"); - } - } -#line 2545 "smarty_internal_templateparser.php" -#line 433 "smarty_internal_templateparser.y" - function yy_r118(){ 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;} else { - $this->_retvalue = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor['var'] .')->value'.$this->yystack[$this->yyidx + -2]->minor['smarty_internal_index'].'::'.$this->yystack[$this->yyidx + 0]->minor; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -2]->minor['var'],"'"), null, true, false)->nocache;} } -#line 2549 "smarty_internal_templateparser.php" + function yy_r52(){ + $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor)))); + } +#line 2444 "smarty_internal_templateparser.php" +#line 427 "smarty_internal_templateparser.y" + function yy_r53(){ + $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -8]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor),array('key'=>$this->yystack[$this->yyidx + -5]->minor)))); + } +#line 2449 "smarty_internal_templateparser.php" +#line 432 "smarty_internal_templateparser.y" + function yy_r54(){ + $this->_retvalue = $this->compiler->compileTag('setfilter',array(),array('modifier_list'=>array(array_merge(array($this->yystack[$this->yyidx + -2]->minor),$this->yystack[$this->yyidx + -1]->minor)))); + } +#line 2454 "smarty_internal_templateparser.php" #line 436 "smarty_internal_templateparser.y" - function yy_r119(){ $this->prefix_number++; $this->compiler->prefix_code[] = '<?php ob_start();?>'.$this->yystack[$this->yyidx + 0]->minor.'<?php $_tmp'.$this->prefix_number.'=ob_get_clean();?>'; $this->_retvalue = '$_tmp'.$this->prefix_number; } -#line 2552 "smarty_internal_templateparser.php" -#line 446 "smarty_internal_templateparser.y" - function yy_r121(){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']); - $this->_retvalue = $smarty_var; - } else { - // 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']; - if (isset($this->compiler->local_var[$this->yystack[$this->yyidx + 0]->minor['var']])) { - $this->_retvalue = '$_smarty_tpl->tpl_vars['. $this->yystack[$this->yyidx + 0]->minor['var'] .']->value'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']; - } else { - $this->_retvalue = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + 0]->minor['var'] .')->value'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']; - } - $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + 0]->minor['var'],"'"), null, true, false)->nocache; - } - } + function yy_r55(){ + $this->_retvalue = $this->compiler->compileTag('setfilter',array(),array('modifier_list'=>array_merge(array(array_merge(array($this->yystack[$this->yyidx + -3]->minor),$this->yystack[$this->yyidx + -2]->minor)),$this->yystack[$this->yyidx + -1]->minor))); + } +#line 2459 "smarty_internal_templateparser.php" +#line 441 "smarty_internal_templateparser.y" + function yy_r56(){ + $this->_retvalue = SMARTY_INTERNAL_COMPILE_BLOCK::compileChildBlock($this->compiler); + } +#line 2464 "smarty_internal_templateparser.php" +#line 447 "smarty_internal_templateparser.y" + function yy_r57(){ + $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor.'close',array()); + } +#line 2469 "smarty_internal_templateparser.php" +#line 451 "smarty_internal_templateparser.y" + function yy_r58(){ + $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor.'close',array(),array('modifier_list'=>$this->yystack[$this->yyidx + -1]->minor)); + } +#line 2474 "smarty_internal_templateparser.php" +#line 456 "smarty_internal_templateparser.y" + function yy_r59(){ + $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor.'close',array(),array('object_methode'=>$this->yystack[$this->yyidx + -1]->minor)); + } +#line 2479 "smarty_internal_templateparser.php" +#line 460 "smarty_internal_templateparser.y" + function yy_r60(){ + $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor.'close',array(),array('object_methode'=>$this->yystack[$this->yyidx + -2]->minor, 'modifier_list'=>$this->yystack[$this->yyidx + -1]->minor)); + } +#line 2484 "smarty_internal_templateparser.php" +#line 468 "smarty_internal_templateparser.y" + function yy_r61(){ + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; + $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor; + } +#line 2490 "smarty_internal_templateparser.php" +#line 474 "smarty_internal_templateparser.y" + function yy_r62(){ + $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor); + } +#line 2495 "smarty_internal_templateparser.php" +#line 479 "smarty_internal_templateparser.y" + function yy_r63(){ + $this->_retvalue = array(); + } +#line 2500 "smarty_internal_templateparser.php" +#line 484 "smarty_internal_templateparser.y" + function yy_r64(){ + 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'); + } else { + $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>"'".$this->yystack[$this->yyidx + 0]->minor."'"); + } + } +#line 2513 "smarty_internal_templateparser.php" +#line 496 "smarty_internal_templateparser.y" + function yy_r65(){ + $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor); + } +#line 2518 "smarty_internal_templateparser.php" +#line 504 "smarty_internal_templateparser.y" + function yy_r67(){ + $this->_retvalue = "'".$this->yystack[$this->yyidx + 0]->minor."'"; + } +#line 2523 "smarty_internal_templateparser.php" +#line 529 "smarty_internal_templateparser.y" + function yy_r72(){ + $this->yystack[$this->yyidx + -2]->minor[]=$this->yystack[$this->yyidx + 0]->minor; + $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; + } +#line 2529 "smarty_internal_templateparser.php" +#line 534 "smarty_internal_templateparser.y" + function yy_r73(){ + $this->_retvalue = array('var' => $this->yystack[$this->yyidx + -2]->minor, 'value'=>$this->yystack[$this->yyidx + 0]->minor); + } +#line 2534 "smarty_internal_templateparser.php" +#line 562 "smarty_internal_templateparser.y" + function yy_r78(){ + $this->_retvalue = '$_smarty_tpl->getStreamVariable(\''. $this->yystack[$this->yyidx + -2]->minor .'://'. $this->yystack[$this->yyidx + 0]->minor . '\')'; + } +#line 2539 "smarty_internal_templateparser.php" +#line 567 "smarty_internal_templateparser.y" + function yy_r79(){ + $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor . trim($this->yystack[$this->yyidx + -1]->minor) . $this->yystack[$this->yyidx + 0]->minor; + } +#line 2544 "smarty_internal_templateparser.php" +#line 586 "smarty_internal_templateparser.y" + function yy_r83(){ + $this->_retvalue = $this->compiler->compileTag('private_modifier',array(),array('value'=>$this->yystack[$this->yyidx + -1]->minor,'modifierlist'=>$this->yystack[$this->yyidx + 0]->minor)); + } +#line 2549 "smarty_internal_templateparser.php" +#line 592 "smarty_internal_templateparser.y" + function yy_r84(){ + $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2554 "smarty_internal_templateparser.php" +#line 596 "smarty_internal_templateparser.y" + function yy_r85(){ + $this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor.')'; + } +#line 2559 "smarty_internal_templateparser.php" +#line 600 "smarty_internal_templateparser.y" + function yy_r86(){ + $this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.',(array)'.$this->yystack[$this->yyidx + 0]->minor.')'; + } +#line 2564 "smarty_internal_templateparser.php" +#line 608 "smarty_internal_templateparser.y" + function yy_r88(){ + $this->_retvalue = '!('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')'; + } #line 2569 "smarty_internal_templateparser.php" -#line 462 "smarty_internal_templateparser.y" - function yy_r122(){if (isset($this->compiler->local_var[$this->yystack[$this->yyidx + -2]->minor])) { - $this->_retvalue = '$_smarty_tpl->tpl_vars['. $this->yystack[$this->yyidx + -2]->minor .']->'.$this->yystack[$this->yyidx + 0]->minor; - } else { - $this->_retvalue = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor .')->'.$this->yystack[$this->yyidx + 0]->minor; - } - $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -2]->minor,"'"), null, true, false)->nocache; } -#line 2577 "smarty_internal_templateparser.php" -#line 471 "smarty_internal_templateparser.y" - function yy_r124(){$this->_retvalue = '$_smarty_tpl->getConfigVariable(\''. $this->yystack[$this->yyidx + -1]->minor .'\')'; } -#line 2580 "smarty_internal_templateparser.php" -#line 472 "smarty_internal_templateparser.y" - function yy_r125(){$this->_retvalue = '$_smarty_tpl->getConfigVariable('. $this->yystack[$this->yyidx + -1]->minor .')'; } -#line 2583 "smarty_internal_templateparser.php" -#line 475 "smarty_internal_templateparser.y" - function yy_r126(){$this->_retvalue = array('var'=>$this->yystack[$this->yyidx + -1]->minor, 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor); } -#line 2586 "smarty_internal_templateparser.php" -#line 481 "smarty_internal_templateparser.y" - function yy_r127(){$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } +#line 612 "smarty_internal_templateparser.y" + function yy_r89(){ + $this->_retvalue = '('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')'; + } +#line 2574 "smarty_internal_templateparser.php" +#line 616 "smarty_internal_templateparser.y" + function yy_r90(){ + $this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -1]->minor.')'; + } +#line 2579 "smarty_internal_templateparser.php" +#line 620 "smarty_internal_templateparser.y" + function yy_r91(){ + $this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -1]->minor.')'; + } +#line 2584 "smarty_internal_templateparser.php" +#line 624 "smarty_internal_templateparser.y" + function yy_r92(){ + $this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')'; + } #line 2589 "smarty_internal_templateparser.php" -#line 483 "smarty_internal_templateparser.y" - function yy_r128(){return; } -#line 2592 "smarty_internal_templateparser.php" -#line 487 "smarty_internal_templateparser.y" - function yy_r129(){ $this->_retvalue = '[$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + 0]->minor .')->value]'; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable('$this->yystack[$this->yyidx + 0]->minor', null, true, false)->nocache; } -#line 2595 "smarty_internal_templateparser.php" -#line 488 "smarty_internal_templateparser.y" - function yy_r130(){ $this->_retvalue = '[$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor .')->'.$this->yystack[$this->yyidx + 0]->minor.']'; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -2]->minor,"'"), null, true, false)->nocache; } -#line 2598 "smarty_internal_templateparser.php" -#line 489 "smarty_internal_templateparser.y" - function yy_r131(){ $this->_retvalue = "['". $this->yystack[$this->yyidx + 0]->minor ."']"; } +#line 628 "smarty_internal_templateparser.y" + function yy_r93(){ + $this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')'; + } +#line 2594 "smarty_internal_templateparser.php" +#line 652 "smarty_internal_templateparser.y" + function yy_r99(){ + $this->prefix_number++; + $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.$this->yystack[$this->yyidx + 0]->minor.';?>'; + $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.'$_tmp'.$this->prefix_number; + } #line 2601 "smarty_internal_templateparser.php" -#line 490 "smarty_internal_templateparser.y" - function yy_r132(){ $this->_retvalue = "[". $this->yystack[$this->yyidx + 0]->minor ."]"; } -#line 2604 "smarty_internal_templateparser.php" -#line 491 "smarty_internal_templateparser.y" - function yy_r133(){ $this->_retvalue = "[". $this->yystack[$this->yyidx + -1]->minor ."]"; } -#line 2607 "smarty_internal_templateparser.php" -#line 493 "smarty_internal_templateparser.y" - function yy_r134(){ $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']'; } -#line 2610 "smarty_internal_templateparser.php" -#line 494 "smarty_internal_templateparser.y" - function yy_r135(){ $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']'; } -#line 2613 "smarty_internal_templateparser.php" -#line 498 "smarty_internal_templateparser.y" - function yy_r137(){$this->_retvalue = '[]'; } +#line 661 "smarty_internal_templateparser.y" + function yy_r100(){ + $this->_retvalue = $this->yystack[$this->yyidx + -6]->minor.' ? '. $this->compileVariable("'".$this->yystack[$this->yyidx + -2]->minor."'") . ' : '.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2606 "smarty_internal_templateparser.php" +#line 665 "smarty_internal_templateparser.y" + function yy_r101(){ + $this->_retvalue = $this->yystack[$this->yyidx + -5]->minor.' ? '.$this->yystack[$this->yyidx + -2]->minor.' : '.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2611 "smarty_internal_templateparser.php" +#line 680 "smarty_internal_templateparser.y" + function yy_r104(){ + $this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor; + } #line 2616 "smarty_internal_templateparser.php" -#line 506 "smarty_internal_templateparser.y" - function yy_r139(){$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor; } -#line 2619 "smarty_internal_templateparser.php" -#line 508 "smarty_internal_templateparser.y" - function yy_r140(){$this->_retvalue = '\''.$this->yystack[$this->yyidx + 0]->minor.'\''; } -#line 2622 "smarty_internal_templateparser.php" -#line 510 "smarty_internal_templateparser.y" - function yy_r141(){$this->_retvalue = '('.$this->yystack[$this->yyidx + -1]->minor.')'; } -#line 2625 "smarty_internal_templateparser.php" -#line 515 "smarty_internal_templateparser.y" - function yy_r142(){ 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 = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -1]->minor['var'] .')->value'.$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index'].$this->yystack[$this->yyidx + 0]->minor; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -1]->minor['var'],"'"), null, true, false)->nocache;} } -#line 2629 "smarty_internal_templateparser.php" -#line 518 "smarty_internal_templateparser.y" - function yy_r143(){$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 2632 "smarty_internal_templateparser.php" -#line 520 "smarty_internal_templateparser.y" - function yy_r144(){$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } -#line 2635 "smarty_internal_templateparser.php" -#line 522 "smarty_internal_templateparser.y" - function yy_r145(){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 2642 "smarty_internal_templateparser.php" -#line 527 "smarty_internal_templateparser.y" - function yy_r146(){if ($this->security) { - $this->compiler->trigger_template_error (self::Err2); - } - $this->_retvalue = '->{$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -1]->minor .')->value'.$this->yystack[$this->yyidx + 0]->minor.'}'; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -1]->minor,"'"), null, true, false)->nocache; - } +#line 701 "smarty_internal_templateparser.y" + function yy_r109(){ + $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2621 "smarty_internal_templateparser.php" +#line 705 "smarty_internal_templateparser.y" + function yy_r110(){ + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'; + } +#line 2626 "smarty_internal_templateparser.php" +#line 709 "smarty_internal_templateparser.y" + function yy_r111(){ + $this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2631 "smarty_internal_templateparser.php" +#line 714 "smarty_internal_templateparser.y" + function yy_r112(){ + 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'; + } else { + $this->_retvalue = "'".$this->yystack[$this->yyidx + 0]->minor."'"; + } + } +#line 2644 "smarty_internal_templateparser.php" +#line 732 "smarty_internal_templateparser.y" + function yy_r114(){ + $this->_retvalue = "(". $this->yystack[$this->yyidx + -1]->minor .")"; + } #line 2649 "smarty_internal_templateparser.php" -#line 532 "smarty_internal_templateparser.y" - function yy_r147(){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 2656 "smarty_internal_templateparser.php" -#line 537 "smarty_internal_templateparser.y" - function yy_r148(){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 2663 "smarty_internal_templateparser.php" -#line 543 "smarty_internal_templateparser.y" - function yy_r149(){ $this->_retvalue = '->'.$this->yystack[$this->yyidx + 0]->minor; } -#line 2666 "smarty_internal_templateparser.php" -#line 549 "smarty_internal_templateparser.y" - function yy_r150(){if (!$this->security || $this->smarty->security_policy->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') { - if (count($this->yystack[$this->yyidx + -1]->minor) == 0) { - $this->compiler->trigger_template_error ('Illegal number of paramer in "isset()"'); - } - $isset_par=str_replace("')->value","',null,true,false)->value",implode(',',$this->yystack[$this->yyidx + -1]->minor)); - $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". $isset_par .")"; - } elseif (in_array($func_name,array('empty','reset','current','end','prev','next'))){ - if (count($this->yystack[$this->yyidx + -1]->minor) != 1) { - $this->compiler->trigger_template_error ('Illegal number of paramer in "empty()"'); - } - if ($func_name == 'empty') { - $this->_retvalue = $func_name.'('.str_replace("')->value","',null,true,false)->value",$this->yystack[$this->yyidx + -1]->minor[0]).')'; - } else { - $this->_retvalue = $func_name.'('.$this->yystack[$this->yyidx + -1]->minor[0].')'; - } - } else { - $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". implode(',',$this->yystack[$this->yyidx + -1]->minor) .")"; - } - } else { - $this->compiler->trigger_template_error ("unknown function \"" . $this->yystack[$this->yyidx + -3]->minor . "\""); - } - } - } -#line 2694 "smarty_internal_templateparser.php" -#line 579 "smarty_internal_templateparser.y" - function yy_r151(){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 747 "smarty_internal_templateparser.y" + function yy_r117(){ + 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; + } + } else { + $this->compiler->trigger_template_error ("static class '".$this->yystack[$this->yyidx + -2]->minor."' is undefined or not allowed by security setting"); + } + } +#line 2662 "smarty_internal_templateparser.php" +#line 759 "smarty_internal_templateparser.y" + function yy_r118(){ + 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; + } 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; + } + } +#line 2671 "smarty_internal_templateparser.php" +#line 768 "smarty_internal_templateparser.y" + function yy_r119(){ + $this->prefix_number++; + $this->compiler->prefix_code[] = '<?php ob_start();?>'.$this->yystack[$this->yyidx + 0]->minor.'<?php $_tmp'.$this->prefix_number.'=ob_get_clean();?>'; + $this->_retvalue = '$_tmp'.$this->prefix_number; + } +#line 2678 "smarty_internal_templateparser.php" +#line 783 "smarty_internal_templateparser.y" + function yy_r121(){ + 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']); + $this->_retvalue = $smarty_var; + } else { + // 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']; + } + } +#line 2691 "smarty_internal_templateparser.php" +#line 796 "smarty_internal_templateparser.y" + function yy_r122(){ + $this->_retvalue = '$_smarty_tpl->tpl_vars['. $this->yystack[$this->yyidx + -2]->minor .']->'.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2696 "smarty_internal_templateparser.php" +#line 806 "smarty_internal_templateparser.y" + function yy_r124(){ + $this->_retvalue = '$_smarty_tpl->getConfigVariable(\''. $this->yystack[$this->yyidx + -1]->minor .'\')'; + } #line 2701 "smarty_internal_templateparser.php" -#line 584 "smarty_internal_templateparser.y" - function yy_r152(){if ($this->security) { - $this->compiler->trigger_template_error (self::Err2); - } - $this->prefix_number++; $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'=$_smarty_tpl->getVariable(\''. $this->yystack[$this->yyidx + -3]->minor .'\')->value;?>'; $this->_retvalue = '$_tmp'.$this->prefix_number.'('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')'; - } -#line 2708 "smarty_internal_templateparser.php" -#line 592 "smarty_internal_templateparser.y" - function yy_r153(){ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array($this->yystack[$this->yyidx + 0]->minor)); } +#line 810 "smarty_internal_templateparser.y" + function yy_r125(){ + $this->_retvalue = '$_smarty_tpl->getConfigVariable('. $this->yystack[$this->yyidx + -1]->minor .')'; + } +#line 2706 "smarty_internal_templateparser.php" +#line 814 "smarty_internal_templateparser.y" + function yy_r126(){ + $this->_retvalue = array('var'=>$this->yystack[$this->yyidx + -1]->minor, 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor); + } #line 2711 "smarty_internal_templateparser.php" -#line 601 "smarty_internal_templateparser.y" - function yy_r156(){$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 2714 "smarty_internal_templateparser.php" -#line 602 "smarty_internal_templateparser.y" - function yy_r157(){$this->_retvalue = array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor)); } -#line 2717 "smarty_internal_templateparser.php" -#line 605 "smarty_internal_templateparser.y" - function yy_r159(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor); } -#line 2720 "smarty_internal_templateparser.php" -#line 610 "smarty_internal_templateparser.y" - function yy_r160(){ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor); } -#line 2723 "smarty_internal_templateparser.php" -#line 612 "smarty_internal_templateparser.y" - function yy_r161(){$this->_retvalue = array(); } +#line 827 "smarty_internal_templateparser.y" + function yy_r128(){ + return; + } +#line 2716 "smarty_internal_templateparser.php" +#line 833 "smarty_internal_templateparser.y" + function yy_r129(){ + $this->_retvalue = '['.$this->compileVariable($this->yystack[$this->yyidx + 0]->minor).']'; + } +#line 2721 "smarty_internal_templateparser.php" +#line 837 "smarty_internal_templateparser.y" + function yy_r130(){ + $this->_retvalue = '['.$this->compileVariable($this->yystack[$this->yyidx + -2]->minor).'->'.$this->yystack[$this->yyidx + 0]->minor.']'; + } #line 2726 "smarty_internal_templateparser.php" -#line 614 "smarty_internal_templateparser.y" - function yy_r162(){$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor); } -#line 2729 "smarty_internal_templateparser.php" -#line 624 "smarty_internal_templateparser.y" - function yy_r167(){ $this->_retvalue = '$'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } -#line 2732 "smarty_internal_templateparser.php" -#line 626 "smarty_internal_templateparser.y" - function yy_r168(){ $this->_retvalue = '$'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } -#line 2735 "smarty_internal_templateparser.php" -#line 635 "smarty_internal_templateparser.y" - function yy_r169(){$this->_retvalue = '=='; } -#line 2738 "smarty_internal_templateparser.php" -#line 636 "smarty_internal_templateparser.y" - function yy_r170(){$this->_retvalue = '!='; } +#line 841 "smarty_internal_templateparser.y" + function yy_r131(){ + $this->_retvalue = "['". $this->yystack[$this->yyidx + 0]->minor ."']"; + } +#line 2731 "smarty_internal_templateparser.php" +#line 845 "smarty_internal_templateparser.y" + function yy_r132(){ + $this->_retvalue = "[". $this->yystack[$this->yyidx + 0]->minor ."]"; + } +#line 2736 "smarty_internal_templateparser.php" +#line 849 "smarty_internal_templateparser.y" + function yy_r133(){ + $this->_retvalue = "[". $this->yystack[$this->yyidx + -1]->minor ."]"; + } #line 2741 "smarty_internal_templateparser.php" -#line 637 "smarty_internal_templateparser.y" - function yy_r171(){$this->_retvalue = '>'; } -#line 2744 "smarty_internal_templateparser.php" -#line 638 "smarty_internal_templateparser.y" - function yy_r172(){$this->_retvalue = '<'; } -#line 2747 "smarty_internal_templateparser.php" -#line 639 "smarty_internal_templateparser.y" - function yy_r173(){$this->_retvalue = '>='; } -#line 2750 "smarty_internal_templateparser.php" -#line 640 "smarty_internal_templateparser.y" - function yy_r174(){$this->_retvalue = '<='; } -#line 2753 "smarty_internal_templateparser.php" -#line 641 "smarty_internal_templateparser.y" - function yy_r175(){$this->_retvalue = '==='; } +#line 854 "smarty_internal_templateparser.y" + function yy_r134(){ + $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']'; + } +#line 2746 "smarty_internal_templateparser.php" +#line 858 "smarty_internal_templateparser.y" + function yy_r135(){ + $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']'; + } +#line 2751 "smarty_internal_templateparser.php" +#line 868 "smarty_internal_templateparser.y" + function yy_r137(){ + $this->_retvalue = '[]'; + } #line 2756 "smarty_internal_templateparser.php" -#line 642 "smarty_internal_templateparser.y" - function yy_r176(){$this->_retvalue = '!=='; } -#line 2759 "smarty_internal_templateparser.php" -#line 643 "smarty_internal_templateparser.y" - function yy_r177(){$this->_retvalue = '%'; } -#line 2762 "smarty_internal_templateparser.php" -#line 645 "smarty_internal_templateparser.y" - function yy_r178(){$this->_retvalue = '&&'; } -#line 2765 "smarty_internal_templateparser.php" -#line 646 "smarty_internal_templateparser.y" - function yy_r179(){$this->_retvalue = '||'; } -#line 2768 "smarty_internal_templateparser.php" -#line 647 "smarty_internal_templateparser.y" - function yy_r180(){$this->_retvalue = ' XOR '; } +#line 881 "smarty_internal_templateparser.y" + function yy_r139(){ + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2761 "smarty_internal_templateparser.php" +#line 886 "smarty_internal_templateparser.y" + function yy_r140(){ + $this->_retvalue = '\''.$this->yystack[$this->yyidx + 0]->minor.'\''; + } +#line 2766 "smarty_internal_templateparser.php" +#line 891 "smarty_internal_templateparser.y" + function yy_r141(){ + $this->_retvalue = '('.$this->yystack[$this->yyidx + -1]->minor.')'; + } #line 2771 "smarty_internal_templateparser.php" -#line 652 "smarty_internal_templateparser.y" - function yy_r181(){ $this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')'; } -#line 2774 "smarty_internal_templateparser.php" -#line 654 "smarty_internal_templateparser.y" - function yy_r183(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor; } -#line 2777 "smarty_internal_templateparser.php" -#line 655 "smarty_internal_templateparser.y" - function yy_r184(){ return; } +#line 898 "smarty_internal_templateparser.y" + function yy_r142(){ + 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; + } + } #line 2780 "smarty_internal_templateparser.php" -#line 656 "smarty_internal_templateparser.y" - function yy_r185(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'=>'.$this->yystack[$this->yyidx + 0]->minor; } -#line 2783 "smarty_internal_templateparser.php" -#line 657 "smarty_internal_templateparser.y" - function yy_r186(){ $this->_retvalue = '\''.$this->yystack[$this->yyidx + -2]->minor.'\'=>'.$this->yystack[$this->yyidx + 0]->minor; } -#line 2786 "smarty_internal_templateparser.php" -#line 664 "smarty_internal_templateparser.y" - function yy_r188(){ $this->_retvalue = "''"; } -#line 2789 "smarty_internal_templateparser.php" -#line 665 "smarty_internal_templateparser.y" - function yy_r189(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor->to_smarty_php(); } -#line 2792 "smarty_internal_templateparser.php" -#line 667 "smarty_internal_templateparser.y" - function yy_r190(){ $this->yystack[$this->yyidx + -1]->minor->append_subtree($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; } -#line 2795 "smarty_internal_templateparser.php" -#line 668 "smarty_internal_templateparser.y" - function yy_r191(){ $this->_retvalue = new _smarty_doublequoted($this, $this->yystack[$this->yyidx + 0]->minor); } +#line 907 "smarty_internal_templateparser.y" + function yy_r143(){ + $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; + } +#line 2785 "smarty_internal_templateparser.php" +#line 912 "smarty_internal_templateparser.y" + function yy_r144(){ + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2790 "smarty_internal_templateparser.php" +#line 917 "smarty_internal_templateparser.y" + function yy_r145(){ + 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 2798 "smarty_internal_templateparser.php" -#line 670 "smarty_internal_templateparser.y" - function yy_r192(){ $this->_retvalue = new _smarty_code($this, $this->yystack[$this->yyidx + -1]->minor); } -#line 2801 "smarty_internal_templateparser.php" -#line 672 "smarty_internal_templateparser.y" - function yy_r194(){if (isset($this->compiler->local_var["'".substr($this->yystack[$this->yyidx + 0]->minor,1)."'"])) { - $this->_retvalue = new _smarty_code($this, '$_smarty_tpl->tpl_vars[\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\']->value'); - } else { - $this->_retvalue = new _smarty_code($this, '$_smarty_tpl->getVariable(\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\')->value'); - } - $this->compiler->tag_nocache = $this->compiler->tag_nocache | $this->template->getVariable(trim($this->yystack[$this->yyidx + 0]->minor,"'"), null, true, false)->nocache; - } -#line 2810 "smarty_internal_templateparser.php" -#line 680 "smarty_internal_templateparser.y" - function yy_r196(){ $this->_retvalue = new _smarty_code($this, '('.$this->yystack[$this->yyidx + -1]->minor.')'); } -#line 2813 "smarty_internal_templateparser.php" -#line 681 "smarty_internal_templateparser.y" +#line 924 "smarty_internal_templateparser.y" + function yy_r146(){ + 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.'}'; + } +#line 2806 "smarty_internal_templateparser.php" +#line 931 "smarty_internal_templateparser.y" + function yy_r147(){ + 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 2814 "smarty_internal_templateparser.php" +#line 938 "smarty_internal_templateparser.y" + function yy_r148(){ + 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 2822 "smarty_internal_templateparser.php" +#line 946 "smarty_internal_templateparser.y" + function yy_r149(){ + $this->_retvalue = '->'.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2827 "smarty_internal_templateparser.php" +#line 954 "smarty_internal_templateparser.y" + function yy_r150(){ + if (!$this->security || $this->smarty->security_policy->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') { + if (count($this->yystack[$this->yyidx + -1]->minor) == 0) { + $this->compiler->trigger_template_error ('Illegal number of paramer in "isset()"'); + } + $par = implode(',',$this->yystack[$this->yyidx + -1]->minor); + if (strncasecmp($par,'$_smarty_tpl->getConfigVariable',strlen('$_smarty_tpl->getConfigVariable')) === 0) { + $this->prefix_number++; + $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.str_replace(')',', false)',$par).';?>'; + $isset_par = '$_tmp'.$this->prefix_number; + } else { + $isset_par=str_replace("')->value","',null,true,false)->value",$par); + } + $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". $isset_par .")"; + } elseif (in_array($func_name,array('empty','reset','current','end','prev','next'))){ + if (count($this->yystack[$this->yyidx + -1]->minor) != 1) { + $this->compiler->trigger_template_error ('Illegal number of paramer in "empty()"'); + } + if ($func_name == 'empty') { + $this->_retvalue = $func_name.'('.str_replace("')->value","',null,true,false)->value",$this->yystack[$this->yyidx + -1]->minor[0]).')'; + } else { + $this->_retvalue = $func_name.'('.$this->yystack[$this->yyidx + -1]->minor[0].')'; + } + } else { + $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". implode(',',$this->yystack[$this->yyidx + -1]->minor) .")"; + } + } else { + $this->compiler->trigger_template_error ("unknown function \"" . $this->yystack[$this->yyidx + -3]->minor . "\""); + } + } + } +#line 2863 "smarty_internal_templateparser.php" +#line 992 "smarty_internal_templateparser.y" + function yy_r151(){ + 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 2871 "smarty_internal_templateparser.php" +#line 999 "smarty_internal_templateparser.y" + function yy_r152(){ + if ($this->security) { + $this->compiler->trigger_template_error (self::Err2); + } + $this->prefix_number++; + $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.$this->compileVariable("'".$this->yystack[$this->yyidx + -3]->minor."'").';?>'; + $this->_retvalue = '$_tmp'.$this->prefix_number.'('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')'; + } +#line 2881 "smarty_internal_templateparser.php" +#line 1010 "smarty_internal_templateparser.y" + function yy_r153(){ + $this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array($this->yystack[$this->yyidx + 0]->minor)); + } +#line 2886 "smarty_internal_templateparser.php" +#line 1027 "smarty_internal_templateparser.y" + function yy_r156(){ + $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 2891 "smarty_internal_templateparser.php" +#line 1031 "smarty_internal_templateparser.y" + function yy_r157(){ + $this->_retvalue = array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor)); + } +#line 2896 "smarty_internal_templateparser.php" +#line 1039 "smarty_internal_templateparser.y" + function yy_r159(){ + $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor); + } +#line 2901 "smarty_internal_templateparser.php" +#line 1047 "smarty_internal_templateparser.y" + function yy_r160(){ + $this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor); + } +#line 2906 "smarty_internal_templateparser.php" +#line 1081 "smarty_internal_templateparser.y" + function yy_r167(){ + $this->_retvalue = '$'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2911 "smarty_internal_templateparser.php" +#line 1086 "smarty_internal_templateparser.y" + function yy_r168(){ + $this->_retvalue = '$'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2916 "smarty_internal_templateparser.php" +#line 1092 "smarty_internal_templateparser.y" + function yy_r169(){ + $this->_retvalue = '=='; + } +#line 2921 "smarty_internal_templateparser.php" +#line 1096 "smarty_internal_templateparser.y" + function yy_r170(){ + $this->_retvalue = '!='; + } +#line 2926 "smarty_internal_templateparser.php" +#line 1100 "smarty_internal_templateparser.y" + function yy_r171(){ + $this->_retvalue = '>'; + } +#line 2931 "smarty_internal_templateparser.php" +#line 1104 "smarty_internal_templateparser.y" + function yy_r172(){ + $this->_retvalue = '<'; + } +#line 2936 "smarty_internal_templateparser.php" +#line 1108 "smarty_internal_templateparser.y" + function yy_r173(){ + $this->_retvalue = '>='; + } +#line 2941 "smarty_internal_templateparser.php" +#line 1112 "smarty_internal_templateparser.y" + function yy_r174(){ + $this->_retvalue = '<='; + } +#line 2946 "smarty_internal_templateparser.php" +#line 1116 "smarty_internal_templateparser.y" + function yy_r175(){ + $this->_retvalue = '==='; + } +#line 2951 "smarty_internal_templateparser.php" +#line 1120 "smarty_internal_templateparser.y" + function yy_r176(){ + $this->_retvalue = '!=='; + } +#line 2956 "smarty_internal_templateparser.php" +#line 1124 "smarty_internal_templateparser.y" + function yy_r177(){ + $this->_retvalue = '%'; + } +#line 2961 "smarty_internal_templateparser.php" +#line 1128 "smarty_internal_templateparser.y" + function yy_r178(){ + $this->_retvalue = '&&'; + } +#line 2966 "smarty_internal_templateparser.php" +#line 1132 "smarty_internal_templateparser.y" + function yy_r179(){ + $this->_retvalue = '||'; + } +#line 2971 "smarty_internal_templateparser.php" +#line 1136 "smarty_internal_templateparser.y" + function yy_r180(){ + $this->_retvalue = ' XOR '; + } +#line 2976 "smarty_internal_templateparser.php" +#line 1143 "smarty_internal_templateparser.y" + function yy_r181(){ + $this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')'; + } +#line 2981 "smarty_internal_templateparser.php" +#line 1151 "smarty_internal_templateparser.y" + function yy_r183(){ + $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2986 "smarty_internal_templateparser.php" +#line 1159 "smarty_internal_templateparser.y" + function yy_r185(){ + $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'=>'.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2991 "smarty_internal_templateparser.php" +#line 1163 "smarty_internal_templateparser.y" + function yy_r186(){ + $this->_retvalue = '\''.$this->yystack[$this->yyidx + -2]->minor.'\'=>'.$this->yystack[$this->yyidx + 0]->minor; + } +#line 2996 "smarty_internal_templateparser.php" +#line 1175 "smarty_internal_templateparser.y" + function yy_r188(){ + $this->_retvalue = "''"; + } +#line 3001 "smarty_internal_templateparser.php" +#line 1179 "smarty_internal_templateparser.y" + function yy_r189(){ + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor->to_smarty_php(); + } +#line 3006 "smarty_internal_templateparser.php" +#line 1184 "smarty_internal_templateparser.y" + function yy_r190(){ + $this->yystack[$this->yyidx + -1]->minor->append_subtree($this->yystack[$this->yyidx + 0]->minor); + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; + } +#line 3012 "smarty_internal_templateparser.php" +#line 1189 "smarty_internal_templateparser.y" + function yy_r191(){ + $this->_retvalue = new _smarty_doublequoted($this, $this->yystack[$this->yyidx + 0]->minor); + } +#line 3017 "smarty_internal_templateparser.php" +#line 1193 "smarty_internal_templateparser.y" + function yy_r192(){ + $this->_retvalue = new _smarty_code($this, $this->yystack[$this->yyidx + -1]->minor); + } +#line 3022 "smarty_internal_templateparser.php" +#line 1201 "smarty_internal_templateparser.y" + function yy_r194(){ + $this->_retvalue = new _smarty_code($this, '$_smarty_tpl->tpl_vars[\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\']->value'); + } +#line 3027 "smarty_internal_templateparser.php" +#line 1209 "smarty_internal_templateparser.y" + function yy_r196(){ + $this->_retvalue = new _smarty_code($this, '('.$this->yystack[$this->yyidx + -1]->minor.')'); + } +#line 3032 "smarty_internal_templateparser.php" +#line 1213 "smarty_internal_templateparser.y" function yy_r197(){ - $this->_retvalue = new _smarty_tag($this, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2818 "smarty_internal_templateparser.php" -#line 684 "smarty_internal_templateparser.y" - function yy_r198(){ $this->_retvalue = new _smarty_dq_content($this, $this->yystack[$this->yyidx + 0]->minor); } -#line 2821 "smarty_internal_templateparser.php" -#line 691 "smarty_internal_templateparser.y" - function yy_r200(){$this->_retvalue = ''; } -#line 2824 "smarty_internal_templateparser.php" + $this->_retvalue = new _smarty_tag($this, $this->yystack[$this->yyidx + 0]->minor); + } +#line 3037 "smarty_internal_templateparser.php" +#line 1217 "smarty_internal_templateparser.y" + function yy_r198(){ + $this->_retvalue = new _smarty_dq_content($this, $this->yystack[$this->yyidx + 0]->minor); + } +#line 3042 "smarty_internal_templateparser.php" private $_retvalue; @@ -2882,12 +3100,12 @@ static public $yy_action = array( function yy_syntax_error($yymajor, $TOKEN) { -#line 66 "smarty_internal_templateparser.y" +#line 76 "smarty_internal_templateparser.y" $this->internalError = true; $this->yymajor = $yymajor; $this->compiler->trigger_template_error(); -#line 2887 "smarty_internal_templateparser.php" +#line 3105 "smarty_internal_templateparser.php" } function yy_accept() @@ -2898,13 +3116,13 @@ static public $yy_action = array( while ($this->yyidx >= 0) { $stack = $this->yy_pop_parser_stack(); } -#line 58 "smarty_internal_templateparser.y" +#line 68 "smarty_internal_templateparser.y" $this->successful = !$this->internalError; $this->internalError = false; $this->retvalue = $this->_retvalue; //echo $this->retvalue."\n\n"; -#line 2905 "smarty_internal_templateparser.php" +#line 3123 "smarty_internal_templateparser.php" } function doParse($yymajor, $yytokenvalue) diff --git a/libs/sysplugins/smarty_internal_utility.php b/libs/sysplugins/smarty_internal_utility.php index 57046bca..d52f6056 100644 --- a/libs/sysplugins/smarty_internal_utility.php +++ b/libs/sysplugins/smarty_internal_utility.php @@ -1,5 +1,4 @@ <?php - /** * Project: Smarty: the PHP compiling template engine * File: smarty_internal_utility.php @@ -32,41 +31,48 @@ * @version 3-SVN$Rev: 3286 $ */ + +/** + * Utility class + * + * @package Smarty + * @subpackage Security + */ class Smarty_Internal_Utility { - protected $smarty; - function __construct($smarty) + /** + * private constructor to prevent calls creation of new instances + */ + private final function __construct() { - $this->smarty = $smarty; + // intentionally left blank } /** * Compile all template files * - * @param string $extension file extension - * @param bool $force_compile force all to recompile - * @param int $time_limit - * @param int $max_errors - * @return integer number of template files recompiled + * @param string $extension template file name extension + * @param bool $force_compile force all to recompile + * @param int $time_limit set maximum execution time + * @param int $max_errors set maximum allowed errors + * @param Smarty $smarty Smarty instance + * @return integer number of template files compiled */ - function compileAllTemplates($extention = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null) + public static function compileAllTemplates($extention, $force_compile, $time_limit, $max_errors, Smarty $smarty) { // switch off time limit if (function_exists('set_time_limit')) { @set_time_limit($time_limit); } - $this->smarty->force_compile = $force_compile; + $smarty->force_compile = $force_compile; $_count = 0; $_error_count = 0; // loop over array of template directories - foreach((array)$this->smarty->template_dir as $_dir) { - if (strpos('/\\', substr($_dir, -1)) === false) { - $_dir .= DS; - } + foreach($smarty->getTemplateDir() as $_dir) { $_compileDirs = new RecursiveDirectoryIterator($_dir); $_compile = new RecursiveIteratorIterator($_compileDirs); foreach ($_compile as $_fileinfo) { - if (substr($_fileinfo->getBasename(),0,1) == '.') continue; + if (substr($_fileinfo->getBasename(),0,1) == '.' || strpos($_fileinfo, '.svn') !== false) continue; $_file = $_fileinfo->getFilename(); if (!substr_compare($_file, $extention, - strlen($extention)) == 0) continue; if ($_fileinfo->getPath() == substr($_dir, 0, -1)) { @@ -78,7 +84,7 @@ class Smarty_Internal_Utility { flush(); $_start_time = microtime(true); try { - $_tpl = $this->smarty->createTemplate($_template_file,null,null,null,false); + $_tpl = $smarty->createTemplate($_template_file,null,null,null,false); if ($_tpl->mustCompile()) { $_tpl->compileTemplateSource(); echo ' compiled in ', microtime(true) - $_start_time, ' seconds'; @@ -92,8 +98,8 @@ class Smarty_Internal_Utility { echo 'Error: ', $e->getMessage(), "<br><br>"; $_error_count++; } - // free memory - $this->smarty->template_objects = array(); + // free memory + $smarty->template_objects = array(); $_tpl->smarty->template_objects = array(); $_tpl = null; if ($max_errors !== null && $_error_count == $max_errors) { @@ -108,30 +114,28 @@ class Smarty_Internal_Utility { /** * Compile all config files * - * @param string $extension file extension - * @param bool $force_compile force all to recompile - * @param int $time_limit - * @param int $max_errors - * @return integer number of template files recompiled + * @param string $extension config file name extension + * @param bool $force_compile force all to recompile + * @param int $time_limit set maximum execution time + * @param int $max_errors set maximum allowed errors + * @param Smarty $smarty Smarty instance + * @return integer number of config files compiled */ - function compileAllConfig($extention = '.conf', $force_compile = false, $time_limit = 0, $max_errors = null) + public static function compileAllConfig($extention, $force_compile, $time_limit, $max_errors, Smarty $smarty) { // switch off time limit if (function_exists('set_time_limit')) { @set_time_limit($time_limit); } - $this->smarty->force_compile = $force_compile; + $smarty->force_compile = $force_compile; $_count = 0; $_error_count = 0; // loop over array of template directories - foreach((array)$this->smarty->config_dir as $_dir) { - if (strpos('/\\', substr($_dir, -1)) === false) { - $_dir .= DS; - } + foreach($smarty->getConfigDir() as $_dir) { $_compileDirs = new RecursiveDirectoryIterator($_dir); $_compile = new RecursiveIteratorIterator($_compileDirs); foreach ($_compile as $_fileinfo) { - if (substr($_fileinfo->getBasename(),0,1) == '.') continue; + if (substr($_fileinfo->getBasename(),0,1) == '.' || strpos($_fileinfo, '.svn') !== false) continue; $_file = $_fileinfo->getFilename(); if (!substr_compare($_file, $extention, - strlen($extention)) == 0) continue; if ($_fileinfo->getPath() == substr($_dir, 0, -1)) { @@ -143,7 +147,7 @@ class Smarty_Internal_Utility { flush(); $_start_time = microtime(true); try { - $_config = new Smarty_Internal_Config($_config_file, $this->smarty); + $_config = new Smarty_Internal_Config($_config_file, $smarty); if ($_config->mustCompile()) { $_config->compileConfigSource(); echo ' compiled in ', microtime(true) - $_start_time, ' seconds'; @@ -169,132 +173,480 @@ class Smarty_Internal_Utility { /** * Delete compiled template file * - * @param string $resource_name template name - * @param string $compile_id compile id - * @param integer $exp_time expiration time + * @param string $resource_name template name + * @param string $compile_id compile id + * @param integer $exp_time expiration time + * @param Smarty $smarty Smarty instance * @return integer number of template files deleted */ - function clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) + public static function clearCompiledTemplate($resource_name, $compile_id, $exp_time, Smarty $smarty) { + $_compile_dir = $smarty->getCompileDir(); $_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null; - $_dir_sep = $this->smarty->use_sub_dirs ? DS : '^'; + $_dir_sep = $smarty->use_sub_dirs ? DS : '^'; if (isset($resource_name)) { - $_resource_part_1 = $resource_name . '.php'; - $_resource_part_2 = $resource_name . '.cache' . '.php'; + $_save_stat = $smarty->caching; + $smarty->caching = false; + $tpl = new $smarty->template_class($resource_name, $smarty); + $smarty->caching = $_save_stat; + if ($tpl->source->exists) { + $_resource_part_1 = basename(str_replace('^', '/', $tpl->compiled->filepath)); + // remove from template cache + unset($smarty->template_objects[sha1($tpl->template_resource . $tpl->cache_id . $tpl->compile_id)]); + } else { + // remove from template cache + unset($smarty->template_objects[sha1($tpl->template_resource . $tpl->cache_id . $tpl->compile_id)]); + return 0; + } + $_resource_part_2 = str_replace('.php','.cache.php',$_resource_part_1); } else { $_resource_part = ''; } - $_dir = $this->smarty->compile_dir; - if ($this->smarty->use_sub_dirs && isset($_compile_id)) { + $_dir = $_compile_dir; + if ($smarty->use_sub_dirs && isset($_compile_id)) { $_dir .= $_compile_id . $_dir_sep; } if (isset($_compile_id)) { - $_compile_id_part = $this->smarty->compile_dir . $_compile_id . $_dir_sep; + $_compile_id_part = $_compile_dir . $_compile_id . $_dir_sep; } $_count = 0; $_compileDirs = new RecursiveDirectoryIterator($_dir); $_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST); foreach ($_compile as $_file) { - if (substr($_file->getBasename(),0,1) == '.') continue; + if (substr($_file->getBasename(), 0, 1) == '.' || strpos($_file, '.svn') !== false) + continue; if ($_file->isDir()) { if (!$_compile->isDot()) { // delete folder if empty @rmdir($_file->getPathname()); } } else { - if ((!isset($_compile_id) || (strlen((string)$_file) > strlen($_compile_id_part) && substr_compare((string)$_file, $_compile_id_part, 0, strlen($_compile_id_part)) == 0)) && - (!isset($resource_name) || (strlen((string)$_file) > strlen($_resource_part_1) && substr_compare((string)$_file, $_resource_part_1, - strlen($_resource_part_1), strlen($_resource_part_1)) == 0) || - (strlen((string)$_file) > strlen($_resource_part_2) && substr_compare((string)$_file, $_resource_part_2, - strlen($_resource_part_2), strlen($_resource_part_2)) == 0))) { + if ((!isset($_compile_id) || (strlen((string) $_file) > strlen($_compile_id_part) && substr_compare((string) $_file, $_compile_id_part, 0, strlen($_compile_id_part)) == 0)) && + (!isset($resource_name) || (strlen((string) $_file) > strlen($_resource_part_1) && substr_compare((string) $_file, $_resource_part_1, - strlen($_resource_part_1), strlen($_resource_part_1)) == 0) || + (strlen((string) $_file) > strlen($_resource_part_2) && substr_compare((string) $_file, $_resource_part_2, - strlen($_resource_part_2), strlen($_resource_part_2)) == 0))) { if (isset($exp_time)) { if (time() - @filemtime($_file) >= $exp_time) { - $_count += @unlink((string) $_file) ? 1 : 0; + $_count += @ unlink((string) $_file) ? 1 : 0; } } else { - $_count += @unlink((string) $_file) ? 1 : 0; + $_count += @ unlink((string) $_file) ? 1 : 0; } } } } + // clear compiled cache + Smarty_Resource::$sources = array(); + Smarty_Resource::$compileds = array(); return $_count; } /** * Return array of tag/attributes of all tags used by an template * - * @param object $templae template object + * @param Smarty_Internal_Template $templae template object * @return array of tag/attributes */ - public static function getTags(Smarty_Internal_Template $template) - { - $template->smarty->get_used_tags = true; - $template->compileTemplateSource(); - return $template->used_tags; - } + public static function getTags(Smarty_Internal_Template $template) + { + $template->smarty->get_used_tags = true; + $template->compileTemplateSource(); + return $template->used_tags; + } + - function 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) { - echo "<PRE>\n"; + $status = true; + + if ($errors === null) { + echo "<PRE>\n"; + echo "Smarty Installation test...\n"; + echo "Testing template directory...\n"; + } + + // test if all registered template_dir are accessible + foreach($smarty->getTemplateDir() as $template_dir) { + 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"; + } + } + } - echo "Smarty Installation test...\n"; - echo "Testing template directory...\n"; + if ($errors === null) { + echo "Testing compile directory...\n"; + } + + // test if registered compile_dir is accessible + $_compile_dir = $smarty->getCompileDir(); + if (!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"; + } + } + - foreach((array)$this->smarty->template_dir as $template_dir) { - if (!is_dir($template_dir)) - echo "FAILED: $template_dir is not a directory.\n"; - elseif (!is_readable($template_dir)) - echo "FAILED: $template_dir is not readable.\n"; - else - echo "$template_dir is OK.\n"; + if ($errors === null) { + echo "Testing plugins directory...\n"; } - echo "Testing compile 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) { + 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; + } 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 (!is_dir($this->smarty->compile_dir)) - echo "FAILED: {$this->smarty->compile_dir} is not a directory.\n"; - elseif (!is_readable($this->smarty->compile_dir)) - echo "FAILED: {$this->smarty->compile_dir} is not readable.\n"; - elseif (!is_writable($this->smarty->compile_dir)) - echo "FAILED: {$this->smarty->compile_dir} is not writable.\n"; - else - echo "{$this->smarty->compile_dir} is OK.\n"; + if ($errors === null) { + echo "Testing cache directory...\n"; + } - echo "Testing plugins directory...\n"; + $_cache_dir = $smarty->getCacheDir(); - foreach((array)$this->smarty->plugins_dir as $plugin_dir) { - if (!is_dir($plugin_dir)) - echo "FAILED: $plugin_dir is not a directory.\n"; - elseif (!is_readable($plugin_dir)) - echo "FAILED: $plugin_dir is not readable.\n"; - else - echo "$plugin_dir is OK.\n"; + // test if all registered cache_dir is accessible + if (!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"; + } } - echo "Testing cache directory...\n"; - if (!is_dir($this->smarty->cache_dir)) - echo "FAILED: {$this->smarty->cache_dir} is not a directory.\n"; - elseif (!is_readable($this->smarty->cache_dir)) - echo "FAILED: {$this->smarty->cache_dir} is not readable.\n"; - elseif (!is_writable($this->smarty->cache_dir)) - echo "FAILED: {$this->smarty->cache_dir} is not writable.\n"; - else - echo "{$this->smarty->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) { + 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"; + } + } + } - echo "Testing configs directory...\n"; - if (!is_dir($this->smarty->config_dir)) - echo "FAILED: {$this->smarty->config_dir} is not a directory.\n"; - elseif (!is_readable($this->smarty->config_dir)) - echo "FAILED: {$this->smarty->config_dir} is not readable.\n"; - else - echo "{$this->smarty->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; + } + } - echo "Tests complete.\n"; + 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; + } + } - echo "</PRE>\n"; + if ($errors === null) { + echo "Tests complete.\n"; + echo "</PRE>\n"; + } - return true; + return $status; } + } + ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_wrapper.php b/libs/sysplugins/smarty_internal_wrapper.php deleted file mode 100644 index 303e2f92..00000000 --- a/libs/sysplugins/smarty_internal_wrapper.php +++ /dev/null @@ -1,133 +0,0 @@ -<?php - -/** - * Project: Smarty: the PHP compiling template engine - * File: smarty_internal_wrapper.php - * SVN: $Id: $ - * - * 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 - * - * For questions, help, comments, discussion, etc., please join the - * Smarty mailing list. Send a blank e-mail to - * smarty-discussion-subscribe@googlegroups.com - * - * @link http://www.smarty.net/ - * @copyright 2008 New Digital Group, Inc. - * @author Monte Ohrt <monte at ohrt dot com> - * @author Uwe Tews - * @package Smarty - * @subpackage PluginsInternal - * @version 3-SVN$Rev: 3286 $ - */ - -/* - * Smarty Backward Compatability Wrapper - */ - -class Smarty_Internal_Wrapper { - - protected $smarty; - - function __construct($smarty) { - $this->smarty = $smarty; - } - - /** - * Converts smarty2-style function call to smarty 3-style function call - * This is expensive, be sure to port your code to Smarty 3! - * - * @param string $name Smarty 2 function name - * @param array $args Smarty 2 function args - */ - function convert($name, $args) { - // throw notice about deprecated function - if($this->smarty->deprecation_notices) - trigger_error("function call '$name' is unknown or deprecated.",E_USER_NOTICE); - // get first and last part of function name - $name_parts = explode('_',$name,2); - switch($name_parts[0]) { - case 'register': - case 'unregister': - switch($name_parts[1]) { - case 'object': - return call_user_func_array(array($this->smarty,"{$name_parts[0]}Object"),$args); - case 'compiler_function': - return call_user_func_array(array($this->smarty,"{$name_parts[0]}Plugin"),array_merge(array('compiler'),$args)); - case 'prefilter': - return call_user_func_array(array($this->smarty,"{$name_parts[0]}Filter"),array_merge(array('pre'),$args)); - case 'postfilter': - return call_user_func_array(array($this->smarty,"{$name_parts[0]}Filter"),array_merge(array('post'),$args)); - case 'outputfilter': - return call_user_func_array(array($this->smarty,"{$name_parts[0]}Filter"),array_merge(array('output'),$args)); - case 'resource': - return call_user_func_array(array($this->smarty,"{$name_parts[0]}Resource"),$args); - default: - return call_user_func_array(array($this->smarty,"{$name_parts[0]}Plugin"),array_merge(array($name_parts[1]),$args)); - } - case 'get': - switch($name_parts[1]) { - case 'template_vars': - return call_user_func_array(array($this->smarty,'getTemplateVars'),$args); - case 'config_vars': - return call_user_func_array(array($this->smarty,'getConfigVars'),$args); - default: - return call_user_func_array(array($myobj,$name_parts[1]),$args); - } - case 'clear': - switch($name_parts[1]) { - case 'all_assign': - return call_user_func_array(array($this->smarty,'clearAllAssign'),$args); - case 'assign': - return call_user_func_array(array($this->smarty,'clearAssign'),$args); - case 'all_cache': - return call_user_func_array(array($this->smarty,'clearAllCache'),$args); - case 'cache': - return call_user_func_array(array($this->smarty,'clearCache'),$args); - case 'config': - return call_user_func_array(array($this->smarty,'clearConfig'),$args); - case 'compiled_template': - return call_user_func_array(array($this->smarty,'clearCompiledTemplate'),$args); - } - case 'config': - switch($name_parts[1]) { - case 'load': - return call_user_func_array(array($this->smarty,'configLoad'),$args); - } - case 'trigger': - switch($name_parts[1]) { - case 'error': - return call_user_func_array('trigger_error',$args); - } - case 'load': - switch($name_parts[1]) { - case 'filter': - return call_user_func_array(array($this->smarty,'loadFilter'),$args); - } - } - throw new SmartyException("unknown method '$name'"); - } - - /** - * trigger Smarty error - * - * @param string $error_msg - * @param integer $error_type - */ - function trigger_error($error_msg, $error_type = E_USER_WARNING) - { - trigger_error("Smarty error: $error_msg", $error_type); - } -} -?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_write_file.php b/libs/sysplugins/smarty_internal_write_file.php index 4e34335f..aae600ee 100644 --- a/libs/sysplugins/smarty_internal_write_file.php +++ b/libs/sysplugins/smarty_internal_write_file.php @@ -1,56 +1,70 @@ <?php - /** * Smarty write file plugin - * + * * @package Smarty * @subpackage PluginsInternal - * @author Monte Ohrt + * @author Monte Ohrt */ /** * Smarty Internal Write File Class + * + * @package Smarty + * @subpackage PluginsInternal */ class Smarty_Internal_Write_File { + /** - * Writes file in a save way to disk - * + * Writes file in a safe way to disk + * * @param string $_filepath complete filepath * @param string $_contents file content + * @param Smarty $smarty smarty instance * @return boolean true */ - public static function writeFile($_filepath, $_contents, $smarty) + public static function writeFile($_filepath, $_contents, Smarty $smarty) { - $old_umask = umask(0); - $_dirpath = dirname($_filepath); + $_error_reporting = error_reporting(); + error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING); + if ($smarty->_file_perms !== null) { + $old_umask = umask(0); + } + + $_dirpath = dirname($_filepath); // if subdirs, create dir structure if ($_dirpath !== '.' && !file_exists($_dirpath)) { - mkdir($_dirpath, $smarty->_dir_perms, true); - } - // write to tmp file, then move to overt file lock race condition - $_tmp_file = tempnam($_dirpath, 'wrt'); + mkdir($_dirpath, $smarty->_dir_perms === null ? 0777 : $smarty->_dir_perms, true); + } - if (!($fd = @fopen($_tmp_file, 'wb'))) { - $_tmp_file = $_dirpath . DS . uniqid('wrt'); - if (!($fd = @fopen($_tmp_file, 'wb'))) { + // write to tmp file, then move to overt file lock race condition + $_tmp_file = $_dirpath . DS . uniqid('wrt'); + if (!file_put_contents($_tmp_file, $_contents)) { + error_reporting($_error_reporting); throw new SmartyException("unable to write file {$_tmp_file}"); return false; - } - } - - fwrite($fd, $_contents); - fclose($fd); + } // remove original file - if (file_exists($_filepath)) - @unlink($_filepath); + unlink($_filepath); + // rename tmp file - rename($_tmp_file, $_filepath); - // set file permissions - chmod($_filepath, $smarty->_file_perms); - umask($old_umask); + $success = rename($_tmp_file, $_filepath); + if (!$success) { + error_reporting($_error_reporting); + throw new SmartyException("unable to write file {$_filepath}"); + return false; + } + + if ($smarty->_file_perms !== null) { + // set file permissions + chmod($_filepath, $smarty->_file_perms); + umask($old_umask); + } + error_reporting($_error_reporting); return true; - } -} + } + +} ?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_resource.php b/libs/sysplugins/smarty_resource.php new file mode 100644 index 00000000..42cef6c7 --- /dev/null +++ b/libs/sysplugins/smarty_resource.php @@ -0,0 +1,736 @@ +<?php +/** + * Smarty Resource Plugin + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ + +/** + * Smarty Resource Plugin + * + * Base implementation for resource plugins + * + * @package Smarty + * @subpackage TemplateResources + */ +abstract class Smarty_Resource { + /** + * cache for Smarty_Template_Source instances + * @var array + */ + public static $sources = array(); + /** + * cache for Smarty_Template_Compiled instances + * @var array + */ + public static $compileds = array(); + /** + * cache for Smarty_Resource instances + * @var array + */ + protected 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 + ); + + /** + * Name of the Class to compile this resource's contents with + * @var string + */ + public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler'; + + /** + * Name of the Class to tokenize this resource's contents with + * @var string + */ + public $template_lexer_class = 'Smarty_Internal_Templatelexer'; + + /** + * Name of the Class to parse this resource's contents with + * @var string + */ + public $template_parser_class = 'Smarty_Internal_Templateparser'; + + /** + * Load template's source into current template object + * + * {@internal The loaded source is assigned to $_template->source->content directly.}} + * + * @param Smarty_Template_Source $source source object + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + public abstract function getContent(Smarty_Template_Source $source); + + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + */ + public abstract function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null); + + /** + * populate Source Object with timestamp and exists from Resource + * + * @param Smarty_Template_Source $source source object + */ + public function populateTimestamp(Smarty_Template_Source $source) + { + // intentionally left blank + } + + /** + * 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'; + } + + /** + * 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') { + 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; + } elseif ($_file_is_dotted) { + throw new SmartyException("Template '{$file}' may not start with ../ or ./'"); + } + + // resolve relative path + if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) { + $_path = DS . trim($file, '/\\'); + $_was_relative = true; + } else { + $_path = $file; + } + // don't we all just love windows? + $_path = str_replace('\\', '/', $_path); + // resolve simples + $_path = preg_replace('#(/\./(\./)*)|/{2,}#', '/', $_path); + // resolve parents + while (true) { + $_parent = strpos($_path, '/../'); + if ($_parent === false) { + break; + } else if ($_parent === 0) { + $_path = substr($_path, 3); + break; + } + $_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 != '/') { + // 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)) { + if ($match['file'][0] == '.' && ($match['file'][1] == '.' || $match['file'][1] == '/' || $match['file'][1] == "\\")) { + throw new SmartyException("Template '{$match['file']}' may not start with ../ or ./'"); + } + + $_directory = null; + // try string indexes + if (isset($_directories[$match['key']])) { + $_directory = $_directories[$match['key']]; + } else if (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; + } + } + } + + // relative file name? + if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) { + foreach ($_directories as $_directory) { + $_filepath = $_directory . $file; + if ($this->fileExists($source, $_filepath)) { + return $_filepath; + } + if ($source->smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_directory)) { + // try PHP include_path + if (($_filepath = Smarty_Internal_Get_Include_Path::getIncludePath($_filepath)) !== false) { + return $_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 = @filemtime($file); + 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) + { + return null; + } + + /** + * Load Resource Handler + * + * @param Smarty $smarty smarty object + * @param string $resource_type name of the resource + * @return Smarty_Resource Resource Handler + */ + public static function load(Smarty $smarty, $resource_type) + { + // try the instance cache + if (isset(self::$resources[$resource_type])) { + return self::$resources[$resource_type]; + } + + // try registered resource + if (isset($smarty->registered_resources[$resource_type])) { + if ($smarty->registered_resources[$resource_type] instanceof Smarty_Resource) { + return self::$resources[$resource_type] = $smarty->registered_resources[$resource_type]; + } + if (!isset(self::$resources['registered'])) { + self::$resources['registered'] = new Smarty_Internal_Resource_Registered(); + } + return self::$resources['registered']; + } + + // try sysplugins dir + if (isset(self::$sysplugins[$resource_type])) { + $_resource_class = 'Smarty_Internal_Resource_' . ucfirst($resource_type); + return self::$resources[$resource_type] = new $_resource_class(); + } + + // try plugins dir + $_resource_class = 'Smarty_Resource_' . ucfirst($resource_type); + if ($smarty->loadPlugin($_resource_class)) { + if (class_exists($_resource_class, false)) { + return self::$resources[$resource_type] = new $_resource_class(); + } else { + $smarty->registerResource($resource_type, + array("smarty_resource_{$resource_type}_source", + "smarty_resource_{$resource_type}_timestamp", + "smarty_resource_{$resource_type}_secure", + "smarty_resource_{$resource_type}_trusted")); + // give it another try, now that the resource is registered properly + return self::load($smarty, $resource_type); + } + } + + // try streams + $_known_stream = stream_get_wrappers(); + if (in_array($resource_type, $_known_stream)) { + // is known stream + if (is_object($smarty->security_policy)) { + $smarty->security_policy->isTrustedStream($resource_type); + } + if (!isset(self::$resources['stream'])) { + self::$resources['stream'] = new Smarty_Internal_Resource_Stream(); + } + return self::$resources['stream']; + } + + // TODO: try default_(template|config)_handler + + // give up + throw new SmartyException('Unkown resource type \'' . $resource_type . '\''); + } + + /** + * 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 + */ + 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; + } + + // check runtime cache + $_cache_key = 'template|' . $template_resource; + if (isset(self::$sources[$_cache_key])) { + return self::$sources[$_cache_key]; + } + + if (($pos = strpos($template_resource, ':')) === false) { + // no resource given, use default + $resource_type = $smarty->default_resource_type; + $resource_name = $template_resource; + } else { + // get type and name from path + $resource_type = substr($template_resource, 0, $pos); + $resource_name = substr($template_resource, $pos +1); + if (strlen($resource_type) == 1) { + // 1 char is not resource type, but part of filepath + $resource_type = 'file'; + $resource_name = $template_resource; + } + } + + $resource = Smarty_Resource::load($smarty, $resource_type); + $source = new Smarty_Template_Source($resource, $smarty, $template_resource, $resource_type, $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 + * @return Smarty_Config_Source Source Object + */ + public static function config(Smarty_Internal_Config $_config) + { + $config_resource = $_config->config_resource; + $smarty = $_config->smarty; + + if (($pos = strpos($config_resource, ':')) === false) { + // no resource given, use default + $resource_type = $smarty->default_config_type; + $resource_name = $config_resource; + } else { + // get type and name from path + $resource_type = substr($config_resource, 0, $pos); + $resource_name = substr($config_resource, $pos +1); + if (strlen($resource_type) == 1) { + // 1 char is not resource type, but part of filepath + $resource_type = 'file'; + $resource_name = $config_resource; + } + } + + if (in_array($resource_type, array('eval', 'string', 'extends', 'php'))) { + throw new SmartyException ("Unable to use resource '{$resource_type}' for config"); + } + + $resource = Smarty_Resource::load($smarty, $resource_type); + $source = new Smarty_Config_Source($resource, $smarty, $config_resource, $resource_type, $resource_name); + $resource->populate($source, null); + return $source; + } + +} + +/** + * 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 Existance + * @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; + + /** + * 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 + */ + public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name) + { + $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; + } + + /** + * get a Compiled Object of this source + * + * @param Smarty_Internal_Template $_template template objet + * @return Smarty_Template_Compiled compiled object + */ + public function getCompiled(Smarty_Internal_Template $_template) + { + // check runtime cache + $_cache_key = $_template->template_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 Existance + * @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; + } + +} + +?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_resource_custom.php b/libs/sysplugins/smarty_resource_custom.php new file mode 100644 index 00000000..9ec1f356 --- /dev/null +++ b/libs/sysplugins/smarty_resource_custom.php @@ -0,0 +1,96 @@ +<?php +/** + * Smarty Resource Plugin + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ + +/** + * Smarty Resource Plugin + * + * Wrapper Implementation for custom resource plugins + * + * @package Smarty + * @subpackage TemplateResources + */ +abstract class Smarty_Resource_Custom extends Smarty_Resource { + + /** + * fetch template and its modification time from data source + * + * @param string $name template name + * @param string &$source template source + * @param integer &$mtime template modification timestamp (epoch) + */ + protected abstract function fetch($name, &$source, &$mtime); + + /** + * Fetch template'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 template source.}} + * + * @param string $name template name + * @return integer|boolean timestamp (epoch) the template was modified, or false if not found + */ + protected function fetchTimestamp($name) + { + return null; + } + + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null) + { + $source->filepath = strtolower($source->type . ':' . $source->name); + $source->uid = sha1($source->type . ':' . $source->name); + + $mtime = $this->fetchTimestamp($source->name); + if ($mtime !== null) { + $source->timestamp = $mtime; + } else { + $this->fetch($source->name, $content, $timestamp); + $source->timestamp = isset($timestamp) ? $timestamp : false; + if( isset($content) ) + $source->content = $content; + } + $source->exists = !!$source->timestamp; + } + + /** + * Load template's source into current template object + * + * @param Smarty_Template_Source $source source object + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + public function getContent(Smarty_Template_Source $source) + { + $this->fetch($source->name, $content, $timestamp); + if (isset($content)) { + return $content; + } + + throw new SmartyException("Unable to read template {$source->type} '{$source->name}'"); + } + + /** + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * @return string resource's basename + */ + protected function getBasename(Smarty_Template_Source $source) + { + return basename($source->name); + } + +} + +?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_resource_recompiled.php b/libs/sysplugins/smarty_resource_recompiled.php new file mode 100644 index 00000000..ab55b93a --- /dev/null +++ b/libs/sysplugins/smarty_resource_recompiled.php @@ -0,0 +1,36 @@ +<?php +/** + * Smarty Resource Plugin + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ + +/** + * Smarty Resource Plugin + * + * Base implementation for resource plugins that don't compile cache + * + * @package Smarty + * @subpackage TemplateResources + */ +abstract class Smarty_Resource_Recompiled extends Smarty_Resource { + + /** + * populate Compiled Object with compiled filepath + * + * @param Smarty_Template_Compiled $compiled compiled object + * @param Smarty_Internal_Template $_template template object + * @return void + */ + public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template) + { + $compiled->filepath = false; + $compiled->timestamp = false; + $compiled->exists = false; + } + +} + +?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_resource_uncompiled.php b/libs/sysplugins/smarty_resource_uncompiled.php new file mode 100644 index 00000000..ea802350 --- /dev/null +++ b/libs/sysplugins/smarty_resource_uncompiled.php @@ -0,0 +1,44 @@ +<?php +/** + * Smarty Resource Plugin + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ + +/** + * Smarty Resource Plugin + * + * Base implementation for resource plugins that don't use the compiler + * + * @package Smarty + * @subpackage TemplateResources + */ +abstract class Smarty_Resource_Uncompiled extends Smarty_Resource { + + /** + * Render and output the template (without using the compiler) + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * @throws SmartyException on failure + */ + public abstract function renderUncompiled(Smarty_Template_Source $source, Smarty_Internal_Template $_template); + + /** + * 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; + } + +} + +?>
\ No newline at end of file diff --git a/libs/sysplugins/smarty_security.php b/libs/sysplugins/smarty_security.php index cd066fb4..8eb4ed7a 100644 --- a/libs/sysplugins/smarty_security.php +++ b/libs/sysplugins/smarty_security.php @@ -1,16 +1,17 @@ <?php /** * Smarty plugin - * + * * @package Smarty * @subpackage Security - * @author Uwe Tews - */ + * @author Uwe Tews + */ /** * This class does contain the security settings */ class Smarty_Security { + /** * This determines how Smarty handles "<?php ... ?>" tags in templates. * possible values: @@ -20,210 +21,391 @@ class Smarty_Security { * <li>Smarty::PHP_REMOVE -> remove php tags</li> * <li>Smarty::PHP_ALLOW -> execute php tags</li> * </ul> - * - * @var integer + * + * @var integer */ public $php_handling = Smarty::PHP_PASSTHRU; - /** * This is the list of template directories that are considered secure. * $template_dir is in this list implicitly. - * - * @var array + * + * @var array */ public $secure_dir = array(); - - /** * This is an array of directories where trusted php scripts reside. * {@link $security} is disabled during their inclusion/execution. - * - * @var array + * + * @var array */ public $trusted_dir = 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. - * @var array + * @var array */ public $static_classes = array(); - /** * This is an array of trusted PHP functions. * * If empty all functions are allowed. * To disable all PHP functions set $php_functions = null. - * @var array + * @var array */ - public $php_functions = array('isset', 'empty', - 'count', 'sizeof','in_array', 'is_array','time','nl2br'); - + public $php_functions = array( + 'isset', 'empty', + 'count', 'sizeof', + 'in_array', 'is_array', + 'time', + 'nl2br', + ); /** * This is an array of trusted PHP modifers. * * If empty all modifiers are allowed. * To disable all modifier set $modifiers = null. - * @var array + * @var array */ - public $php_modifiers = array('escape','count'); - + public $php_modifiers = array( + 'escape', + 'count' + ); + /** + * This is an array of allowed tags. + * + * If empty no restriction by allowed_tags. + * @var array + */ + public $allowed_tags = array(); + /** + * This is an array of disabled tags. + * + * If empty no restriction by disabled_tags. + * @var array + */ + public $disabled_tags = array(); + /** + * This is an array of allowed modifier plugins. + * + * If empty no restriction by allowed_modifiers. + * @var array + */ + public $allowed_modifiers = array(); + /** + * This is an array of disabled modifier plugins. + * + * If empty no restriction by disabled_modifiers. + * @var array + */ + public $disabled_modifiers = array(); /** * This is an array of trusted streams. * * If empty all streams are allowed. * To disable all streams set $streams = null. - * @var array + * @var array */ public $streams = array('file'); /** * + flag if constants can be accessed from template + * @var boolean */ public $allow_constants = true; /** * + flag if super globals can be accessed from template + * @var boolean */ public $allow_super_globals = true; + /** - * + flag if the {php} and {include_php} tag can be executed + * @param Smarty $smarty */ - public $allow_php_tag = false; - public function __construct($smarty) { - $this->smarty = $smarty; - } + $this->smarty = $smarty; + } + + /** + * @var string + */ + protected $_resource_dir = null; + /** + * @var string + */ + protected $_template_dir = null; + /** + * @var string + */ + protected $_config_dir = null; + /** + * @var string + */ + protected $_secure_dir = null; + /** + * @var string + */ + protected $_php_resource_dir = null; + /** + * @var string + */ + protected $_trusted_dir = null; + /** * Check if PHP function is trusted. - * - * @param string $function_name + * + * @param string $function_name * @param object $compiler compiler object * @return boolean true if function is trusted + * @throws SmartyCompilerException if php function is not trusted */ - function isTrustedPhpFunction($function_name, $compiler) + public function isTrustedPhpFunction($function_name, $compiler) { if (isset($this->php_functions) && (empty($this->php_functions) || in_array($function_name, $this->php_functions))) { return true; - } else { - $compiler->trigger_template_error ("PHP function '{$function_name}' not allowed by security setting"); - return false; - } - } + } + + $compiler->trigger_template_error("PHP function '{$function_name}' not allowed by security setting"); + return false; // should not, but who knows what happens to the compiler in the future? + } /** * Check if static class is trusted. - * - * @param string $class_name + * + * @param string $class_name * @param object $compiler compiler object * @return boolean true if class is trusted + * @throws SmartyCompilerException if static class is not trusted */ - function isTrustedStaticClass($class_name, $compiler) + public function isTrustedStaticClass($class_name, $compiler) { if (isset($this->static_classes) && (empty($this->static_classes) || in_array($class_name, $this->static_classes))) { return true; - } else { - $compiler->trigger_template_error ("access to static class '{$class_name}' not allowed by security setting"); - return false; - } - } + } + + $compiler->trigger_template_error("access to static class '{$class_name}' not allowed by security setting"); + return false; // should not, but who knows what happens to the compiler in the future? + } + /** - * Check if modifier is trusted. - * - * @param string $modifier_name + * Check if PHP modifier is trusted. + * + * @param string $modifier_name * @param object $compiler compiler object * @return boolean true if modifier is trusted + * @throws SmartyCompilerException if modifier is not trusted */ - function isTrustedModifier($modifier_name, $compiler) + public function isTrustedPhpModifier($modifier_name, $compiler) { if (isset($this->php_modifiers) && (empty($this->php_modifiers) || in_array($modifier_name, $this->php_modifiers))) { return true; + } + + $compiler->trigger_template_error("modifier '{$modifier_name}' not allowed by security setting"); + return false; // should not, but who knows what happens to the compiler in the future? + } + + /** + * Check if tag is trusted. + * + * @param string $tag_name + * @param object $compiler compiler object + * @return boolean true if tag is trusted + * @throws SmartyCompilerException if modifier is not trusted + */ + public function isTrustedTag($tag_name, $compiler) + { + // check for internal always required tags + if (in_array($tag_name, array('assign', 'call', 'private_filter', 'private_block_plugin', 'private_function_plugin', 'private_object_block_function', + 'private_object_function', 'private_registered_function', 'private_registered_block', 'private_special_variable', 'private_print_expression', 'private_modifier'))) { + return true; + } + // check security settings + if (empty($this->allowed_tags)) { + if (empty($this->disabled_tags) || !in_array($tag_name, $this->disabled_tags)) { + return true; + } else { + $compiler->trigger_template_error("tag '{$tag_name}' disabled by security setting", $compiler->lex->taglineno); + } + } else if (in_array($tag_name, $this->allowed_tags) && !in_array($tag_name, $this->disabled_tags)) { + return true; } else { - $compiler->trigger_template_error ("modifier '{$modifier_name}' not allowed by security setting"); - return false; - } - } + $compiler->trigger_template_error("tag '{$tag_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 stream is trusted. - * - * @param string $stream_name + * Check if modifier plugin is trusted. + * + * @param string $modifier_name * @param object $compiler compiler object + * @return boolean true if tag is trusted + * @throws SmartyCompilerException if modifier is not trusted + */ + public function isTrustedModifier($modifier_name, $compiler) + { + // check for internal always allowed modifier + if (in_array($modifier_name, array('default'))) { + return true; + } + // check security settings + if (empty($this->allowed_modifiers)) { + if (empty($this->disabled_modifiers) || !in_array($modifier_name, $this->disabled_modifiers)) { + return true; + } else { + $compiler->trigger_template_error("modifier '{$modifier_name}' disabled by security setting", $compiler->lex->taglineno); + } + } else if (in_array($modifier_name, $this->allowed_modifiers) && !in_array($modifier_name, $this->disabled_modifiers)) { + return true; + } else { + $compiler->trigger_template_error("modifier '{$modifier_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 stream is trusted. + * + * @param string $stream_name * @return boolean true if stream is trusted + * @throws SmartyException if stream is not trusted */ - function isTrustedStream($stream_name) + public function isTrustedStream($stream_name) { if (isset($this->streams) && (empty($this->streams) || in_array($stream_name, $this->streams))) { return true; - } else { - throw new SmartyException ("stream '{$stream_name}' not allowed by security setting"); - return false; - } - } + } + + throw new SmartyException("stream '{$stream_name}' not allowed by security setting"); + } /** * Check if directory of file resource is trusted. - * - * @param string $filepath - * @param object $compiler compiler object + * + * @param string $filepath * @return boolean true if directory is trusted + * @throws SmartyException if directory is not trusted */ - function isTrustedResourceDir($filepath) + public function isTrustedResourceDir($filepath) { - $_rp = realpath($filepath); - if (isset($this->smarty->template_dir)) { - foreach ((array)$this->smarty->template_dir as $curr_dir) { - if (($_cd = realpath($curr_dir)) !== false && - strncmp($_rp, $_cd, strlen($_cd)) == 0 && - (strlen($_rp) == strlen($_cd) || substr($_rp, strlen($_cd), 1) == DS)) { - return true; - } - } - } - if (!empty($this->smarty->security_policy->secure_dir)) { - foreach ((array)$this->smarty->security_policy->secure_dir as $curr_dir) { - if (($_cd = realpath($curr_dir)) !== false) { - if ($_cd == $_rp) { - return true; - } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 && - (strlen($_rp) == strlen($_cd) || substr($_rp, strlen($_cd), 1) == DS)) { - return true; - } - } - } - } + $_template = false; + $_config = false; + $_secure = false; + + $_template_dir = $this->smarty->getTemplateDir(); + $_config_dir = $this->smarty->getConfigDir(); + + // check if index is outdated + if ((!$this->_template_dir || $this->_template_dir !== $_template_dir) + || (!$this->_config_dir || $this->_config_dir !== $_config_dir) + || (!empty($this->secure_dir) && (!$this->_secure_dir || $this->_secure_dir !== $this->secure_dir)) + ) { + $this->_resource_dir = array(); + $_template = true; + $_config = true; + $_secure = !empty($this->secure_dir); + } + + // rebuild template dir index + if ($_template) { + $this->_template_dir = $_template_dir; + foreach ($_template_dir as $directory) { + $directory = realpath($directory); + $this->_resource_dir[$directory] = true; + } + } + + // rebuild config dir index + if ($_config) { + $this->_config_dir = $_config_dir; + foreach ($_config_dir as $directory) { + $directory = realpath($directory); + $this->_resource_dir[$directory] = true; + } + } + + // rebuild secure dir index + if ($_secure) { + $this->_secure_dir = $this->secure_dir; + foreach ((array) $this->secure_dir as $directory) { + $directory = realpath($directory); + $this->_resource_dir[$directory] = true; + } + } + + $_filepath = realpath($filepath); + $directory = dirname($_filepath); + $_directory = array(); + while (true) { + // remember the directory to add it to _resource_dir in case we're successful + $_directory[] = $directory; + // test if the directory is trusted + if (isset($this->_resource_dir[$directory])) { + // merge sub directories of current $directory into _resource_dir to speed up subsequent lookups + $this->_resource_dir = array_merge($this->_resource_dir, $_directory); + return true; + } + // abort if we've reached root + if (($pos = strrpos($directory, DS)) === false || strlen($directory) < 2) { + break; + } + // bubble up one level + $directory = substr($directory, 0, $pos); + } + + // give up + throw new SmartyException("directory '{$_filepath}' not allowed by security setting"); + } - throw new SmartyException ("directory '{$_rp}' not allowed by security setting"); - return false; - } - /** * Check if directory of file resource is trusted. - * - * @param string $filepath - * @param object $compiler compiler object + * + * @param string $filepath * @return boolean true if directory is trusted + * @throws SmartyException if PHP directory is not trusted */ - function isTrustedPHPDir($filepath) + public function isTrustedPHPDir($filepath) { - $_rp = realpath($filepath); - if (!empty($this->trusted_dir)) { - foreach ((array)$this->trusted_dir as $curr_dir) { - if (($_cd = realpath($curr_dir)) !== false) { - if ($_cd == $_rp) { - return true; - } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 && - substr($_rp, strlen($_cd), 1) == DS) { - return true; - } - } - } - } + if (empty($this->trusted_dir)) { + throw new SmartyException("directory '{$filepath}' not allowed by security setting (no trusted_dir specified)"); + } + + // check if index is outdated + if (!$this->_trusted_dir || $this->_trusted_dir !== $this->trusted_dir) { + $this->_php_resource_dir = array(); + + $this->_trusted_dir = $this->trusted_dir; + foreach ((array) $this->trusted_dir as $directory) { + $directory = realpath($directory); + $this->_php_resource_dir[$directory] = true; + } + } + + $_filepath = realpath($filepath); + $directory = dirname($_filepath); + $_directory = array(); + while (true) { + // remember the directory to add it to _resource_dir in case we're successful + $_directory[] = $directory; + // test if the directory is trusted + if (isset($this->_php_resource_dir[$directory])) { + // merge sub directories of current $directory into _resource_dir to speed up subsequent lookups + $this->_php_resource_dir = array_merge($this->_php_resource_dir, $_directory); + return true; + } + // abort if we've reached root + if (($pos = strrpos($directory, DS)) === false || strlen($directory) < 2) { + break; + } + // bubble up one level + $directory = substr($directory, 0, $pos); + } + + throw new SmartyException("directory '{$_filepath}' not allowed by security setting"); + } - throw new SmartyException ("directory '{$_rp}' not allowed by security setting"); - return false; - } -} +} ?>
\ No newline at end of file |
