Upgrade Smarty

This commit is contained in:
nemunaire 2015-01-14 11:28:47 +01:00 committed by Nemunaire
commit 93918f5756
121 changed files with 8385 additions and 6267 deletions

View file

@ -1,17 +1,16 @@
<?php
/**
* Smarty Internal Plugin Templateparser Parsetrees
*
* These are classes to build parsetrees in the template parser
*
* @package Smarty
* @package Smarty
* @subpackage Compiler
* @author Thue Kristensen
* @author Uwe Tews
* @author Thue Kristensen
* @author Uwe Tews
*/
/**
* @package Smarty
* @package Smarty
* @subpackage Compiler
* @ignore
*/
@ -19,28 +18,36 @@ abstract class _smarty_parsetree
{
/**
* Parser object
*
* @var object
*/
public $parser;
/**
* Buffer content
*
* @var mixed
*/
public $data;
/**
* Subtree array
*
* @var array
*/
public $subtrees = array();
/**
* Return buffer
*
* @return string buffer content
*/
abstract public function to_smarty_php();
}
/**
* A complete smarty tag.
*
* @package Smarty
* @package Smarty
* @subpackage Compiler
* @ignore
*/
@ -48,6 +55,7 @@ class _smarty_tag extends _smarty_parsetree
{
/**
* Saved block nesting level
*
* @var int
*/
public $saved_block_nesting;
@ -76,24 +84,23 @@ class _smarty_tag extends _smarty_parsetree
}
/**
* Return complied code that loads the evaluated outout of buffer content into a temporary variable
* Return complied code that loads the evaluated output of buffer content into a temporary variable
*
* @return string template code
*/
public function assign_to_var()
{
$var = sprintf('$_tmp%d', ++Smarty_Internal_Templateparser::$prefix_number);
$this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>', $this->data, $var);
$this->parser->compiler->prefix_code[] = sprintf("<?php ob_start();\n%s\n%s=ob_get_clean();?>", preg_replace(array('/^\s*<\?php\s+/','/\s*\?>\s*$/'), '', $this->data), $var);
return $var;
}
}
/**
* Code fragment inside a tag.
*
* @package Smarty
* @package Smarty
* @subpackage Compiler
* @ignore
*/
@ -120,13 +127,12 @@ class _smarty_code extends _smarty_parsetree
{
return sprintf("(%s)", $this->data);
}
}
/**
* Double quoted string inside a tag.
*
* @package Smarty
* @package Smarty
* @subpackage Compiler
* @ignore
*/
@ -198,13 +204,12 @@ class _smarty_doublequoted extends _smarty_parsetree
return $code;
}
}
/**
* Raw chars as part of a double quoted string.
*
* @package Smarty
* @package Smarty
* @subpackage Compiler
* @ignore
*/
@ -231,13 +236,12 @@ class _smarty_dq_content extends _smarty_parsetree
{
return '"' . $this->data . '"';
}
}
/**
* Template element
*
* @package Smarty
* @package Smarty
* @subpackage Compiler
* @ignore
*/
@ -267,7 +271,9 @@ class _smarty_template_buffer extends _smarty_parsetree
*/
public function append_subtree(_smarty_parsetree $subtree)
{
$this->subtrees[] = $subtree;
if ($subtree->data !== '') {
$this->subtrees[] = $subtree;
}
}
/**
@ -278,49 +284,45 @@ class _smarty_template_buffer extends _smarty_parsetree
public function to_smarty_php()
{
$code = '';
for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) {
if ($key + 2 < $cnt) {
if ($this->subtrees[$key] instanceof _smarty_linebreak && $this->subtrees[$key + 1] instanceof _smarty_tag && $this->subtrees[$key + 1]->data == '' && $this->subtrees[$key + 2] instanceof _smarty_linebreak) {
$key = $key + 1;
for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key ++) {
if ($this->subtrees[$key] instanceof _smarty_text) {
$subtree = $this->subtrees[$key]->to_smarty_php();
while ($key + 1 < $cnt && ($this->subtrees[$key+1] instanceof _smarty_text || $this->subtrees[$key +1]->data == '')) {
$key++;
if ($this->subtrees[$key]->data == '') {
continue;
}
$subtree .= $this->subtrees[$key]->to_smarty_php();
}
if ($subtree == '') {
continue;
}
if (substr($this->subtrees[$key]->data, -1) == '<' && $this->subtrees[$key + 1]->data == '' && substr($this->subtrees[$key + 2]->data, -1) == '?') {
$key = $key + 2;
$code .= preg_replace('/(<%|%>|<\?php|<\?|\?>|<\/?script)/', "<?php echo '\$1'; ?>\n", $subtree);
continue;
}
if ($this->subtrees[$key] instanceof _smarty_tag) {
$subtree = $this->subtrees[$key]->to_smarty_php();
while ($key + 1 < $cnt && ($this->subtrees[$key+1] instanceof _smarty_tag || $this->subtrees[$key +1]->data == '')) {
$key++;
if ($this->subtrees[$key]->data == '') {
continue;
}
$newCode = $this->subtrees[$key]->to_smarty_php();
if ((preg_match('/^\s*<\?php\s+/', $newCode) && preg_match('/\s*\?>\s*$/', $subtree))) {
$subtree = preg_replace('/\s*\?>\s*$/', "\n", $subtree);
$subtree .= preg_replace('/^\s*<\?php\s+/', '', $newCode);
} else {
$subtree .= $newCode;
}
}
if ($subtree == '') {
continue;
}
}
if (substr($code, -1) == '<') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '?') {
$code = substr($code, 0, strlen($code) - 1) . '<<?php ?>?' . substr($subtree, 1);
} elseif ($this->parser->asp_tags && substr($subtree, 0, 1) == '%') {
$code = substr($code, 0, strlen($code) - 1) . '<<?php ?>%' . substr($subtree, 1);
} else {
$code .= $subtree;
}
continue;
}
if ($this->parser->asp_tags && substr($code, -1) == '%') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '>') {
$code = substr($code, 0, strlen($code) - 1) . '%<?php ?>>' . substr($subtree, 1);
} else {
$code .= $subtree;
}
continue;
}
if (substr($code, -1) == '?') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '>') {
$code = substr($code, 0, strlen($code) - 1) . '?<?php ?>>' . substr($subtree, 1);
} else {
$code .= $subtree;
}
$code .= $subtree;
continue;
}
$code .= $this->subtrees[$key]->to_smarty_php();
}
return $code;
}
@ -329,7 +331,7 @@ class _smarty_template_buffer extends _smarty_parsetree
/**
* template text
*
* @package Smarty
* @package Smarty
* @subpackage Compiler
* @ignore
*/
@ -356,38 +358,4 @@ class _smarty_text extends _smarty_parsetree
{
return $this->data;
}
}
/**
* template linebreaks
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_linebreak extends _smarty_parsetree
{
/**
* Create buffer with linebreak content
*
* @param object $parser parser object
* @param string $data linebreak string
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
}
/**
* Return linebrak
*
* @return string linebreak
*/
public function to_smarty_php()
{
return $this->data;
}
}