forked from SimplesIP/pabx-app
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
5.1 KiB
169 lines
5.1 KiB
<?php |
|
/** |
|
* Smarty Internal Plugin Templateparser Parse Tree |
|
* These are classes to build parse tree in the template parser |
|
* |
|
* @package Smarty |
|
* @subpackage Compiler |
|
* @author Thue Kristensen |
|
* @author Uwe Tews |
|
*/ |
|
|
|
/** |
|
* Template element |
|
* |
|
* @package Smarty |
|
* @subpackage Compiler |
|
* @ignore |
|
*/ |
|
class Smarty_Internal_ParseTree_Template extends Smarty_Internal_ParseTree |
|
{ |
|
/** |
|
* Array of template elements |
|
* |
|
* @var array |
|
*/ |
|
public $subtrees = array(); |
|
|
|
/** |
|
* Create root of parse tree for template elements |
|
*/ |
|
public function __construct() |
|
{ |
|
} |
|
|
|
/** |
|
* Append buffer to subtree |
|
* |
|
* @param \Smarty_Internal_Templateparser $parser |
|
* @param Smarty_Internal_ParseTree $subtree |
|
*/ |
|
public function append_subtree(Smarty_Internal_Templateparser $parser, Smarty_Internal_ParseTree $subtree) |
|
{ |
|
if (!empty($subtree->subtrees)) { |
|
$this->subtrees = array_merge($this->subtrees, $subtree->subtrees); |
|
} else { |
|
if ($subtree->data !== '') { |
|
$this->subtrees[] = $subtree; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Append array to subtree |
|
* |
|
* @param \Smarty_Internal_Templateparser $parser |
|
* @param \Smarty_Internal_ParseTree[] $array |
|
*/ |
|
public function append_array(Smarty_Internal_Templateparser $parser, $array = array()) |
|
{ |
|
if (!empty($array)) { |
|
$this->subtrees = array_merge($this->subtrees, (array)$array); |
|
} |
|
} |
|
|
|
/** |
|
* Prepend array to subtree |
|
* |
|
* @param \Smarty_Internal_Templateparser $parser |
|
* @param \Smarty_Internal_ParseTree[] $array |
|
*/ |
|
public function prepend_array(Smarty_Internal_Templateparser $parser, $array = array()) |
|
{ |
|
if (!empty($array)) { |
|
$this->subtrees = array_merge((array)$array, $this->subtrees); |
|
} |
|
} |
|
|
|
/** |
|
* Sanitize and merge subtree buffers together |
|
* |
|
* @param \Smarty_Internal_Templateparser $parser |
|
* |
|
* @return string template code content |
|
*/ |
|
public function to_smarty_php(Smarty_Internal_Templateparser $parser) |
|
{ |
|
$code = ''; |
|
|
|
foreach ($this->getChunkedSubtrees() as $chunk) { |
|
$text = ''; |
|
switch ($chunk['mode']) { |
|
case 'textstripped': |
|
foreach ($chunk['subtrees'] as $subtree) { |
|
$text .= $subtree->to_smarty_php($parser); |
|
} |
|
$code .= preg_replace( |
|
'/((<%)|(%>)|(<\?php)|(<\?)|(\?>)|(<\/?script))/', |
|
"<?php echo '\$1'; ?>\n", |
|
$parser->compiler->processText($text) |
|
); |
|
break; |
|
case 'text': |
|
foreach ($chunk['subtrees'] as $subtree) { |
|
$text .= $subtree->to_smarty_php($parser); |
|
} |
|
$code .= preg_replace( |
|
'/((<%)|(%>)|(<\?php)|(<\?)|(\?>)|(<\/?script))/', |
|
"<?php echo '\$1'; ?>\n", |
|
$text |
|
); |
|
break; |
|
case 'tag': |
|
foreach ($chunk['subtrees'] as $subtree) { |
|
$text = $parser->compiler->appendCode($text, $subtree->to_smarty_php($parser)); |
|
} |
|
$code .= $text; |
|
break; |
|
default: |
|
foreach ($chunk['subtrees'] as $subtree) { |
|
$text = $subtree->to_smarty_php($parser); |
|
} |
|
$code .= $text; |
|
|
|
} |
|
} |
|
return $code; |
|
} |
|
|
|
private function getChunkedSubtrees() { |
|
$chunks = array(); |
|
$currentMode = null; |
|
$currentChunk = array(); |
|
for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) { |
|
|
|
if ($this->subtrees[ $key ]->data === '' && in_array($currentMode, array('textstripped', 'text', 'tag'))) { |
|
continue; |
|
} |
|
|
|
if ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Text |
|
&& $this->subtrees[ $key ]->isToBeStripped()) { |
|
$newMode = 'textstripped'; |
|
} elseif ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Text) { |
|
$newMode = 'text'; |
|
} elseif ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Tag) { |
|
$newMode = 'tag'; |
|
} else { |
|
$newMode = 'other'; |
|
} |
|
|
|
if ($newMode == $currentMode) { |
|
$currentChunk[] = $this->subtrees[ $key ]; |
|
} else { |
|
$chunks[] = array( |
|
'mode' => $currentMode, |
|
'subtrees' => $currentChunk |
|
); |
|
$currentMode = $newMode; |
|
$currentChunk = array($this->subtrees[ $key ]); |
|
} |
|
} |
|
if ($currentMode && $currentChunk) { |
|
$chunks[] = array( |
|
'mode' => $currentMode, |
|
'subtrees' => $currentChunk |
|
); |
|
} |
|
return $chunks; |
|
} |
|
}
|
|
|