add smarty engine, remove some obsolete zot1 stuff
This commit is contained in:
		
							
								
								
									
										165
									
								
								library/Smarty/COPYING.lib
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								library/Smarty/COPYING.lib
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,165 @@ | ||||
|                    GNU LESSER GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 29 June 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|  | ||||
|   This version of the GNU Lesser General Public License incorporates | ||||
| the terms and conditions of version 3 of the GNU General Public | ||||
| License, supplemented by the additional permissions listed below. | ||||
|  | ||||
|   0. Additional Definitions. | ||||
|  | ||||
|   As used herein, "this License" refers to version 3 of the GNU Lesser | ||||
| General Public License, and the "GNU GPL" refers to version 3 of the GNU | ||||
| General Public License. | ||||
|  | ||||
|   "The Library" refers to a covered work governed by this License, | ||||
| other than an Application or a Combined Work as defined below. | ||||
|  | ||||
|   An "Application" is any work that makes use of an interface provided | ||||
| by the Library, but which is not otherwise based on the Library. | ||||
| Defining a subclass of a class defined by the Library is deemed a mode | ||||
| of using an interface provided by the Library. | ||||
|  | ||||
|   A "Combined Work" is a work produced by combining or linking an | ||||
| Application with the Library.  The particular version of the Library | ||||
| with which the Combined Work was made is also called the "Linked | ||||
| Version". | ||||
|  | ||||
|   The "Minimal Corresponding Source" for a Combined Work means the | ||||
| Corresponding Source for the Combined Work, excluding any source code | ||||
| for portions of the Combined Work that, considered in isolation, are | ||||
| based on the Application, and not on the Linked Version. | ||||
|  | ||||
|   The "Corresponding Application Code" for a Combined Work means the | ||||
| object code and/or source code for the Application, including any data | ||||
| and utility programs needed for reproducing the Combined Work from the | ||||
| Application, but excluding the System Libraries of the Combined Work. | ||||
|  | ||||
|   1. Exception to Section 3 of the GNU GPL. | ||||
|  | ||||
|   You may convey a covered work under sections 3 and 4 of this License | ||||
| without being bound by section 3 of the GNU GPL. | ||||
|  | ||||
|   2. Conveying Modified Versions. | ||||
|  | ||||
|   If you modify a copy of the Library, and, in your modifications, a | ||||
| facility refers to a function or data to be supplied by an Application | ||||
| that uses the facility (other than as an argument passed when the | ||||
| facility is invoked), then you may convey a copy of the modified | ||||
| version: | ||||
|  | ||||
|    a) under this License, provided that you make a good faith effort to | ||||
|    ensure that, in the event an Application does not supply the | ||||
|    function or data, the facility still operates, and performs | ||||
|    whatever part of its purpose remains meaningful, or | ||||
|  | ||||
|    b) under the GNU GPL, with none of the additional permissions of | ||||
|    this License applicable to that copy. | ||||
|  | ||||
|   3. Object Code Incorporating Material from Library Header Files. | ||||
|  | ||||
|   The object code form of an Application may incorporate material from | ||||
| a header file that is part of the Library.  You may convey such object | ||||
| code under terms of your choice, provided that, if the incorporated | ||||
| material is not limited to numerical parameters, data structure | ||||
| layouts and accessors, or small macros, inline functions and templates | ||||
| (ten or fewer lines in length), you do both of the following: | ||||
|  | ||||
|    a) Give prominent notice with each copy of the object code that the | ||||
|    Library is used in it and that the Library and its use are | ||||
|    covered by this License. | ||||
|  | ||||
|    b) Accompany the object code with a copy of the GNU GPL and this license | ||||
|    document. | ||||
|  | ||||
|   4. Combined Works. | ||||
|  | ||||
|   You may convey a Combined Work under terms of your choice that, | ||||
| taken together, effectively do not restrict modification of the | ||||
| portions of the Library contained in the Combined Work and reverse | ||||
| engineering for debugging such modifications, if you also do each of | ||||
| the following: | ||||
|  | ||||
|    a) Give prominent notice with each copy of the Combined Work that | ||||
|    the Library is used in it and that the Library and its use are | ||||
|    covered by this License. | ||||
|  | ||||
|    b) Accompany the Combined Work with a copy of the GNU GPL and this license | ||||
|    document. | ||||
|  | ||||
|    c) For a Combined Work that displays copyright notices during | ||||
|    execution, include the copyright notice for the Library among | ||||
|    these notices, as well as a reference directing the user to the | ||||
|    copies of the GNU GPL and this license document. | ||||
|  | ||||
|    d) Do one of the following: | ||||
|  | ||||
|        0) Convey the Minimal Corresponding Source under the terms of this | ||||
|        License, and the Corresponding Application Code in a form | ||||
|        suitable for, and under terms that permit, the user to | ||||
|        recombine or relink the Application with a modified version of | ||||
|        the Linked Version to produce a modified Combined Work, in the | ||||
|        manner specified by section 6 of the GNU GPL for conveying | ||||
|        Corresponding Source. | ||||
|  | ||||
|        1) Use a suitable shared library mechanism for linking with the | ||||
|        Library.  A suitable mechanism is one that (a) uses at run time | ||||
|        a copy of the Library already present on the user's computer | ||||
|        system, and (b) will operate properly with a modified version | ||||
|        of the Library that is interface-compatible with the Linked | ||||
|        Version. | ||||
|  | ||||
|    e) Provide Installation Information, but only if you would otherwise | ||||
|    be required to provide such information under section 6 of the | ||||
|    GNU GPL, and only to the extent that such information is | ||||
|    necessary to install and execute a modified version of the | ||||
|    Combined Work produced by recombining or relinking the | ||||
|    Application with a modified version of the Linked Version. (If | ||||
|    you use option 4d0, the Installation Information must accompany | ||||
|    the Minimal Corresponding Source and Corresponding Application | ||||
|    Code. If you use option 4d1, you must provide the Installation | ||||
|    Information in the manner specified by section 6 of the GNU GPL | ||||
|    for conveying Corresponding Source.) | ||||
|  | ||||
|   5. Combined Libraries. | ||||
|  | ||||
|   You may place library facilities that are a work based on the | ||||
| Library side by side in a single library together with other library | ||||
| facilities that are not Applications and are not covered by this | ||||
| License, and convey such a combined library under terms of your | ||||
| choice, if you do both of the following: | ||||
|  | ||||
|    a) Accompany the combined library with a copy of the same work based | ||||
|    on the Library, uncombined with any other library facilities, | ||||
|    conveyed under the terms of this License. | ||||
|  | ||||
|    b) Give prominent notice with the combined library that part of it | ||||
|    is a work based on the Library, and explaining where to find the | ||||
|    accompanying uncombined form of the same work. | ||||
|  | ||||
|   6. Revised Versions of the GNU Lesser General Public License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions | ||||
| of the GNU Lesser General Public License from time to time. Such new | ||||
| versions will be similar in spirit to the present version, but may | ||||
| differ in detail to address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number. If the | ||||
| Library as you received it specifies that a certain numbered version | ||||
| of the GNU Lesser General Public License "or any later version" | ||||
| applies to it, you have the option of following the terms and | ||||
| conditions either of that published version or of any later version | ||||
| published by the Free Software Foundation. If the Library as you | ||||
| received it does not specify a version number of the GNU Lesser | ||||
| General Public License, you may choose any version of the GNU Lesser | ||||
| General Public License ever published by the Free Software Foundation. | ||||
|  | ||||
|   If the Library as you received it specifies that a proxy can decide | ||||
| whether future versions of the GNU Lesser General Public License shall | ||||
| apply, that proxy's public statement of acceptance of any version is | ||||
| permanent authorization for you to choose that version for the | ||||
| Library. | ||||
							
								
								
									
										574
									
								
								library/Smarty/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										574
									
								
								library/Smarty/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,574 @@ | ||||
| Smarty 3.1.11 | ||||
|  | ||||
| Author: Monte Ohrt <monte at ohrt dot com > | ||||
| Author: Uwe Tews | ||||
|  | ||||
| AN INTRODUCTION TO SMARTY 3 | ||||
|  | ||||
| NOTICE FOR 3.1 release: | ||||
|  | ||||
| Please see the SMARTY_3.1_NOTES.txt file that comes with the distribution. | ||||
|  | ||||
| NOTICE for 3.0.5 release: | ||||
|  | ||||
| Smarty now follows the PHP error_reporting level by default. If PHP does not mask E_NOTICE and you try to access an unset template variable, you will now get an E_NOTICE warning. To revert to the old behavior: | ||||
|  | ||||
| $smarty->error_reporting = E_ALL & ~E_NOTICE; | ||||
|  | ||||
| NOTICE for 3.0 release: | ||||
|  | ||||
| IMPORTANT: Some API adjustments have been made between the RC4 and 3.0 release. | ||||
| We felt it is better to make these now instead of after a 3.0 release, then have to | ||||
| immediately deprecate APIs in 3.1. Online documentation has been updated | ||||
| to reflect these changes. Specifically: | ||||
|  | ||||
| ---- API CHANGES RC4 -> 3.0 ---- | ||||
|  | ||||
| $smarty->register->* | ||||
| $smarty->unregister->* | ||||
| $smarty->utility->* | ||||
| $samrty->cache->* | ||||
|  | ||||
| Have all been changed to local method calls such as: | ||||
|  | ||||
| $smarty->clearAllCache() | ||||
| $smarty->registerFoo() | ||||
| $smarty->unregisterFoo() | ||||
| $smarty->testInstall() | ||||
| etc. | ||||
|  | ||||
| Registration of function, block, compiler, and modifier plugins have been | ||||
| consolidated under two API calls: | ||||
|  | ||||
| $smarty->registerPlugin(...) | ||||
| $smarty->unregisterPlugin(...) | ||||
|  | ||||
| Registration of pre, post, output and variable filters have been | ||||
| consolidated under two API calls: | ||||
|  | ||||
| $smarty->registerFilter(...) | ||||
| $smarty->unregisterFilter(...) | ||||
|  | ||||
| Please refer to the online documentation for all specific changes: | ||||
|  | ||||
| http://www.smarty.net/documentation | ||||
|  | ||||
| ---- | ||||
|  | ||||
| The Smarty 3 API has been refactored to a syntax geared | ||||
| for consistency and modularity. The Smarty 2 API syntax is still supported, but | ||||
| will throw a deprecation notice. You can disable the notices, but it is highly | ||||
| recommended to adjust your syntax to Smarty 3, as the Smarty 2 syntax must run | ||||
| through an extra rerouting wrapper. | ||||
|  | ||||
| Basically, all Smarty methods now follow the "fooBarBaz" camel case syntax. Also, | ||||
| all Smarty properties now have getters and setters. So for example, the property | ||||
| $smarty->cache_dir can be set with $smarty->setCacheDir('foo/') and can be | ||||
| retrieved with $smarty->getCacheDir(). | ||||
|  | ||||
| Some of the Smarty 3 APIs have been revoked such as the "is*" methods that were | ||||
| just duplicate functions of the now available "get*" methods. | ||||
|  | ||||
| Here is a rundown of the Smarty 3 API: | ||||
|  | ||||
| $smarty->fetch($template, $cache_id = null, $compile_id = null, $parent = null) | ||||
| $smarty->display($template, $cache_id = null, $compile_id = null, $parent = null) | ||||
| $smarty->isCached($template, $cache_id = null, $compile_id = null) | ||||
| $smarty->createData($parent = null) | ||||
| $smarty->createTemplate($template, $cache_id = null, $compile_id = null, $parent = null) | ||||
| $smarty->enableSecurity() | ||||
| $smarty->disableSecurity() | ||||
| $smarty->setTemplateDir($template_dir) | ||||
| $smarty->addTemplateDir($template_dir) | ||||
| $smarty->templateExists($resource_name) | ||||
| $smarty->loadPlugin($plugin_name, $check = true) | ||||
| $smarty->loadFilter($type, $name) | ||||
| $smarty->setExceptionHandler($handler) | ||||
| $smarty->addPluginsDir($plugins_dir) | ||||
| $smarty->getGlobal($varname = null) | ||||
| $smarty->getRegisteredObject($name) | ||||
| $smarty->getDebugTemplate() | ||||
| $smarty->setDebugTemplate($tpl_name) | ||||
| $smarty->assign($tpl_var, $value = null, $nocache = false) | ||||
| $smarty->assignGlobal($varname, $value = null, $nocache = false) | ||||
| $smarty->assignByRef($tpl_var, &$value, $nocache = false) | ||||
| $smarty->append($tpl_var, $value = null, $merge = false, $nocache = false) | ||||
| $smarty->appendByRef($tpl_var, &$value, $merge = false) | ||||
| $smarty->clearAssign($tpl_var) | ||||
| $smarty->clearAllAssign() | ||||
| $smarty->configLoad($config_file, $sections = null) | ||||
| $smarty->getVariable($variable, $_ptr = null, $search_parents = true, $error_enable = true) | ||||
| $smarty->getConfigVariable($variable) | ||||
| $smarty->getStreamVariable($variable) | ||||
| $smarty->getConfigVars($varname = null) | ||||
| $smarty->clearConfig($varname = null) | ||||
| $smarty->getTemplateVars($varname = null, $_ptr = null, $search_parents = true) | ||||
| $smarty->clearAllCache($exp_time = null, $type = null) | ||||
| $smarty->clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null) | ||||
|  | ||||
| $smarty->registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = array()) | ||||
|  | ||||
| $smarty->registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) | ||||
|  | ||||
| $smarty->registerFilter($type, $function_name) | ||||
| $smarty->registerResource($resource_type, $function_names) | ||||
| $smarty->registerDefaultPluginHandler($function_name) | ||||
| $smarty->registerDefaultTemplateHandler($function_name) | ||||
|  | ||||
| $smarty->unregisterPlugin($type, $tag) | ||||
| $smarty->unregisterObject($object_name) | ||||
| $smarty->unregisterFilter($type, $function_name) | ||||
| $smarty->unregisterResource($resource_type) | ||||
|  | ||||
| $smarty->compileAllTemplates($extention = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null) | ||||
| $smarty->clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) | ||||
| $smarty->testInstall() | ||||
|  | ||||
| // then all the getters/setters, available for all properties. Here are a few: | ||||
|  | ||||
| $caching = $smarty->getCaching();      // get $smarty->caching | ||||
| $smarty->setCaching(true);             // set $smarty->caching | ||||
| $smarty->setDeprecationNotices(false); // set $smarty->deprecation_notices | ||||
| $smarty->setCacheId($id);              // set $smarty->cache_id | ||||
| $debugging = $smarty->getDebugging();  // get $smarty->debugging | ||||
|  | ||||
|  | ||||
| FILE STRUCTURE | ||||
|  | ||||
| The Smarty 3 file structure is similar to Smarty 2: | ||||
|  | ||||
| /libs/ | ||||
|   Smarty.class.php | ||||
| /libs/sysplugins/ | ||||
|   internal.* | ||||
| /libs/plugins/ | ||||
|   function.mailto.php | ||||
|   modifier.escape.php | ||||
|   ... | ||||
|  | ||||
| A lot of Smarty 3 core functionality lies in the sysplugins directory; you do | ||||
| not need to change any files here. The /libs/plugins/ folder is where Smarty | ||||
| plugins are located. You can add your own here, or create a separate plugin | ||||
| directory, just the same as Smarty 2. You will still need to create your own | ||||
| /cache/, /templates/, /templates_c/, /configs/ folders. Be sure /cache/ and | ||||
| /templates_c/ are writable. | ||||
|  | ||||
| The typical way to use Smarty 3 should also look familiar: | ||||
|  | ||||
| require('Smarty.class.php'); | ||||
| $smarty = new Smarty; | ||||
| $smarty->assign('foo','bar'); | ||||
| $smarty->display('index.tpl'); | ||||
|  | ||||
|  | ||||
| However, Smarty 3 works completely different on the inside. Smarty 3 is mostly | ||||
| backward compatible with Smarty 2, except for the following items: | ||||
|  | ||||
| *) Smarty 3 is PHP 5 only. It will not work with PHP 4. | ||||
| *) The {php} tag is disabled by default. Enable with $smarty->allow_php_tag=true. | ||||
| *) Delimiters surrounded by whitespace are no longer treated as Smarty tags. | ||||
|    Therefore, { foo } will not compile as a tag, you must use {foo}. This change | ||||
|    Makes Javascript/CSS easier to work with, eliminating the need for {literal}. | ||||
|    This can be disabled by setting $smarty->auto_literal = false; | ||||
| *) The Smarty 3 API is a bit different. Many Smarty 2 API calls are deprecated | ||||
|    but still work. You will want to update your calls to Smarty 3 for maximum | ||||
|    efficiency. | ||||
|  | ||||
|  | ||||
| There are many things that are new to Smarty 3. Here are the notable items: | ||||
|     | ||||
| LEXER/PARSER | ||||
| ============ | ||||
|  | ||||
| Smarty 3 now uses a lexing tokenizer for its parser/compiler. Basically, this | ||||
| means Smarty has some syntax additions that make life easier such as in-template | ||||
| math, shorter/intuitive function parameter options, infinite function recursion, | ||||
| more accurate error handling, etc. | ||||
|  | ||||
|  | ||||
| WHAT IS NEW IN SMARTY TEMPLATE SYNTAX | ||||
| ===================================== | ||||
|  | ||||
| Smarty 3 allows expressions almost anywhere. Expressions can include PHP | ||||
| functions as long as they are not disabled by the security policy, object | ||||
| methods and properties, etc. The {math} plugin is no longer necessary but | ||||
| is still supported for BC. | ||||
|  | ||||
| Examples: | ||||
| {$x+$y}                           will output the sum of x and y. | ||||
| {$foo = strlen($bar)}             function in assignment | ||||
| {assign var=foo value= $x+$y}     in attributes  | ||||
| {$foo = myfunct( ($x+$y)*3 )}     as function parameter  | ||||
| {$foo[$x+3]}                      as array index | ||||
|  | ||||
| Smarty tags can be used as values within other tags. | ||||
| Example:  {$foo={counter}+3} | ||||
|  | ||||
| Smarty tags can also be used inside double quoted strings. | ||||
| Example:  {$foo="this is message {counter}"} | ||||
|  | ||||
| You can define arrays within templates. | ||||
| Examples: | ||||
| {assign var=foo value=[1,2,3]} | ||||
| {assign var=foo value=['y'=>'yellow','b'=>'blue']} | ||||
| Arrays can be nested. | ||||
| {assign var=foo value=[1,[9,8],3]} | ||||
|  | ||||
| There is a new short syntax supported for assigning variables. | ||||
| Example: {$foo=$bar+2} | ||||
|  | ||||
| You can assign a value to a specific array element. If the variable exists but | ||||
| is not an array, it is converted to an array before the new values are assigned. | ||||
| Examples: | ||||
| {$foo['bar']=1} | ||||
| {$foo['bar']['blar']=1} | ||||
|  | ||||
| You can append values to an array. If the variable exists but is not an array, | ||||
| it is converted to an array before the new values are assigned. | ||||
| Example: {$foo[]=1} | ||||
|  | ||||
| You can use a PHP-like syntax for accessing array elements, as well as the | ||||
| original "dot" notation. | ||||
| Examples: | ||||
| {$foo[1]}             normal access | ||||
| {$foo['bar']} | ||||
| {$foo['bar'][1]} | ||||
| {$foo[$x+$x]}         index may contain any expression | ||||
| {$foo[$bar[1]]}       nested index | ||||
| {$foo[section_name]}  smarty section access, not array access! | ||||
|  | ||||
| The original "dot" notation stays, and with improvements. | ||||
| Examples: | ||||
| {$foo.a.b.c}        =>  $foo['a']['b']['c']  | ||||
| {$foo.a.$b.c}       =>  $foo['a'][$b]['c']        with variable index | ||||
| {$foo.a.{$b+4}.c}   =>  $foo['a'][$b+4]['c']       with expression as index | ||||
| {$foo.a.{$b.c}}     =>  $foo['a'][$b['c']]         with nested index | ||||
|  | ||||
| note that { and } are used to address ambiguties when nesting the dot syntax.  | ||||
|  | ||||
| Variable names themselves can be variable and contain expressions. | ||||
| Examples: | ||||
| $foo         normal variable | ||||
| $foo_{$bar}  variable name containing other variable  | ||||
| $foo_{$x+$y} variable name containing expressions  | ||||
| $foo_{$bar}_buh_{$blar}  variable name with multiple segments | ||||
| {$foo_{$x}}  will output the variable $foo_1 if $x has a value of 1. | ||||
|  | ||||
| Object method chaining is implemented. | ||||
| Example: {$object->method1($x)->method2($y)} | ||||
|  | ||||
| {for} tag added for looping (replacement for {section} tag): | ||||
| {for $x=0, $y=count($foo); $x<$y; $x++}  ....  {/for} | ||||
| Any number of statements can be used separated by comma as the first | ||||
| inital expression at {for}. | ||||
|  | ||||
| {for $x = $start to $end step $step} ... {/for}is in the SVN now . | ||||
| You can use also | ||||
| {for $x = $start to $end} ... {/for} | ||||
| In this case the step value will be automaticall 1 or -1 depending on the start and end values. | ||||
| Instead of $start and $end you can use any valid expression. | ||||
| Inside the loop the following special vars can be accessed: | ||||
| $x@iteration = number of iteration | ||||
| $x@total = total number of iterations | ||||
| $x@first = true on first iteration | ||||
| $x@last = true on last iteration | ||||
|  | ||||
|  | ||||
| The Smarty 2 {section} syntax is still supported. | ||||
|  | ||||
| New shorter {foreach} syntax to loop over an array. | ||||
| Example: {foreach $myarray as $var}...{/foreach} | ||||
|  | ||||
| Within the foreach loop, properties are access via: | ||||
|  | ||||
| $var@key            foreach $var array key | ||||
| $var@iteration      foreach current iteration count (1,2,3...) | ||||
| $var@index          foreach current index count (0,1,2...) | ||||
| $var@total          foreach $var array total | ||||
| $var@first          true on first iteration | ||||
| $var@last           true on last iteration | ||||
|  | ||||
| The Smarty 2 {foreach} tag syntax is still supported. | ||||
|  | ||||
| NOTE: {$bar[foo]} still indicates a variable inside of a {section} named foo.  | ||||
| If you want to access an array element with index foo, you must use quotes | ||||
| such as {$bar['foo']}, or use the dot syntax {$bar.foo}. | ||||
|  | ||||
| while block tag is now implemented: | ||||
| {while $foo}...{/while} | ||||
| {while $x lt 10}...{/while} | ||||
|  | ||||
| Direct access to PHP functions: | ||||
| Just as you can use PHP functions as modifiers directly, you can now access | ||||
| PHP functions directly, provided they are permitted by security settings: | ||||
| {time()} | ||||
|  | ||||
| There is a new {function}...{/function} block tag to implement a template function. | ||||
| This enables reuse of code sequences like a plugin function. It can call itself recursively. | ||||
| Template function must be called with the new {call name=foo...} tag. | ||||
|  | ||||
| Example: | ||||
|  | ||||
| Template file: | ||||
| {function name=menu level=0} | ||||
|   <ul class="level{$level}"> | ||||
|   {foreach $data as $entry} | ||||
|     {if is_array($entry)} | ||||
|       <li>{$entry@key}</li> | ||||
|        {call name=menu data=$entry level=$level+1} | ||||
|     {else} | ||||
|       <li>{$entry}</li> | ||||
|     {/if} | ||||
|   {/foreach} | ||||
|   </ul> | ||||
| {/function} | ||||
|  | ||||
| {$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' => | ||||
|   ['item3-3-1','item3-3-2']],'item4']} | ||||
|  | ||||
| {call name=menu data=$menu} | ||||
|  | ||||
|  | ||||
| Generated output: | ||||
|     * item1 | ||||
|     * item2 | ||||
|     * item3 | ||||
|           o item3-1 | ||||
|           o item3-2 | ||||
|           o item3-3 | ||||
|                 + item3-3-1 | ||||
|                 + item3-3-2 | ||||
|     * item4 | ||||
|  | ||||
| The function tag itself must have the "name" attribute. This name is the tag | ||||
| name when calling the function. The function tag may have any number of | ||||
| additional attributes. These will be default settings for local variables. | ||||
|  | ||||
| New {nocache} block function: | ||||
| {nocache}...{/nocache} will declare a section of the template to be non-cached | ||||
| when template caching is enabled. | ||||
|  | ||||
| New nocache attribute: | ||||
| You can declare variable/function output as non-cached with the nocache attribute. | ||||
| Examples: | ||||
|  | ||||
| {$foo nocache=true} | ||||
| {$foo nocache} /* same */ | ||||
|  | ||||
| {foo bar="baz" nocache=true} | ||||
| {foo bar="baz" nocache} /* same */ | ||||
|  | ||||
| {time() nocache=true} | ||||
| {time() nocache} /* same */ | ||||
|  | ||||
| Or you can also assign the variable in your script as nocache: | ||||
| $smarty->assign('foo',$something,true); // third param is nocache setting | ||||
| {$foo} /* non-cached */ | ||||
|  | ||||
| $smarty.current_dir returns the directory name of the current template. | ||||
|  | ||||
| You can use strings directly as templates with the "string" resource type. | ||||
| Examples: | ||||
| $smarty->display('string:This is my template, {$foo}!'); // php | ||||
| {include file="string:This is my template, {$foo}!"} // template | ||||
|  | ||||
|  | ||||
|  | ||||
| VARIABLE SCOPE / VARIABLE STORAGE | ||||
| ================================= | ||||
|  | ||||
| In Smarty 2, all assigned variables were stored within the Smarty object.  | ||||
| Therefore, all variables assigned in PHP were accessible by all subsequent  | ||||
| fetch and display template calls. | ||||
|  | ||||
| In Smarty 3, we have the choice to assign variables to the main Smarty object,  | ||||
| to user-created data objects, and to user-created template objects.  | ||||
| These objects can be chained. The object at the end of a chain can access all | ||||
| variables belonging to that template and all variables within the parent objects. | ||||
| The Smarty object can only be the root of a chain, but a chain can be isolated | ||||
| from the Smarty object. | ||||
|  | ||||
| All known Smarty assignment interfaces will work on the data and template objects. | ||||
|  | ||||
| Besides the above mentioned objects, there is also a special storage area for | ||||
| global variables. | ||||
|  | ||||
| A Smarty data object can be created as follows: | ||||
| $data = $smarty->createData();    // create root data object | ||||
| $data->assign('foo','bar');       // assign variables as usual | ||||
| $data->config_load('my.conf');									 // load config file     | ||||
|  | ||||
| $data= $smarty->createData($smarty);  // create data object having a parent link to | ||||
| the Smarty object | ||||
|  | ||||
| $data2= $smarty->createData($data);   // create data object having a parent link to | ||||
| the $data data object | ||||
|  | ||||
| A template object can be created by using the createTemplate method. It has the | ||||
| same parameter assignments as the fetch() or display() method. | ||||
| Function definition: | ||||
| function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null) | ||||
|  | ||||
| The first parameter can be a template name, a smarty object or a data object. | ||||
|  | ||||
| Examples: | ||||
| $tpl = $smarty->createTemplate('mytpl.tpl'); // create template object not linked to any parent | ||||
| $tpl->assign('foo','bar');                   // directly assign variables | ||||
| $tpl->config_load('my.conf');									 // load config file     | ||||
|  | ||||
| $tpl = $smarty->createTemplate('mytpl.tpl',$smarty);  // create template having a parent link to the Smarty object | ||||
| $tpl = $smarty->createTemplate('mytpl.tpl',$data);    // create template having a parent link to the $data object | ||||
|  | ||||
| The standard fetch() and display() methods will implicitly create a template object. | ||||
| If the $parent parameter is not specified in these method calls, the template object | ||||
| is will link back to the Smarty object as it's parent. | ||||
|  | ||||
| If a template is called by an {include...} tag from another template, the | ||||
| subtemplate links back to the calling template as it's parent.  | ||||
|  | ||||
| All variables assigned locally or from a parent template are accessible. If the | ||||
| template creates or modifies a variable by using the {assign var=foo...} or | ||||
| {$foo=...} tags, these new values are only known locally (local scope). When the | ||||
| template exits, none of the new variables or modifications can be seen in the | ||||
| parent template(s). This is same behavior as in Smarty 2.  | ||||
|  | ||||
| With Smarty 3, we can assign variables with a scope attribute which allows the | ||||
| availablility of these new variables or modifications globally (ie in the parent | ||||
| templates.) | ||||
|  | ||||
| Possible scopes are local, parent, root and global.  | ||||
| Examples: | ||||
| {assign var=foo value='bar'}       // no scope is specified, the default 'local' | ||||
| {$foo='bar'}                       // same, local scope | ||||
| {assign var=foo value='bar' scope='local'} // same, local scope | ||||
|  | ||||
| {assign var=foo value='bar' scope='parent'} // Values will be available to the parent object  | ||||
| {$foo='bar' scope='parent'}                 // (normally the calling template) | ||||
|  | ||||
| {assign var=foo value='bar' scope='root'}   // Values will be exported up to the root object, so they can  | ||||
| {$foo='bar' scope='root'}                   // be seen from all templates using the same root. | ||||
|  | ||||
| {assign var=foo value='bar' scope='global'} // Values will be exported to global variable storage,  | ||||
| {$foo='bar' scope='global'}                 // they are available to any and all templates. | ||||
|  | ||||
|  | ||||
| The scope attribute can also be attached to the {include...} tag. In this case, | ||||
| the specified scope will be the default scope for all assignments within the | ||||
| included template. | ||||
|  | ||||
|  | ||||
| PLUGINS | ||||
| ======= | ||||
|  | ||||
| Smarty3 are following the same coding rules as in Smarty2.  | ||||
| The only difference is that the template object is passed as additional third parameter. | ||||
|  | ||||
| smarty_plugintype_name (array $params, object $smarty, object $template) | ||||
|  | ||||
| The Smarty 2 plugins are still compatible as long as they do not make use of specific Smarty2 internals. | ||||
|  | ||||
|  | ||||
| TEMPLATE INHERITANCE: | ||||
| ===================== | ||||
|  | ||||
| With template inheritance you can define blocks, which are areas that can be | ||||
| overriden by child templates, so your templates could look like this:  | ||||
|  | ||||
| parent.tpl: | ||||
| <html> | ||||
|   <head> | ||||
|     <title>{block name='title'}My site name{/block}</title> | ||||
|   </head> | ||||
|   <body> | ||||
|     <h1>{block name='page-title'}Default page title{/block}</h1> | ||||
|     <div id="content"> | ||||
|       {block name='content'} | ||||
|         Default content | ||||
|       {/block} | ||||
|     </div> | ||||
|   </body> | ||||
| </html> | ||||
|  | ||||
| child.tpl: | ||||
| {extends file='parent.tpl'}  | ||||
| {block name='title'} | ||||
| Child title | ||||
| {/block} | ||||
|  | ||||
| grandchild.tpl: | ||||
| {extends file='child.tpl'}  | ||||
| {block name='title'}Home - {$smarty.block.parent}{/block}  | ||||
| {block name='page-title'}My home{/block} | ||||
| {block name='content'} | ||||
|   {foreach $images as $img} | ||||
|     <img src="{$img.url}" alt="{$img.description}" /> | ||||
|   {/foreach} | ||||
| {/block} | ||||
|  | ||||
| We redefined all the blocks here, however in the title block we used {$smarty.block.parent}, | ||||
| which tells Smarty to insert the default content from the parent template in its place. | ||||
| The content block was overriden to display the image files, and page-title has also be  | ||||
| overriden to display a completely different title.  | ||||
|  | ||||
| If we render grandchild.tpl we will get this:  | ||||
| <html> | ||||
|   <head> | ||||
|     <title>Home - Child title</title> | ||||
|   </head> | ||||
|   <body> | ||||
|     <h1>My home</h1> | ||||
|     <div id="content"> | ||||
|       <img src="/example.jpg" alt="image" /> | ||||
|       <img src="/example2.jpg" alt="image" /> | ||||
|       <img src="/example3.jpg" alt="image" /> | ||||
|     </div> | ||||
|   </body> | ||||
| </html> | ||||
|  | ||||
| NOTE: In the child templates everything outside the {extends} or {block} tag sections | ||||
| is ignored. | ||||
|  | ||||
| The inheritance tree can be as big as you want (meaning you can extend a file that  | ||||
| extends another one that extends another one and so on..), but be aware that all files  | ||||
| have to be checked for modifications at runtime so the more inheritance the more overhead you add. | ||||
|  | ||||
| Instead of defining the parent/child relationships with the {extends} tag in the child template you | ||||
| can use the resource as follow: | ||||
|  | ||||
| $smarty->display('extends:parent.tpl|child.tpl|grandchild.tpl'); | ||||
|  | ||||
| Child {block} tags may optionally have a append or prepend attribute. In this case the parent block content  | ||||
| is appended or prepended to the child block content. | ||||
|  | ||||
| {block name='title' append} My title {/block} | ||||
|  | ||||
|  | ||||
| PHP STREAMS: | ||||
| ============ | ||||
|  | ||||
| (see online documentation) | ||||
|  | ||||
| VARIBLE FILTERS: | ||||
| ================ | ||||
|  | ||||
| (see online documentation) | ||||
|  | ||||
|  | ||||
| STATIC CLASS ACCESS AND NAMESPACE SUPPORT | ||||
| ========================================= | ||||
|  | ||||
| You can register a class with optional namespace for the use in the template like: | ||||
|  | ||||
| $smarty->register->templateClass('foo','name\name2\myclass'); | ||||
|  | ||||
| In the template you can use it like this: | ||||
| {foo::method()}  etc. | ||||
|  | ||||
|  | ||||
| ======================= | ||||
|  | ||||
| Please look through it and send any questions/suggestions/etc to the forums. | ||||
|  | ||||
| http://www.phpinsider.com/smarty-forum/viewtopic.php?t=14168 | ||||
|  | ||||
| Monte and Uwe | ||||
							
								
								
									
										109
									
								
								library/Smarty/SMARTY_2_BC_NOTES.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								library/Smarty/SMARTY_2_BC_NOTES.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | ||||
| = Known incompatibilities with Smarty 2 = | ||||
|  | ||||
| == Syntax == | ||||
|  | ||||
| Smarty 3 API has a new syntax. Much of the Smarty 2 syntax is supported  | ||||
| by a wrapper but deprecated. See the README that comes with Smarty 3 for more  | ||||
| information. | ||||
|  | ||||
| The {$array|@mod} syntax has always been a bit confusing, where an "@" is required | ||||
| to apply a modifier to an array instead of the individual elements. Normally you | ||||
| always want the modifier to apply to the variable regardless of its type. In Smarty 3, | ||||
| {$array|mod} and {$array|@mod} behave identical. It is safe to drop the "@" and the | ||||
| modifier will still apply to the array. If you really want the modifier to apply to | ||||
| each array element, you must loop the array in-template, or use a custom modifier that | ||||
| supports array iteration. Most smarty functions already escape values where necessary | ||||
| such as {html_options} | ||||
|  | ||||
| == PHP Version == | ||||
| Smarty 3 is PHP 5 only. It will not work with PHP 4. | ||||
|  | ||||
| == {php} Tag == | ||||
| The {php} tag is disabled by default. The use of {php} tags is | ||||
| deprecated. It can be enabled with $smarty->allow_php_tag=true. | ||||
|  | ||||
| But if you scatter PHP code which belongs together into several | ||||
| {php} tags it may not work any longer. | ||||
|  | ||||
| == Delimiters and whitespace == | ||||
| Delimiters surrounded by whitespace are no longer treated as Smarty tags. | ||||
| Therefore, { foo } will not compile as a tag, you must use {foo}. This change | ||||
| Makes Javascript/CSS easier to work with, eliminating the need for {literal}. | ||||
| This can be disabled by setting $smarty->auto_literal = false; | ||||
|  | ||||
| == Unquoted Strings == | ||||
| Smarty 2 was a bit more forgiving (and ambiguous) when it comes to unquoted strings  | ||||
| in parameters. Smarty3 is more restrictive. You can still pass strings without quotes  | ||||
| so long as they contain no special characters. (anything outside of A-Za-z0-9_)  | ||||
|  | ||||
| For example filename strings must be quoted | ||||
| <source lang="smarty"> | ||||
| {include file='path/foo.tpl'} | ||||
| </source> | ||||
|  | ||||
| == Extending the Smarty class == | ||||
| Smarty 3 makes use of the __construct method for initialization. If you are extending  | ||||
| the Smarty class, its constructor is not called implicitly if the your child class defines  | ||||
| its own constructor. In order to run Smarty's constructor, a call to parent::__construct()  | ||||
| within your child constructor is required.  | ||||
|  | ||||
| <source lang="php"> | ||||
| class MySmarty extends Smarty { | ||||
|    function __construct() { | ||||
|        parent::__construct(); | ||||
|      | ||||
|        // your initialization code goes here | ||||
|  | ||||
|    } | ||||
| } | ||||
| </source> | ||||
|  | ||||
| == Autoloader == | ||||
| Smarty 3 does register its own autoloader with spl_autoload_register. If your code has  | ||||
| an existing __autoload function then this function must be explicitly registered on  | ||||
| the __autoload stack. See http://us3.php.net/manual/en/function.spl-autoload-register.php  | ||||
| for further details. | ||||
|  | ||||
| == Plugin Filenames == | ||||
| Smarty 3 optionally supports the PHP spl_autoloader. The autoloader requires filenames  | ||||
| to be lower case. Because of this, Smarty plugin file names must also be lowercase.  | ||||
| In Smarty 2, mixed case file names did work. | ||||
|  | ||||
| == Scope of Special Smarty Variables == | ||||
| In Smarty 2 the special Smarty variables $smarty.section... and $smarty.foreach...  | ||||
| had global scope. If you had loops with the same name in subtemplates you could accidentally  | ||||
| overwrite values of parent template. | ||||
|  | ||||
| In Smarty 3 these special Smarty variable have only local scope in the template which  | ||||
| is defining the loop. If you need their value in a subtemplate you have to pass them  | ||||
| as parameter. | ||||
| <source lang="smarty"> | ||||
| {include file='path/foo.tpl' index=$smarty.section.foo.index} | ||||
| </source> | ||||
|  | ||||
| == SMARTY_RESOURCE_CHAR_SET == | ||||
| Smarty 3 sets the constant SMARTY_RESOURCE_CHAR_SET to utf-8 as default template charset.  | ||||
| This is now used also on modifiers like escape as default charset. If your templates use  | ||||
| other charsets make sure that you define the constant accordingly. Otherwise you may not  | ||||
| get any output. | ||||
|  | ||||
| == newline at {if} tags == | ||||
| A \n was added to the compiled code of the {if},{else},{elseif},{/if} tags to get output of newlines as expected by the template source.  | ||||
| If one of the {if} tags is at the line end you will now get a newline in the HTML output. | ||||
|  | ||||
| == trigger_error() == | ||||
| The API function trigger_error() has been removed because it did just map to PHP trigger_error. | ||||
| However it's still included in the Smarty2 API wrapper. | ||||
|  | ||||
| == Smarty constants == | ||||
| The constants  | ||||
| SMARTY_PHP_PASSTHRU | ||||
| SMARTY_PHP_QUOTE | ||||
| SMARTY_PHP_REMOVE | ||||
| SMARTY_PHP_ALLOW | ||||
| have been replaced with class constants | ||||
| Smarty::PHP_PASSTHRU | ||||
| Smarty::PHP_QUOTE | ||||
| Smarty::PHP_REMOVE | ||||
| Smarty::PHP_ALLOW | ||||
|  | ||||
							
								
								
									
										24
									
								
								library/Smarty/SMARTY_3.0_BC_NOTES.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								library/Smarty/SMARTY_3.0_BC_NOTES.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||
							
								
								
									
										306
									
								
								library/Smarty/SMARTY_3.1_NOTES.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								library/Smarty/SMARTY_3.1_NOTES.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,306 @@ | ||||
| Smarty 3.1 Notes | ||||
| ================ | ||||
|  | ||||
| Smarty 3.1 is a departure from 2.0 compatibility. Most notably, all | ||||
| backward compatibility has been moved to a separate class file named | ||||
| SmartyBC.class.php. If you require compatibility with 2.0, you will | ||||
| need to use this class. | ||||
|  | ||||
| Some differences from 3.0 are also present. 3.1 begins the journey of | ||||
| requiring setters/getters for property access. So far this is only | ||||
| implemented on the five directory properties: template_dir, | ||||
| plugins_dir, configs_dir, compile_dir and cache_dir. These properties | ||||
| are now protected, it is required to use the setters/getters instead. | ||||
| That said, direct property access will still work, however slightly | ||||
| slower since they will now fall through __set() and __get() and in | ||||
| turn passed through the setter/getter methods. 3.2 will exhibit a full | ||||
| list of setter/getter methods for all (currently) public properties, | ||||
| so code-completion in your IDE will work as expected. | ||||
|  | ||||
| There is absolutely no PHP allowed in templates any more. All | ||||
| deprecated features of Smarty 2.0 are gone. Again, use the SmartyBC | ||||
| class if you need any backward compatibility. | ||||
|  | ||||
| Internal Changes | ||||
|  | ||||
|   Full UTF-8 Compatibility | ||||
|  | ||||
| The plugins shipped with Smarty 3.1 have been rewritten to fully | ||||
| support UTF-8 strings if Multibyte String is available. Without | ||||
| MBString UTF-8 cannot be handled properly. For those rare cases where | ||||
| templates themselves have to juggle encodings, the new modifiers | ||||
| to_charset and from_charset may come in handy. | ||||
|  | ||||
|   Plugin API and Performance | ||||
|  | ||||
| All Plugins (modifiers, functions, blocks, resources, | ||||
| default_template_handlers, etc) are now receiving the | ||||
| Smarty_Internal_Template instance, where they were supplied with the | ||||
| Smarty instance in Smarty 3.0. *. As The Smarty_Internal_Template | ||||
| mimics the behavior of Smarty, this API simplification should not | ||||
| require any changes to custom plugins. | ||||
|  | ||||
| The plugins shipped with Smarty 3.1 have been rewritten for better | ||||
| performance. Most notably {html_select_date} and {html_select_time} | ||||
| have been improved vastly. Performance aside, plugins have also been | ||||
| reviewed and generalized in their API. {html_select_date} and | ||||
| {html_select_time} now share almost all available options. | ||||
|  | ||||
| The escape modifier now knows the $double_encode option, which will | ||||
| prevent entities from being encoded again. | ||||
|  | ||||
| The capitalize modifier now know the $lc_rest option, which makes sure | ||||
| all letters following a captial letter are lower-cased. | ||||
|  | ||||
| The count_sentences modifier now accepts (.?!) as | ||||
| legitimate endings of a sentence - previously only (.) was | ||||
| accepted | ||||
|  | ||||
| The new unescape modifier is there to reverse the effects of the | ||||
| escape modifier. This applies to the escape formats html, htmlall and | ||||
| entity. | ||||
|  | ||||
|   default_template_handler_func | ||||
|  | ||||
| The invocation of $smarty->$default_template_handler_func had to be  | ||||
| altered. Instead of a Smarty_Internal_Template, the fifth argument is | ||||
| now provided with the Smarty instance. New footprint: | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Default Template Handler | ||||
|  * | ||||
|  * called when Smarty's file: resource is unable to load a requested file | ||||
|  *  | ||||
|  * @param string   $type     resource type (e.g. "file", "string", "eval", "resource") | ||||
|  * @param string   $name     resource name (e.g. "foo/bar.tpl") | ||||
|  * @param string  &$content  template's content | ||||
|  * @param integer &$modified template's modification time | ||||
|  * @param Smarty   $smarty   Smarty instance | ||||
|  * @return string|boolean   path to file or boolean true if $content and $modified  | ||||
|  *                          have been filled, boolean false if no default template  | ||||
|  *                          could be loaded | ||||
|  */ | ||||
| function default_template_handler_func($type, $name, &$content, &$modified, Smarty $smarty) { | ||||
|     if (false) { | ||||
|         // return corrected filepath | ||||
|         return "/tmp/some/foobar.tpl"; | ||||
|     } elseif (false) { | ||||
|         // return a template directly | ||||
|         $content = "the template source"; | ||||
|         $modified = time(); | ||||
|         return true; | ||||
|     } else { | ||||
|         // tell smarty that we failed | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
|  | ||||
|   Stuff done to the compiler | ||||
|  | ||||
| Many performance improvements have happened internally. One notable | ||||
| improvement is that all compiled templates are now handled as PHP | ||||
| functions. This speeds up repeated templates tremendously, as each one | ||||
| calls an (in-memory) PHP function instead of performing another file | ||||
| include/scan. | ||||
|  | ||||
| New Features | ||||
|  | ||||
|   Template syntax | ||||
|  | ||||
|  {block}..{/block} | ||||
|  | ||||
| The {block} tag has a new hide option flag. It does suppress the block | ||||
| content if no corresponding child block exists. | ||||
| EXAMPLE: | ||||
| parent.tpl | ||||
| {block name=body hide} child content "{$smarty.block.child}" was | ||||
| inserted {block} | ||||
| In the above example the whole block will be suppressed if no child | ||||
| block "body" is existing. | ||||
|  | ||||
|  {setfilter}..{/setfilter} | ||||
|  | ||||
| The new {setfilter} block tag allows the definition of filters which | ||||
| run on variable output. | ||||
| SYNTAX: | ||||
| {setfilter filter1|filter2|filter3....} | ||||
| Smarty3 will lookup up matching filters in the following search order: | ||||
| 1. varibale filter plugin in plugins_dir. | ||||
| 2. a valid modifier. A modifier specification will also accept | ||||
| additional parameter like filter2:'foo' | ||||
| 3. a PHP function | ||||
| {/setfilter} will turn previous filter setting off again. | ||||
| {setfilter} tags can be nested. | ||||
| EXAMPLE: | ||||
| {setfilter filter1} | ||||
|   {$foo} | ||||
|   {setfilter filter2} | ||||
|     {$bar} | ||||
|   {/setfilter} | ||||
|   {$buh} | ||||
| {/setfilter} | ||||
| {$blar} | ||||
| In the above example filter1 will run on the output of $foo, filter2 | ||||
| on $bar, filter1 again on $buh and no filter on $blar. | ||||
| NOTES: | ||||
| - {$foo nofilter} will suppress the filters | ||||
| - These filters will run in addition to filters defined by | ||||
| registerFilter('variable',...), autoLoadFilter('variable',...) and | ||||
| defined default modifier. | ||||
| - {setfilter} will effect only the current template, not included | ||||
| subtemplates. | ||||
|  | ||||
|   Resource API | ||||
|  | ||||
| Smarty 3.1 features a new approach to resource management. The | ||||
| Smarty_Resource API allows simple, yet powerful integration of custom | ||||
| resources for templates and configuration files. It offers simple | ||||
| functions for loading data from a custom resource (e.g. database) as | ||||
| well as define new template types adhering to the special | ||||
| non-compiling (e,g, plain php) and non-compile-caching (e.g. eval: | ||||
| resource type) resources. | ||||
|  | ||||
| See demo/plugins/resource.mysql.php for an example custom database | ||||
| resource. | ||||
|  | ||||
| Note that old-fashioned registration of callbacks for resource | ||||
| management has been deprecated but is still possible with SmartyBC. | ||||
|  | ||||
|   CacheResource API | ||||
|  | ||||
| In line with the Resource API, the CacheResource API offers a more | ||||
| comfortable handling of output-cache data. With the | ||||
| Smarty_CacheResource_Custom accessing databases is made simple. With | ||||
| the introduction of Smarty_CacheResource_KeyValueStore the | ||||
| implementation of resources like memcache or APC became a no-brainer; | ||||
| simple hash-based storage systems are now supporting hierarchical | ||||
| output-caches. | ||||
|  | ||||
| See demo/plugins/cacheresource.mysql.php for an example custom | ||||
| database CacheResource. | ||||
| See demo/plugins/cacheresource.memcache.php for an example custom | ||||
| memcache CacheResource using the KeyValueStore helper. | ||||
|  | ||||
| Note that old-fashioned registration of $cache_handler is not possible | ||||
| anymore. As the functionality had not been ported to Smarty 3.0.x | ||||
| properly, it has been dropped from 3.1 completely. | ||||
|  | ||||
| Locking facilities have been implemented to avoid concurrent cache  | ||||
| generation. Enable cache locking by setting  | ||||
| $smarty->cache_locking = true; | ||||
|  | ||||
|   Relative Paths in Templates (File-Resource) | ||||
|  | ||||
| As of Smarty 3.1 {include file="../foo.tpl"} and {include | ||||
| file="./foo.tpl"} will resolve relative to the template they're in. | ||||
| Relative paths are available with {include file="..."} and | ||||
| {extends file="..."}. As $smarty->fetch('../foo.tpl') and | ||||
| $smarty->fetch('./foo.tpl') cannot be relative to a template, an | ||||
| exception is thrown. | ||||
|  | ||||
|   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() | ||||
|  | ||||
| An optional default_plugin_handler_func() can be defined which gets called  | ||||
| by the compiler on tags which can't be resolved internally or by plugins. | ||||
| The default_plugin_handler() can map tags to plugins on the fly. | ||||
|  | ||||
| New getters/setters | ||||
|  | ||||
| The following setters/getters will be part of the official | ||||
| documentation, and will be strongly recommended. Direct property | ||||
| access will still work for the foreseeable future... it will be | ||||
| transparently routed through the setters/getters, and consequently a | ||||
| bit slower. | ||||
|  | ||||
| array|string getTemplateDir( [string $index] ) | ||||
| replaces $smarty->template_dir; and $smarty->template_dir[$index]; | ||||
| Smarty setTemplateDir( array|string $path ) | ||||
| replaces $smarty->template_dir = "foo"; and $smarty->template_dir = | ||||
| array("foo", "bar"); | ||||
| Smarty addTemplateDir( array|string $path, [string $index]) | ||||
| replaces $smarty->template_dir[] = "bar"; and | ||||
| $smarty->template_dir[$index] = "bar"; | ||||
|  | ||||
| array|string getConfigDir( [string $index] ) | ||||
| replaces $smarty->config_dir; and $smarty->config_dir[$index]; | ||||
| Smarty setConfigDir( array|string $path ) | ||||
| replaces $smarty->config_dir = "foo"; and $smarty->config_dir = | ||||
| array("foo", "bar"); | ||||
| Smarty addConfigDir( array|string $path, [string $index]) | ||||
| replaces $smarty->config_dir[] = "bar"; and | ||||
| $smarty->config_dir[$index] = "bar"; | ||||
|  | ||||
| array getPluginsDir() | ||||
| replaces $smarty->plugins_dir; | ||||
| Smarty setPluginsDir( array|string $path ) | ||||
| replaces $smarty->plugins_dir = "foo"; | ||||
| Smarty addPluginsDir( array|string $path ) | ||||
| replaces $smarty->plugins_dir[] = "bar"; | ||||
|  | ||||
| string getCompileDir() | ||||
| replaces $smarty->compile_dir; | ||||
| Smarty setCompileDir( string $path ) | ||||
| replaces $smarty->compile_dir = "foo"; | ||||
|  | ||||
| string getCacheDir() | ||||
| replaces $smarty->cache_dir; | ||||
| Smarty setCacheDir( string $path ) | ||||
| replaces $smarty->cache_dir; | ||||
							
								
								
									
										2078
									
								
								library/Smarty/change_log.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2078
									
								
								library/Smarty/change_log.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										5
									
								
								library/Smarty/demo/configs/test.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								library/Smarty/demo/configs/test.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| title = Welcome to Smarty! | ||||
| cutoff_size = 40 | ||||
|  | ||||
| [setup] | ||||
| bold = true | ||||
							
								
								
									
										33
									
								
								library/Smarty/demo/index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								library/Smarty/demo/index.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
|  /** | ||||
|  * Example Application | ||||
|  | ||||
|  * @package Example-application | ||||
|  */ | ||||
|  | ||||
| require('../libs/Smarty.class.php'); | ||||
|  | ||||
| $smarty = new Smarty; | ||||
|  | ||||
|  | ||||
|  | ||||
| //$smarty->force_compile = true; | ||||
| $smarty->debugging = true; | ||||
| $smarty->caching = true; | ||||
| $smarty->cache_lifetime = 120; | ||||
|  | ||||
| $smarty->assign("Name","Fred Irving Johnathan Bradley Peppergill",true); | ||||
| $smarty->assign("FirstName",array("John","Mary","James","Henry")); | ||||
| $smarty->assign("LastName",array("Doe","Smith","Johnson","Case")); | ||||
| $smarty->assign("Class",array(array("A","B","C","D"), array("E", "F", "G", "H"), | ||||
| 	  array("I", "J", "K", "L"), array("M", "N", "O", "P"))); | ||||
|  | ||||
| $smarty->assign("contacts", array(array("phone" => "1", "fax" => "2", "cell" => "3"), | ||||
| 	  array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234"))); | ||||
|  | ||||
| $smarty->assign("option_values", array("NY","NE","KS","IA","OK","TX")); | ||||
| $smarty->assign("option_output", array("New York","Nebraska","Kansas","Iowa","Oklahoma","Texas")); | ||||
| $smarty->assign("option_selected", "NE"); | ||||
|  | ||||
| $smarty->display('index.tpl'); | ||||
| ?> | ||||
							
								
								
									
										77
									
								
								library/Smarty/demo/plugins/cacheresource.apc.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								library/Smarty/demo/plugins/cacheresource.apc.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| <?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'); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										91
									
								
								library/Smarty/demo/plugins/cacheresource.memcache.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								library/Smarty/demo/plugins/cacheresource.memcache.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										152
									
								
								library/Smarty/demo/plugins/cacheresource.mysql.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								library/Smarty/demo/plugins/cacheresource.mysql.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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 = strtotime($row['modified']); | ||||
|         } else { | ||||
|             $content = null; | ||||
|             $mtime = null; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Fetch cached content's modification timestamp from data source | ||||
|      * | ||||
|      * @note implementing this method is optional. Only implement it if modification times can be accessed faster than loading the complete cached content. | ||||
|      * @param string $id unique cache content identifier | ||||
|      * @param string $name template name | ||||
|      * @param string $cache_id cache id | ||||
|      * @param string $compile_id compile id | ||||
|      * @return integer|boolean timestamp (epoch) the template was modified, or false if not found | ||||
|      */ | ||||
|     protected function fetchTimestamp($id, $name, $cache_id, $compile_id) | ||||
|     { | ||||
|         $this->fetchTimestamp->execute(array('id' => $id)); | ||||
|         $mtime = strtotime($this->fetchTimestamp->fetchColumn()); | ||||
|         $this->fetchTimestamp->closeCursor(); | ||||
|         return $mtime; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Save content to cache | ||||
|      * | ||||
|      * @param string $id unique cache content identifier | ||||
|      * @param string $name template name | ||||
|      * @param string $cache_id cache id | ||||
|      * @param string $compile_id compile id | ||||
|      * @param integer|null $exp_time seconds till expiration time in seconds or null | ||||
|      * @param string $content content to cache | ||||
|      * @return boolean success | ||||
|      */ | ||||
|     protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content) | ||||
|     { | ||||
|         $this->save->execute(array( | ||||
|             'id' => $id, | ||||
|             'name' => $name, | ||||
|             'cache_id' => $cache_id, | ||||
|             'compile_id' => $compile_id, | ||||
|             'content' => $content, | ||||
|         )); | ||||
|         return !!$this->save->rowCount(); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Delete content from cache | ||||
|      * | ||||
|      * @param string $name template name | ||||
|      * @param string $cache_id cache id | ||||
|      * @param string $compile_id compile id | ||||
|      * @param integer|null $exp_time seconds till expiration or null | ||||
|      * @return integer number of deleted caches | ||||
|      */ | ||||
|     protected function delete($name, $cache_id, $compile_id, $exp_time) | ||||
|     { | ||||
|         // delete the whole cache | ||||
|         if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) { | ||||
|             // returning the number of deleted caches would require a second query to count them | ||||
|             $query = $this->db->query('TRUNCATE TABLE output_cache'); | ||||
|             return -1; | ||||
|         } | ||||
|         // build the filter | ||||
|         $where = array(); | ||||
|         // equal test name | ||||
|         if ($name !== null) { | ||||
|             $where[] = 'name = ' . $this->db->quote($name); | ||||
|         } | ||||
|         // equal test compile_id | ||||
|         if ($compile_id !== null) { | ||||
|             $where[] = 'compile_id = ' . $this->db->quote($compile_id); | ||||
|         } | ||||
|         // range test expiration time | ||||
|         if ($exp_time !== null) { | ||||
|             $where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)'; | ||||
|         } | ||||
|         // equal test cache_id and match sub-groups | ||||
|         if ($cache_id !== null) { | ||||
|             $where[] = '(cache_id = '. $this->db->quote($cache_id) | ||||
|                 . ' OR cache_id LIKE '. $this->db->quote($cache_id .'|%') .')'; | ||||
|         } | ||||
|         // run delete query | ||||
|         $query = $this->db->query('DELETE FROM output_cache WHERE ' . join(' AND ', $where)); | ||||
|         return $query->rowCount(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										60
									
								
								library/Smarty/demo/plugins/resource.extendsall.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								library/Smarty/demo/plugins/resource.extendsall.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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; | ||||
|     } | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										76
									
								
								library/Smarty/demo/plugins/resource.mysql.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								library/Smarty/demo/plugins/resource.mysql.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										62
									
								
								library/Smarty/demo/plugins/resource.mysqls.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								library/Smarty/demo/plugins/resource.mysqls.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										2
									
								
								library/Smarty/demo/templates/footer.tpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								library/Smarty/demo/templates/footer.tpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| </BODY> | ||||
| </HTML> | ||||
							
								
								
									
										5
									
								
								library/Smarty/demo/templates/header.tpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								library/Smarty/demo/templates/header.tpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| <HTML> | ||||
| <HEAD> | ||||
| <TITLE>{$title} - {$Name}</TITLE> | ||||
| </HEAD> | ||||
| <BODY bgcolor="#ffffff"> | ||||
							
								
								
									
										82
									
								
								library/Smarty/demo/templates/index.tpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								library/Smarty/demo/templates/index.tpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| {config_load file="test.conf" section="setup"} | ||||
| {include file="header.tpl" title=foo} | ||||
|  | ||||
| <PRE> | ||||
|  | ||||
| {* bold and title are read from the config file *} | ||||
| {if #bold#}<b>{/if} | ||||
| {* capitalize the first letters of each word of the title *} | ||||
| Title: {#title#|capitalize} | ||||
| {if #bold#}</b>{/if} | ||||
|  | ||||
| The current date and time is {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"} | ||||
|  | ||||
| The value of global assigned variable $SCRIPT_NAME is {$SCRIPT_NAME} | ||||
|  | ||||
| Example of accessing server environment variable SERVER_NAME: {$smarty.server.SERVER_NAME} | ||||
|  | ||||
| The value of {ldelim}$Name{rdelim} is <b>{$Name}</b> | ||||
|  | ||||
| variable modifier example of {ldelim}$Name|upper{rdelim} | ||||
|  | ||||
| <b>{$Name|upper}</b> | ||||
|  | ||||
|  | ||||
| An example of a section loop: | ||||
|  | ||||
| {section name=outer  | ||||
| loop=$FirstName} | ||||
| {if $smarty.section.outer.index is odd by 2} | ||||
| 	{$smarty.section.outer.rownum} . {$FirstName[outer]} {$LastName[outer]} | ||||
| {else} | ||||
| 	{$smarty.section.outer.rownum} * {$FirstName[outer]} {$LastName[outer]} | ||||
| {/if} | ||||
| {sectionelse} | ||||
| 	none | ||||
| {/section} | ||||
|  | ||||
| An example of section looped key values: | ||||
|  | ||||
| {section name=sec1 loop=$contacts} | ||||
| 	phone: {$contacts[sec1].phone}<br> | ||||
| 	fax: {$contacts[sec1].fax}<br> | ||||
| 	cell: {$contacts[sec1].cell}<br> | ||||
| {/section} | ||||
| <p> | ||||
|  | ||||
| testing strip tags | ||||
| {strip} | ||||
| <table border=0> | ||||
| 	<tr> | ||||
| 		<td> | ||||
| 			<A HREF="{$SCRIPT_NAME}"> | ||||
| 			<font color="red">This is a  test     </font> | ||||
| 			</A> | ||||
| 		</td> | ||||
| 	</tr> | ||||
| </table> | ||||
| {/strip} | ||||
|  | ||||
| </PRE> | ||||
|  | ||||
| This is an example of the html_select_date function: | ||||
|  | ||||
| <form> | ||||
| {html_select_date start_year=1998 end_year=2010} | ||||
| </form> | ||||
|  | ||||
| This is an example of the html_select_time function: | ||||
|  | ||||
| <form> | ||||
| {html_select_time use_24_hours=false} | ||||
| </form> | ||||
|  | ||||
| This is an example of the html_options function: | ||||
|  | ||||
| <form> | ||||
| <select name=states> | ||||
| {html_options values=$option_values selected=$option_selected output=$option_output} | ||||
| </select> | ||||
| </form> | ||||
|  | ||||
| {include file="footer.tpl"} | ||||
							
								
								
									
										1517
									
								
								library/Smarty/libs/Smarty.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1517
									
								
								library/Smarty/libs/Smarty.class.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										460
									
								
								library/Smarty/libs/SmartyBC.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										460
									
								
								library/Smarty/libs/SmartyBC.class.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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 ''; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										133
									
								
								library/Smarty/libs/debug.tpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								library/Smarty/libs/debug.tpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,133 @@ | ||||
| {capture name='_smarty_debug' assign=debug_output} | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> | ||||
| <head> | ||||
|     <title>Smarty Debug Console</title> | ||||
| <style type="text/css"> | ||||
| {literal} | ||||
| body, h1, h2, td, th, p { | ||||
|     font-family: sans-serif; | ||||
|     font-weight: normal; | ||||
|     font-size: 0.9em; | ||||
|     margin: 1px; | ||||
|     padding: 0; | ||||
| } | ||||
|  | ||||
| h1 { | ||||
|     margin: 0; | ||||
|     text-align: left; | ||||
|     padding: 2px; | ||||
|     background-color: #f0c040; | ||||
|     color:  black; | ||||
|     font-weight: bold; | ||||
|     font-size: 1.2em; | ||||
|  } | ||||
|  | ||||
| h2 { | ||||
|     background-color: #9B410E; | ||||
|     color: white; | ||||
|     text-align: left; | ||||
|     font-weight: bold; | ||||
|     padding: 2px; | ||||
|     border-top: 1px solid black; | ||||
| } | ||||
|  | ||||
| body { | ||||
|     background: black;  | ||||
| } | ||||
|  | ||||
| p, table, div { | ||||
|     background: #f0ead8; | ||||
| }  | ||||
|  | ||||
| p { | ||||
|     margin: 0; | ||||
|     font-style: italic; | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| table { | ||||
|     width: 100%; | ||||
| } | ||||
|  | ||||
| th, td { | ||||
|     font-family: monospace; | ||||
|     vertical-align: top; | ||||
|     text-align: left; | ||||
|     width: 50%; | ||||
| } | ||||
|  | ||||
| td { | ||||
|     color: green; | ||||
| } | ||||
|  | ||||
| .odd { | ||||
|     background-color: #eeeeee; | ||||
| } | ||||
|  | ||||
| .even { | ||||
|     background-color: #fafafa; | ||||
| } | ||||
|  | ||||
| .exectime { | ||||
|     font-size: 0.8em; | ||||
|     font-style: italic; | ||||
| } | ||||
|  | ||||
| #table_assigned_vars th { | ||||
|     color: blue; | ||||
| } | ||||
|  | ||||
| #table_config_vars th { | ||||
|     color: maroon; | ||||
| } | ||||
| {/literal} | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <h1>Smarty Debug Console  -  {if isset($template_name)}{$template_name|debug_print_var nofilter}{else}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1> | ||||
|  | ||||
| {if !empty($template_data)} | ||||
| <h2>included templates & config files (load time in seconds)</h2> | ||||
|  | ||||
| <div> | ||||
| {foreach $template_data as $template} | ||||
|   <font color=brown>{$template.name}</font> | ||||
|   <span class="exectime"> | ||||
|    (compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"}) | ||||
|   </span> | ||||
|   <br> | ||||
| {/foreach} | ||||
| </div> | ||||
| {/if} | ||||
|  | ||||
| <h2>assigned template variables</h2> | ||||
|  | ||||
| <table id="table_assigned_vars"> | ||||
|     {foreach $assigned_vars as $vars} | ||||
|        <tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">    | ||||
|        <th>${$vars@key|escape:'html'}</th> | ||||
|        <td>{$vars|debug_print_var nofilter}</td></tr> | ||||
|     {/foreach} | ||||
| </table> | ||||
|  | ||||
| <h2>assigned config file variables (outer template scope)</h2> | ||||
|  | ||||
| <table id="table_config_vars"> | ||||
|     {foreach $config_vars as $vars} | ||||
|        <tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">    | ||||
|        <th>{$vars@key|escape:'html'}</th> | ||||
|        <td>{$vars|debug_print_var nofilter}</td></tr> | ||||
|     {/foreach} | ||||
|  | ||||
| </table> | ||||
| </body> | ||||
| </html> | ||||
| {/capture} | ||||
| <script type="text/javascript"> | ||||
| {$id = $template_name|default:''|md5} | ||||
|     _smarty_console = window.open("","console{$id}","width=680,height=600,resizable,scrollbars=yes"); | ||||
|     _smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}"); | ||||
|     _smarty_console.document.close(); | ||||
| </script> | ||||
							
								
								
									
										113
									
								
								library/Smarty/libs/plugins/block.textformat.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								library/Smarty/libs/plugins/block.textformat.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin to format text blocks | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsBlock | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {textformat}{/textformat} block plugin | ||||
|  * | ||||
|  * Type:     block function<br> | ||||
|  * Name:     textformat<br> | ||||
|  * Purpose:  format text a certain way with preset styles | ||||
|  *           or custom wrap/indent settings<br> | ||||
|  * Params: | ||||
|  * <pre> | ||||
|  * - style         - string (email) | ||||
|  * - indent        - integer (0) | ||||
|  * - wrap          - integer (80) | ||||
|  * - wrap_char     - string ("\n") | ||||
|  * - indent_char   - string (" ") | ||||
|  * - wrap_boundary - boolean (true) | ||||
|  * </pre> | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat} | ||||
|  *       (Smarty online manual) | ||||
|  * @param array                    $params   parameters | ||||
|  * @param string                   $content  contents of the block | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @param boolean                  &$repeat  repeat flag | ||||
|  * @return string content re-formatted | ||||
|  * @author Monte Ohrt <monte at ohrt dot com> | ||||
|  */ | ||||
| function smarty_block_textformat($params, $content, $template, &$repeat) | ||||
| { | ||||
|     if (is_null($content)) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     $style = null; | ||||
|     $indent = 0; | ||||
|     $indent_first = 0; | ||||
|     $indent_char = ' '; | ||||
|     $wrap = 80; | ||||
|     $wrap_char = "\n"; | ||||
|     $wrap_cut = false; | ||||
|     $assign = null; | ||||
|  | ||||
|     foreach ($params as $_key => $_val) { | ||||
|         switch ($_key) { | ||||
|             case 'style': | ||||
|             case 'indent_char': | ||||
|             case 'wrap_char': | ||||
|             case 'assign': | ||||
|                 $$_key = (string)$_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'indent': | ||||
|             case 'indent_first': | ||||
|             case 'wrap': | ||||
|                 $$_key = (int)$_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'wrap_cut': | ||||
|                 $$_key = (bool)$_val; | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 trigger_error("textformat: unknown attribute '$_key'"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if ($style == 'email') { | ||||
|         $wrap = 72; | ||||
|     } | ||||
|     // split into paragraphs | ||||
|     $_paragraphs = preg_split('![\r\n]{2}!', $content); | ||||
|     $_output = ''; | ||||
|  | ||||
|  | ||||
|     foreach ($_paragraphs as &$_paragraph) { | ||||
|         if (!$_paragraph) { | ||||
|             continue; | ||||
|         } | ||||
|         // convert mult. spaces & special chars to single space | ||||
|         $_paragraph = preg_replace(array('!\s+!' . Smarty::$_UTF8_MODIFIER, '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER), array(' ', ''), $_paragraph); | ||||
|         // indent first line | ||||
|         if ($indent_first > 0) { | ||||
|             $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph; | ||||
|         } | ||||
|         // wordwrap sentences | ||||
|         if (Smarty::$_MBSTRING) { | ||||
|             require_once(SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'); | ||||
|             $_paragraph = smarty_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); | ||||
|         } else { | ||||
|             $_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); | ||||
|         } | ||||
|         // indent lines | ||||
|         if ($indent > 0) { | ||||
|             $_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph); | ||||
|         } | ||||
|     } | ||||
|     $_output = implode($wrap_char . $wrap_char, $_paragraphs); | ||||
|      | ||||
|     if ($assign) { | ||||
|         $template->assign($assign, $_output); | ||||
|     } else { | ||||
|         return $_output; | ||||
|     } | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										78
									
								
								library/Smarty/libs/plugins/function.counter.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								library/Smarty/libs/plugins/function.counter.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {counter} function plugin | ||||
|  * | ||||
|  * Type:     function<br> | ||||
|  * Name:     counter<br> | ||||
|  * Purpose:  print out a counter value | ||||
|  * | ||||
|  * @author Monte Ohrt <monte at ohrt dot com> | ||||
|  * @link http://www.smarty.net/manual/en/language.function.counter.php {counter} | ||||
|  *       (Smarty online manual) | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string|null | ||||
|  */ | ||||
| function smarty_function_counter($params, $template) | ||||
| { | ||||
|     static $counters = array(); | ||||
|  | ||||
|     $name = (isset($params['name'])) ? $params['name'] : 'default'; | ||||
|     if (!isset($counters[$name])) { | ||||
|         $counters[$name] = array( | ||||
|             'start'=>1, | ||||
|             'skip'=>1, | ||||
|             'direction'=>'up', | ||||
|             'count'=>1 | ||||
|             ); | ||||
|     } | ||||
|     $counter =& $counters[$name]; | ||||
|  | ||||
|     if (isset($params['start'])) { | ||||
|         $counter['start'] = $counter['count'] = (int)$params['start']; | ||||
|     } | ||||
|  | ||||
|     if (!empty($params['assign'])) { | ||||
|         $counter['assign'] = $params['assign']; | ||||
|     } | ||||
|  | ||||
|     if (isset($counter['assign'])) { | ||||
|         $template->assign($counter['assign'], $counter['count']); | ||||
|     } | ||||
|      | ||||
|     if (isset($params['print'])) { | ||||
|         $print = (bool)$params['print']; | ||||
|     } else { | ||||
|         $print = empty($counter['assign']); | ||||
|     } | ||||
|  | ||||
|     if ($print) { | ||||
|         $retval = $counter['count']; | ||||
|     } else { | ||||
|         $retval = null; | ||||
|     } | ||||
|  | ||||
|     if (isset($params['skip'])) { | ||||
|         $counter['skip'] = $params['skip']; | ||||
|     } | ||||
|      | ||||
|     if (isset($params['direction'])) { | ||||
|         $counter['direction'] = $params['direction']; | ||||
|     } | ||||
|  | ||||
|     if ($counter['direction'] == "down") | ||||
|         $counter['count'] -= $counter['skip']; | ||||
|     else | ||||
|         $counter['count'] += $counter['skip']; | ||||
|      | ||||
|     return $retval; | ||||
|      | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										106
									
								
								library/Smarty/libs/plugins/function.cycle.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								library/Smarty/libs/plugins/function.cycle.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {cycle} function plugin | ||||
|  * | ||||
|  * Type:     function<br> | ||||
|  * Name:     cycle<br> | ||||
|  * Date:     May 3, 2002<br> | ||||
|  * Purpose:  cycle through given values<br> | ||||
|  * Params: | ||||
|  * <pre> | ||||
|  * - name      - name of cycle (optional) | ||||
|  * - values    - comma separated list of values to cycle, or an array of values to cycle | ||||
|  *               (this can be left out for subsequent calls) | ||||
|  * - reset     - boolean - resets given var to true | ||||
|  * - print     - boolean - print var or not. default is true | ||||
|  * - advance   - boolean - whether or not to advance the cycle | ||||
|  * - delimiter - the value delimiter, default is "," | ||||
|  * - assign    - boolean, assigns to template var instead of printed. | ||||
|  * </pre> | ||||
|  * Examples:<br> | ||||
|  * <pre> | ||||
|  * {cycle values="#eeeeee,#d0d0d0d"} | ||||
|  * {cycle name=row values="one,two,three" reset=true} | ||||
|  * {cycle name=row} | ||||
|  * </pre> | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle} | ||||
|  *       (Smarty online manual) | ||||
|  * @author Monte Ohrt <monte at ohrt dot com> | ||||
|  * @author credit to Mark Priatel <mpriatel@rogers.com> | ||||
|  * @author credit to Gerard <gerard@interfold.com> | ||||
|  * @author credit to Jason Sweat <jsweat_php@yahoo.com> | ||||
|  * @version  1.3 | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string|null | ||||
|  */ | ||||
|  | ||||
| function smarty_function_cycle($params, $template) | ||||
| { | ||||
|     static $cycle_vars; | ||||
|  | ||||
|     $name = (empty($params['name'])) ? 'default' : $params['name']; | ||||
|     $print = (isset($params['print'])) ? (bool)$params['print'] : true; | ||||
|     $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true; | ||||
|     $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false; | ||||
|  | ||||
|     if (!isset($params['values'])) { | ||||
|         if(!isset($cycle_vars[$name]['values'])) { | ||||
|             trigger_error("cycle: missing 'values' parameter"); | ||||
|             return; | ||||
|         } | ||||
|     } else { | ||||
|         if(isset($cycle_vars[$name]['values']) | ||||
|             && $cycle_vars[$name]['values'] != $params['values'] ) { | ||||
|             $cycle_vars[$name]['index'] = 0; | ||||
|         } | ||||
|         $cycle_vars[$name]['values'] = $params['values']; | ||||
|     } | ||||
|  | ||||
|     if (isset($params['delimiter'])) { | ||||
|         $cycle_vars[$name]['delimiter'] = $params['delimiter']; | ||||
|     } elseif (!isset($cycle_vars[$name]['delimiter'])) { | ||||
|         $cycle_vars[$name]['delimiter'] = ','; | ||||
|     } | ||||
|  | ||||
|     if(is_array($cycle_vars[$name]['values'])) { | ||||
|         $cycle_array = $cycle_vars[$name]['values']; | ||||
|     } else { | ||||
|         $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); | ||||
|     } | ||||
|  | ||||
|     if(!isset($cycle_vars[$name]['index']) || $reset ) { | ||||
|         $cycle_vars[$name]['index'] = 0; | ||||
|     } | ||||
|  | ||||
|     if (isset($params['assign'])) { | ||||
|         $print = false; | ||||
|         $template->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); | ||||
|     } | ||||
|  | ||||
|     if($print) { | ||||
|         $retval = $cycle_array[$cycle_vars[$name]['index']]; | ||||
|     } else { | ||||
|         $retval = null; | ||||
|     } | ||||
|  | ||||
|     if($advance) { | ||||
|         if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) { | ||||
|             $cycle_vars[$name]['index'] = 0; | ||||
|         } else { | ||||
|             $cycle_vars[$name]['index']++; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return $retval; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										214
									
								
								library/Smarty/libs/plugins/function.fetch.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								library/Smarty/libs/plugins/function.fetch.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,214 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {fetch} plugin | ||||
|  * | ||||
|  * Type:     function<br> | ||||
|  * Name:     fetch<br> | ||||
|  * Purpose:  fetch file, web or ftp data and display results | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch} | ||||
|  *       (Smarty online manual) | ||||
|  * @author Monte Ohrt <monte at ohrt dot com> | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable | ||||
|  */ | ||||
| function smarty_function_fetch($params, $template) | ||||
| { | ||||
|     if (empty($params['file'])) { | ||||
|         trigger_error("[plugin] fetch parameter 'file' cannot be empty",E_USER_NOTICE); | ||||
|         return; | ||||
|     } | ||||
|      | ||||
|     // strip file protocol | ||||
|     if (stripos($params['file'], 'file://') === 0) { | ||||
|         $params['file'] = substr($params['file'], 7); | ||||
|     } | ||||
|      | ||||
|     $protocol = strpos($params['file'], '://'); | ||||
|     if ($protocol !== false) { | ||||
|         $protocol = strtolower(substr($params['file'], 0, $protocol)); | ||||
|     } | ||||
|      | ||||
|     if (isset($template->smarty->security_policy)) { | ||||
|         if ($protocol) { | ||||
|             // remote resource (or php stream, …) | ||||
|             if(!$template->smarty->security_policy->isTrustedUri($params['file'])) { | ||||
|                 return; | ||||
|             } | ||||
|         } else { | ||||
|             // local file | ||||
|             if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     $content = ''; | ||||
|     if ($protocol == 'http') { | ||||
|         // http fetch | ||||
|         if($uri_parts = parse_url($params['file'])) { | ||||
|             // set defaults | ||||
|             $host = $server_name = $uri_parts['host']; | ||||
|             $timeout = 30; | ||||
|             $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; | ||||
|             $agent = "Smarty Template Engine ". Smarty::SMARTY_VERSION; | ||||
|             $referer = ""; | ||||
|             $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; | ||||
|             $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; | ||||
|             $_is_proxy = false; | ||||
|             if(empty($uri_parts['port'])) { | ||||
|                 $port = 80; | ||||
|             } else { | ||||
|                 $port = $uri_parts['port']; | ||||
|             } | ||||
|             if(!empty($uri_parts['user'])) { | ||||
|                 $user = $uri_parts['user']; | ||||
|             } | ||||
|             if(!empty($uri_parts['pass'])) { | ||||
|                 $pass = $uri_parts['pass']; | ||||
|             } | ||||
|             // loop through parameters, setup headers | ||||
|             foreach($params as $param_key => $param_value) { | ||||
|                 switch($param_key) { | ||||
|                     case "file": | ||||
|                     case "assign": | ||||
|                     case "assign_headers": | ||||
|                         break; | ||||
|                     case "user": | ||||
|                         if(!empty($param_value)) { | ||||
|                             $user = $param_value; | ||||
|                         } | ||||
|                         break; | ||||
|                     case "pass": | ||||
|                         if(!empty($param_value)) { | ||||
|                             $pass = $param_value; | ||||
|                         } | ||||
|                         break; | ||||
|                     case "accept": | ||||
|                         if(!empty($param_value)) { | ||||
|                             $accept = $param_value; | ||||
|                         } | ||||
|                         break; | ||||
|                     case "header": | ||||
|                         if(!empty($param_value)) { | ||||
|                             if(!preg_match('![\w\d-]+: .+!',$param_value)) { | ||||
|                                 trigger_error("[plugin] invalid header format '".$param_value."'",E_USER_NOTICE); | ||||
|                                 return; | ||||
|                             } else { | ||||
|                                 $extra_headers[] = $param_value; | ||||
|                             } | ||||
|                         } | ||||
|                         break; | ||||
|                     case "proxy_host": | ||||
|                         if(!empty($param_value)) { | ||||
|                             $proxy_host = $param_value; | ||||
|                         } | ||||
|                         break; | ||||
|                     case "proxy_port": | ||||
|                         if(!preg_match('!\D!', $param_value)) { | ||||
|                             $proxy_port = (int) $param_value; | ||||
|                         } else { | ||||
|                             trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); | ||||
|                             return; | ||||
|                         } | ||||
|                         break; | ||||
|                     case "agent": | ||||
|                         if(!empty($param_value)) { | ||||
|                             $agent = $param_value; | ||||
|                         } | ||||
|                         break; | ||||
|                     case "referer": | ||||
|                         if(!empty($param_value)) { | ||||
|                             $referer = $param_value; | ||||
|                         } | ||||
|                         break; | ||||
|                     case "timeout": | ||||
|                         if(!preg_match('!\D!', $param_value)) { | ||||
|                             $timeout = (int) $param_value; | ||||
|                         } else { | ||||
|                             trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); | ||||
|                             return; | ||||
|                         } | ||||
|                         break; | ||||
|                     default: | ||||
|                         trigger_error("[plugin] unrecognized attribute '".$param_key."'",E_USER_NOTICE); | ||||
|                         return; | ||||
|                 } | ||||
|             } | ||||
|             if(!empty($proxy_host) && !empty($proxy_port)) { | ||||
|                 $_is_proxy = true; | ||||
|                 $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); | ||||
|             } else { | ||||
|                 $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); | ||||
|             } | ||||
|  | ||||
|             if(!$fp) { | ||||
|                 trigger_error("[plugin] unable to fetch: $errstr ($errno)",E_USER_NOTICE); | ||||
|                 return; | ||||
|             } else { | ||||
|                 if($_is_proxy) { | ||||
|                     fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); | ||||
|                 } else { | ||||
|                     fputs($fp, "GET $uri HTTP/1.0\r\n"); | ||||
|                 } | ||||
|                 if(!empty($host)) { | ||||
|                     fputs($fp, "Host: $host\r\n"); | ||||
|                 } | ||||
|                 if(!empty($accept)) { | ||||
|                     fputs($fp, "Accept: $accept\r\n"); | ||||
|                 } | ||||
|                 if(!empty($agent)) { | ||||
|                     fputs($fp, "User-Agent: $agent\r\n"); | ||||
|                 } | ||||
|                 if(!empty($referer)) { | ||||
|                     fputs($fp, "Referer: $referer\r\n"); | ||||
|                 } | ||||
|                 if(isset($extra_headers) && is_array($extra_headers)) { | ||||
|                     foreach($extra_headers as $curr_header) { | ||||
|                         fputs($fp, $curr_header."\r\n"); | ||||
|                     } | ||||
|                 } | ||||
|                 if(!empty($user) && !empty($pass)) { | ||||
|                     fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); | ||||
|                 } | ||||
|  | ||||
|                 fputs($fp, "\r\n"); | ||||
|                 while(!feof($fp)) { | ||||
|                     $content .= fgets($fp,4096); | ||||
|                 } | ||||
|                 fclose($fp); | ||||
|                 $csplit = preg_split("!\r\n\r\n!",$content,2); | ||||
|  | ||||
|                 $content = $csplit[1]; | ||||
|  | ||||
|                 if(!empty($params['assign_headers'])) { | ||||
|                     $template->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0])); | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             trigger_error("[plugin fetch] unable to parse URL, check syntax",E_USER_NOTICE); | ||||
|             return; | ||||
|         } | ||||
|     } else { | ||||
|         $content = @file_get_contents($params['file']); | ||||
|         if ($content === false) { | ||||
|             throw new SmartyException("{fetch} cannot read resource '" . $params['file'] ."'"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (!empty($params['assign'])) { | ||||
|         $template->assign($params['assign'], $content); | ||||
|     } else { | ||||
|         return $content; | ||||
|     } | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										216
									
								
								library/Smarty/libs/plugins/function.html_checkboxes.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								library/Smarty/libs/plugins/function.html_checkboxes.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {html_checkboxes} function plugin | ||||
|  * | ||||
|  * File:       function.html_checkboxes.php<br> | ||||
|  * Type:       function<br> | ||||
|  * Name:       html_checkboxes<br> | ||||
|  * Date:       24.Feb.2003<br> | ||||
|  * Purpose:    Prints out a list of checkbox input types<br> | ||||
|  * Examples: | ||||
|  * <pre> | ||||
|  * {html_checkboxes values=$ids output=$names} | ||||
|  * {html_checkboxes values=$ids name='box' separator='<br>' output=$names} | ||||
|  * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names} | ||||
|  * </pre> | ||||
|  * Params: | ||||
|  * <pre> | ||||
|  * - name       (optional) - string default "checkbox" | ||||
|  * - values     (required) - array | ||||
|  * - options    (optional) - associative array | ||||
|  * - checked    (optional) - array default not set | ||||
|  * - separator  (optional) - ie <br> or   | ||||
|  * - output     (optional) - the output next to each checkbox | ||||
|  * - assign     (optional) - assign the output as an array to this variable | ||||
|  * - escape     (optional) - escape the content (not value), defaults to true | ||||
|  * </pre> | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} | ||||
|  *      (Smarty online manual) | ||||
|  * @author     Christopher Kvarme <christopher.kvarme@flashjab.com> | ||||
|  * @author credits to Monte Ohrt <monte at ohrt dot com> | ||||
|  * @version    1.0 | ||||
|  * @param array $params parameters | ||||
|  * @param object $template template object | ||||
|  * @return string | ||||
|  * @uses smarty_function_escape_special_chars() | ||||
|  */ | ||||
| function smarty_function_html_checkboxes($params, $template) | ||||
| { | ||||
|     require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); | ||||
|  | ||||
|     $name = 'checkbox'; | ||||
|     $values = null; | ||||
|     $options = null; | ||||
|     $selected = array(); | ||||
|     $separator = ''; | ||||
|     $escape = true; | ||||
|     $labels = true; | ||||
|     $label_ids = false; | ||||
|     $output = null; | ||||
|  | ||||
|     $extra = ''; | ||||
|  | ||||
|     foreach($params as $_key => $_val) { | ||||
|         switch($_key) { | ||||
|             case 'name': | ||||
|             case 'separator': | ||||
|                 $$_key = (string) $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'escape': | ||||
|             case 'labels': | ||||
|             case 'label_ids': | ||||
|                 $$_key = (bool) $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'options': | ||||
|                 $$_key = (array) $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'values': | ||||
|             case 'output': | ||||
|                 $$_key = array_values((array) $_val); | ||||
|                 break; | ||||
|  | ||||
|             case 'checked': | ||||
|             case 'selected': | ||||
|                 if (is_array($_val)) { | ||||
|                     $selected = array(); | ||||
|                     foreach ($_val as $_sel) { | ||||
|                         if (is_object($_sel)) { | ||||
|                             if (method_exists($_sel, "__toString")) { | ||||
|                                 $_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); | ||||
|                             } else { | ||||
|                                 trigger_error("html_checkboxes: selected attribute contains an object of class '". get_class($_sel) ."' without __toString() method", E_USER_NOTICE); | ||||
|                                 continue; | ||||
|                             } | ||||
|                         } else { | ||||
|                             $_sel = smarty_function_escape_special_chars((string) $_sel); | ||||
|                         } | ||||
|                         $selected[$_sel] = true; | ||||
|                     } | ||||
|                 } elseif (is_object($_val)) { | ||||
|                     if (method_exists($_val, "__toString")) { | ||||
|                         $selected = smarty_function_escape_special_chars((string) $_val->__toString()); | ||||
|                     } else { | ||||
|                         trigger_error("html_checkboxes: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); | ||||
|                     } | ||||
|                 } else { | ||||
|                     $selected = smarty_function_escape_special_chars((string) $_val); | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|             case 'checkboxes': | ||||
|                 trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); | ||||
|                 $options = (array) $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'assign': | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 if(!is_array($_val)) { | ||||
|                     $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; | ||||
|                 } else { | ||||
|                     trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); | ||||
|                 } | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (!isset($options) && !isset($values)) | ||||
|         return ''; /* raise error here? */ | ||||
|  | ||||
|     $_html_result = array(); | ||||
|  | ||||
|     if (isset($options)) { | ||||
|         foreach ($options as $_key=>$_val) { | ||||
|             $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); | ||||
|         } | ||||
|     } else { | ||||
|         foreach ($values as $_i=>$_key) { | ||||
|             $_val = isset($output[$_i]) ? $output[$_i] : ''; | ||||
|             $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if(!empty($params['assign'])) { | ||||
|         $template->assign($params['assign'], $_html_result); | ||||
|     } else { | ||||
|         return implode("\n", $_html_result); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape=true) { | ||||
|     $_output = ''; | ||||
|      | ||||
|     if (is_object($value)) { | ||||
|         if (method_exists($value, "__toString")) { | ||||
|             $value = (string) $value->__toString(); | ||||
|         } else { | ||||
|             trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); | ||||
|             return ''; | ||||
|         } | ||||
|     } else { | ||||
|         $value = (string) $value; | ||||
|     } | ||||
|      | ||||
|     if (is_object($output)) { | ||||
|         if (method_exists($output, "__toString")) { | ||||
|             $output = (string) $output->__toString(); | ||||
|         } else { | ||||
|             trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE); | ||||
|             return ''; | ||||
|         } | ||||
|     } else { | ||||
|         $output = (string) $output; | ||||
|     } | ||||
|      | ||||
|     if ($labels) { | ||||
|         if ($label_ids) { | ||||
|             $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value)); | ||||
|             $_output .= '<label for="' . $_id . '">'; | ||||
|         } else { | ||||
|             $_output .= '<label>'; | ||||
|         }  | ||||
|     } | ||||
|      | ||||
|     $name = smarty_function_escape_special_chars($name); | ||||
|     $value = smarty_function_escape_special_chars($value); | ||||
|     if ($escape) { | ||||
|         $output = smarty_function_escape_special_chars($output); | ||||
|     } | ||||
|      | ||||
|     $_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"'; | ||||
|      | ||||
|     if ($labels && $label_ids) { | ||||
|         $_output .= ' id="' . $_id . '"'; | ||||
|     } | ||||
|      | ||||
|     if (is_array($selected)) { | ||||
|         if (isset($selected[$value])) { | ||||
|             $_output .= ' checked="checked"'; | ||||
|         } | ||||
|     } elseif ($value === $selected) { | ||||
|         $_output .= ' checked="checked"'; | ||||
|     } | ||||
|      | ||||
|     $_output .= $extra . ' />' . $output; | ||||
|     if ($labels) { | ||||
|         $_output .= '</label>'; | ||||
|     } | ||||
|      | ||||
|     $_output .=  $separator; | ||||
|     return $_output; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										159
									
								
								library/Smarty/libs/plugins/function.html_image.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								library/Smarty/libs/plugins/function.html_image.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  *  | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {html_image} function plugin | ||||
|  *  | ||||
|  * Type:     function<br> | ||||
|  * Name:     html_image<br> | ||||
|  * Date:     Feb 24, 2003<br> | ||||
|  * Purpose:  format HTML tags for the image<br> | ||||
|  * Examples: {html_image file="/images/masthead.gif"}<br> | ||||
|  * Output:   <img src="/images/masthead.gif" width=400 height=23><br> | ||||
|  * Params: | ||||
|  * <pre> | ||||
|  * - file        - (required) - file (and path) of image | ||||
|  * - height      - (optional) - image height (default actual height) | ||||
|  * - width       - (optional) - image width (default actual width) | ||||
|  * - basedir     - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT | ||||
|  * - path_prefix - prefix for path output (optional, default empty) | ||||
|  * </pre> | ||||
|  *  | ||||
|  * @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image} | ||||
|  *      (Smarty online manual) | ||||
|  * @author Monte Ohrt <monte at ohrt dot com>  | ||||
|  * @author credits to Duda <duda@big.hu>  | ||||
|  * @version 1.0 | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string  | ||||
|  * @uses smarty_function_escape_special_chars() | ||||
|  */ | ||||
| function smarty_function_html_image($params, $template) | ||||
| { | ||||
|     require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); | ||||
|   | ||||
|     $alt = ''; | ||||
|     $file = ''; | ||||
|     $height = ''; | ||||
|     $width = ''; | ||||
|     $extra = ''; | ||||
|     $prefix = ''; | ||||
|     $suffix = ''; | ||||
|     $path_prefix = ''; | ||||
|     $basedir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : ''; | ||||
|     foreach($params as $_key => $_val) { | ||||
|         switch ($_key) { | ||||
|             case 'file': | ||||
|             case 'height': | ||||
|             case 'width': | ||||
|             case 'dpi': | ||||
|             case 'path_prefix': | ||||
|             case 'basedir': | ||||
|                 $$_key = $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'alt': | ||||
|                 if (!is_array($_val)) { | ||||
|                     $$_key = smarty_function_escape_special_chars($_val); | ||||
|                 } else { | ||||
|                     throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); | ||||
|                 }  | ||||
|                 break; | ||||
|  | ||||
|             case 'link': | ||||
|             case 'href': | ||||
|                 $prefix = '<a href="' . $_val . '">'; | ||||
|                 $suffix = '</a>'; | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 if (!is_array($_val)) { | ||||
|                     $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; | ||||
|                 } else { | ||||
|                     throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); | ||||
|                 }  | ||||
|                 break; | ||||
|         }  | ||||
|     }  | ||||
|  | ||||
|     if (empty($file)) { | ||||
|         trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); | ||||
|         return; | ||||
|     }  | ||||
|  | ||||
|     if ($file[0] == '/') { | ||||
|         $_image_path = $basedir . $file; | ||||
|     } else { | ||||
|         $_image_path = $file; | ||||
|     } | ||||
|      | ||||
|     // strip file protocol | ||||
|     if (stripos($params['file'], 'file://') === 0) { | ||||
|         $params['file'] = substr($params['file'], 7); | ||||
|     } | ||||
|      | ||||
|     $protocol = strpos($params['file'], '://'); | ||||
|     if ($protocol !== false) { | ||||
|         $protocol = strtolower(substr($params['file'], 0, $protocol)); | ||||
|     } | ||||
|      | ||||
|     if (isset($template->smarty->security_policy)) { | ||||
|         if ($protocol) { | ||||
|             // remote resource (or php stream, …) | ||||
|             if(!$template->smarty->security_policy->isTrustedUri($params['file'])) { | ||||
|                 return; | ||||
|             } | ||||
|         } else { | ||||
|             // local file | ||||
|             if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (!isset($params['width']) || !isset($params['height'])) { | ||||
|         // FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader! | ||||
|         if (!$_image_data = @getimagesize($_image_path)) { | ||||
|             if (!file_exists($_image_path)) { | ||||
|                 trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); | ||||
|                 return; | ||||
|             } else if (!is_readable($_image_path)) { | ||||
|                 trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); | ||||
|                 return; | ||||
|             } else { | ||||
|                 trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); | ||||
|                 return; | ||||
|             }  | ||||
|         } | ||||
|  | ||||
|         if (!isset($params['width'])) { | ||||
|             $width = $_image_data[0]; | ||||
|         }  | ||||
|         if (!isset($params['height'])) { | ||||
|             $height = $_image_data[1]; | ||||
|         }  | ||||
|     }  | ||||
|  | ||||
|     if (isset($params['dpi'])) { | ||||
|         if (strstr($_SERVER['HTTP_USER_AGENT'], 'Mac')) { | ||||
|             // FIXME: (rodneyrehm) wrong dpi assumption | ||||
|             // don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011. | ||||
|             $dpi_default = 72; | ||||
|         } else { | ||||
|             $dpi_default = 96; | ||||
|         }  | ||||
|         $_resize = $dpi_default / $params['dpi']; | ||||
|         $width = round($width * $_resize); | ||||
|         $height = round($height * $_resize); | ||||
|     }  | ||||
|  | ||||
|     return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' . $height . '"' . $extra . ' />' . $suffix; | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										176
									
								
								library/Smarty/libs/plugins/function.html_options.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								library/Smarty/libs/plugins/function.html_options.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  *  | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {html_options} function plugin | ||||
|  *  | ||||
|  * Type:     function<br> | ||||
|  * Name:     html_options<br> | ||||
|  * Purpose:  Prints the list of <option> tags generated from | ||||
|  *           the passed parameters<br> | ||||
|  * Params: | ||||
|  * <pre> | ||||
|  * - name       (optional) - string default "select" | ||||
|  * - values     (required) - if no options supplied) - array | ||||
|  * - options    (required) - if no values supplied) - associative array | ||||
|  * - selected   (optional) - string default not set | ||||
|  * - output     (required) - if not options supplied) - array | ||||
|  * - id         (optional) - string default not set | ||||
|  * - class      (optional) - string default not set | ||||
|  * </pre> | ||||
|  *  | ||||
|  * @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image} | ||||
|  *      (Smarty online manual) | ||||
|  * @author Monte Ohrt <monte at ohrt dot com>  | ||||
|  * @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de> | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string  | ||||
|  * @uses smarty_function_escape_special_chars() | ||||
|  */ | ||||
| function smarty_function_html_options($params, $template) | ||||
| { | ||||
|     require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); | ||||
|  | ||||
|     $name = null; | ||||
|     $values = null; | ||||
|     $options = null; | ||||
|     $selected = null; | ||||
|     $output = null; | ||||
|     $id = null; | ||||
|     $class = null; | ||||
|  | ||||
|     $extra = ''; | ||||
|  | ||||
|     foreach ($params as $_key => $_val) { | ||||
|         switch ($_key) { | ||||
|             case 'name': | ||||
|             case 'class': | ||||
|             case 'id': | ||||
|                 $$_key = (string) $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'options': | ||||
|                 $options = (array) $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'values': | ||||
|             case 'output': | ||||
|                 $$_key = array_values((array) $_val); | ||||
|                 break; | ||||
|  | ||||
|             case 'selected': | ||||
|                 if (is_array($_val)) { | ||||
|                     $selected = array(); | ||||
|                     foreach ($_val as $_sel) { | ||||
|                         if (is_object($_sel)) { | ||||
|                             if (method_exists($_sel, "__toString")) { | ||||
|                                 $_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); | ||||
|                             } else { | ||||
|                                 trigger_error("html_options: selected attribute contains an object of class '". get_class($_sel) ."' without __toString() method", E_USER_NOTICE); | ||||
|                                 continue; | ||||
|                             } | ||||
|                         } else { | ||||
|                             $_sel = smarty_function_escape_special_chars((string) $_sel); | ||||
|                         } | ||||
|                         $selected[$_sel] = true; | ||||
|                     } | ||||
|                 } elseif (is_object($_val)) { | ||||
|                     if (method_exists($_val, "__toString")) { | ||||
|                         $selected = smarty_function_escape_special_chars((string) $_val->__toString()); | ||||
|                     } else { | ||||
|                         trigger_error("html_options: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); | ||||
|                     } | ||||
|                 } else { | ||||
|                     $selected = smarty_function_escape_special_chars((string) $_val); | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 if (!is_array($_val)) { | ||||
|                     $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; | ||||
|                 } else { | ||||
|                     trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE); | ||||
|                 }  | ||||
|                 break; | ||||
|         }  | ||||
|     } | ||||
|  | ||||
|     if (!isset($options) && !isset($values)) { | ||||
|         /* raise error here? */ | ||||
|         return ''; | ||||
|     } | ||||
|  | ||||
|     $_html_result = ''; | ||||
|     $_idx = 0; | ||||
|  | ||||
|     if (isset($options)) { | ||||
|         foreach ($options as $_key => $_val) { | ||||
|             $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); | ||||
|         } | ||||
|     } else { | ||||
|         foreach ($values as $_i => $_key) { | ||||
|             $_val = isset($output[$_i]) ? $output[$_i] : ''; | ||||
|             $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); | ||||
|         }  | ||||
|     } | ||||
|  | ||||
|     if (!empty($name)) { | ||||
|         $_html_class = !empty($class) ? ' class="'.$class.'"' : ''; | ||||
|         $_html_id = !empty($id) ? ' id="'.$id.'"' : ''; | ||||
|         $_html_result = '<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result . '</select>' . "\n"; | ||||
|     }  | ||||
|  | ||||
|     return $_html_result; | ||||
| } | ||||
|  | ||||
| function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx) | ||||
| { | ||||
|     if (!is_array($value)) { | ||||
|         $_key = smarty_function_escape_special_chars($key); | ||||
|         $_html_result = '<option value="' . $_key . '"'; | ||||
|         if (is_array($selected)) { | ||||
|             if (isset($selected[$_key])) { | ||||
|                 $_html_result .= ' selected="selected"'; | ||||
|             } | ||||
|         } elseif ($_key === $selected) { | ||||
|             $_html_result .= ' selected="selected"'; | ||||
|         } | ||||
|         $_html_class = !empty($class) ? ' class="'.$class.' option"' : ''; | ||||
|         $_html_id = !empty($id) ? ' id="'.$id.'-'.$idx.'"' : ''; | ||||
|         if (is_object($value)) { | ||||
|             if (method_exists($value, "__toString")) { | ||||
|                 $value = smarty_function_escape_special_chars((string) $value->__toString()); | ||||
|             } else { | ||||
|                 trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); | ||||
|                 return ''; | ||||
|             } | ||||
|         } else { | ||||
|             $value = smarty_function_escape_special_chars((string) $value); | ||||
|         } | ||||
|         $_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n"; | ||||
|         $idx++; | ||||
|     } else { | ||||
|         $_idx = 0; | ||||
|         $_html_result = smarty_function_html_options_optgroup($key, $value, $selected, !empty($id) ? ($id.'-'.$idx) : null, $class, $_idx); | ||||
|         $idx++; | ||||
|     } | ||||
|     return $_html_result; | ||||
| }  | ||||
|  | ||||
| function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx) | ||||
| { | ||||
|     $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n"; | ||||
|     foreach ($values as $key => $value) { | ||||
|         $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx); | ||||
|     }  | ||||
|     $optgroup_html .= "</optgroup>\n"; | ||||
|     return $optgroup_html; | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										200
									
								
								library/Smarty/libs/plugins/function.html_radios.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								library/Smarty/libs/plugins/function.html_radios.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,200 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  *  | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {html_radios} function plugin | ||||
|  *  | ||||
|  * File:       function.html_radios.php<br> | ||||
|  * Type:       function<br> | ||||
|  * Name:       html_radios<br> | ||||
|  * Date:       24.Feb.2003<br> | ||||
|  * Purpose:    Prints out a list of radio input types<br> | ||||
|  * Params: | ||||
|  * <pre> | ||||
|  * - name       (optional) - string default "radio" | ||||
|  * - values     (required) - array | ||||
|  * - options    (required) - associative array | ||||
|  * - checked    (optional) - array default not set | ||||
|  * - separator  (optional) - ie <br> or   | ||||
|  * - output     (optional) - the output next to each radio button | ||||
|  * - assign     (optional) - assign the output as an array to this variable | ||||
|  * - escape     (optional) - escape the content (not value), defaults to true | ||||
|  * </pre> | ||||
|  * Examples: | ||||
|  * <pre> | ||||
|  * {html_radios values=$ids output=$names} | ||||
|  * {html_radios values=$ids name='box' separator='<br>' output=$names} | ||||
|  * {html_radios values=$ids checked=$checked separator='<br>' output=$names} | ||||
|  * </pre> | ||||
|  *  | ||||
|  * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios} | ||||
|  *      (Smarty online manual) | ||||
|  * @author Christopher Kvarme <christopher.kvarme@flashjab.com>  | ||||
|  * @author credits to Monte Ohrt <monte at ohrt dot com>  | ||||
|  * @version 1.0 | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string  | ||||
|  * @uses smarty_function_escape_special_chars() | ||||
|  */ | ||||
| function smarty_function_html_radios($params, $template) | ||||
| { | ||||
|     require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); | ||||
|  | ||||
|     $name = 'radio'; | ||||
|     $values = null; | ||||
|     $options = null; | ||||
|     $selected = null; | ||||
|     $separator = ''; | ||||
|     $escape = true; | ||||
|     $labels = true; | ||||
|     $label_ids = false; | ||||
|     $output = null; | ||||
|     $extra = ''; | ||||
|  | ||||
|     foreach($params as $_key => $_val) { | ||||
|         switch ($_key) { | ||||
|             case 'name': | ||||
|             case 'separator': | ||||
|                 $$_key = (string) $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'checked': | ||||
|             case 'selected': | ||||
|                 if (is_array($_val)) { | ||||
|                     trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING); | ||||
|                 } elseif (is_object($_val)) { | ||||
|                     if (method_exists($_val, "__toString")) { | ||||
|                         $selected = smarty_function_escape_special_chars((string) $_val->__toString()); | ||||
|                     } else { | ||||
|                         trigger_error("html_radios: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); | ||||
|                     } | ||||
|                 } else { | ||||
|                     $selected = (string) $_val; | ||||
|                 }  | ||||
|                 break; | ||||
|  | ||||
|             case 'escape': | ||||
|             case 'labels': | ||||
|             case 'label_ids': | ||||
|                 $$_key = (bool) $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'options': | ||||
|                 $$_key = (array) $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'values': | ||||
|             case 'output': | ||||
|                 $$_key = array_values((array) $_val); | ||||
|                 break; | ||||
|  | ||||
|             case 'radios': | ||||
|                 trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING); | ||||
|                 $options = (array) $_val; | ||||
|                 break; | ||||
|  | ||||
|             case 'assign': | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 if (!is_array($_val)) { | ||||
|                     $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; | ||||
|                 } else { | ||||
|                     trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE); | ||||
|                 }  | ||||
|                 break; | ||||
|         }  | ||||
|     }  | ||||
|  | ||||
|     if (!isset($options) && !isset($values)) { | ||||
|         /* raise error here? */ | ||||
|         return ''; | ||||
|     } | ||||
|  | ||||
|     $_html_result = array(); | ||||
|  | ||||
|     if (isset($options)) { | ||||
|         foreach ($options as $_key => $_val) { | ||||
|             $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); | ||||
|         } | ||||
|     } else { | ||||
|         foreach ($values as $_i => $_key) { | ||||
|             $_val = isset($output[$_i]) ? $output[$_i] : ''; | ||||
|             $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); | ||||
|         }  | ||||
|     }  | ||||
|  | ||||
|     if (!empty($params['assign'])) { | ||||
|         $template->assign($params['assign'], $_html_result); | ||||
|     } else { | ||||
|         return implode("\n", $_html_result); | ||||
|     }  | ||||
| }  | ||||
|  | ||||
| function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape) | ||||
| { | ||||
|     $_output = ''; | ||||
|      | ||||
|     if (is_object($value)) { | ||||
|         if (method_exists($value, "__toString")) { | ||||
|             $value = (string) $value->__toString(); | ||||
|         } else { | ||||
|             trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); | ||||
|             return ''; | ||||
|         } | ||||
|     } else { | ||||
|         $value = (string) $value; | ||||
|     } | ||||
|      | ||||
|     if (is_object($output)) { | ||||
|         if (method_exists($output, "__toString")) { | ||||
|             $output = (string) $output->__toString(); | ||||
|         } else { | ||||
|             trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE); | ||||
|             return ''; | ||||
|         } | ||||
|     } else { | ||||
|         $output = (string) $output; | ||||
|     } | ||||
|      | ||||
|     if ($labels) { | ||||
|         if ($label_ids) { | ||||
|             $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value)); | ||||
|             $_output .= '<label for="' . $_id . '">'; | ||||
|         } else { | ||||
|             $_output .= '<label>'; | ||||
|         }  | ||||
|     } | ||||
|      | ||||
|     $name = smarty_function_escape_special_chars($name); | ||||
|     $value = smarty_function_escape_special_chars($value); | ||||
|     if ($escape) { | ||||
|         $output = smarty_function_escape_special_chars($output); | ||||
|     } | ||||
|      | ||||
|     $_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"'; | ||||
|  | ||||
|     if ($labels && $label_ids) { | ||||
|         $_output .= ' id="' . $_id . '"'; | ||||
|     } | ||||
|  | ||||
|     if ($value === $selected) { | ||||
|         $_output .= ' checked="checked"'; | ||||
|     } | ||||
|      | ||||
|     $_output .= $extra . ' />' . $output; | ||||
|     if ($labels) { | ||||
|         $_output .= '</label>'; | ||||
|     } | ||||
|      | ||||
|     $_output .= $separator; | ||||
|     return $_output; | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										394
									
								
								library/Smarty/libs/plugins/function.html_select_date.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										394
									
								
								library/Smarty/libs/plugins/function.html_select_date.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,394 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  *  | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @ignore | ||||
|  */ | ||||
| require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); | ||||
| /** | ||||
|  * @ignore | ||||
|  */ | ||||
| require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); | ||||
|  | ||||
| /** | ||||
|  * Smarty {html_select_date} plugin | ||||
|  *  | ||||
|  * Type:     function<br> | ||||
|  * Name:     html_select_date<br> | ||||
|  * Purpose:  Prints the dropdowns for date selection. | ||||
|  *  | ||||
|  * ChangeLog: | ||||
|  * <pre> | ||||
|  *            - 1.0 initial release | ||||
|  *            - 1.1 added support for +/- N syntax for begin | ||||
|  *              and end year values. (Monte) | ||||
|  *            - 1.2 added support for yyyy-mm-dd syntax for | ||||
|  *              time value. (Jan Rosier) | ||||
|  *            - 1.3 added support for choosing format for | ||||
|  *              month values (Gary Loescher) | ||||
|  *            - 1.3.1 added support for choosing format for | ||||
|  *              day values (Marcus Bointon) | ||||
|  *            - 1.3.2 support negative timestamps, force year | ||||
|  *              dropdown to include given date unless explicitly set (Monte) | ||||
|  *            - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that | ||||
|  *              of 0000-00-00 dates (cybot, boots) | ||||
|  *            - 2.0 complete rewrite for performance,   | ||||
|  *              added attributes month_names, *_id | ||||
|  * </pre> | ||||
|  *  | ||||
|  * @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date} | ||||
|  *      (Smarty online manual) | ||||
|  * @version 2.0 | ||||
|  * @author Andrei Zmievski  | ||||
|  * @author Monte Ohrt <monte at ohrt dot com>  | ||||
|  * @author Rodney Rehm | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string  | ||||
|  */ | ||||
| function smarty_function_html_select_date($params, $template) | ||||
| { | ||||
|     // generate timestamps used for month names only | ||||
|     static $_month_timestamps = null; | ||||
|     static $_current_year = null; | ||||
|     if ($_month_timestamps === null) { | ||||
|         $_current_year = date('Y'); | ||||
|         $_month_timestamps = array(); | ||||
|         for ($i = 1; $i <= 12; $i++) { | ||||
|             $_month_timestamps[$i] = mktime(0, 0, 0, $i, 1, 2000); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* Default values. */ | ||||
|     $prefix = "Date_"; | ||||
|     $start_year = null; | ||||
|     $end_year = null; | ||||
|     $display_days = true; | ||||
|     $display_months = true; | ||||
|     $display_years = true; | ||||
|     $month_format = "%B"; | ||||
|     /* Write months as numbers by default  GL */ | ||||
|     $month_value_format = "%m"; | ||||
|     $day_format = "%02d"; | ||||
|     /* Write day values using this format MB */ | ||||
|     $day_value_format = "%d"; | ||||
|     $year_as_text = false; | ||||
|     /* Display years in reverse order? Ie. 2000,1999,.... */ | ||||
|     $reverse_years = false; | ||||
|     /* Should the select boxes be part of an array when returned from PHP? | ||||
|        e.g. setting it to "birthday", would create "birthday[Day]", | ||||
|        "birthday[Month]" & "birthday[Year]". Can be combined with prefix */ | ||||
|     $field_array = null; | ||||
|     /* <select size>'s of the different <select> tags. | ||||
|        If not set, uses default dropdown. */ | ||||
|     $day_size = null; | ||||
|     $month_size = null; | ||||
|     $year_size = null; | ||||
|     /* Unparsed attributes common to *ALL* the <select>/<input> tags. | ||||
|        An example might be in the template: all_extra ='class ="foo"'. */ | ||||
|     $all_extra = null; | ||||
|     /* Separate attributes for the tags. */ | ||||
|     $day_extra = null; | ||||
|     $month_extra = null; | ||||
|     $year_extra = null; | ||||
|     /* Order in which to display the fields. | ||||
|        "D" -> day, "M" -> month, "Y" -> year. */ | ||||
|     $field_order = 'MDY'; | ||||
|     /* String printed between the different fields. */ | ||||
|     $field_separator = "\n"; | ||||
|     $option_separator = "\n"; | ||||
|     $time = null; | ||||
|     // $all_empty = null; | ||||
|     // $day_empty = null; | ||||
|     // $month_empty = null; | ||||
|     // $year_empty = null; | ||||
|     $extra_attrs = ''; | ||||
|     $all_id = null; | ||||
|     $day_id = null; | ||||
|     $month_id = null; | ||||
|     $year_id = null; | ||||
|  | ||||
|     foreach ($params as $_key => $_value) { | ||||
|         switch ($_key) { | ||||
|             case 'time': | ||||
|                 if (!is_array($_value) && $_value !== null) { | ||||
|                     $time = smarty_make_timestamp($_value); | ||||
|                 } | ||||
|                 break; | ||||
|                  | ||||
|             case 'month_names': | ||||
|                 if (is_array($_value) && count($_value) == 12) { | ||||
|                     $$_key = $_value; | ||||
|                 } else { | ||||
|                     trigger_error("html_select_date: month_names must be an array of 12 strings", E_USER_NOTICE); | ||||
|                 } | ||||
|                 break; | ||||
|                  | ||||
|             case 'prefix': | ||||
|             case 'field_array': | ||||
|             case 'start_year': | ||||
|             case 'end_year': | ||||
|             case 'day_format': | ||||
|             case 'day_value_format': | ||||
|             case 'month_format': | ||||
|             case 'month_value_format': | ||||
|             case 'day_size': | ||||
|             case 'month_size': | ||||
|             case 'year_size': | ||||
|             case 'all_extra': | ||||
|             case 'day_extra': | ||||
|             case 'month_extra': | ||||
|             case 'year_extra': | ||||
|             case 'field_order': | ||||
|             case 'field_separator': | ||||
|             case 'option_separator': | ||||
|             case 'all_empty': | ||||
|             case 'month_empty': | ||||
|             case 'day_empty': | ||||
|             case 'year_empty': | ||||
|             case 'all_id': | ||||
|             case 'month_id': | ||||
|             case 'day_id': | ||||
|             case 'year_id': | ||||
|                 $$_key = (string)$_value; | ||||
|                 break; | ||||
|  | ||||
|             case 'display_days': | ||||
|             case 'display_months': | ||||
|             case 'display_years': | ||||
|             case 'year_as_text': | ||||
|             case 'reverse_years': | ||||
|                 $$_key = (bool)$_value; | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 if (!is_array($_value)) { | ||||
|                     $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; | ||||
|                 } else { | ||||
|                     trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); | ||||
|                 }  | ||||
|                 break; | ||||
|         }  | ||||
|     } | ||||
|      | ||||
|     // Note: date() is faster than strftime() | ||||
|     // Note: explode(date()) is faster than date() date() date() | ||||
|     if (isset($params['time']) && is_array($params['time'])) { | ||||
|         if (isset($params['time'][$prefix . 'Year'])) { | ||||
|             // $_REQUEST[$field_array] given | ||||
|             foreach (array('Y' => 'Year',  'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { | ||||
|                 $_variableName = '_' . strtolower($_elementName); | ||||
|                 $$_variableName = isset($params['time'][$prefix . $_elementName]) | ||||
|                     ? $params['time'][$prefix . $_elementName] | ||||
|                     : date($_elementKey); | ||||
|             } | ||||
|             $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 { | ||||
|             // no date found, use NOW | ||||
|             list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); | ||||
|         } | ||||
|     } elseif ($time === null) { | ||||
|         if (array_key_exists('time', $params)) { | ||||
|             $_year = $_month = $_day = $time = null; | ||||
|         } else { | ||||
|             list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); | ||||
|         } | ||||
|     } else { | ||||
|         list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time)); | ||||
|     } | ||||
|  | ||||
|     // make syntax "+N" or "-N" work with $start_year and $end_year | ||||
|     // Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr | ||||
|     foreach (array('start', 'end') as $key) { | ||||
|         $key .= '_year'; | ||||
|         $t = $$key; | ||||
|         if ($t === null) { | ||||
|             $$key = (int)$_current_year; | ||||
|         } else if ($t[0] == '+') { | ||||
|             $$key = (int)($_current_year + trim(substr($t, 1))); | ||||
|         } else if ($t[0] == '-') { | ||||
|             $$key = (int)($_current_year - trim(substr($t, 1))); | ||||
|         } else { | ||||
|             $$key = (int)$$key; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // flip for ascending or descending | ||||
|     if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) { | ||||
|         $t = $end_year; | ||||
|         $end_year = $start_year; | ||||
|         $start_year = $t; | ||||
|     } | ||||
|  | ||||
|     // generate year <select> or <input> | ||||
|     if ($display_years) { | ||||
|         $_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) { | ||||
|             $_html_years = '<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra . $extra_attrs . ' />'; | ||||
|         } else { | ||||
|             $_html_years = '<select name="' . $_name . '"'; | ||||
|             if ($year_id !== null || $all_id !== null) { | ||||
|                 $_html_years .= ' id="' . smarty_function_escape_special_chars(  | ||||
|                     $year_id !== null ? ( $year_id ? $year_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )  | ||||
|                 ) . '"'; | ||||
|             } | ||||
|             if ($year_size) { | ||||
|                 $_html_years .= ' size="' . $year_size . '"'; | ||||
|             }  | ||||
|             $_html_years .= $_extra . $extra_attrs . '>' . $option_separator; | ||||
|              | ||||
|             if (isset($year_empty) || isset($all_empty)) { | ||||
|                 $_html_years .= '<option value="">' . ( isset($year_empty) ? $year_empty : $all_empty ) . '</option>' . $option_separator; | ||||
|             } | ||||
|              | ||||
|             $op = $start_year > $end_year ? -1 : 1; | ||||
|             for ($i=$start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) { | ||||
|                 $_html_years .= '<option value="' . $i . '"' | ||||
|                     . ($_year == $i ? ' selected="selected"' : '') | ||||
|                     . '>' . $i . '</option>' . $option_separator; | ||||
|             } | ||||
|              | ||||
|             $_html_years .= '</select>'; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     // generate month <select> or <input> | ||||
|     if ($display_months) { | ||||
|         $_html_month = ''; | ||||
|         $_extra = ''; | ||||
|         $_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month'); | ||||
|         if ($all_extra) { | ||||
|             $_extra .= ' ' . $all_extra; | ||||
|         }  | ||||
|         if ($month_extra) { | ||||
|             $_extra .= ' ' . $month_extra; | ||||
|         } | ||||
|          | ||||
|         $_html_months = '<select name="' . $_name . '"'; | ||||
|         if ($month_id !== null || $all_id !== null) { | ||||
|             $_html_months .= ' id="' . smarty_function_escape_special_chars(  | ||||
|                 $month_id !== null ? ( $month_id ? $month_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )  | ||||
|             ) . '"'; | ||||
|         } | ||||
|         if ($month_size) { | ||||
|             $_html_months .= ' size="' . $month_size . '"'; | ||||
|         }  | ||||
|         $_html_months .= $_extra . $extra_attrs . '>' . $option_separator; | ||||
|          | ||||
|         if (isset($month_empty) || isset($all_empty)) { | ||||
|             $_html_months .= '<option value="">' . ( isset($month_empty) ? $month_empty : $all_empty ) . '</option>' . $option_separator; | ||||
|         } | ||||
|          | ||||
|         for ($i = 1; $i <= 12; $i++) { | ||||
|             $_val = sprintf('%02d', $i); | ||||
|             $_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[$i]) : ($month_format == "%m" ? $_val : strftime($month_format, $_month_timestamps[$i])); | ||||
|             $_value = $month_value_format == "%m" ? $_val : strftime($month_value_format, $_month_timestamps[$i]); | ||||
|             $_html_months .= '<option value="' . $_value . '"' | ||||
|                 . ($_val == $_month ? ' selected="selected"' : '') | ||||
|                 . '>' . $_text . '</option>' . $option_separator; | ||||
|         } | ||||
|          | ||||
|         $_html_months .= '</select>'; | ||||
|     } | ||||
|      | ||||
|     // generate day <select> or <input> | ||||
|     if ($display_days) { | ||||
|         $_html_day = ''; | ||||
|         $_extra = ''; | ||||
|         $_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day'); | ||||
|         if ($all_extra) { | ||||
|             $_extra .= ' ' . $all_extra; | ||||
|         }  | ||||
|         if ($day_extra) { | ||||
|             $_extra .= ' ' . $day_extra; | ||||
|         } | ||||
|          | ||||
|         $_html_days = '<select name="' . $_name . '"'; | ||||
|         if ($day_id !== null || $all_id !== null) { | ||||
|             $_html_days .= ' id="' . smarty_function_escape_special_chars(  | ||||
|                 $day_id !== null ? ( $day_id ? $day_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )  | ||||
|             ) . '"'; | ||||
|         } | ||||
|         if ($day_size) { | ||||
|             $_html_days .= ' size="' . $day_size . '"'; | ||||
|         }  | ||||
|         $_html_days .= $_extra . $extra_attrs . '>' . $option_separator; | ||||
|          | ||||
|         if (isset($day_empty) || isset($all_empty)) { | ||||
|             $_html_days .= '<option value="">' . ( isset($day_empty) ? $day_empty : $all_empty ) . '</option>' . $option_separator; | ||||
|         } | ||||
|          | ||||
|         for ($i = 1; $i <= 31; $i++) { | ||||
|             $_val = sprintf('%02d', $i); | ||||
|             $_text = $day_format == '%02d' ? $_val : sprintf($day_format, $i); | ||||
|             $_value = $day_value_format ==  '%02d' ? $_val : sprintf($day_value_format, $i); | ||||
|             $_html_days .= '<option value="' . $_value . '"' | ||||
|                 . ($_val == $_day ? ' selected="selected"' : '') | ||||
|                 . '>' . $_text . '</option>' . $option_separator; | ||||
|         } | ||||
|          | ||||
|         $_html_days .= '</select>'; | ||||
|     } | ||||
|  | ||||
|     // order the fields for output | ||||
|     $_html = ''; | ||||
|     for ($i=0; $i <= 2; $i++) { | ||||
|         switch ($field_order[$i]) { | ||||
|             case 'Y': | ||||
|             case 'y': | ||||
|                 if (isset($_html_years)) { | ||||
|                     if ($_html) { | ||||
|                         $_html .= $field_separator; | ||||
|                     } | ||||
|                     $_html .= $_html_years; | ||||
|                 } | ||||
|             break; | ||||
|              | ||||
|             case 'm': | ||||
|             case 'M': | ||||
|                 if (isset($_html_months)) { | ||||
|                     if ($_html) { | ||||
|                         $_html .= $field_separator; | ||||
|                     } | ||||
|                     $_html .= $_html_months; | ||||
|                 } | ||||
|             break; | ||||
|              | ||||
|             case 'd': | ||||
|             case 'D': | ||||
|                 if (isset($_html_days)) { | ||||
|                     if ($_html) { | ||||
|                         $_html .= $field_separator; | ||||
|                     } | ||||
|                     $_html .= $_html_days; | ||||
|                 } | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|     return $_html; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										366
									
								
								library/Smarty/libs/plugins/function.html_select_time.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										366
									
								
								library/Smarty/libs/plugins/function.html_select_time.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,366 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @ignore | ||||
|  */ | ||||
| require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); | ||||
| /** | ||||
|  * @ignore | ||||
|  */ | ||||
| require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); | ||||
|  | ||||
| /** | ||||
|  * Smarty {html_select_time} function plugin | ||||
|  * | ||||
|  * Type:     function<br> | ||||
|  * Name:     html_select_time<br> | ||||
|  * Purpose:  Prints the dropdowns for time selection | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time} | ||||
|  *          (Smarty online manual) | ||||
|  * @author Roberto Berto <roberto@berto.net> | ||||
|  * @author Monte Ohrt <monte AT ohrt DOT com> | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string | ||||
|  * @uses smarty_make_timestamp() | ||||
|  */ | ||||
| function smarty_function_html_select_time($params, $template) | ||||
| { | ||||
|     $prefix = "Time_"; | ||||
|     $field_array = null; | ||||
|     $field_separator = "\n"; | ||||
|     $option_separator = "\n"; | ||||
|     $time = null; | ||||
|  | ||||
|     $display_hours = true; | ||||
|     $display_minutes = true; | ||||
|     $display_seconds = true; | ||||
|     $display_meridian = true; | ||||
|  | ||||
|     $hour_format = '%02d'; | ||||
|     $hour_value_format = '%02d'; | ||||
|     $minute_format = '%02d'; | ||||
|     $minute_value_format = '%02d'; | ||||
|     $second_format = '%02d'; | ||||
|     $second_value_format = '%02d'; | ||||
|  | ||||
|     $hour_size = null; | ||||
|     $minute_size = null; | ||||
|     $second_size = null; | ||||
|     $meridian_size = null; | ||||
|  | ||||
|     $all_empty = null; | ||||
|     $hour_empty = null; | ||||
|     $minute_empty = null; | ||||
|     $second_empty = null; | ||||
|     $meridian_empty = null; | ||||
|  | ||||
|     $all_id = null; | ||||
|     $hour_id = null; | ||||
|     $minute_id = null; | ||||
|     $second_id = null; | ||||
|     $meridian_id = null; | ||||
|  | ||||
|     $use_24_hours = true; | ||||
|     $minute_interval = 1; | ||||
|     $second_interval = 1; | ||||
|  | ||||
|     $extra_attrs = ''; | ||||
|     $all_extra = null; | ||||
|     $hour_extra = null; | ||||
|     $minute_extra = null; | ||||
|     $second_extra = null; | ||||
|     $meridian_extra = null; | ||||
|  | ||||
|     foreach ($params as $_key => $_value) { | ||||
|         switch ($_key) { | ||||
|             case 'time': | ||||
|                 if (!is_array($_value) && $_value !== null) { | ||||
|                     $time = smarty_make_timestamp($_value); | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|             case 'prefix': | ||||
|             case 'field_array': | ||||
|  | ||||
|             case 'field_separator': | ||||
|             case 'option_separator': | ||||
|  | ||||
|             case 'all_extra': | ||||
|             case 'hour_extra': | ||||
|             case 'minute_extra': | ||||
|             case 'second_extra': | ||||
|             case 'meridian_extra': | ||||
|  | ||||
|             case 'all_empty': | ||||
|             case 'hour_empty': | ||||
|             case 'minute_empty': | ||||
|             case 'second_empty': | ||||
|             case 'meridian_empty': | ||||
|  | ||||
|             case 'all_id': | ||||
|             case 'hour_id': | ||||
|             case 'minute_id': | ||||
|             case 'second_id': | ||||
|             case 'meridian_id': | ||||
|  | ||||
|             case 'hour_format': | ||||
|             case 'hour_value_format': | ||||
|             case 'minute_format': | ||||
|             case 'minute_value_format': | ||||
|             case 'second_format': | ||||
|             case 'second_value_format': | ||||
|                 $$_key = (string)$_value; | ||||
|                 break; | ||||
|  | ||||
|             case 'display_hours': | ||||
|             case 'display_minutes': | ||||
|             case 'display_seconds': | ||||
|             case 'display_meridian': | ||||
|             case 'use_24_hours': | ||||
|                 $$_key = (bool)$_value; | ||||
|                 break; | ||||
|  | ||||
|             case 'minute_interval': | ||||
|             case 'second_interval': | ||||
|  | ||||
|             case 'hour_size': | ||||
|             case 'minute_size': | ||||
|             case 'second_size': | ||||
|             case 'meridian_size': | ||||
|                 $$_key = (int)$_value; | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 if (!is_array($_value)) { | ||||
|                     $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; | ||||
|                 } else { | ||||
|                     trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); | ||||
|                 } | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (isset($params['time']) && is_array($params['time'])) { | ||||
|         if (isset($params['time'][$prefix . 'Hour'])) { | ||||
|             // $_REQUEST[$field_array] given | ||||
|             foreach (array('H' => 'Hour',  'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { | ||||
|                 $_variableName = '_' . strtolower($_elementName); | ||||
|                 $$_variableName = isset($params['time'][$prefix . $_elementName]) | ||||
|                     ? $params['time'][$prefix . $_elementName] | ||||
|                     : date($_elementKey); | ||||
|             } | ||||
|             $_meridian = isset($params['time'][$prefix . 'Meridian']) | ||||
|                 ? (' ' . $params['time'][$prefix . 'Meridian']) | ||||
|                 : ''; | ||||
|             $time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian ); | ||||
|             list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); | ||||
|         } elseif (isset($params['time'][$field_array][$prefix . 'Hour'])) { | ||||
|             // $_REQUEST given | ||||
|             foreach (array('H' => 'Hour',  'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { | ||||
|                 $_variableName = '_' . strtolower($_elementName); | ||||
|                 $$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) | ||||
|                     ? $params['time'][$field_array][$prefix . $_elementName] | ||||
|                     : date($_elementKey); | ||||
|             } | ||||
|             $_meridian = isset($params['time'][$field_array][$prefix . 'Meridian']) | ||||
|                 ? (' ' . $params['time'][$field_array][$prefix . 'Meridian']) | ||||
|                 : ''; | ||||
|             $time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian ); | ||||
|             list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); | ||||
|         } else { | ||||
|             // no date found, use NOW | ||||
|             list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); | ||||
|         } | ||||
|     } elseif ($time === null) { | ||||
|         if (array_key_exists('time', $params)) { | ||||
|             $_hour = $_minute = $_second = $time = null; | ||||
|         } else { | ||||
|             list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s')); | ||||
|         } | ||||
|     } else { | ||||
|         list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); | ||||
|     } | ||||
|  | ||||
|     // generate hour <select> | ||||
|     if ($display_hours) { | ||||
|         $_html_hours = ''; | ||||
|         $_extra = ''; | ||||
|         $_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour'); | ||||
|         if ($all_extra) { | ||||
|             $_extra .= ' ' . $all_extra; | ||||
|         } | ||||
|         if ($hour_extra) { | ||||
|             $_extra .= ' ' . $hour_extra; | ||||
|         } | ||||
|  | ||||
|         $_html_hours = '<select name="' . $_name . '"'; | ||||
|         if ($hour_id !== null || $all_id !== null) { | ||||
|             $_html_hours .= ' id="' . smarty_function_escape_special_chars( | ||||
|                 $hour_id !== null ? ( $hour_id ? $hour_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) | ||||
|             ) . '"'; | ||||
|         } | ||||
|         if ($hour_size) { | ||||
|             $_html_hours .= ' size="' . $hour_size . '"'; | ||||
|         } | ||||
|         $_html_hours .= $_extra . $extra_attrs . '>' . $option_separator; | ||||
|  | ||||
|         if (isset($hour_empty) || isset($all_empty)) { | ||||
|             $_html_hours .= '<option value="">' . ( isset($hour_empty) ? $hour_empty : $all_empty ) . '</option>' . $option_separator; | ||||
|         } | ||||
|  | ||||
|         $start = $use_24_hours ? 0 : 1; | ||||
|         $end = $use_24_hours ? 23 : 12; | ||||
|         for ($i=$start; $i <= $end; $i++) { | ||||
|             $_val = sprintf('%02d', $i); | ||||
|             $_text = $hour_format == '%02d' ? $_val : sprintf($hour_format, $i); | ||||
|             $_value = $hour_value_format == '%02d' ? $_val : sprintf($hour_value_format, $i); | ||||
|  | ||||
|             if (!$use_24_hours) { | ||||
|                 $_hour12 = $_hour == 0 | ||||
|                     ? 12 | ||||
|                     : ($_hour <= 12 ? $_hour : $_hour -12); | ||||
|             } | ||||
|  | ||||
|             $selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null; | ||||
|             $_html_hours .= '<option value="' . $_value . '"' | ||||
|                 . ($selected ? ' selected="selected"' : '') | ||||
|                 . '>' . $_text . '</option>' . $option_separator; | ||||
|         } | ||||
|  | ||||
|         $_html_hours .= '</select>'; | ||||
|     } | ||||
|  | ||||
|     // generate minute <select> | ||||
|     if ($display_minutes) { | ||||
|         $_html_minutes = ''; | ||||
|         $_extra = ''; | ||||
|         $_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute'); | ||||
|         if ($all_extra) { | ||||
|             $_extra .= ' ' . $all_extra; | ||||
|         } | ||||
|         if ($minute_extra) { | ||||
|             $_extra .= ' ' . $minute_extra; | ||||
|         } | ||||
|  | ||||
|         $_html_minutes = '<select name="' . $_name . '"'; | ||||
|         if ($minute_id !== null || $all_id !== null) { | ||||
|             $_html_minutes .= ' id="' . smarty_function_escape_special_chars( | ||||
|                 $minute_id !== null ? ( $minute_id ? $minute_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) | ||||
|             ) . '"'; | ||||
|         } | ||||
|         if ($minute_size) { | ||||
|             $_html_minutes .= ' size="' . $minute_size . '"'; | ||||
|         } | ||||
|         $_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator; | ||||
|  | ||||
|         if (isset($minute_empty) || isset($all_empty)) { | ||||
|             $_html_minutes .= '<option value="">' . ( isset($minute_empty) ? $minute_empty : $all_empty ) . '</option>' . $option_separator; | ||||
|         } | ||||
|  | ||||
|         $selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null; | ||||
|         for ($i=0; $i <= 59; $i += $minute_interval) { | ||||
|             $_val = sprintf('%02d', $i); | ||||
|             $_text = $minute_format == '%02d' ? $_val : sprintf($minute_format, $i); | ||||
|             $_value = $minute_value_format == '%02d' ? $_val : sprintf($minute_value_format, $i); | ||||
|             $_html_minutes .= '<option value="' . $_value . '"' | ||||
|                 . ($selected === $i ? ' selected="selected"' : '') | ||||
|                 . '>' . $_text . '</option>' . $option_separator; | ||||
|         } | ||||
|  | ||||
|         $_html_minutes .= '</select>'; | ||||
|     } | ||||
|  | ||||
|     // generate second <select> | ||||
|     if ($display_seconds) { | ||||
|         $_html_seconds = ''; | ||||
|         $_extra = ''; | ||||
|         $_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second'); | ||||
|         if ($all_extra) { | ||||
|             $_extra .= ' ' . $all_extra; | ||||
|         } | ||||
|         if ($second_extra) { | ||||
|             $_extra .= ' ' . $second_extra; | ||||
|         } | ||||
|  | ||||
|         $_html_seconds = '<select name="' . $_name . '"'; | ||||
|         if ($second_id !== null || $all_id !== null) { | ||||
|             $_html_seconds .= ' id="' . smarty_function_escape_special_chars( | ||||
|                 $second_id !== null ? ( $second_id ? $second_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) | ||||
|             ) . '"'; | ||||
|         } | ||||
|         if ($second_size) { | ||||
|             $_html_seconds .= ' size="' . $second_size . '"'; | ||||
|         } | ||||
|         $_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator; | ||||
|  | ||||
|         if (isset($second_empty) || isset($all_empty)) { | ||||
|             $_html_seconds .= '<option value="">' . ( isset($second_empty) ? $second_empty : $all_empty ) . '</option>' . $option_separator; | ||||
|         } | ||||
|  | ||||
|         $selected = $_second !== null ? ($_second - $_second % $second_interval) : null; | ||||
|         for ($i=0; $i <= 59; $i += $second_interval) { | ||||
|             $_val = sprintf('%02d', $i); | ||||
|             $_text = $second_format == '%02d' ? $_val : sprintf($second_format, $i); | ||||
|             $_value = $second_value_format == '%02d' ? $_val : sprintf($second_value_format, $i); | ||||
|             $_html_seconds .= '<option value="' . $_value . '"' | ||||
|                 . ($selected === $i ? ' selected="selected"' : '') | ||||
|                 . '>' . $_text . '</option>' . $option_separator; | ||||
|         } | ||||
|  | ||||
|         $_html_seconds .= '</select>'; | ||||
|     } | ||||
|  | ||||
|     // generate meridian <select> | ||||
|     if ($display_meridian && !$use_24_hours) { | ||||
|         $_html_meridian = ''; | ||||
|         $_extra = ''; | ||||
|         $_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian'); | ||||
|         if ($all_extra) { | ||||
|             $_extra .= ' ' . $all_extra; | ||||
|         } | ||||
|         if ($meridian_extra) { | ||||
|             $_extra .= ' ' . $meridian_extra; | ||||
|         } | ||||
|  | ||||
|         $_html_meridian = '<select name="' . $_name . '"'; | ||||
|         if ($meridian_id !== null || $all_id !== null) { | ||||
|             $_html_meridian .= ' id="' . smarty_function_escape_special_chars( | ||||
|                 $meridian_id !== null ? ( $meridian_id ? $meridian_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) | ||||
|             ) . '"'; | ||||
|         } | ||||
|         if ($meridian_size) { | ||||
|             $_html_meridian .= ' size="' . $meridian_size . '"'; | ||||
|         } | ||||
|         $_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator; | ||||
|  | ||||
|         if (isset($meridian_empty) || isset($all_empty)) { | ||||
|             $_html_meridian .= '<option value="">' . ( isset($meridian_empty) ? $meridian_empty : $all_empty ) . '</option>' . $option_separator; | ||||
|         } | ||||
|  | ||||
|         $_html_meridian .= '<option value="am"'. ($_hour < 12 ? ' selected="selected"' : '') .'>AM</option>' . $option_separator | ||||
|             . '<option value="pm"'. ($_hour < 12 ? '' : ' selected="selected"') .'>PM</option>' . $option_separator | ||||
|             . '</select>'; | ||||
|     } | ||||
|  | ||||
|     $_html = ''; | ||||
|     foreach (array('_html_hours', '_html_minutes', '_html_seconds', '_html_meridian') as $k) { | ||||
|         if (isset($$k)) { | ||||
|             if ($_html) { | ||||
|                 $_html .= $field_separator; | ||||
|             } | ||||
|             $_html .= $$k; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return $_html; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										177
									
								
								library/Smarty/libs/plugins/function.html_table.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								library/Smarty/libs/plugins/function.html_table.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {html_table} function plugin | ||||
|  * | ||||
|  * Type:     function<br> | ||||
|  * Name:     html_table<br> | ||||
|  * Date:     Feb 17, 2003<br> | ||||
|  * Purpose:  make an html table from an array of data<br> | ||||
|  * Params: | ||||
|  * <pre> | ||||
|  * - loop       - array to loop through | ||||
|  * - cols       - number of columns, comma separated list of column names | ||||
|  *                or array of column names | ||||
|  * - rows       - number of rows | ||||
|  * - table_attr - table attributes | ||||
|  * - th_attr    - table heading attributes (arrays are cycled) | ||||
|  * - tr_attr    - table row attributes (arrays are cycled) | ||||
|  * - td_attr    - table cell attributes (arrays are cycled) | ||||
|  * - trailpad   - value to pad trailing cells with | ||||
|  * - caption    - text for caption element | ||||
|  * - vdir       - vertical direction (default: "down", means top-to-bottom) | ||||
|  * - hdir       - horizontal direction (default: "right", means left-to-right) | ||||
|  * - inner      - inner loop (default "cols": print $loop line by line, | ||||
|  *                $loop will be printed column by column otherwise) | ||||
|  * </pre> | ||||
|  * Examples: | ||||
|  * <pre> | ||||
|  * {table loop=$data} | ||||
|  * {table loop=$data cols=4 tr_attr='"bgcolor=red"'} | ||||
|  * {table loop=$data cols="first,second,third" tr_attr=$colors} | ||||
|  * </pre> | ||||
|  * | ||||
|  * @author Monte Ohrt <monte at ohrt dot com> | ||||
|  * @author credit to Messju Mohr <messju at lammfellpuschen dot de> | ||||
|  * @author credit to boots <boots dot smarty at yahoo dot com> | ||||
|  * @version 1.1 | ||||
|  * @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table} | ||||
|  *          (Smarty online manual) | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string | ||||
|  */ | ||||
| function smarty_function_html_table($params, $template) | ||||
| { | ||||
|     $table_attr = 'border="1"'; | ||||
|     $tr_attr = ''; | ||||
|     $th_attr = ''; | ||||
|     $td_attr = ''; | ||||
|     $cols = $cols_count = 3; | ||||
|     $rows = 3; | ||||
|     $trailpad = ' '; | ||||
|     $vdir = 'down'; | ||||
|     $hdir = 'right'; | ||||
|     $inner = 'cols'; | ||||
|     $caption = ''; | ||||
|     $loop = null; | ||||
|  | ||||
|     if (!isset($params['loop'])) { | ||||
|         trigger_error("html_table: missing 'loop' parameter",E_USER_WARNING); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     foreach ($params as $_key => $_value) { | ||||
|         switch ($_key) { | ||||
|             case 'loop': | ||||
|                 $$_key = (array)$_value; | ||||
|                 break; | ||||
|  | ||||
|             case 'cols': | ||||
|                 if (is_array($_value) && !empty($_value)) { | ||||
|                     $cols = $_value; | ||||
|                     $cols_count = count($_value); | ||||
|                 } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) { | ||||
|                     $cols = explode(',', $_value); | ||||
|                     $cols_count = count($cols); | ||||
|                 } elseif (!empty($_value)) { | ||||
|                     $cols_count = (int)$_value; | ||||
|                 } else { | ||||
|                     $cols_count = $cols; | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|             case 'rows': | ||||
|                 $$_key = (int)$_value; | ||||
|                 break; | ||||
|  | ||||
|             case 'table_attr': | ||||
|             case 'trailpad': | ||||
|             case 'hdir': | ||||
|             case 'vdir': | ||||
|             case 'inner': | ||||
|             case 'caption': | ||||
|                 $$_key = (string)$_value; | ||||
|                 break; | ||||
|  | ||||
|             case 'tr_attr': | ||||
|             case 'td_attr': | ||||
|             case 'th_attr': | ||||
|                 $$_key = $_value; | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     $loop_count = count($loop); | ||||
|     if (empty($params['rows'])) { | ||||
|         /* no rows specified */ | ||||
|         $rows = ceil($loop_count / $cols_count); | ||||
|     } elseif (empty($params['cols'])) { | ||||
|         if (!empty($params['rows'])) { | ||||
|             /* no cols specified, but rows */ | ||||
|             $cols_count = ceil($loop_count / $rows); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     $output = "<table $table_attr>\n"; | ||||
|  | ||||
|     if (!empty($caption)) { | ||||
|         $output .= '<caption>' . $caption . "</caption>\n"; | ||||
|     } | ||||
|  | ||||
|     if (is_array($cols)) { | ||||
|         $cols = ($hdir == 'right') ? $cols : array_reverse($cols); | ||||
|         $output .= "<thead><tr>\n"; | ||||
|  | ||||
|         for ($r = 0; $r < $cols_count; $r++) { | ||||
|             $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>'; | ||||
|             $output .= $cols[$r]; | ||||
|             $output .= "</th>\n"; | ||||
|         } | ||||
|         $output .= "</tr></thead>\n"; | ||||
|     } | ||||
|  | ||||
|     $output .= "<tbody>\n"; | ||||
|     for ($r = 0; $r < $rows; $r++) { | ||||
|         $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n"; | ||||
|         $rx = ($vdir == 'down') ? $r * $cols_count : ($rows-1 - $r) * $cols_count; | ||||
|  | ||||
|         for ($c = 0; $c < $cols_count; $c++) { | ||||
|             $x = ($hdir == 'right') ? $rx + $c : $rx + $cols_count-1 - $c; | ||||
|             if ($inner != 'cols') { | ||||
|                 /* shuffle x to loop over rows*/ | ||||
|                 $x = floor($x / $cols_count) + ($x % $cols_count) * $rows; | ||||
|             } | ||||
|  | ||||
|             if ($x < $loop_count) { | ||||
|                 $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n"; | ||||
|             } else { | ||||
|                 $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n"; | ||||
|             } | ||||
|         } | ||||
|         $output .= "</tr>\n"; | ||||
|     } | ||||
|     $output .= "</tbody>\n"; | ||||
|     $output .= "</table>\n"; | ||||
|  | ||||
|     return $output; | ||||
| } | ||||
|  | ||||
| function smarty_function_html_table_cycle($name, $var, $no) | ||||
| { | ||||
|     if (!is_array($var)) { | ||||
|         $ret = $var; | ||||
|     } else { | ||||
|         $ret = $var[$no % count($var)]; | ||||
|     } | ||||
|  | ||||
|     return ($ret) ? ' ' . $ret : ''; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										152
									
								
								library/Smarty/libs/plugins/function.mailto.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								library/Smarty/libs/plugins/function.mailto.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,152 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {mailto} function plugin | ||||
|  * | ||||
|  * Type:     function<br> | ||||
|  * Name:     mailto<br> | ||||
|  * Date:     May 21, 2002 | ||||
|  * Purpose:  automate mailto address link creation, and optionally encode them.<br> | ||||
|  * Params: | ||||
|  * <pre> | ||||
|  * - address    - (required) - e-mail address | ||||
|  * - text       - (optional) - text to display, default is address | ||||
|  * - encode     - (optional) - can be one of: | ||||
|  *                             * none : no encoding (default) | ||||
|  *                             * javascript : encode with javascript | ||||
|  *                             * javascript_charcode : encode with javascript charcode | ||||
|  *                             * hex : encode with hexidecimal (no javascript) | ||||
|  * - cc         - (optional) - address(es) to carbon copy | ||||
|  * - bcc        - (optional) - address(es) to blind carbon copy | ||||
|  * - subject    - (optional) - e-mail subject | ||||
|  * - newsgroups - (optional) - newsgroup(s) to post to | ||||
|  * - followupto - (optional) - address(es) to follow up to | ||||
|  * - extra      - (optional) - extra tags for the href link | ||||
|  * </pre> | ||||
|  * Examples: | ||||
|  * <pre> | ||||
|  * {mailto address="me@domain.com"} | ||||
|  * {mailto address="me@domain.com" encode="javascript"} | ||||
|  * {mailto address="me@domain.com" encode="hex"} | ||||
|  * {mailto address="me@domain.com" subject="Hello to you!"} | ||||
|  * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"} | ||||
|  * {mailto address="me@domain.com" extra='class="mailto"'} | ||||
|  * </pre> | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto} | ||||
|  *          (Smarty online manual) | ||||
|  * @version 1.2 | ||||
|  * @author Monte Ohrt <monte at ohrt dot com> | ||||
|  * @author credits to Jason Sweat (added cc, bcc and subject functionality) | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string | ||||
|  */ | ||||
| function smarty_function_mailto($params, $template) | ||||
| { | ||||
|     static $_allowed_encoding = array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true); | ||||
|     $extra = ''; | ||||
|  | ||||
|     if (empty($params['address'])) { | ||||
|         trigger_error("mailto: missing 'address' parameter",E_USER_WARNING); | ||||
|         return; | ||||
|     } else { | ||||
|         $address = $params['address']; | ||||
|     } | ||||
|  | ||||
|     $text = $address; | ||||
|     // netscape and mozilla do not decode %40 (@) in BCC field (bug?) | ||||
|     // so, don't encode it. | ||||
|     $search = array('%40', '%2C'); | ||||
|     $replace = array('@', ','); | ||||
|     $mail_parms = array(); | ||||
|     foreach ($params as $var => $value) { | ||||
|         switch ($var) { | ||||
|             case 'cc': | ||||
|             case 'bcc': | ||||
|             case 'followupto': | ||||
|                 if (!empty($value)) | ||||
|                     $mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value)); | ||||
|                 break; | ||||
|  | ||||
|             case 'subject': | ||||
|             case 'newsgroups': | ||||
|                 $mail_parms[] = $var . '=' . rawurlencode($value); | ||||
|                 break; | ||||
|  | ||||
|             case 'extra': | ||||
|             case 'text': | ||||
|                 $$var = $value; | ||||
|  | ||||
|             default: | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if ($mail_parms) { | ||||
|         $address .= '?' . join('&', $mail_parms); | ||||
|     } | ||||
|      | ||||
|     $encode = (empty($params['encode'])) ? 'none' : $params['encode']; | ||||
|     if (!isset($_allowed_encoding[$encode])) { | ||||
|         trigger_error("mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex", E_USER_WARNING); | ||||
|         return; | ||||
|     } | ||||
|     // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed! | ||||
|     if ($encode == 'javascript') { | ||||
|         $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');'; | ||||
|  | ||||
|         $js_encode = ''; | ||||
|         for ($x = 0, $_length = strlen($string); $x < $_length; $x++) { | ||||
|             $js_encode .= '%' . bin2hex($string[$x]); | ||||
|         } | ||||
|  | ||||
|         return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>'; | ||||
|     } elseif ($encode == 'javascript_charcode') { | ||||
|         $string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; | ||||
|  | ||||
|         for($x = 0, $y = strlen($string); $x < $y; $x++) { | ||||
|             $ord[] = ord($string[$x]); | ||||
|         } | ||||
|  | ||||
|         $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" | ||||
|             . "{document.write(String.fromCharCode(" | ||||
|             . implode(',', $ord) | ||||
|             . "))" | ||||
|             . "}\n" | ||||
|             . "</script>\n"; | ||||
|  | ||||
|         return $_ret; | ||||
|     } elseif ($encode == 'hex') { | ||||
|         preg_match('!^(.*)(\?.*)$!', $address, $match); | ||||
|         if (!empty($match[2])) { | ||||
|             trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.",E_USER_WARNING); | ||||
|             return; | ||||
|         } | ||||
|         $address_encode = ''; | ||||
|         for ($x = 0, $_length = strlen($address); $x < $_length; $x++) { | ||||
|             if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[$x])) { | ||||
|                 $address_encode .= '%' . bin2hex($address[$x]); | ||||
|             } else { | ||||
|                 $address_encode .= $address[$x]; | ||||
|             } | ||||
|         } | ||||
|         $text_encode = ''; | ||||
|         for ($x = 0, $_length = strlen($text); $x < $_length; $x++) { | ||||
|             $text_encode .= '&#x' . bin2hex($text[$x]) . ';'; | ||||
|         } | ||||
|  | ||||
|         $mailto = "mailto:"; | ||||
|         return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>'; | ||||
|     } else { | ||||
|         // no encoding | ||||
|         return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; | ||||
|     } | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										87
									
								
								library/Smarty/libs/plugins/function.math.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								library/Smarty/libs/plugins/function.math.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * This plugin is only for Smarty2 BC | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFunction | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty {math} function plugin | ||||
|  * | ||||
|  * Type:     function<br> | ||||
|  * Name:     math<br> | ||||
|  * Purpose:  handle math computations in template | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.function.math.php {math} | ||||
|  *          (Smarty online manual) | ||||
|  * @author   Monte Ohrt <monte at ohrt dot com> | ||||
|  * @param array                    $params   parameters | ||||
|  * @param Smarty_Internal_Template $template template object | ||||
|  * @return string|null | ||||
|  */ | ||||
| function smarty_function_math($params, $template) | ||||
| { | ||||
|     static $_allowed_funcs = array( | ||||
|         'int' => true, 'abs' => true, 'ceil' => true, 'cos' => true, 'exp' => true, 'floor' => true, | ||||
|         'log' => true, 'log10' => true, 'max' => true, 'min' => true, 'pi' => true, 'pow' => true, | ||||
|         'rand' => true, 'round' => true, 'sin' => true, 'sqrt' => true, 'srand' => true ,'tan' => true | ||||
|     ); | ||||
|     // be sure equation parameter is present | ||||
|     if (empty($params['equation'])) { | ||||
|         trigger_error("math: missing equation parameter",E_USER_WARNING); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     $equation = $params['equation']; | ||||
|  | ||||
|     // make sure parenthesis are balanced | ||||
|     if (substr_count($equation,"(") != substr_count($equation,")")) { | ||||
|         trigger_error("math: unbalanced parenthesis",E_USER_WARNING); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     // match all vars in equation, make sure all are passed | ||||
|     preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match); | ||||
|  | ||||
|     foreach($match[1] as $curr_var) { | ||||
|         if ($curr_var && !isset($params[$curr_var]) && !isset($_allowed_funcs[$curr_var])) { | ||||
|             trigger_error("math: function call $curr_var not allowed",E_USER_WARNING); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     foreach($params as $key => $val) { | ||||
|         if ($key != "equation" && $key != "format" && $key != "assign") { | ||||
|             // make sure value is not empty | ||||
|             if (strlen($val)==0) { | ||||
|                 trigger_error("math: parameter $key is empty",E_USER_WARNING); | ||||
|                 return; | ||||
|             } | ||||
|             if (!is_numeric($val)) { | ||||
|                 trigger_error("math: parameter $key: is not numeric",E_USER_WARNING); | ||||
|                 return; | ||||
|             } | ||||
|             $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation); | ||||
|         } | ||||
|     } | ||||
|     $smarty_math_result = null; | ||||
|     eval("\$smarty_math_result = ".$equation.";"); | ||||
|  | ||||
|     if (empty($params['format'])) { | ||||
|         if (empty($params['assign'])) { | ||||
|             return $smarty_math_result; | ||||
|         } else { | ||||
|             $template->assign($params['assign'],$smarty_math_result); | ||||
|         } | ||||
|     } else { | ||||
|         if (empty($params['assign'])){ | ||||
|             printf($params['format'],$smarty_math_result); | ||||
|         } else { | ||||
|             $template->assign($params['assign'],sprintf($params['format'],$smarty_math_result)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										65
									
								
								library/Smarty/libs/plugins/modifier.capitalize.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								library/Smarty/libs/plugins/modifier.capitalize.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  *  | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifier | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty capitalize modifier plugin | ||||
|  *  | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     capitalize<br> | ||||
|  * Purpose:  capitalize words in the string | ||||
|  * | ||||
|  * {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }} | ||||
|  * | ||||
|  * @param string  $string    string to capitalize | ||||
|  * @param boolean $uc_digits also capitalize "x123" to "X123" | ||||
|  * @param boolean $lc_rest   capitalize first letters, lowercase all following letters "aAa" to "Aaa" | ||||
|  * @return string capitalized string | ||||
|  * @author Monte Ohrt <monte at ohrt dot com>  | ||||
|  * @author Rodney Rehm | ||||
|  */ | ||||
| function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false) | ||||
| { | ||||
|     if (Smarty::$_MBSTRING) { | ||||
|         if ($lc_rest) { | ||||
|             // uppercase (including hyphenated words) | ||||
|             $upper_string = mb_convert_case( $string, MB_CASE_TITLE, Smarty::$_CHARSET ); | ||||
|         } else { | ||||
|             // uppercase word breaks | ||||
|             $upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!eS" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').mb_convert_case(stripslashes('\\2'),MB_CASE_UPPER, '" . addslashes(Smarty::$_CHARSET) . "')", $string); | ||||
|         } | ||||
|         // check uc_digits case | ||||
|         if (!$uc_digits) { | ||||
|             if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) { | ||||
|                 foreach($matches[1] as $match) { | ||||
|                     $upper_string = substr_replace($upper_string, mb_strtolower($match[0], Smarty::$_CHARSET), $match[1], strlen($match[0])); | ||||
|                 } | ||||
|             }  | ||||
|         } | ||||
|         $upper_string = preg_replace("!((^|\s)['\"])(\w)!e" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').mb_convert_case(stripslashes('\\3'),MB_CASE_UPPER, '" . addslashes(Smarty::$_CHARSET) . "')", $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}])!eS" . Smarty::$_UTF8_MODIFIER, "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!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) { | ||||
|             foreach($matches[1] as $match) { | ||||
|                 $upper_string = substr_replace($upper_string, strtolower($match[0]), $match[1], strlen($match[0])); | ||||
|             } | ||||
|         }  | ||||
|     } | ||||
|     $upper_string = preg_replace("!((^|\s)['\"])(\w)!e" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').strtoupper(stripslashes('\\3'))", $upper_string); | ||||
|     return $upper_string; | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										65
									
								
								library/Smarty/libs/plugins/modifier.date_format.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								library/Smarty/libs/plugins/modifier.date_format.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  *  | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifier | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty date_format modifier plugin | ||||
|  *  | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     date_format<br> | ||||
|  * Purpose:  format datestamps via strftime<br> | ||||
|  * Input:<br> | ||||
|  *          - string: input date string | ||||
|  *          - format: strftime format for output | ||||
|  *          - default_date: default date if $string is empty | ||||
|  *  | ||||
|  * @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual) | ||||
|  * @author Monte Ohrt <monte at ohrt dot com>  | ||||
|  * @param string $string       input date string | ||||
|  * @param string $format       strftime format for output | ||||
|  * @param string $default_date default date if $string is empty | ||||
|  * @param string $formatter    either 'strftime' or 'auto' | ||||
|  * @return string |void | ||||
|  * @uses smarty_make_timestamp() | ||||
|  */ | ||||
| function smarty_modifier_date_format($string, $format=null, $default_date='', $formatter='auto') | ||||
| { | ||||
|     if ($format === null) { | ||||
|         $format = Smarty::$_DATE_FORMAT; | ||||
|     } | ||||
|     /** | ||||
|     * Include the {@link shared.make_timestamp.php} plugin | ||||
|     */ | ||||
|     require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); | ||||
|     if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') { | ||||
|         $timestamp = smarty_make_timestamp($string); | ||||
|     } elseif ($default_date != '') { | ||||
|         $timestamp = smarty_make_timestamp($default_date); | ||||
|     } else { | ||||
|         return; | ||||
|     }  | ||||
|     if($formatter=='strftime'||($formatter=='auto'&&strpos($format,'%')!==false)) { | ||||
|         if (DS == '\\') { | ||||
|             $_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T'); | ||||
|             $_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S'); | ||||
|             if (strpos($format, '%e') !== false) { | ||||
|                 $_win_from[] = '%e'; | ||||
|                 $_win_to[] = sprintf('%\' 2d', date('j', $timestamp)); | ||||
|             }  | ||||
|             if (strpos($format, '%l') !== false) { | ||||
|                 $_win_from[] = '%l'; | ||||
|                 $_win_to[] = sprintf('%\' 2d', date('h', $timestamp)); | ||||
|             }  | ||||
|             $format = str_replace($_win_from, $_win_to, $format); | ||||
|         }  | ||||
|         return strftime($format, $timestamp); | ||||
|     } else { | ||||
|         return date($format, $timestamp); | ||||
|     } | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										105
									
								
								library/Smarty/libs/plugins/modifier.debug_print_var.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								library/Smarty/libs/plugins/modifier.debug_print_var.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  *  | ||||
|  * @package Smarty | ||||
|  * @subpackage Debug | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty debug_print_var modifier plugin | ||||
|  *  | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     debug_print_var<br> | ||||
|  * Purpose:  formats variable contents for display in the console | ||||
|  * | ||||
|  * @author Monte Ohrt <monte at ohrt dot com>  | ||||
|  * @param array|object $var     variable to be formatted | ||||
|  * @param 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) | ||||
| { | ||||
|     $_replace = array("\n" => '<i>\n</i>', | ||||
|         "\r" => '<i>\r</i>', | ||||
|         "\t" => '<i>\t</i>' | ||||
|         ); | ||||
|  | ||||
|     switch (gettype($var)) { | ||||
|         case 'array' : | ||||
|             $results = '<b>Array (' . count($var) . ')</b>'; | ||||
|             foreach ($var as $curr_key => $curr_val) { | ||||
|                 $results .= '<br>' . str_repeat(' ', $depth * 2) | ||||
|                  . '<b>' . strtr($curr_key, $_replace) . '</b> => ' | ||||
|                  . smarty_modifier_debug_print_var($curr_val, ++$depth, $length); | ||||
|                 $depth--; | ||||
|             }  | ||||
|             break; | ||||
|              | ||||
|         case 'object' : | ||||
|             $object_vars = get_object_vars($var); | ||||
|             $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>'; | ||||
|             foreach ($object_vars as $curr_key => $curr_val) { | ||||
|                 $results .= '<br>' . str_repeat(' ', $depth * 2) | ||||
|                  . '<b> ->' . strtr($curr_key, $_replace) . '</b> = ' | ||||
|                  . smarty_modifier_debug_print_var($curr_val, ++$depth, $length); | ||||
|                 $depth--; | ||||
|             }  | ||||
|             break; | ||||
|              | ||||
|         case 'boolean' : | ||||
|         case 'NULL' : | ||||
|         case 'resource' : | ||||
|             if (true === $var) { | ||||
|                 $results = 'true'; | ||||
|             } elseif (false === $var) { | ||||
|                 $results = 'false'; | ||||
|             } elseif (null === $var) { | ||||
|                 $results = 'null'; | ||||
|             } else { | ||||
|                 $results = htmlspecialchars((string) $var); | ||||
|             }  | ||||
|             $results = '<i>' . $results . '</i>'; | ||||
|             break; | ||||
|              | ||||
|         case 'integer' : | ||||
|         case 'float' : | ||||
|             $results = htmlspecialchars((string) $var); | ||||
|             break; | ||||
|              | ||||
|         case 'string' : | ||||
|             $results = strtr($var, $_replace); | ||||
|             if (Smarty::$_MBSTRING) { | ||||
|                 if (mb_strlen($var, Smarty::$_CHARSET) > $length) { | ||||
|                     $results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...'; | ||||
|                 } | ||||
|             } else { | ||||
|                 if (isset($var[$length])) { | ||||
|                     $results = substr($var, 0, $length - 3) . '...'; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             $results = htmlspecialchars('"' . $results . '"'); | ||||
|             break; | ||||
|              | ||||
|         case 'unknown type' : | ||||
|         default : | ||||
|             $results = strtr((string) $var, $_replace); | ||||
|             if (Smarty::$_MBSTRING) { | ||||
|                 if (mb_strlen($results, Smarty::$_CHARSET) > $length) { | ||||
|                     $results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...'; | ||||
|                 } | ||||
|             } else { | ||||
|                 if (strlen($results) > $length) { | ||||
|                     $results = substr($results, 0, $length - 3) . '...'; | ||||
|                 } | ||||
|             } | ||||
|               | ||||
|             $results = htmlspecialchars($results); | ||||
|     }  | ||||
|  | ||||
|     return $results; | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										188
									
								
								library/Smarty/libs/plugins/modifier.escape.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								library/Smarty/libs/plugins/modifier.escape.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,188 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifier | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty escape modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     escape<br> | ||||
|  * Purpose:  escape string for output | ||||
|  * | ||||
|  * @link http://www.smarty.net/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 = null, $double_encode = true) | ||||
| { | ||||
|     static $_double_encode = null; | ||||
|     if ($_double_encode === null) { | ||||
|         $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); | ||||
|     } | ||||
|      | ||||
|     if (!$char_set) { | ||||
|         $char_set = Smarty::$_CHARSET; | ||||
|     } | ||||
|  | ||||
|     switch ($esc_type) { | ||||
|         case 'html': | ||||
|             if ($_double_encode) { | ||||
|                 // php >=5.3.2 - go native | ||||
|                 return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); | ||||
|             } else { | ||||
|                 if ($double_encode) { | ||||
|                     // php <5.3.2 - only handle double encoding | ||||
|                     return htmlspecialchars($string, ENT_QUOTES, $char_set); | ||||
|                 } else { | ||||
|                     // php <5.3.2 - prevent double encoding | ||||
|                     $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); | ||||
|                     $string = htmlspecialchars($string, ENT_QUOTES, $char_set); | ||||
|                     $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); | ||||
|                     return $string; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|         case 'htmlall': | ||||
|             if (Smarty::$_MBSTRING) { | ||||
|                 // mb_convert_encoding ignores htmlspecialchars() | ||||
|                 if ($_double_encode) { | ||||
|                     // php >=5.3.2 - go native | ||||
|                     $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); | ||||
|                 } else { | ||||
|                     if ($double_encode) { | ||||
|                         // php <5.3.2 - only handle double encoding | ||||
|                         $string = htmlspecialchars($string, ENT_QUOTES, $char_set); | ||||
|                     } else { | ||||
|                         // php <5.3.2 - prevent double encoding | ||||
|                         $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); | ||||
|                         $string = htmlspecialchars($string, ENT_QUOTES, $char_set); | ||||
|                         $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); | ||||
|                         return $string; | ||||
|                     } | ||||
|                 } | ||||
|                  | ||||
|                 // htmlentities() won't convert everything, so use mb_convert_encoding | ||||
|                 return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set); | ||||
|             } | ||||
|  | ||||
|             // no MBString fallback | ||||
|             if ($_double_encode) { | ||||
|                 return htmlentities($string, ENT_QUOTES, $char_set, $double_encode); | ||||
|             } else { | ||||
|                 if ($double_encode) { | ||||
|                     return htmlentities($string, ENT_QUOTES, $char_set); | ||||
|                 } else { | ||||
|                     $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); | ||||
|                     $string = htmlentities($string, ENT_QUOTES, $char_set); | ||||
|                     $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); | ||||
|                     return $string; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|         case 'url': | ||||
|             return rawurlencode($string); | ||||
|  | ||||
|         case 'urlpathinfo': | ||||
|             return str_replace('%2F', '/', rawurlencode($string)); | ||||
|  | ||||
|         case 'quotes': | ||||
|             // escape unescaped single quotes | ||||
|             return preg_replace("%(?<!\\\\)'%", "\\'", $string); | ||||
|  | ||||
|         case 'hex': | ||||
|             // escape every byte into hex | ||||
|             // Note that the UTF-8 encoded character ä will be represented as %c3%a4 | ||||
|             $return = ''; | ||||
|             $_length = strlen($string); | ||||
|             for ($x = 0; $x < $_length; $x++) { | ||||
|                 $return .= '%' . bin2hex($string[$x]); | ||||
|             } | ||||
|             return $return; | ||||
|  | ||||
|         case 'hexentity': | ||||
|             $return = ''; | ||||
|             if (Smarty::$_MBSTRING) { | ||||
|                 require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); | ||||
|                 $return = ''; | ||||
|                 foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { | ||||
|                     $return .= '&#x' . strtoupper(dechex($unicode)) . ';'; | ||||
|                 } | ||||
|                 return $return; | ||||
|             } | ||||
|             // no MBString fallback | ||||
|             $_length = strlen($string); | ||||
|             for ($x = 0; $x < $_length; $x++) { | ||||
|                 $return .= '&#x' . bin2hex($string[$x]) . ';'; | ||||
|             } | ||||
|             return $return; | ||||
|  | ||||
|         case 'decentity': | ||||
|             $return = ''; | ||||
|             if (Smarty::$_MBSTRING) { | ||||
|                 require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); | ||||
|                 $return = ''; | ||||
|                 foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { | ||||
|                     $return .= '&#' . $unicode . ';'; | ||||
|                 } | ||||
|                 return $return; | ||||
|             } | ||||
|             // no MBString fallback | ||||
|             $_length = strlen($string); | ||||
|             for ($x = 0; $x < $_length; $x++) { | ||||
|                 $return .= '&#' . ord($string[$x]) . ';'; | ||||
|             } | ||||
|             return $return; | ||||
|  | ||||
|         case 'javascript': | ||||
|             // escape quotes and backslashes, newlines, etc. | ||||
|             return strtr($string, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n', '</' => '<\/')); | ||||
|  | ||||
|         case 'mail': | ||||
|             if (Smarty::$_MBSTRING) { | ||||
|                 require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); | ||||
|                 return smarty_mb_str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); | ||||
|             } | ||||
|             // no MBString fallback | ||||
|             return str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); | ||||
|  | ||||
|         case 'nonstd': | ||||
|             // escape non-standard chars, such as ms document quotes | ||||
|             $return = ''; | ||||
|             if (Smarty::$_MBSTRING) { | ||||
|                 require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); | ||||
|                 foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { | ||||
|                     if ($unicode >= 126) { | ||||
|                         $return .= '&#' . $unicode . ';'; | ||||
|                     } else { | ||||
|                         $return .= chr($unicode); | ||||
|                     } | ||||
|                 } | ||||
|                 return $return; | ||||
|             } | ||||
|  | ||||
|             $_length = strlen($string); | ||||
|             for ($_i = 0; $_i < $_length; $_i++) { | ||||
|                 $_ord = ord(substr($string, $_i, 1)); | ||||
|                 // non-standard char, escape it | ||||
|                 if ($_ord >= 126) { | ||||
|                     $return .= '&#' . $_ord . ';'; | ||||
|                 } else { | ||||
|                     $return .= substr($string, $_i, 1); | ||||
|                 } | ||||
|             } | ||||
|             return $return; | ||||
|  | ||||
|         default: | ||||
|             return $string; | ||||
|     } | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										55
									
								
								library/Smarty/libs/plugins/modifier.regex_replace.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								library/Smarty/libs/plugins/modifier.regex_replace.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifier | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty regex_replace modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     regex_replace<br> | ||||
|  * Purpose:  regular expression search/replace | ||||
|  * | ||||
|  * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php | ||||
|  *          regex_replace (Smarty online manual) | ||||
|  * @author Monte Ohrt <monte at ohrt dot com> | ||||
|  * @param string       $string   input string | ||||
|  * @param string|array $search   regular expression(s) to search for | ||||
|  * @param string|array $replace  string(s) that should be replaced | ||||
|  * @return string | ||||
|  */ | ||||
| function smarty_modifier_regex_replace($string, $search, $replace) | ||||
| { | ||||
|     if(is_array($search)) { | ||||
|         foreach($search as $idx => $s) { | ||||
|             $search[$idx] = _smarty_regex_replace_check($s); | ||||
|         } | ||||
|     } else { | ||||
|         $search = _smarty_regex_replace_check($search); | ||||
|     } | ||||
|     return preg_replace($search, $replace, $string); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @param  string $search string(s) that should be replaced | ||||
|  * @return string | ||||
|  * @ignore | ||||
|  */ | ||||
| function _smarty_regex_replace_check($search) | ||||
| { | ||||
|     // null-byte injection detection | ||||
|     // anything behind the first null-byte is ignored | ||||
|     if (($pos = strpos($search,"\0")) !== false) { | ||||
|         $search = substr($search,0,$pos); | ||||
|     } | ||||
|     // remove eval-modifier from $search | ||||
|     if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) { | ||||
|         $search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]); | ||||
|     } | ||||
|     return $search; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										33
									
								
								library/Smarty/libs/plugins/modifier.replace.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								library/Smarty/libs/plugins/modifier.replace.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifier | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty replace modifier plugin | ||||
|  *  | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     replace<br> | ||||
|  * Purpose:  simple search/replace | ||||
|  *  | ||||
|  * @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual) | ||||
|  * @author Monte Ohrt <monte at ohrt dot com>  | ||||
|  * @author Uwe Tews  | ||||
|  * @param string $string  input string | ||||
|  * @param string $search  text to search for | ||||
|  * @param string $replace replacement text | ||||
|  * @return string  | ||||
|  */ | ||||
| function smarty_modifier_replace($string, $search, $replace) | ||||
| { | ||||
|     if (Smarty::$_MBSTRING) { | ||||
|         require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); | ||||
|         return smarty_mb_str_replace($search, $replace, $string); | ||||
|     } | ||||
|      | ||||
|     return str_replace($search, $replace, $string); | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										27
									
								
								library/Smarty/libs/plugins/modifier.spacify.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								library/Smarty/libs/plugins/modifier.spacify.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifier | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty spacify modifier plugin | ||||
|  *  | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     spacify<br> | ||||
|  * Purpose:  add spaces between characters in a string | ||||
|  *  | ||||
|  * @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual) | ||||
|  * @author Monte Ohrt <monte at ohrt dot com>  | ||||
|  * @param string $string       input string | ||||
|  * @param string $spacify_char string to insert between characters. | ||||
|  * @return string | ||||
|  */ | ||||
| function smarty_modifier_spacify($string, $spacify_char = ' ') | ||||
| { | ||||
|     // well… what about charsets besides latin and UTF-8? | ||||
|     return implode($spacify_char, preg_split('//' . Smarty::$_UTF8_MODIFIER, $string, -1, PREG_SPLIT_NO_EMPTY)); | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										59
									
								
								library/Smarty/libs/plugins/modifier.truncate.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								library/Smarty/libs/plugins/modifier.truncate.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifier | ||||
|  */ | ||||
|   | ||||
| /** | ||||
|  * Smarty truncate modifier plugin | ||||
|  *  | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     truncate<br> | ||||
|  * Purpose:  Truncate a string to a certain length if necessary, | ||||
|  *               optionally splitting in the middle of a word, and | ||||
|  *               appending the $etc string or inserting $etc into the middle. | ||||
|  *  | ||||
|  * @link http://smarty.php.net/manual/en/language.modifier.truncate.php truncate (Smarty online manual) | ||||
|  * @author Monte Ohrt <monte at ohrt dot com>  | ||||
|  * @param string  $string      input string | ||||
|  * @param integer $length      length of truncated text | ||||
|  * @param string  $etc         end string | ||||
|  * @param boolean $break_words truncate at word boundary | ||||
|  * @param boolean $middle      truncate in the middle of text | ||||
|  * @return string truncated string | ||||
|  */ | ||||
| function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) { | ||||
|     if ($length == 0) | ||||
|         return ''; | ||||
|  | ||||
|     if (Smarty::$_MBSTRING) { | ||||
|         if (mb_strlen($string, Smarty::$_CHARSET) > $length) { | ||||
|             $length -= min($length, mb_strlen($etc, Smarty::$_CHARSET)); | ||||
|             if (!$break_words && !$middle) { | ||||
|                 $string = preg_replace('/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER, '', mb_substr($string, 0, $length + 1, Smarty::$_CHARSET)); | ||||
|             }  | ||||
|             if (!$middle) { | ||||
|                 return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc; | ||||
|             } | ||||
|             return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc . mb_substr($string, - $length / 2, $length, Smarty::$_CHARSET); | ||||
|         } | ||||
|         return $string; | ||||
|     } | ||||
|      | ||||
|     // no MBString fallback | ||||
|     if (isset($string[$length])) { | ||||
|         $length -= min($length, strlen($etc)); | ||||
|         if (!$break_words && !$middle) { | ||||
|             $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1)); | ||||
|         }  | ||||
|         if (!$middle) { | ||||
|             return substr($string, 0, $length) . $etc; | ||||
|         } | ||||
|         return substr($string, 0, $length / 2) . $etc . substr($string, - $length / 2); | ||||
|     } | ||||
|     return $string; | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										30
									
								
								library/Smarty/libs/plugins/modifiercompiler.cat.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								library/Smarty/libs/plugins/modifiercompiler.cat.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty cat modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     cat<br> | ||||
|  * Date:     Feb 24, 2003<br> | ||||
|  * Purpose:  catenate a value to a variable<br> | ||||
|  * Input:    string to catenate<br> | ||||
|  * Example:  {$var|cat:"foo"} | ||||
|  * | ||||
|  * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat | ||||
|  *          (Smarty online manual) | ||||
|  * @author   Uwe Tews | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
| function smarty_modifiercompiler_cat($params, $compiler) | ||||
| { | ||||
|     return '('.implode(').(', $params).')'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty count_characters modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     count_characteres<br> | ||||
|  * Purpose:  count the number of characters in a text | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual) | ||||
|  * @author Uwe Tews | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
| function smarty_modifiercompiler_count_characters($params, $compiler) | ||||
| { | ||||
|     if (!isset($params[1]) || $params[1] != 'true') { | ||||
|         return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[0] . ', $tmp)'; | ||||
|     } | ||||
|     if (Smarty::$_MBSTRING) { | ||||
|         return 'mb_strlen(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')'; | ||||
|     } | ||||
|     // no MBString fallback | ||||
|     return 'strlen(' . $params[0] . ')'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,28 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty count_paragraphs modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     count_paragraphs<br> | ||||
|  * Purpose:  count the number of paragraphs in a text | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php | ||||
|  *          count_paragraphs (Smarty online manual) | ||||
|  * @author Uwe Tews | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
| function smarty_modifiercompiler_count_paragraphs($params, $compiler) | ||||
| { | ||||
|     // count \r or \n characters | ||||
|     return '(preg_match_all(\'#[\r\n]+#\', ' . $params[0] . ', $tmp)+1)'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,28 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty count_sentences modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     count_sentences | ||||
|  * Purpose:  count the number of sentences in a text | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php | ||||
|  *          count_sentences (Smarty online manual) | ||||
|  * @author Uwe Tews | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
| function smarty_modifiercompiler_count_sentences($params, $compiler) | ||||
| { | ||||
|     // find periods, question marks, exclamation marks with a word before but not after. | ||||
|     return 'preg_match_all("#\w[\.\?\!](\W|$)#S' . Smarty::$_UTF8_MODIFIER . '", ' . $params[0] . ', $tmp)'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										32
									
								
								library/Smarty/libs/plugins/modifiercompiler.count_words.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								library/Smarty/libs/plugins/modifiercompiler.count_words.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +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://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) | ||||
| { | ||||
|     if (Smarty::$_MBSTRING) { | ||||
|         // return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)'; | ||||
|         // expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592 | ||||
|         return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)'; | ||||
|     } | ||||
|     // no MBString fallback | ||||
|     return 'str_word_count(' . $params[0] . ')'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										35
									
								
								library/Smarty/libs/plugins/modifiercompiler.default.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								library/Smarty/libs/plugins/modifiercompiler.default.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty default modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     default<br> | ||||
|  * Purpose:  designate default value for empty variables | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual) | ||||
|  * @author Uwe Tews | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
| function smarty_modifiercompiler_default ($params, $compiler) | ||||
| { | ||||
|     $output = $params[0]; | ||||
|     if (!isset($params[1])) { | ||||
|         $params[1] = "''"; | ||||
|     } | ||||
|      | ||||
|     array_shift($params); | ||||
|     foreach ($params as $param) { | ||||
|         $output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)'; | ||||
|     } | ||||
|     return $output; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										125
									
								
								library/Smarty/libs/plugins/modifiercompiler.escape.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								library/Smarty/libs/plugins/modifiercompiler.escape.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| <?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) | ||||
| { | ||||
|     static $_double_encode = null; | ||||
|     if ($_double_encode === null) { | ||||
|         $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); | ||||
|     } | ||||
|      | ||||
|     try { | ||||
|         $esc_type = smarty_literal_compiler_param($params, 1, 'html'); | ||||
|         $char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET); | ||||
|         $double_encode = smarty_literal_compiler_param($params, 3, true); | ||||
|  | ||||
|         if (!$char_set) { | ||||
|             $char_set = Smarty::$_CHARSET; | ||||
|         } | ||||
|  | ||||
|         switch ($esc_type) { | ||||
|             case 'html': | ||||
|                 if ($_double_encode) { | ||||
|                     return 'htmlspecialchars(' | ||||
|                         . $params[0] .', ENT_QUOTES, ' | ||||
|                         . var_export($char_set, true) . ', ' | ||||
|                         . var_export($double_encode, true) . ')'; | ||||
|                 } else if ($double_encode) { | ||||
|                     return 'htmlspecialchars(' | ||||
|                         . $params[0] .', ENT_QUOTES, ' | ||||
|                         . var_export($char_set, true) . ')'; | ||||
|                 } else { | ||||
|                     // fall back to modifier.escape.php | ||||
|                 } | ||||
|  | ||||
|             case 'htmlall': | ||||
|                 if (Smarty::$_MBSTRING) { | ||||
|                     if ($_double_encode) { | ||||
|                         // php >=5.3.2 - go native | ||||
|                         return 'mb_convert_encoding(htmlspecialchars(' | ||||
|                             . $params[0] .', ENT_QUOTES, ' | ||||
|                             . var_export($char_set, true) . ', ' | ||||
|                             . var_export($double_encode, true) | ||||
|                             . '), "HTML-ENTITIES", ' | ||||
|                             . var_export($char_set, true) . ')'; | ||||
|                     } else if ($double_encode) { | ||||
|                         // php <5.3.2 - only handle double encoding | ||||
|                         return 'mb_convert_encoding(htmlspecialchars(' | ||||
|                             . $params[0] .', ENT_QUOTES, ' | ||||
|                             . var_export($char_set, true) | ||||
|                             . '), "HTML-ENTITIES", ' | ||||
|                             . var_export($char_set, true) . ')'; | ||||
|                     } else { | ||||
|                         // fall back to modifier.escape.php | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 // no MBString fallback | ||||
|                 if ($_double_encode) { | ||||
|                     // php >=5.3.2 - go native | ||||
|                     return 'htmlentities(' | ||||
|                         . $params[0] .', ENT_QUOTES, ' | ||||
|                         . var_export($char_set, true) . ', ' | ||||
|                         . var_export($double_encode, true) . ')'; | ||||
|                 } else if ($double_encode) { | ||||
|                     // php <5.3.2 - only handle double encoding | ||||
|                     return 'htmlentities(' | ||||
|                         . $params[0] .', ENT_QUOTES, ' | ||||
|                         . var_export($char_set, true) . ')'; | ||||
|                 } else { | ||||
|                     // fall back to modifier.escape.php | ||||
|                 } | ||||
|  | ||||
|             case 'url': | ||||
|                 return 'rawurlencode(' . $params[0] . ')'; | ||||
|  | ||||
|             case 'urlpathinfo': | ||||
|                 return 'str_replace("%2F", "/", rawurlencode(' . $params[0] . '))'; | ||||
|  | ||||
|             case 'quotes': | ||||
|                 // escape unescaped single quotes | ||||
|                 return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[0] . ')'; | ||||
|  | ||||
|             case 'javascript': | ||||
|                 // escape quotes and backslashes, newlines, etc. | ||||
|                 return 'strtr(' . $params[0] . ', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))'; | ||||
|  | ||||
|         } | ||||
|     } catch(SmartyException $e) { | ||||
|         // pass through to regular plugin fallback | ||||
|     } | ||||
|  | ||||
|     // could not optimize |escape call, so fallback to regular plugin | ||||
|     if ($compiler->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 ) . ')'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -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) { | ||||
|         // FIXME: (rodneyrehm) shouldn't this throw an error? | ||||
|         return $params[0]; | ||||
|     } | ||||
|  | ||||
|     if (!isset($params[1])) { | ||||
|         $params[1] = '"ISO-8859-1"'; | ||||
|     } | ||||
|  | ||||
|     return 'mb_convert_encoding(' . $params[0] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[1] . ')'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										32
									
								
								library/Smarty/libs/plugins/modifiercompiler.indent.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								library/Smarty/libs/plugins/modifiercompiler.indent.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty indent modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     indent<br> | ||||
|  * Purpose:  indent lines of text | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual) | ||||
|  * @author Uwe Tews | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
|  | ||||
| function smarty_modifiercompiler_indent($params, $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] . ')'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										31
									
								
								library/Smarty/libs/plugins/modifiercompiler.lower.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								library/Smarty/libs/plugins/modifiercompiler.lower.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty lower modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     lower<br> | ||||
|  * Purpose:  convert string to lowercase | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual) | ||||
|  * @author Monte Ohrt <monte at ohrt dot com> | ||||
|  * @author Uwe Tews | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
|  | ||||
| function smarty_modifiercompiler_lower($params, $compiler) | ||||
| { | ||||
|     if (Smarty::$_MBSTRING) { | ||||
|         return 'mb_strtolower(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ; | ||||
|     } | ||||
|     // no MBString fallback | ||||
|     return 'strtolower(' . $params[0] . ')'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										25
									
								
								library/Smarty/libs/plugins/modifiercompiler.noprint.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								library/Smarty/libs/plugins/modifiercompiler.noprint.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty noprint modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     noprint<br> | ||||
|  * Purpose:  return an empty string | ||||
|  * | ||||
|  * @author   Uwe Tews | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
| function smarty_modifiercompiler_noprint($params, $compiler) | ||||
| { | ||||
|     return "''"; | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +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://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] . ')'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										33
									
								
								library/Smarty/libs/plugins/modifiercompiler.strip.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								library/Smarty/libs/plugins/modifiercompiler.strip.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty strip modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     strip<br> | ||||
|  * Purpose:  Replace all repeated spaces, newlines, tabs | ||||
|  *              with a single space or supplied replacement string.<br> | ||||
|  * Example:  {$var|strip} {$var|strip:" "}<br> | ||||
|  * Date:     September 25th, 2002 | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual) | ||||
|  * @author Uwe Tews | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
|  | ||||
| function smarty_modifiercompiler_strip($params, $compiler) | ||||
| { | ||||
|     if (!isset($params[1])) { | ||||
|         $params[1] = "' '"; | ||||
|     } | ||||
|     return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})"; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										33
									
								
								library/Smarty/libs/plugins/modifiercompiler.strip_tags.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								library/Smarty/libs/plugins/modifiercompiler.strip_tags.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty strip_tags modifier plugin | ||||
|  * | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     strip_tags<br> | ||||
|  * Purpose:  strip html tags from text | ||||
|  * | ||||
|  * @link http://www.smarty.net/manual/en/language.modifier.strip.tags.php strip_tags (Smarty online manual) | ||||
|  * @author Uwe Tews | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
| function smarty_modifiercompiler_strip_tags($params, $compiler) | ||||
| { | ||||
|    if (!isset($params[1])) { | ||||
|         $params[1] = true; | ||||
|     } | ||||
|     if ($params[1] === true) { | ||||
|         return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})"; | ||||
|     } else { | ||||
|         return 'strip_tags(' . $params[0] . ')'; | ||||
|     } | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										34
									
								
								library/Smarty/libs/plugins/modifiercompiler.to_charset.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								library/Smarty/libs/plugins/modifiercompiler.to_charset.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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) { | ||||
|         // FIXME: (rodneyrehm) shouldn't this throw an error? | ||||
|         return $params[0]; | ||||
|     } | ||||
|  | ||||
|     if (!isset($params[1])) { | ||||
|         $params[1] = '"ISO-8859-1"'; | ||||
|     } | ||||
|  | ||||
|     return 'mb_convert_encoding(' . $params[0] . ', ' . $params[1] . ', "' . addslashes(Smarty::$_CHARSET) . '")'; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										51
									
								
								library/Smarty/libs/plugins/modifiercompiler.unescape.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								library/Smarty/libs/plugins/modifiercompiler.unescape.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| <?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] = '\'' . addslashes(Smarty::$_CHARSET) . '\''; | ||||
|     } else { | ||||
|         $params[2] = "'" . $params[2] . "'"; | ||||
|     } | ||||
|  | ||||
|     switch (trim($params[1], '"\'')) { | ||||
|         case 'entity': | ||||
|         case 'htmlall': | ||||
|             if (Smarty::$_MBSTRING) { | ||||
|                 return 'mb_convert_encoding(' . $params[0] . ', ' . $params[2] . ', \'HTML-ENTITIES\')'; | ||||
|             } | ||||
|  | ||||
|             return 'html_entity_decode(' . $params[0] . ', ENT_NOQUOTES, ' . $params[2] . ')'; | ||||
|  | ||||
|         case 'html': | ||||
|             return 'htmlspecialchars_decode(' . $params[0] . ', ENT_QUOTES)'; | ||||
|  | ||||
|         case 'url': | ||||
|             return 'rawurldecode(' . $params[0] . ')'; | ||||
|  | ||||
|         default: | ||||
|             return $params[0]; | ||||
|     } | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										30
									
								
								library/Smarty/libs/plugins/modifiercompiler.upper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								library/Smarty/libs/plugins/modifiercompiler.upper.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty upper modifier plugin | ||||
|  *  | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     lower<br> | ||||
|  * Purpose:  convert string to uppercase | ||||
|  *  | ||||
|  * @link http://smarty.php.net/manual/en/language.modifier.upper.php lower (Smarty online manual) | ||||
|  * @author Uwe Tews  | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
| function smarty_modifiercompiler_upper($params, $compiler) | ||||
| { | ||||
|     if (Smarty::$_MBSTRING) { | ||||
|         return 'mb_strtoupper(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ; | ||||
|     } | ||||
|     // no MBString fallback | ||||
|     return 'strtoupper(' . $params[0] . ')'; | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										46
									
								
								library/Smarty/libs/plugins/modifiercompiler.wordwrap.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								library/Smarty/libs/plugins/modifiercompiler.wordwrap.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsModifierCompiler | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty wordwrap modifier plugin | ||||
|  *  | ||||
|  * Type:     modifier<br> | ||||
|  * Name:     wordwrap<br> | ||||
|  * Purpose:  wrap a string of text at a given length | ||||
|  *  | ||||
|  * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php wordwrap (Smarty online manual) | ||||
|  * @author Uwe Tews  | ||||
|  * @param array $params parameters | ||||
|  * @return string with compiled code | ||||
|  */ | ||||
| function smarty_modifiercompiler_wordwrap($params, $compiler) | ||||
| { | ||||
|     if (!isset($params[1])) { | ||||
|         $params[1] = 80; | ||||
|     }  | ||||
|     if (!isset($params[2])) { | ||||
|         $params[2] = '"\n"'; | ||||
|     }  | ||||
|     if (!isset($params[3])) { | ||||
|         $params[3] = 'false'; | ||||
|     }  | ||||
|     $function = 'wordwrap'; | ||||
|     if (Smarty::$_MBSTRING) { | ||||
|         if ($compiler->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] . ')'; | ||||
| }  | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										94
									
								
								library/Smarty/libs/plugins/outputfilter.trimwhitespace.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								library/Smarty/libs/plugins/outputfilter.trimwhitespace.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFilter | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty trimwhitespace outputfilter plugin | ||||
|  * | ||||
|  * Trim unnecessary whitespace from HTML markup. | ||||
|  * | ||||
|  * @author   Rodney Rehm | ||||
|  * @param string                   $source input string | ||||
|  * @param Smarty_Internal_Template $smarty Smarty object | ||||
|  * @return string filtered output | ||||
|  * @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail! | ||||
|  */ | ||||
| function smarty_outputfilter_trimwhitespace($source, Smarty_Internal_Template $smarty) | ||||
| { | ||||
|     $store = array(); | ||||
|     $_store = 0; | ||||
|     $_offset = 0; | ||||
|  | ||||
|     // Unify Line-Breaks to \n | ||||
|     $source = preg_replace("/\015\012|\015|\012/", "\n", $source); | ||||
|  | ||||
|     // capture Internet Explorer Conditional Comments | ||||
|     if (preg_match_all('#<!--\[[^\]]+\]>.*?<!\[[^\]]+\]-->#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { | ||||
|         foreach ($matches as $match) { | ||||
|             $store[] = $match[0][0]; | ||||
|             $_length = strlen($match[0][0]); | ||||
|             $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; | ||||
|             $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length); | ||||
|  | ||||
|             $_offset += $_length - strlen($replace); | ||||
|             $_store++; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Strip all HTML-Comments | ||||
|     // yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124 | ||||
|     $source = preg_replace( '#<!--.*?-->#ms', '', $source ); | ||||
|  | ||||
|     // capture html elements not to be messed with | ||||
|     $_offset = 0; | ||||
|     if (preg_match_all('#<(script|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); | ||||
|  | ||||
|             $_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' => '>', | ||||
|     ); | ||||
|  | ||||
|     $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; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										51
									
								
								library/Smarty/libs/plugins/shared.escape_special_chars.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								library/Smarty/libs/plugins/shared.escape_special_chars.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty shared plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsShared | ||||
|  */ | ||||
|  | ||||
| if (version_compare(PHP_VERSION, '5.2.3', '>=')) { | ||||
|     /** | ||||
|      * escape_special_chars common function | ||||
|      * | ||||
|      * Function: smarty_function_escape_special_chars<br> | ||||
|      * Purpose:  used by other smarty functions to escape | ||||
|      *           special chars except for already escaped ones | ||||
|      * | ||||
|      * @author   Monte Ohrt <monte at ohrt dot com> | ||||
|      * @param string $string text that should by escaped | ||||
|      * @return string | ||||
|      */ | ||||
|     function smarty_function_escape_special_chars($string) | ||||
|     { | ||||
|         if (!is_array($string)) { | ||||
|             $string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false); | ||||
|         } | ||||
|         return $string; | ||||
|     }   | ||||
| } else {          | ||||
|     /** | ||||
|      * escape_special_chars common function | ||||
|      * | ||||
|      * Function: smarty_function_escape_special_chars<br> | ||||
|      * Purpose:  used by other smarty functions to escape | ||||
|      *           special chars except for already escaped ones | ||||
|      * | ||||
|      * @author   Monte Ohrt <monte at ohrt dot com> | ||||
|      * @param string $string text that should by escaped | ||||
|      * @return string | ||||
|      */ | ||||
|     function smarty_function_escape_special_chars($string) | ||||
|     { | ||||
|         if (!is_array($string)) { | ||||
|             $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); | ||||
|             $string = htmlspecialchars($string); | ||||
|             $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);  | ||||
|         } | ||||
|         return $string; | ||||
|     }                                                                                                              | ||||
| }  | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsShared | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * evaluate compiler parameter | ||||
|  * | ||||
|  * @param array   $params  parameter array as given to the compiler function | ||||
|  * @param integer $index   array index of the parameter to convert | ||||
|  * @param mixed   $default value to be returned if the parameter is not present | ||||
|  * @return mixed evaluated value of parameter or $default | ||||
|  * @throws SmartyException if parameter is not a literal (but an expression, variable, …) | ||||
|  * @author Rodney Rehm | ||||
|  */ | ||||
| function smarty_literal_compiler_param($params, $index, $default=null) | ||||
| { | ||||
|     // not set, go default | ||||
|     if (!isset($params[$index])) { | ||||
|         return $default; | ||||
|     } | ||||
|     // test if param is a literal | ||||
|     if (!preg_match('/^([\'"]?)[a-zA-Z0-9]+(\\1)$/', $params[$index])) { | ||||
|         throw new SmartyException('$param[' . $index . '] is not a literal and is thus not evaluatable at compile time'); | ||||
|     } | ||||
|  | ||||
|     $t = null; | ||||
|     eval("\$t = " . $params[$index] . ";"); | ||||
|     return $t; | ||||
| } | ||||
							
								
								
									
										42
									
								
								library/Smarty/libs/plugins/shared.make_timestamp.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								library/Smarty/libs/plugins/shared.make_timestamp.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty shared plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsShared | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Function: smarty_make_timestamp<br> | ||||
|  * Purpose:  used by other smarty functions to make a timestamp from a string. | ||||
|  * | ||||
|  * @author   Monte Ohrt <monte at ohrt dot com> | ||||
|  * @param DateTime|int|string $string  date object, timestamp or string that can be converted using strtotime() | ||||
|  * @return int | ||||
|  */ | ||||
| function smarty_make_timestamp($string) | ||||
| { | ||||
|     if (empty($string)) { | ||||
|         // use "now": | ||||
|         return time(); | ||||
|     } elseif ($string instanceof DateTime) { | ||||
|         return $string->getTimestamp(); | ||||
|     } elseif (strlen($string) == 14 && ctype_digit($string)) { | ||||
|         // it is mysql timestamp format of YYYYMMDDHHMMSS? | ||||
|         return mktime(substr($string, 8, 2),substr($string, 10, 2),substr($string, 12, 2), | ||||
|                        substr($string, 4, 2),substr($string, 6, 2),substr($string, 0, 4)); | ||||
|     } elseif (is_numeric($string)) { | ||||
|         // it is a numeric string, we handle it as timestamp | ||||
|         return (int) $string; | ||||
|     } else { | ||||
|         // strtotime should handle it | ||||
|         $time = strtotime($string); | ||||
|         if ($time == -1 || $time === false) { | ||||
|             // strtotime() was not able to parse $string, use "now": | ||||
|             return time(); | ||||
|         } | ||||
|         return $time; | ||||
|     } | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										55
									
								
								library/Smarty/libs/plugins/shared.mb_str_replace.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								library/Smarty/libs/plugins/shared.mb_str_replace.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty shared plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsShared | ||||
|  */ | ||||
| if (!function_exists('smarty_mb_str_replace')) { | ||||
|  | ||||
|     /** | ||||
|      * Multibyte string replace | ||||
|      * | ||||
|      * @param string $search  the string to be searched | ||||
|      * @param string $replace the replacement string | ||||
|      * @param string $subject the source string | ||||
|      * @param int    &$count  number of matches found | ||||
|      * @return string replaced string | ||||
|      * @author Rodney Rehm | ||||
|      */ | ||||
|     function smarty_mb_str_replace($search, $replace, $subject, &$count=0) | ||||
|     { | ||||
|         if (!is_array($search) && is_array($replace)) { | ||||
|             return false; | ||||
|         } | ||||
|         if (is_array($subject)) { | ||||
|             // call mb_replace for each single string in $subject | ||||
|             foreach ($subject as &$string) { | ||||
|                 $string = &smarty_mb_str_replace($search, $replace, $string, $c); | ||||
|                 $count += $c; | ||||
|             } | ||||
|         } elseif (is_array($search)) { | ||||
|             if (!is_array($replace)) { | ||||
|                 foreach ($search as &$string) { | ||||
|                     $subject = smarty_mb_str_replace($string, $replace, $subject, $c); | ||||
|                     $count += $c; | ||||
|                 } | ||||
|             } else { | ||||
|                 $n = max(count($search), count($replace)); | ||||
|                 while ($n--) { | ||||
|                     $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c); | ||||
|                     $count += $c; | ||||
|                     next($search); | ||||
|                     next($replace); | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             $parts = mb_split(preg_quote($search), $subject); | ||||
|             $count = count($parts) - 1; | ||||
|             $subject = implode($replace, $parts); | ||||
|         } | ||||
|         return $subject; | ||||
|     } | ||||
|  | ||||
| } | ||||
| ?> | ||||
							
								
								
									
										48
									
								
								library/Smarty/libs/plugins/shared.mb_unicode.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								library/Smarty/libs/plugins/shared.mb_unicode.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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; | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										83
									
								
								library/Smarty/libs/plugins/shared.mb_wordwrap.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								library/Smarty/libs/plugins/shared.mb_wordwrap.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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)!S' . Smarty::$_UTF8_MODIFIER, $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::$_CHARSET); | ||||
|             $_tokens = array($_token); | ||||
|             if ($token_length > $width) { | ||||
|                 // remove last space | ||||
|                 $t = mb_substr($t, 0, -1, Smarty::$_CHARSET); | ||||
|                 $_previous = false; | ||||
|                 $length = 0; | ||||
|  | ||||
|                 if ($cut) { | ||||
|                     $_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, $_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$!S' . Smarty::$_UTF8_MODIFIER, $token); | ||||
|                 $token_length = mb_strlen($token, Smarty::$_CHARSET); | ||||
|                 $length += $token_length; | ||||
|  | ||||
|                 if ($length > $width) { | ||||
|                     // remove space before inserted break | ||||
|                     if ($_previous && $token_length < $width) { | ||||
|                         $t = mb_substr($t, 0, -1, Smarty::$_CHARSET); | ||||
|                     } | ||||
|  | ||||
|                     // 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; | ||||
|     } | ||||
|  | ||||
| } | ||||
| ?> | ||||
| @@ -0,0 +1,21 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage PluginsFilter | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty htmlspecialchars variablefilter plugin | ||||
|  * | ||||
|  * @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, Smarty::$_CHARSET); | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										381
									
								
								library/Smarty/libs/sysplugins/smarty_cacheresource.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										381
									
								
								library/Smarty/libs/sysplugins/smarty_cacheresource.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,381 @@ | ||||
| <?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 | ||||
|     */ | ||||
|     public 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 smarty's cache | ||||
|         if (isset($smarty->_cacheresource_handlers[$type])) { | ||||
|             return $smarty->_cacheresource_handlers[$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->_cacheresource_handlers[$type] = $smarty->registered_cache_resources[$type]; | ||||
|         } | ||||
|         // try sysplugins dir | ||||
|         if (isset(self::$sysplugins[$type])) { | ||||
|             if (!isset(self::$resources[$type])) { | ||||
|                 $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type); | ||||
|                 self::$resources[$type] = new $cache_resource_class(); | ||||
|             } | ||||
|             return $smarty->_cacheresource_handlers[$type] = self::$resources[$type]; | ||||
|         } | ||||
|         // try plugins dir | ||||
|         $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type); | ||||
|         if ($smarty->loadPlugin($cache_resource_class)) { | ||||
|             if (!isset(self::$resources[$type])) { | ||||
|                 self::$resources[$type] = new $cache_resource_class(); | ||||
|             } | ||||
|             return $smarty->_cacheresource_handlers[$type] = self::$resources[$type]; | ||||
|         } | ||||
|         // 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) { | ||||
|             $handler->populate($this, $_template); | ||||
|             return; | ||||
|         } | ||||
|         while (true) { | ||||
|             while (true) { | ||||
|                 $handler->populate($this, $_template); | ||||
|                 if ($this->timestamp === false || $smarty->force_compile || $smarty->force_cache) { | ||||
|                     $this->valid = false; | ||||
|                 } else { | ||||
|                     $this->valid = true; | ||||
|                 } | ||||
|                 if ($this->valid && $_template->caching == Smarty::CACHING_LIFETIME_CURRENT && $_template->cache_lifetime >= 0 && time() > ($this->timestamp + $_template->cache_lifetime)) { | ||||
|                     // lifetime expired | ||||
|                     $this->valid = false; | ||||
|                 } | ||||
|                 if ($this->valid || !$_template->smarty->cache_locking) { | ||||
|                     break; | ||||
|                 } | ||||
|                 if (!$this->handler->locked($_template->smarty, $this)) { | ||||
|                     $this->handler->acquireLock($_template->smarty, $this); | ||||
|                     break 2; | ||||
|                 } | ||||
|             } | ||||
|             if ($this->valid) { | ||||
|                 if (!$_template->smarty->cache_locking || $this->handler->locked($_template->smarty, $this) === null) { | ||||
|                     // load cache file for the following checks | ||||
|                     if ($smarty->debugging) { | ||||
|                         Smarty_Internal_Debug::start_cache($_template); | ||||
|                     } | ||||
|                     if($handler->process($_template, $this) === false) { | ||||
|                         $this->valid = false; | ||||
|                     } else { | ||||
|                         $this->processed = true; | ||||
|                     } | ||||
|                     if ($smarty->debugging) { | ||||
|                         Smarty_Internal_Debug::end_cache($_template); | ||||
|                     } | ||||
|                 } else { | ||||
|                     continue; | ||||
|                 } | ||||
|             } else { | ||||
|                 return; | ||||
|             } | ||||
|             if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_SAVED && $_template->properties['cache_lifetime'] >= 0 && (time() > ($_template->cached->timestamp + $_template->properties['cache_lifetime']))) { | ||||
|                 $this->valid = false; | ||||
|             } | ||||
|             if (!$this->valid && $_template->smarty->cache_locking) { | ||||
|                 $this->handler->acquireLock($_template->smarty, $this); | ||||
|                 return; | ||||
|             } else { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|     * Write this cache object to handler | ||||
|     * | ||||
|     * @param Smarty_Internal_Template $_template template object | ||||
|     * @param string $content content to cache | ||||
|     * @return boolean success | ||||
|     */ | ||||
|     public function write(Smarty_Internal_Template $_template, $content) | ||||
|     { | ||||
|         if (!$_template->source->recompiled) { | ||||
|             if ($this->handler->writeCachedContent($_template, $content)) { | ||||
|                 $this->timestamp = time(); | ||||
|                 $this->exists = true; | ||||
|                 $this->valid = true; | ||||
|                 if ($_template->smarty->cache_locking) { | ||||
|                     $this->handler->releaseLock($_template->smarty, $this); | ||||
|                 } | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
| } | ||||
| ?> | ||||
							
								
								
									
										237
									
								
								library/Smarty/libs/sysplugins/smarty_cacheresource_custom.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										237
									
								
								library/Smarty/libs/sysplugins/smarty_cacheresource_custom.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,237 @@ | ||||
| <?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); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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) | ||||
|     { | ||||
|         $id = $cached->filepath; | ||||
|         $name = $cached->source->name . '.lock'; | ||||
|  | ||||
|         $mtime = $this->fetchTimestamp($id, $name, null, null); | ||||
|         if ($mtime === null) { | ||||
|             $this->fetch($id, $name, null, null, $content, $mtime); | ||||
|         } | ||||
|  | ||||
|         return $mtime && time() - $mtime < $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; | ||||
|  | ||||
|         $id = $cached->filepath; | ||||
|         $name = $cached->source->name . '.lock'; | ||||
|         $this->save($id, $name, null, null, $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; | ||||
|  | ||||
|         $name = $cached->source->name . '.lock'; | ||||
|         $this->delete($name, null, null, null); | ||||
|     } | ||||
| } | ||||
| ?> | ||||
| @@ -0,0 +1,463 @@ | ||||
| <?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, $cached->source->uid)) { | ||||
|             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, $_template->source->uid)) { | ||||
|                 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) | ||||
|     { | ||||
|         $uid = $this->getTemplateUid($smarty, $resource_name, $cache_id, $compile_id); | ||||
|         $cid = $uid . '#' . $this->sanitize($resource_name) . '#' . $this->sanitize($cache_id) . '#' . $this->sanitize($compile_id); | ||||
|         $this->delete(array($cid)); | ||||
|         $this->invalidate($cid, $resource_name, $cache_id, $compile_id, $uid); | ||||
|         return -1; | ||||
|     } | ||||
|     /** | ||||
|      * Get template's unique ID | ||||
|      * | ||||
|      * @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 | ||||
|      */ | ||||
|     protected function getTemplateUid(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 | ||||
|             if ($smarty->allow_ambiguous_resources) { | ||||
|                 $_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id; | ||||
|             } else { | ||||
|                 $_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id; | ||||
|             } | ||||
|             if (isset($_templateId[150])) { | ||||
|                 $_templateId = sha1($_templateId); | ||||
|             } | ||||
|             unset($smarty->template_objects[$_templateId]); | ||||
|         } | ||||
|         return $uid; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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) | ||||
|      * @param string  $resource_uid  resource's uid | ||||
|      * @return boolean success | ||||
|      */ | ||||
|     protected function fetch($cid, $resource_name = null, $cache_id = null, $compile_id = null, &$content = null, &$timestamp = null, $resource_uid = 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, $resource_uid); | ||||
|             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 | ||||
|      * @param string $resource_uid  source's uid | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function invalidate($cid = null, $resource_name = null, $cache_id = null, $compile_id = null, $resource_uid = 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#' . $resource_uid . '#' . $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 | ||||
|      * @param string $resource_uid  source's filepath | ||||
|      * @return float the microtime the CacheID was invalidated | ||||
|      */ | ||||
|     protected function getLatestInvalidationTimestamp($cid, $resource_name = null, $cache_id = null, $compile_id = null, $resource_uid = 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, $resource_uid))) { | ||||
|             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 | ||||
|      * @param string $resource_uid  source's filepath | ||||
|      * @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, $resource_uid = null) | ||||
|     { | ||||
|         $t = array('IVK#ALL'); | ||||
|         $_name = $_compile = '#'; | ||||
|         if ($resource_name) { | ||||
|             $_name .= $resource_uid . '#' . $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; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										95
									
								
								library/Smarty/libs/sysplugins/smarty_config_source.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								library/Smarty/libs/sysplugins/smarty_config_source.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage TemplateResources | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty Resource Data Object | ||||
|  * | ||||
|  * Meta Data Container for Config Files | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage TemplateResources | ||||
|  * @author Rodney Rehm | ||||
|  * | ||||
|  * @property string $content | ||||
|  * @property int    $timestamp | ||||
|  * @property bool   $exists | ||||
|  */ | ||||
| class Smarty_Config_Source extends Smarty_Template_Source { | ||||
|  | ||||
|     /** | ||||
|      * create Config Object container | ||||
|      * | ||||
|      * @param Smarty_Resource $handler          Resource Handler this source object communicates with | ||||
|      * @param Smarty          $smarty           Smarty instance this source object belongs to | ||||
|      * @param string          $resource         full config_resource | ||||
|      * @param string          $type             type of resource | ||||
|      * @param string          $name             resource name | ||||
|      * @param string          $unique_resource  unqiue resource name | ||||
|      */ | ||||
|     public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name, $unique_resource) | ||||
|     { | ||||
|         $this->handler = $handler; // Note: prone to circular references | ||||
|  | ||||
|         // Note: these may be ->config_compiler_class etc in the future | ||||
|         //$this->config_compiler_class = $handler->config_compiler_class; | ||||
|         //$this->config_lexer_class = $handler->config_lexer_class; | ||||
|         //$this->config_parser_class = $handler->config_parser_class; | ||||
|  | ||||
|         $this->smarty = $smarty; | ||||
|         $this->resource = $resource; | ||||
|         $this->type = $type; | ||||
|         $this->name = $name; | ||||
|         $this->unique_resource = $unique_resource; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * <<magic>> Generic setter. | ||||
|      * | ||||
|      * @param string $property_name valid: content, timestamp, exists | ||||
|      * @param mixed  $value         newly assigned value (not check for correct type) | ||||
|      * @throws SmartyException when the given property name is not valid | ||||
|      */ | ||||
|     public function __set($property_name, $value) | ||||
|     { | ||||
|         switch ($property_name) { | ||||
|             case 'content': | ||||
|             case 'timestamp': | ||||
|             case 'exists': | ||||
|                 $this->$property_name = $value; | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 throw new SmartyException("invalid config property '$property_name'."); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * <<magic>> Generic getter. | ||||
|      * | ||||
|      * @param string $property_name valid: content, timestamp, exists | ||||
|      * @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."); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,266 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin CacheResource File | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Cacher | ||||
|  * @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 extends Smarty_CacheResource { | ||||
|  | ||||
|     /** | ||||
|      * 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) | ||||
|     { | ||||
|         $_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->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($_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 = $_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 = rtrim(getcwd(), '/\\') . DS . $_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; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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) | ||||
|     { | ||||
|         $cached->timestamp = @filemtime($cached->filepath); | ||||
|         $cached->exists = !!$cached->timestamp; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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 process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null) | ||||
|     { | ||||
|         $_smarty_tpl = $_template; | ||||
|         return @include $_template->cached->filepath; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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) | ||||
|     { | ||||
|         if (Smarty_Internal_Write_File::writeFile($_template->cached->filepath, $content, $_template->smarty) === true) { | ||||
|             $_template->cached->timestamp = @filemtime($_template->cached->filepath); | ||||
|             $_template->cached->exists = !!$_template->cached->timestamp; | ||||
|             if ($_template->cached->exists) { | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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(Smarty $smarty, $exp_time = null) | ||||
|     { | ||||
|         return $this->clear($smarty, null, null, null, $exp_time); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Empty cache for a specific template | ||||
|      * | ||||
|      * @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(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 = $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 ($smarty->use_sub_dirs) { | ||||
|                 foreach ($_cache_id_parts as $id_part) { | ||||
|                     $_dir .= $id_part . DS; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if (isset($resource_name)) { | ||||
|             $_save_stat = $smarty->caching; | ||||
|             $smarty->caching = true; | ||||
|             $tpl = new $smarty->template_class($resource_name, $smarty); | ||||
|             $smarty->caching = $_save_stat; | ||||
|  | ||||
|             // remove from template cache | ||||
|             $tpl->source; // have the template registered before unset() | ||||
|             if ($smarty->allow_ambiguous_resources) { | ||||
|                 $_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id; | ||||
|             } else { | ||||
|                 $_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id; | ||||
|             } | ||||
|             if (isset($_templateId[150])) { | ||||
|                 $_templateId = sha1($_templateId); | ||||
|             } | ||||
|             unset($smarty->template_objects[$_templateId]); | ||||
|  | ||||
|             if ($tpl->source->exists) { | ||||
|                 $_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath)); | ||||
|             } else { | ||||
|                 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) == '.' || 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); | ||||
|                     // 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) { | ||||
|                         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); | ||||
|     } | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,53 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Append | ||||
|  * | ||||
|  * Compiles the {append} tag | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // 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'); | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         // map to compile assign attributes | ||||
|         if (isset($_attr['index'])) { | ||||
|             $_params['smarty_internal_index'] = '[' . $_attr['index'] . ']'; | ||||
|             unset($_attr['index']); | ||||
|         } else { | ||||
|             $_params['smarty_internal_index'] = '[]'; | ||||
|         } | ||||
|         $_new_attr = array(); | ||||
|         foreach ($_attr as $key => $value) { | ||||
|             $_new_attr[] = array($key => $value); | ||||
|         } | ||||
|         // call compile assign | ||||
|         return parent::compile($_new_attr, $compiler, $_params); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,84 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Assign | ||||
|  * | ||||
|  * Compiles the {assign} tag | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // 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 = Smarty::SCOPE_LOCAL; | ||||
|         // check and get attributes | ||||
|         $_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'], "'\""); | ||||
|             if ($_attr['scope'] == 'parent') { | ||||
|                 $_scope = Smarty::SCOPE_PARENT; | ||||
|             } elseif ($_attr['scope'] == 'root') { | ||||
|                 $_scope = Smarty::SCOPE_ROOT; | ||||
|             } elseif ($_attr['scope'] == 'global') { | ||||
|                 $_scope = Smarty::SCOPE_GLOBAL; | ||||
|             } else { | ||||
|                 $compiler->trigger_template_error('illegal value for "scope" attribute', $compiler->lex->taglineno); | ||||
|             } | ||||
|         } | ||||
|         // compiled output | ||||
|         if (isset($parameter['smarty_internal_index'])) { | ||||
|             $output = "<?php \$_smarty_tpl->createLocalArrayVariable($_attr[var], $_nocache, $_scope);\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value$parameter[smarty_internal_index] = $_attr[value];"; | ||||
|         } else { | ||||
|             // implement Smarty2's behaviour of variables assigned by reference | ||||
|             if ($compiler->template->smarty instanceof SmartyBC) { | ||||
|                 $output = "<?php if (isset(\$_smarty_tpl->tpl_vars[$_attr[var]])) {\$_smarty_tpl->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];"; | ||||
|                 $output .= "\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value = $_attr[value]; \$_smarty_tpl->tpl_vars[$_attr[var]]->nocache = $_nocache; \$_smarty_tpl->tpl_vars[$_attr[var]]->scope = $_scope;"; | ||||
|                 $output .= "\n} else \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);"; | ||||
|             } else { | ||||
|                 $output = "<?php \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);"; | ||||
|             } | ||||
|         } | ||||
|         if ($_scope == Smarty::SCOPE_PARENT) { | ||||
|             $output .= "\nif (\$_smarty_tpl->parent != null) \$_smarty_tpl->parent->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];"; | ||||
|         } elseif ($_scope == Smarty::SCOPE_ROOT || $_scope == Smarty::SCOPE_GLOBAL) { | ||||
|             $output .= "\n\$_ptr = \$_smarty_tpl->parent; while (\$_ptr != null) {\$_ptr->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]]; \$_ptr = \$_ptr->parent; }"; | ||||
|         } | ||||
|         if ( $_scope == Smarty::SCOPE_GLOBAL) { | ||||
|             $output .= "\nSmarty::\$global_tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];"; | ||||
|         } | ||||
|         $output .= '?>'; | ||||
|         return $output; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										277
									
								
								library/Smarty/libs/sysplugins/smarty_internal_compile_block.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										277
									
								
								library/Smarty/libs/sysplugins/smarty_internal_compile_block.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,277 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Block | ||||
|  * | ||||
|  * Compiles the {block}{/block} tags | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Block Class | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  */ | ||||
| class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|      * 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', '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 object $compiler compiler object | ||||
|      * @return boolean true | ||||
|      */ | ||||
|     public function compile($args, $compiler) { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         $save = array($_attr, $compiler->parser->current_buffer, $compiler->nocache, $compiler->smarty->merge_compiled_includes, $compiler->merged_templates, $compiler->smarty->merged_templates_func, $compiler->template->properties, $compiler->template->has_nocache_code); | ||||
|         $this->openTag($compiler, 'block', $save); | ||||
|         if ($_attr['nocache'] == true) { | ||||
|             $compiler->nocache = true; | ||||
|         } | ||||
|         // set flag for {block} tag | ||||
|         $compiler->inheritance = true; | ||||
|         // must merge includes | ||||
|         $compiler->smarty->merge_compiled_includes = true; | ||||
|  | ||||
|         $compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser); | ||||
|         $compiler->has_code = false; | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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); | ||||
|         $_ldl = preg_quote($template->smarty->left_delimiter); | ||||
|         if ($template->smarty->auto_literal) { | ||||
|             $al = '\s*'; | ||||
|         } else { | ||||
|             $al = ''; | ||||
|         } | ||||
|         if (0 == preg_match("!({$_ldl}{$al}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], '\'"'); | ||||
|             if ($_match[8] != 'hide' || isset($template->block_data[$_name])) {        // replace {$smarty.block.child} | ||||
|                 // do we have {$smart.block.child} in nested {block} tags? | ||||
|                 if (0 != preg_match_all("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")([\s\S]*?)(hide)?(\s*{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})([\s\S]*?{$_ldl}{$al}/block{$_rdl})!", $block_content, $_match2)) { | ||||
|                     foreach ($_match2[3] as $key => $name) { | ||||
|                         // get it's replacement | ||||
|                         $_name2 = trim($name, '\'"'); | ||||
|                         if ($_match2[5][$key] != 'hide' || isset($template->block_data[$_name2])) { | ||||
|                             if (isset($template->block_data[$_name2])) { | ||||
|                                 $replacement = $template->block_data[$_name2]['source']; | ||||
|                             } else { | ||||
|                                 $replacement = ''; | ||||
|                             } | ||||
|                             // replace {$smarty.block.child} tag | ||||
|                             $search = array("%({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})([\s\S]*?)({$_ldl}{$al}/block{$_rdl})%", "/<2F><><EFBFBD>child<6C><64><EFBFBD>/"); | ||||
|                             $replace = array('\2<><32><EFBFBD>child<6C><64><EFBFBD>\4', $replacement); | ||||
|                             $block_content = preg_replace($search, $replace, $block_content); | ||||
|                         } else { | ||||
|                             // remove hidden blocks | ||||
|                             $block_content = preg_replace("%({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl}[\s\S]*?{$_ldl}{$al}/block{$_rdl})%", '', $block_content); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 // do we have not nested {$smart.block.child} | ||||
|                 if (0 != preg_match("/({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})/", $block_content, $_match2)) { | ||||
|                     // get child replacement for this block | ||||
|                     if (isset($template->block_data[$_name])) { | ||||
|                         $replacement = $template->block_data[$_name]['source']; | ||||
|                         unset($template->block_data[$_name]); | ||||
|                     } else { | ||||
|                         $replacement = ''; | ||||
|                     } | ||||
|                     $block_content = preg_replace("/({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})/", $replacement, $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']; | ||||
|                     } | ||||
|                 } 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'; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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); | ||||
|             while (--$stack_count >= 0) { | ||||
|                 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']; | ||||
|         $_tpl->allow_relative_path = true; | ||||
|         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 $key => $tmp1) { | ||||
|             if ($compiler->nocache && $compiler->template->caching) { | ||||
|                 $code = 'nocache'; | ||||
|             } else { | ||||
|                 $code = $key; | ||||
|             } | ||||
|             foreach ($tmp1 as $name => $tmp) { | ||||
|                 foreach ($tmp as $type => $data) { | ||||
|                     $compiler->template->required_plugins[$code][$name][$type] = $data; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         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 object $compiler compiler object | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler) { | ||||
|         $compiler->has_code = true; | ||||
|         // check and get attributes | ||||
|         $_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'])) { | ||||
|             // restore to status before {block} tag as new subtemplate code of parent {block} is not needed | ||||
|             // TODO: Below code was disabled in 3.1.8 because of problems with {include} in nested {block} tags in child templates | ||||
|             //       combined with append/prepend or $smarty.block.parent | ||||
|             //       For later versions it should be checked under which conditions it could run for optimisation | ||||
|             // | ||||
|             //$compiler->merged_templates = $saved_data[4]; | ||||
|             //$compiler->smarty->merged_templates_func = $saved_data[5]; | ||||
|             //$compiler->template->properties = $saved_data[6]; | ||||
|             //$compiler->template->has_nocache_code = $saved_data[7]; | ||||
|             $_output = Smarty_Internal_Compile_Block::compileChildBlock($compiler, $_name); | ||||
|         } else { | ||||
|             if (isset($saved_data[0]['hide']) && !isset($compiler->template->block_data[$_name]['source'])) { | ||||
|                 $_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]; | ||||
|         // reset flag for {block} tag | ||||
|         $compiler->inheritance = false; | ||||
|         // $_output content has already nocache code processed | ||||
|         $compiler->suppressNocacheProcessing = true; | ||||
|         return $_output; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,77 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Break | ||||
|  * | ||||
|  * Compiles the {break} tag | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Break Class | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  */ | ||||
| class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|      * 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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true); | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|  | ||||
|         if ($_attr['nocache'] === true) { | ||||
|             $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); | ||||
|         } | ||||
|  | ||||
|         if (isset($_attr['levels'])) { | ||||
|             if (!is_numeric($_attr['levels'])) { | ||||
|                 $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 (isset($_is_loopy[$compiler->_tag_stack[$stack_count][0]])) { | ||||
|                 $level_count--; | ||||
|             } | ||||
|             $stack_count--; | ||||
|         } | ||||
|         if ($level_count != 0) { | ||||
|             $compiler->trigger_template_error("cannot break {$_levels} level(s)", $compiler->lex->taglineno); | ||||
|         } | ||||
|         $compiler->has_code = true; | ||||
|         return "<?php break {$_levels}?>"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										130
									
								
								library/Smarty/libs/sysplugins/smarty_internal_compile_call.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								library/Smarty/libs/sysplugins/smarty_internal_compile_call.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,130 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Function_Call | ||||
|  * | ||||
|  * Compiles the calls of user defined tags defined by {function} | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Function_Call Class | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  */ | ||||
| class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|      * 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'); | ||||
|     /** | ||||
|      * 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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_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']; | ||||
|         if ($compiler->compiles_template_function) { | ||||
|             $compiler->called_functions[] = trim($_name, "'\""); | ||||
|         } | ||||
|         unset($_attr['name'], $_attr['assign'], $_attr['nocache']); | ||||
|         // set flag (compiled code of {function} must be included in cache file | ||||
|         if ($compiler->nocache || $compiler->tag_nocache) { | ||||
|             $_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) { | ||||
|                 if (!isset($_attr[$_key])) { | ||||
|                     if (is_int($_key)) { | ||||
|                         $_paramsArray[] = "$_key=>$_value"; | ||||
|                     } else { | ||||
|                         $_paramsArray[] = "'$_key'=>$_value"; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } elseif (isset($compiler->smarty->template_functions[$_name]['parameter'])) { | ||||
|             foreach ($compiler->smarty->template_functions[$_name]['parameter'] as $_key => $_value) { | ||||
|                 if (!isset($_attr[$_key])) { | ||||
|                     if (is_int($_key)) { | ||||
|                         $_paramsArray[] = "$_key=>$_value"; | ||||
|                     } else { | ||||
|                         $_paramsArray[] = "'$_key'=>$_value"; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         //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; | ||||
|         } | ||||
|  | ||||
|         $_params = 'array(' . implode(",", $_paramsArray) . ')'; | ||||
|         $_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; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,98 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Capture | ||||
|  * | ||||
|  * Compiles the {capture} tag | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Capture Class | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  */ | ||||
| class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|      * 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('name', 'assign', 'append'); | ||||
|  | ||||
|     /** | ||||
|      * Compiles code for the {capture} tag | ||||
|      * | ||||
|      * @param array  $args     array with attributes from parser | ||||
|      * @param object $compiler compiler object | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_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'; | ||||
|  | ||||
|         $compiler->_capture_stack[0][] = array($buffer, $assign, $append, $compiler->nocache); | ||||
|         // maybe nocache because of nocache variables | ||||
|         $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; | ||||
|         $_output = "<?php \$_smarty_tpl->_capture_stack[0][] = array($buffer, $assign, $append); 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 object $compiler compiler object | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         // must endblock be nocache? | ||||
|         if ($compiler->nocache) { | ||||
|             $compiler->tag_nocache = true; | ||||
|         } | ||||
|  | ||||
|         list($buffer, $assign, $append, $compiler->nocache) = array_pop($compiler->_capture_stack[0]); | ||||
|  | ||||
|         $_output = "<?php list(\$_capture_buffer, \$_capture_assign, \$_capture_append) = array_pop(\$_smarty_tpl->_capture_stack[0]);\n"; | ||||
|         $_output .= "if (!empty(\$_capture_buffer)) {\n"; | ||||
|         $_output .= " if (isset(\$_capture_assign)) \$_smarty_tpl->assign(\$_capture_assign, ob_get_contents());\n"; | ||||
|         $_output .= " if (isset( \$_capture_append)) \$_smarty_tpl->append( \$_capture_append, ob_get_contents());\n"; | ||||
|         $_output .= " Smarty::\$_smarty_vars['capture'][\$_capture_buffer]=ob_get_clean();\n"; | ||||
|         $_output .= "} else \$_smarty_tpl->capture_error();?>"; | ||||
|         return $_output; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,85 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Config Load | ||||
|  * | ||||
|  * Compiles the {config load} tag | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @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 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'); | ||||
|     /** | ||||
|      * 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 object $compiler compiler object | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         static $_is_legal_scope = array('local' => true,'parent' => true,'root' => true,'global' => true); | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|  | ||||
|         if ($_attr['nocache'] === true) { | ||||
|             $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'])) { | ||||
|             $_attr['scope'] = trim($_attr['scope'], "'\""); | ||||
|             if (isset($_is_legal_scope[$_attr['scope']])) { | ||||
|                 $scope = $_attr['scope']; | ||||
|            } else { | ||||
|                 $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; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,78 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Continue | ||||
|  * | ||||
|  * Compiles the {continue} tag | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Continue Class | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  */ | ||||
| class Smarty_Internal_Compile_Continue extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|      * 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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true); | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|  | ||||
|         if ($_attr['nocache'] === true) { | ||||
|             $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); | ||||
|         } | ||||
|  | ||||
|         if (isset($_attr['levels'])) { | ||||
|             if (!is_numeric($_attr['levels'])) { | ||||
|                 $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 (isset($_is_loopy[$compiler->_tag_stack[$stack_count][0]])) { | ||||
|                 $level_count--; | ||||
|             } | ||||
|             $stack_count--; | ||||
|         } | ||||
|         if ($level_count != 0) { | ||||
|             $compiler->trigger_template_error("cannot continue {$_levels} level(s)", $compiler->lex->taglineno); | ||||
|         } | ||||
|         $compiler->has_code = true; | ||||
|         return "<?php continue {$_levels}?>"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,43 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Debug | ||||
|  * | ||||
|  * Compiles the {debug} tag. | ||||
|  * It opens a window the the Smarty Debugging Console. | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * 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 object $compiler compiler object | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|  | ||||
|         // 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; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,73 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Eval | ||||
|  * | ||||
|  * Compiles the {eval} tag. | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * 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'); | ||||
|     /** | ||||
|      * 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 object $compiler compiler object | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         $this->required_attributes = array('var'); | ||||
|         $this->optional_attributes = array('assign'); | ||||
|         // check and get attributes | ||||
|         $_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? | ||||
|         if (isset($_assign)) { | ||||
|             $_output .= "\$_smarty_tpl->assign($_assign,\$_template->fetch());"; | ||||
|         } else { | ||||
|             $_output .= "echo \$_template->fetch();"; | ||||
|         } | ||||
|         return "<?php $_output ?>"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,128 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
| * Smarty Internal Plugin Compile extend | ||||
| * | ||||
| * Compiles the {extends} tag | ||||
| * | ||||
| * @package Smarty | ||||
| * @subpackage Compiler | ||||
| * @author Uwe Tews | ||||
| */ | ||||
|  | ||||
| /** | ||||
| * Smarty Internal Plugin Compile extend Class | ||||
| * | ||||
| * @package Smarty | ||||
| * @subpackage Compiler | ||||
| */ | ||||
| class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|     * 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'); | ||||
|     /** | ||||
|     * mbstring.overload flag | ||||
|     * | ||||
|     * @var int | ||||
|     */ | ||||
|     public $mbstring_overload = 0; | ||||
|  | ||||
|     /** | ||||
|     * 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) | ||||
|     { | ||||
|         static $_is_stringy = array('string' => true, 'eval' => true); | ||||
|         $this->_rdl = preg_quote($compiler->smarty->right_delimiter); | ||||
|         $this->_ldl = preg_quote($compiler->smarty->left_delimiter); | ||||
|         $filepath = $compiler->template->source->filepath; | ||||
|         $this->mbstring_overload = ini_get('mbstring.func_overload') & 2; | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         if ($_attr['nocache'] === true) { | ||||
|             $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); | ||||
|         } | ||||
|  | ||||
|         $_smarty_tpl = $compiler->template; | ||||
|         $include_file = null; | ||||
|         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, $compiler->smarty, $compiler->template); | ||||
|         // save file dependency | ||||
|         if (isset($_is_stringy[$_template->source->type])) { | ||||
|             $template_sha1 = sha1($include_file); | ||||
|         } else { | ||||
|             $template_sha1 = sha1($_template->source->filepath); | ||||
|         } | ||||
|         if (isset($compiler->template->properties['file_dependency'][$template_sha1])) { | ||||
|             $compiler->trigger_template_error("illegal recursive call of \"{$include_file}\"", $compiler->lex->line - 1); | ||||
|         } | ||||
|         $compiler->template->properties['file_dependency'][$template_sha1] = array($_template->source->filepath, $_template->source->timestamp, $_template->source->type); | ||||
|         $_content = ($this->mbstring_overload ? mb_substr($compiler->template->source->content, $compiler->lex->counter - 1, 20000000, 'latin1') : 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)) { | ||||
|             $compiler->trigger_template_error('unmatched {block} {/block} pairs'); | ||||
|         } | ||||
|         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+1 < $_result_count) { | ||||
|             $_end = 0; | ||||
|             $_level = 1; | ||||
|             if (($this->mbstring_overload ? mb_substr($_result[0][$_start][0],0,mb_strlen($compiler->smarty->left_delimiter,'latin1')+1, 'latin1') : substr($_result[0][$_start][0],0,strlen($compiler->smarty->left_delimiter)+1)) == $compiler->smarty->left_delimiter.'*') { | ||||
|                 $_start++; | ||||
|                 continue; | ||||
|             } | ||||
|             while ($_level != 0) { | ||||
|                 $_end++; | ||||
|                 if (($this->mbstring_overload ? mb_substr($_result[0][$_start + $_end][0],0,mb_strlen($compiler->smarty->left_delimiter,'latin1')+1, 'latin1') : 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($compiler->smarty->left_delimiter . '$smarty.block.parent' . $compiler->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%', | ||||
|             ($this->mbstring_overload ? mb_substr($_content, $_result[0][$_start][1] + mb_strlen($_result[0][$_start][0], 'latin1'), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + mb_strlen($_result[0][$_start][0], 'latin1'), 'latin1') : 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; | ||||
|         } | ||||
|         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 ''; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										151
									
								
								library/Smarty/libs/sysplugins/smarty_internal_compile_for.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								library/Smarty/libs/sysplugins/smarty_internal_compile_for.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile For | ||||
|  * | ||||
|  * Compiles the {for} {forelse} {/for} tags | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @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 | ||||
|      * 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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         if ($parameter == 0) { | ||||
|             $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(); | ||||
|         } | ||||
|         // check and get attributes | ||||
|         $_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"; | ||||
|             } | ||||
|             $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;"; | ||||
|             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->openTag($compiler, 'for', array('for', $compiler->nocache)); | ||||
|         // maybe nocache because of nocache variables | ||||
|         $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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr  = $this->getAttributes($compiler, $args); | ||||
|  | ||||
|         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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         // must endblock be nocache? | ||||
|         if ($compiler->nocache) { | ||||
|             $compiler->tag_nocache = true; | ||||
|         } | ||||
|  | ||||
|         list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('for', 'forelse')); | ||||
|  | ||||
|         if ($openTag == 'forelse') { | ||||
|             return "<?php }  ?>"; | ||||
|         } else { | ||||
|             return "<?php }} ?>"; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,231 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Foreach | ||||
|  * | ||||
|  * Compiles the {foreach} {foreachelse} {/foreach} tags | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Foreach Class | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  */ | ||||
| class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase { | ||||
|     /** | ||||
|      * Attribute definition: Overwrites base class. | ||||
|      * | ||||
|      * @var array | ||||
|      * @see Smarty_Internal_CompileBase | ||||
|      */ | ||||
|     public $required_attributes = array('from', 'item'); | ||||
|     /** | ||||
|      * 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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         $tpl = $compiler->template; | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|  | ||||
|         $from = $_attr['from']; | ||||
|         $item = $_attr['item']; | ||||
|         if (!strncmp("\$_smarty_tpl->tpl_vars[$item]", $from, strlen($item) + 24)) { | ||||
|             $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->openTag($compiler, 'foreach', array('foreach', $compiler->nocache, $item, $key)); | ||||
|         // maybe nocache because of nocache variables | ||||
|         $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; | ||||
|  | ||||
|         if (isset($_attr['name'])) { | ||||
|             $name = $_attr['name']; | ||||
|             $has_name = true; | ||||
|             $SmartyVarName = '$smarty.foreach.' . trim($name, '\'"') . '.'; | ||||
|         } else { | ||||
|             $name = null; | ||||
|             $has_name = false; | ||||
|         } | ||||
|         $ItemVarName = '$' . trim($item, '\'"') . '@'; | ||||
|         // evaluates which Smarty variables and properties have to be computed | ||||
|         if ($has_name) { | ||||
|             $usesSmartyFirst = strpos($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->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; \$_smarty_tpl->tpl_vars[$item]->_loop = false;\n"; | ||||
|         if ($key != null) { | ||||
|             $output .= " \$_smarty_tpl->tpl_vars[$key] = new Smarty_Variable;\n"; | ||||
|         } | ||||
|         $output .= " \$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array');}\n"; | ||||
|         if ($usesPropTotal) { | ||||
|             $output .= " \$_smarty_tpl->tpl_vars[$item]->total= \$_smarty_tpl->_count(\$_from);\n"; | ||||
|         } | ||||
|         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"; | ||||
|             } | ||||
|         } | ||||
|         $output .= "foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n\$_smarty_tpl->tpl_vars[$item]->_loop = true;\n"; | ||||
|         if ($key != null) { | ||||
|             $output .= " \$_smarty_tpl->tpl_vars[$key]->value = \$_smarty_tpl->tpl_vars[$item]->key;\n"; | ||||
|         } | ||||
|         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 object $compiler compiler object | ||||
|      * @param array  $parameter array with compilation parameter | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|  | ||||
|         list($openTag, $nocache, $item, $key) = $this->closeTag($compiler, array('foreach')); | ||||
|         $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $item, $key)); | ||||
|  | ||||
|         return "<?php }\nif (!\$_smarty_tpl->tpl_vars[$item]->_loop) {\n?>"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * 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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         // must endblock be nocache? | ||||
|         if ($compiler->nocache) { | ||||
|             $compiler->tag_nocache = true; | ||||
|         } | ||||
|  | ||||
|         list($openTag, $compiler->nocache, $item, $key) = $this->closeTag($compiler, array('foreach', 'foreachelse')); | ||||
|  | ||||
|         return "<?php } ?>"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,165 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Function | ||||
|  * | ||||
|  * Compiles the {function} {/function} tags | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Function Class | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  */ | ||||
| class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|      * 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'); | ||||
|     /** | ||||
|      * 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 | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|  | ||||
|         if ($_attr['nocache'] === true) { | ||||
|             $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); | ||||
|         } | ||||
|         unset($_attr['nocache']); | ||||
|         $save = array($_attr, $compiler->parser->current_buffer, | ||||
|             $compiler->template->has_nocache_code, $compiler->template->required_plugins); | ||||
|         $this->openTag($compiler, 'function', $save); | ||||
|         $_name = trim($_attr['name'], "'\""); | ||||
|         unset($_attr['name']); | ||||
|         // set flag that we are compiling a template function | ||||
|         $compiler->compiles_template_function = true; | ||||
|         $compiler->template->properties['function'][$_name]['parameter'] = array(); | ||||
|         $_smarty_tpl = $compiler->template; | ||||
|         foreach ($_attr as $_key => $_data) { | ||||
|             eval ('$tmp='.$_data.';'); | ||||
|             $compiler->template->properties['function'][$_name]['parameter'][$_key] = $tmp; | ||||
|         } | ||||
|         $compiler->smarty->template_functions[$_name]['parameter'] = $compiler->template->properties['function'][$_name]['parameter']; | ||||
|         if ($compiler->template->caching) { | ||||
|             $output = ''; | ||||
|         } else { | ||||
|             $output = "<?php if (!function_exists('smarty_template_function_{$_name}')) { | ||||
|     function smarty_template_function_{$_name}(\$_smarty_tpl,\$params) { | ||||
|     \$saved_tpl_vars = \$_smarty_tpl->tpl_vars; | ||||
|     foreach (\$_smarty_tpl->smarty->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}; | ||||
|     foreach (\$params as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}?>"; | ||||
|         } | ||||
|         // Init temporay context | ||||
|         $compiler->template->required_plugins = array('compiled' => array(), 'nocache' => array()); | ||||
|         $compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser); | ||||
|         $compiler->parser->current_buffer->append_subtree(new _smarty_tag($compiler->parser, $output)); | ||||
|         $compiler->template->has_nocache_code = false; | ||||
|         $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 | ||||
|      * @return boolean true | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         $_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'])) { | ||||
|             $plugins_string = '<?php '; | ||||
|             foreach($compiler->template->required_plugins['compiled'] as $tmp) { | ||||
|                 foreach($tmp as $data) { | ||||
|                     $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$data['file']}';\n"; | ||||
|                 } | ||||
|             } | ||||
|             $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]); | ||||
|          } | ||||
|         // if caching save template function for possible nocache call | ||||
|         if ($compiler->template->caching) { | ||||
|             $compiler->template->properties['function'][$_name]['compiled'] .= $plugins_string | ||||
|              . $compiler->parser->current_buffer->to_smarty_php(); | ||||
|             $compiler->template->properties['function'][$_name]['nocache_hash'] = $compiler->template->properties['nocache_hash']; | ||||
|             $compiler->template->properties['function'][$_name]['has_nocache_code'] = $compiler->template->has_nocache_code; | ||||
|             $compiler->template->properties['function'][$_name]['called_functions'] = $compiler->called_functions; | ||||
|             $compiler->called_functions = array(); | ||||
|             $compiler->smarty->template_functions[$_name] = $compiler->template->properties['function'][$_name]; | ||||
|             $compiler->has_code = false; | ||||
|             $output = true; | ||||
|         } else { | ||||
|             $output = $plugins_string . $compiler->parser->current_buffer->to_smarty_php() . "<?php \$_smarty_tpl->tpl_vars = \$saved_tpl_vars;}}?>\n"; | ||||
|         } | ||||
|         // reset flag that we are compiling a template function | ||||
|         $compiler->compiles_template_function = false; | ||||
|         // 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; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										207
									
								
								library/Smarty/libs/sysplugins/smarty_internal_compile_if.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								library/Smarty/libs/sysplugins/smarty_internal_compile_if.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | ||||
| <?php | ||||
| /** | ||||
| * Smarty Internal Plugin Compile If | ||||
| * | ||||
| * Compiles the {if} {else} {elseif} {/if} tags | ||||
| * | ||||
| * @package Smarty | ||||
| * @subpackage Compiler | ||||
| * @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 | ||||
|     * @return string compiled code | ||||
|     */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         $this->openTag($compiler, 'if', array(1, $compiler->nocache)); | ||||
|         // must whole block be nocache ? | ||||
|         $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; | ||||
|  | ||||
|         if (!array_key_exists("if condition",$parameter)) { | ||||
|             $compiler->trigger_template_error("missing if condition", $compiler->lex->taglineno); | ||||
|         } | ||||
|  | ||||
|         if (is_array($parameter['if condition'])) { | ||||
|             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']."){?>"; | ||||
|             } else { | ||||
|                 $_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 | ||||
|     * @return string compiled code | ||||
|     */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         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 | ||||
|     * @return string compiled code | ||||
|     */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|  | ||||
|         list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif')); | ||||
|  | ||||
|         if (!array_key_exists("if condition",$parameter)) { | ||||
|             $compiler->trigger_template_error("missing elseif condition", $compiler->lex->taglineno); | ||||
|         } | ||||
|  | ||||
|         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($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 ($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 | ||||
| * | ||||
| * @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 | ||||
|     */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // 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 .= '}'; | ||||
|         } | ||||
|         return "<?php {$tmp}?>"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,215 @@ | ||||
| <?php | ||||
| /** | ||||
| * Smarty Internal Plugin Compile Include | ||||
| * | ||||
| * Compiles the {include} tag | ||||
| * | ||||
| * @package Smarty | ||||
| * @subpackage Compiler | ||||
| * @author Uwe Tews | ||||
| */ | ||||
|  | ||||
| /** | ||||
| * 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 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'); | ||||
|     /** | ||||
|     * 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'); | ||||
|  | ||||
|     /** | ||||
|     * 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, $parameter) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         // save posible attributes | ||||
|         $include_file = $_attr['file']; | ||||
|  | ||||
|         if (isset($_attr['assign'])) { | ||||
|             // output will be stored in a smarty variable instead of beind displayed | ||||
|             $_assign = $_attr['assign']; | ||||
|         } | ||||
|  | ||||
|         $_parent_scope = Smarty::SCOPE_LOCAL; | ||||
|         if (isset($_attr['scope'])) { | ||||
|             $_attr['scope'] = trim($_attr['scope'], "'\""); | ||||
|             if ($_attr['scope'] == 'parent') { | ||||
|                 $_parent_scope = Smarty::SCOPE_PARENT; | ||||
|             } elseif ($_attr['scope'] == 'root') { | ||||
|                 $_parent_scope = Smarty::SCOPE_ROOT; | ||||
|             } elseif ($_attr['scope'] == 'global') { | ||||
|                 $_parent_scope = Smarty::SCOPE_GLOBAL; | ||||
|             } | ||||
|         } | ||||
|         $_caching = 'null'; | ||||
|         if ($compiler->nocache || $compiler->tag_nocache) { | ||||
|             $_caching = Smarty::CACHING_OFF; | ||||
|         } | ||||
|         // default for included templates | ||||
|         if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) { | ||||
|             $_caching = self::CACHING_NOCACHE_CODE; | ||||
|         } | ||||
|         /* | ||||
|         * if the {include} tag provides individual parameter for caching | ||||
|         * it will not be included into the common cache file and treated like | ||||
|         * a nocache section | ||||
|         */ | ||||
|         if (isset($_attr['cache_lifetime'])) { | ||||
|             $_cache_lifetime = $_attr['cache_lifetime']; | ||||
|             $compiler->tag_nocache = true; | ||||
|             $_caching = Smarty::CACHING_LIFETIME_CURRENT; | ||||
|         } else { | ||||
|             $_cache_lifetime = 'null'; | ||||
|         } | ||||
|         if (isset($_attr['cache_id'])) { | ||||
|             $_cache_id = $_attr['cache_id']; | ||||
|             $compiler->tag_nocache = true; | ||||
|             $_caching = Smarty::CACHING_LIFETIME_CURRENT; | ||||
|         } else { | ||||
|             $_cache_id = '$_smarty_tpl->cache_id'; | ||||
|         } | ||||
|         if (isset($_attr['compile_id'])) { | ||||
|             $_compile_id = $_attr['compile_id']; | ||||
|         } else { | ||||
|             $_compile_id = '$_smarty_tpl->compile_id'; | ||||
|         } | ||||
|         if ($_attr['caching'] === true) { | ||||
|             $_caching = Smarty::CACHING_LIFETIME_CURRENT; | ||||
|         } | ||||
|         if ($_attr['nocache'] === true) { | ||||
|             $compiler->tag_nocache = true; | ||||
|             $_caching = Smarty::CACHING_OFF; | ||||
|         } | ||||
|  | ||||
|         $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 and substr_count($include_file, '$_smarty_tpl->') == 0) { | ||||
|                 $tpl_name = null; | ||||
|                 eval("\$tpl_name = $include_file;"); | ||||
|                 if (!isset($compiler->smarty->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 | ||||
|                     $compiler->smarty->merged_templates_func[$tpl_name]['func'] = $tpl->properties['unifunc'] = 'content_'. str_replace('.', '_', uniqid('', true)); | ||||
|                     // use current nocache hash for inlined code | ||||
|                     $compiler->smarty->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; | ||||
|                     } | ||||
|                     // make sure whole chain gest compiled | ||||
|                     $tpl->mustCompile = true; | ||||
|                     if (!($tpl->source->uncompiled) && $tpl->source->exists) { | ||||
|                         // get compiled code | ||||
|                         $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 | ||||
|                         $tpl->properties['file_dependency'][$tpl->source->uid] = array($tpl->source->filepath, $tpl->source->timestamp,$tpl->source->type); | ||||
|                         $compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $tpl->properties['file_dependency']); | ||||
|                         // remove header code | ||||
|                         $compiled_code = preg_replace("/(<\?php \/\*%%SmartyHeaderCode:{$tpl->properties['nocache_hash']}%%\*\/(.+?)\/\*\/%%SmartyHeaderCode%%\*\/\?>\n)/s", '', $compiled_code); | ||||
|                         if ($tpl->has_nocache_code) { | ||||
|                             // replace nocache_hash | ||||
|                             $compiled_code = str_replace("{$tpl->properties['nocache_hash']}", $compiler->template->properties['nocache_hash'], $compiled_code); | ||||
|                             $compiler->template->has_nocache_code = true; | ||||
|                         } | ||||
|                         $compiler->merged_templates[$tpl->properties['unifunc']] = $compiled_code; | ||||
|                         $has_compiled_template = true; | ||||
|                     } | ||||
|                 } else { | ||||
|                     $has_compiled_template = true; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // 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) { | ||||
|                     $_pairs[] = "'$key'=>$value"; | ||||
|                 } | ||||
|                 $_vars = 'array('.join(',',$_pairs).')'; | ||||
|                 $_has_vars = true; | ||||
|             } else { | ||||
|                 $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 = $compiler->smarty->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 .= $compiler->smarty->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 = "<?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 { | ||||
|             $_output = "<?php echo \$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope);?>\n"; | ||||
|         } | ||||
|         return $_output; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,108 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Include PHP | ||||
|  * | ||||
|  * Compiles the {include_php} tag | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Insert Class | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  */ | ||||
| class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|      * 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'); | ||||
|     /** | ||||
|      * 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 object $compiler compiler object | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         if (!($compiler->smarty instanceof SmartyBC)) { | ||||
|             throw new SmartyException("{include_php} is deprecated, use SmartyBC class to enable"); | ||||
|         } | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|  | ||||
|         $_output = '<?php '; | ||||
|  | ||||
|         $_smarty_tpl = $compiler->template; | ||||
|         $_filepath = false; | ||||
|         eval('$_file = ' . $_attr['file'] . ';'); | ||||
|         if (!isset($compiler->smarty->security_policy) && file_exists($_file)) { | ||||
|             $_filepath = $_file; | ||||
|         } else { | ||||
|             if (isset($compiler->smarty->security_policy)) { | ||||
|                 $_dir = $compiler->smarty->security_policy->trusted_dir; | ||||
|             } else { | ||||
|                 $_dir = $compiler->smarty->trusted_dir; | ||||
|             } | ||||
|             if (!empty($_dir)) { | ||||
|                 foreach((array)$_dir as $_script_dir) { | ||||
|                     $_script_dir = rtrim($_script_dir, '/\\') . DS; | ||||
|                     if (file_exists($_script_dir . $_file)) { | ||||
|                         $_filepath = $_script_dir .  $_file; | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if ($_filepath == false) { | ||||
|             $compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", $compiler->lex->taglineno); | ||||
|         } | ||||
|  | ||||
|         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"; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,142 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Insert | ||||
|  * | ||||
|  * Compiles the {insert} tag | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Insert Class | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  */ | ||||
| class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|      * 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'); | ||||
|     /** | ||||
|      * 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 object $compiler compiler object | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         // never compile as nocache code | ||||
|         $compiler->suppressNocacheProcessing = true; | ||||
|         $compiler->tag_nocache = true; | ||||
|         $_smarty_tpl = $compiler->template; | ||||
|         $_name = null; | ||||
|         $_script = null; | ||||
|  | ||||
|         $_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']; | ||||
|             // create variable to make shure that the compiler knows about its nocache status | ||||
|             $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($compiler->smarty->security_policy) && file_exists($_script)) { | ||||
|                 $_filepath = $_script; | ||||
|             } else { | ||||
|                 if (isset($compiler->smarty->security_policy)) { | ||||
|                     $_dir = $compiler->smarty->security_policy->trusted_dir; | ||||
|                 } else { | ||||
|                     $_dir = $compiler->smarty->trusted_dir; | ||||
|                 } | ||||
|                 if (!empty($_dir)) { | ||||
|                     foreach((array)$_dir as $_script_dir) { | ||||
|                         $_script_dir = rtrim($_script_dir, '/\\') . DS; | ||||
|                         if (file_exists($_script_dir . $_script)) { | ||||
|                             $_filepath = $_script_dir . $_script; | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             if ($_filepath == false) { | ||||
|                 $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)) { | ||||
|                 $compiler->trigger_template_error(" {insert} function '{$_function}' is not callable in script file '{$_script}'", $compiler->lex->taglineno); | ||||
|             } | ||||
|         } else { | ||||
|             $_filepath = 'null'; | ||||
|             $_function = "insert_{$_name}"; | ||||
|             // function in PHP script ? | ||||
|             if (!is_callable($_function)) { | ||||
|                 // try plugin | ||||
|                 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']); | ||||
|         // convert attributes into parameter array string | ||||
|         $_paramsArray = array(); | ||||
|         foreach ($_attr as $_key => $_value) { | ||||
|             $_paramsArray[] = "'$_key' => $_value"; | ||||
|         } | ||||
|         $_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 { | ||||
|             $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; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,41 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Ldelim | ||||
|  * | ||||
|  * Compiles the {ldelim} tag | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * 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 | ||||
|      * @param object $compiler compiler object | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         if ($_attr['nocache'] === true) { | ||||
|             $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); | ||||
|         } | ||||
|         // this tag does not return compiled code | ||||
|         $compiler->has_code = true; | ||||
|         return $compiler->smarty->left_delimiter; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,73 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Nocache | ||||
|  * | ||||
|  * Compiles the {nocache} {/nocache} tags. | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * 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 | ||||
|      * @param object $compiler compiler object | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         if ($_attr['nocache'] === true) { | ||||
|             $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); | ||||
|         } | ||||
|         // enter nocache mode | ||||
|         $compiler->nocache = true; | ||||
|         // this tag does not return compiled code | ||||
|         $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 | ||||
|      * @param object $compiler compiler object | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function compile($args, $compiler) | ||||
|     { | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         // leave nocache mode | ||||
|         $compiler->nocache = false; | ||||
|         // this tag does not return compiled code | ||||
|         $compiler->has_code = false; | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,87 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Block Plugin | ||||
|  * | ||||
|  * Compiles code for the execution of block plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @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 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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter, $tag, $function) | ||||
|     { | ||||
|         if (!isset($tag[5]) || substr($tag, -5) != 'close') { | ||||
|             // opening tag of block plugin | ||||
|             // 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) { | ||||
|                 if (is_int($_key)) { | ||||
|                     $_paramsArray[] = "$_key=>$_value"; | ||||
|                 } else { | ||||
|                     $_paramsArray[] = "'$_key'=>$_value"; | ||||
|                 } | ||||
|             } | ||||
|             $_params = 'array(' . implode(",", $_paramsArray) . ')'; | ||||
|  | ||||
|             $this->openTag($compiler, $tag, array($_params, $compiler->nocache)); | ||||
|             // maybe nocache because of nocache variables or nocache plugin | ||||
|             $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; | ||||
|             // compile code | ||||
|             $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 ($compiler->nocache) { | ||||
|                 $compiler->tag_nocache = true; | ||||
|             } | ||||
|             // closing tag of block plugin, restore nocache | ||||
|             list($_params, $compiler->nocache) = $this->closeTag($compiler, substr($tag, 0, -5)); | ||||
|             // This tag does create output | ||||
|             $compiler->has_output = true; | ||||
|             // compile code | ||||
|             if (!isset($parameter['modifier_list'])) { | ||||
|                 $mod_pre = $mod_post =''; | ||||
|             } else { | ||||
|                 $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"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,73 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Function Plugin | ||||
|  * | ||||
|  * Compiles code for the execution of function plugin | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @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 definition: Overwrites base class. | ||||
|      * | ||||
|      * @var array | ||||
|      * @see Smarty_Internal_CompileBase | ||||
|      */ | ||||
|     public $required_attributes = array(); | ||||
|     /** | ||||
|      * 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 plugin | ||||
|      * @param string $function PHP function name | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter, $tag, $function) | ||||
|     { | ||||
|         // This tag does create output | ||||
|         $compiler->has_output = true; | ||||
|  | ||||
|         // 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) { | ||||
|             if (is_int($_key)) { | ||||
|                 $_paramsArray[] = "$_key=>$_value"; | ||||
|             } else { | ||||
|                 $_paramsArray[] = "'$_key'=>$_value"; | ||||
|             } | ||||
|         } | ||||
|         $_params = 'array(' . implode(",", $_paramsArray) . ')'; | ||||
|         // compile code | ||||
|         $output = "<?php echo {$function}({$_params},\$_smarty_tpl);?>\n"; | ||||
|         return $output; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,140 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Modifier | ||||
|  * | ||||
|  * Compiles code for modifier execution | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter) { | ||||
|         // check and get attributes | ||||
|         $_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); | ||||
|             // check if we know already the type of modifier | ||||
|             if (isset($compiler->known_modifier_type[$modifier])) { | ||||
|                 $modifier_types = array($compiler->known_modifier_type[$modifier]); | ||||
|             } else { | ||||
|                 $modifier_types = array(1, 2, 3, 4, 5, 6); | ||||
|             } | ||||
|             foreach ($modifier_types as $type) { | ||||
|                 switch ($type) { | ||||
|                     case 1: | ||||
|                         // registered modifier | ||||
|                         if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier])) { | ||||
|                             $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0]; | ||||
|                             if (!is_array($function)) { | ||||
|                                 $output = "{$function}({$params})"; | ||||
|                             } else { | ||||
|                                 if (is_object($function[0])) { | ||||
|                                     $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')'; | ||||
|                                 } else { | ||||
|                                     $output = $function[0] . '::' . $function[1] . '(' . $params . ')'; | ||||
|                                 } | ||||
|                             } | ||||
|                             $compiler->known_modifier_type[$modifier] = $type; | ||||
|                             break 2; | ||||
|                         } | ||||
|                         break; | ||||
|                     case 2: | ||||
|                         // registered modifier compiler | ||||
|                         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); | ||||
|                             $compiler->known_modifier_type[$modifier] = $type; | ||||
|                             break 2; | ||||
|                         } | ||||
|                         break; | ||||
|                     case 3: | ||||
|                         // modifiercompiler plugin | ||||
|                         if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) { | ||||
|                             // 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); | ||||
|                             } | ||||
|                             $compiler->known_modifier_type[$modifier] = $type; | ||||
|                             break 2; | ||||
|                         } | ||||
|                         break; | ||||
|                     case 4: | ||||
|                         // modifier plugin | ||||
|                         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})"; | ||||
|                             } | ||||
|                             $compiler->known_modifier_type[$modifier] = $type; | ||||
|                             break 2; | ||||
|                         } | ||||
|                         break; | ||||
|                     case 5: | ||||
|                         // PHP function | ||||
|                         if (is_callable($modifier)) { | ||||
|                             // check if modifier allowed | ||||
|                             if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)) { | ||||
|                                 $output = "{$modifier}({$params})"; | ||||
|                             } | ||||
|                             $compiler->known_modifier_type[$modifier] = $type; | ||||
|                             break 2; | ||||
|                         } | ||||
|                         break; | ||||
|                     case 6: | ||||
|                         // default plugin handler | ||||
|                         if (isset($compiler->default_handler_plugins[Smarty::PLUGIN_MODIFIER][$modifier]) || (is_callable($compiler->smarty->default_plugin_handler_func) && $compiler->getPluginFromDefaultHandler($modifier, Smarty::PLUGIN_MODIFIER))) { | ||||
|                             $function = $compiler->default_handler_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0]; | ||||
|                             // check if modifier allowed | ||||
|                             if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) { | ||||
|                                 if (!is_array($function)) { | ||||
|                                     $output = "{$function}({$params})"; | ||||
|                                 } else { | ||||
|                                     if (is_object($function[0])) { | ||||
|                                         $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')'; | ||||
|                                     } else { | ||||
|                                         $output = $function[0] . '::' . $function[1] . '(' . $params . ')'; | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                             if (isset($compiler->template->required_plugins['nocache'][$modifier][Smarty::PLUGIN_MODIFIER]['file']) || isset($compiler->template->required_plugins['compiled'][$modifier][Smarty::PLUGIN_MODIFIER]['file'])) { | ||||
|                                 // was a plugin | ||||
|                                 $compiler->known_modifier_type[$modifier] = 4; | ||||
|                             } else { | ||||
|                                 $compiler->known_modifier_type[$modifier] = $type; | ||||
|                             } | ||||
|                             break 2; | ||||
|                         } | ||||
|                 } | ||||
|             } | ||||
|             if (!isset($compiler->known_modifier_type[$modifier])) { | ||||
|                 $compiler->trigger_template_error("unknown modifier \"" . $modifier . "\"", $compiler->lex->taglineno); | ||||
|             } | ||||
|         } | ||||
|         return $output; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,88 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Object Block Function | ||||
|  * | ||||
|  * Compiles code for registered objects as block function | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @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 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 $method    name of method to call | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter, $tag, $method) | ||||
|     { | ||||
|         if (!isset($tag[5]) || substr($tag, -5) != 'close') { | ||||
|             // opening tag of block plugin | ||||
|             // 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) { | ||||
|                 if (is_int($_key)) { | ||||
|                     $_paramsArray[] = "$_key=>$_value"; | ||||
|                 } else { | ||||
|                     $_paramsArray[] = "'$_key'=>$_value"; | ||||
|                 } | ||||
|             } | ||||
|             $_params = 'array(' . implode(",", $_paramsArray) . ')'; | ||||
|  | ||||
|             $this->openTag($compiler, $tag . '->' . $method, array($_params, $compiler->nocache)); | ||||
|             // maybe nocache because of nocache variables or nocache plugin | ||||
|             $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; | ||||
|             // compile code | ||||
|             $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); | ||||
|             // must endblock be nocache? | ||||
|             if ($compiler->nocache) { | ||||
|                 $compiler->tag_nocache = true; | ||||
|             } | ||||
|             // closing tag of block plugin, restore nocache | ||||
|             list($_params, $compiler->nocache) = $this->closeTag($compiler, $base_tag . '->' . $method); | ||||
|             // This tag does create output | ||||
|             $compiler->has_output = true; | ||||
|             // compile code | ||||
|             if (!isset($parameter['modifier_list'])) { | ||||
|                 $mod_pre = $mod_post = ''; | ||||
|             } else { | ||||
|                 $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]->{$method}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); " . $mod_post . "  } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>"; | ||||
|         } | ||||
|         return $output . "\n"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,79 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Object Funtion | ||||
|  * | ||||
|  * Compiles code for registered objects as function | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @author Uwe Tews | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Object Function Class | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  */ | ||||
| class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|      * Attribute definition: Overwrites base class. | ||||
|      * | ||||
|      * @var array | ||||
|      * @see Smarty_Internal_CompileBase | ||||
|      */ | ||||
|     public $optional_attributes = array('_any'); | ||||
|  | ||||
|     /** | ||||
|      * Compiles code for the execution of function plugin | ||||
|      * | ||||
|      * @param array  $args      array with attributes from parser | ||||
|      * @param object $compiler  compiler object | ||||
|      * @param array  $parameter array with compilation parameter | ||||
|      * @param string $tag       name of function | ||||
|      * @param string $method    name of method to call | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter, $tag, $method) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         if ($_attr['nocache'] === true) { | ||||
|             $compiler->tag_nocache = true; | ||||
|         } | ||||
|         unset($_attr['nocache']); | ||||
|         $_assign = null; | ||||
|         if (isset($_attr['assign'])) { | ||||
|             $_assign = $_attr['assign']; | ||||
|             unset($_attr['assign']); | ||||
|         } | ||||
|         // convert attributes into parameter array string | ||||
|         if ($compiler->smarty->registered_objects[$tag][2]) { | ||||
|             $_paramsArray = array(); | ||||
|             foreach ($_attr as $_key => $_value) { | ||||
|                 if (is_int($_key)) { | ||||
|                     $_paramsArray[] = "$_key=>$_value"; | ||||
|                 } else { | ||||
|                     $_paramsArray[] = "'$_key'=>$_value"; | ||||
|                 } | ||||
|             } | ||||
|             $_params = 'array(' . implode(",", $_paramsArray) . ')'; | ||||
|             $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params},\$_smarty_tpl)"; | ||||
|         } else { | ||||
|             $_params = implode(",", $_attr); | ||||
|             $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params})"; | ||||
|         } | ||||
|         if (empty($_assign)) { | ||||
|             // This tag does create output | ||||
|             $compiler->has_output = true; | ||||
|             $output = "<?php echo {$return};?>\n"; | ||||
|         } else { | ||||
|             $output = "<?php \$_smarty_tpl->assign({$_assign},{$return});?>\n"; | ||||
|         } | ||||
|         return $output; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +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 | ||||
| */ | ||||
|  | ||||
| /** | ||||
| * Smarty Internal Plugin Compile Print Expression Class | ||||
| * | ||||
| * @package Smarty | ||||
| * @subpackage Compiler | ||||
| */ | ||||
| class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_CompileBase { | ||||
|  | ||||
|     /** | ||||
|     * 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 | ||||
|     * @return string compiled code | ||||
|     */ | ||||
|     public function compile($args, $compiler, $parameter) | ||||
|     { | ||||
|         // check and get attributes | ||||
|         $_attr = $this->getAttributes($compiler, $args); | ||||
|         // nocache option | ||||
|         if ($_attr['nocache'] === true) { | ||||
|             $compiler->tag_nocache = true; | ||||
|         } | ||||
|         // filter handling | ||||
|         if ($_attr['nofilter'] === true) { | ||||
|             $_filter = 'false'; | ||||
|         } else { | ||||
|             $_filter = 'true'; | ||||
|         } | ||||
|         if (isset($_attr['assign'])) { | ||||
|             // assign output to variable | ||||
|             $output = "<?php \$_smarty_tpl->assign({$_attr['assign']},{$parameter['value']});?>"; | ||||
|         } else { | ||||
|             // display value | ||||
|             $output = $parameter['value']; | ||||
|             // tag modifier | ||||
|             if (!empty($parameter['modifierlist'])) { | ||||
|                 $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter['modifierlist'], 'value' => $output)); | ||||
|             } | ||||
|             if (!$_attr['nofilter']) { | ||||
|                 // default modifier | ||||
|                 if (!empty($compiler->smarty->default_modifiers)) { | ||||
|                     if (empty($compiler->default_modifier_list)) { | ||||
|                         $modifierlist = array(); | ||||
|                         foreach ($compiler->smarty->default_modifiers as $key => $single_default_modifier) { | ||||
|                             preg_match_all('/(\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|:|[^:]+)/', $single_default_modifier, $mod_array); | ||||
|                             for ($i = 0, $count = count($mod_array[0]);$i < $count;$i++) { | ||||
|                                 if ($mod_array[0][$i] != ':') { | ||||
|                                     $modifierlist[$key][] = $mod_array[0][$i]; | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                         $compiler->default_modifier_list  = $modifierlist; | ||||
|                     } | ||||
|                     $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => $compiler->default_modifier_list, 'value' => $output)); | ||||
|                 } | ||||
|                 // autoescape html | ||||
|                 if ($compiler->template->smarty->escape_html) { | ||||
|                     $output = "htmlspecialchars({$output}, ENT_QUOTES, '" . addslashes(Smarty::$_CHARSET) . "')"; | ||||
|                 } | ||||
|                 // loop over 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)"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,113 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Registered Block | ||||
|  * | ||||
|  * Compiles code for the execution of a registered block function | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @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 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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter, $tag) | ||||
|     { | ||||
|         if (!isset($tag[5]) || substr($tag,-5) != 'close') { | ||||
|             // opening tag of block plugin | ||||
|             // 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 ($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->openTag($compiler, $tag, array($_params, $compiler->nocache)); | ||||
|             // maybe nocache because of nocache variables or nocache plugin | ||||
|             $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; 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; 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; echo {$function[0]}::{$function[1]}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>"; | ||||
|             } | ||||
|         } else { | ||||
|             // must endblock be nocache? | ||||
|             if ($compiler->nocache) { | ||||
|                 $compiler->tag_nocache = true; | ||||
|             } | ||||
|             $base_tag = substr($tag, 0, -5); | ||||
|             // closing tag of block plugin, restore nocache | ||||
|             list($_params, $compiler->nocache) = $this->closeTag($compiler, $base_tag); | ||||
|             // This tag does create output | ||||
|             $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 =''; | ||||
|             } else { | ||||
|                 $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);?>"; | ||||
|             } else if (is_object($function[0])) { | ||||
|                 $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"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
| @@ -0,0 +1,81 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Smarty Internal Plugin Compile Registered Function | ||||
|  * | ||||
|  * Compiles code for the execution of a registered function | ||||
|  * | ||||
|  * @package Smarty | ||||
|  * @subpackage Compiler | ||||
|  * @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 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 | ||||
|      * @return string compiled code | ||||
|      */ | ||||
|     public function compile($args, $compiler, $parameter, $tag) | ||||
|     { | ||||
|         // This tag does create output | ||||
|         $compiler->has_output = true; | ||||
|         // 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_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? | ||||
|         $compiler->tag_nocache =  $compiler->tag_nocache || !$tag_info[1]; | ||||
|         // convert attributes into parameter array string | ||||
|         $_paramsArray = array(); | ||||
|         foreach ($_attr as $_key => $_value) { | ||||
|             if (is_int($_key)) { | ||||
|                 $_paramsArray[] = "$_key=>$_value"; | ||||
|             } elseif ($compiler->template->caching && in_array($_key,$tag_info[2])) { | ||||
|                 $_value = str_replace("'","^#^",$_value); | ||||
|                 $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^"; | ||||
|             } else { | ||||
|                 $_paramsArray[] = "'$_key'=>$_value"; | ||||
|             } | ||||
|         } | ||||
|         $_params = 'array(' . implode(",", $_paramsArray) . ')'; | ||||
|         $function = $tag_info[0]; | ||||
|         // compile code | ||||
|         if (!is_array($function)) { | ||||
|             $output = "<?php echo {$function}({$_params},\$_smarty_tpl);?>\n"; | ||||
|         } else if (is_object($function[0])) { | ||||
|             $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; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user