version = '3.0.2.1';
$this->tpl_base = array($tpl_file, $type);
$this->tpl_count = 0;
$this->ignore_stack = array(false);
}
/**
* TemplatePowerParser::__errorAlert()
*
* @param $message
* @return
*
* @access private
*/
protected function __errorAlert($message)
{
print('
' . $message . '
'. PHP_EOL);
}
/**
* TemplatePowerParser::__prepare()
*
* @return
*
* @access private
*/
protected function __prepare()
{
$this->defBlock[ TP_ROOTBLOCK ] = array();
eval(base64_decode($this->header));
$tplvar = $this->__prepareTemplate($this->tpl_base[0], $this->tpl_base[1]);
$initdev["varrow"] = 0;
$initdev["coderow"] = 0;
$initdev["index"] = 0;
$initdev["ignore"] = false;
$this->__parseTemplate($tplvar, TP_ROOTBLOCK, $initdev);
$this->__cleanUp();
}
/**
* TemplatePowerParser::__cleanUp()
*
* @return
*
* @access private
*/
protected function __cleanUp()
{
for ($i=0; $i <= $this->tpl_count; $i++) {
$tplvar = 'tpl_rawContent' . $i;
unset($this->{$tplvar});
}
}
/**
* TemplatePowerParser::__prepareTemplate()
*
* @param $tpl_file
* @param $type
* @return
*
* @access private
*/
protected function __prepareTemplate($tpl_file, $type)
{
$tplvar = 'tpl_rawContent' . $this->tpl_count;
if ($type == T_BYVAR) {
$this->{$tplvar}["content"] = preg_split("/\n/", $tpl_file, -1, PREG_SPLIT_DELIM_CAPTURE);
} else {
if (is_readable($tpl_file)) {
$this->{$tplvar}["content"] = file( $tpl_file );
} else {
die($this->__errorAlert('TemplatePower Error: Couldn\'t open or read [ ' . $tpl_file . ' ]!'));
}
}
$this->{$tplvar}["size"] = sizeof($this->{$tplvar}["content"]);
$this->tpl_count++;
return $tplvar;
}
/**
* TemplatePowerParser::__parseTemplate()
*
* @param $tplvar
* @param $blockname
* @param $initdev
* @return
*
* @access private
*/
protected function __parseTemplate($tplvar, $blockname, $initdev)
{
$coderow = $initdev["coderow"];
$varrow = $initdev["varrow"];
$index = $initdev["index"];
$ignore = $initdev["ignore"];
while ($index < $this->{$tplvar}["size"]) {
$ignreg = array();
if (preg_match('//', $this->{$tplvar}["content"][$index], $ignreg) ) {
if( $ignreg[1] == 'START') {
//$ignore = true;
array_push( $this->ignore_stack, true );
}
else {
//$ignore = false;
array_pop( $this->ignore_stack );
}
} else {
if (! end($this->ignore_stack)) {
$regs = array();
if (preg_match('//', $this->{$tplvar}["content"][$index], $regs)) {
//remove trailing and leading spaces
$regs[2] = trim( $regs[2] );
if ($regs[1] == 'INCLUDE') {
$include_defined = true;
//check if the include file is assigned
if (isset( $this->tpl_include[ $regs[2] ])) {
$tpl_file = $this->tpl_include[ $regs[2] ][0];
$type = $this->tpl_include[ $regs[2] ][1];
} else if (file_exists( $regs[2] )) { //check if defined as constant in template
$tpl_file = $regs[2];
$type = T_BYFILE;
} else {
$include_defined = false;
}
if ($include_defined) {
//initialize startvalues for recursive call
$initdev["varrow"] = $varrow;
$initdev["coderow"] = $coderow;
$initdev["index"] = 0;
$initdev["ignore"] = false;
$tplvar2 = $this->__prepareTemplate( $tpl_file, $type );
$initdev = $this->__parseTemplate( $tplvar2, $blockname, $initdev );
$coderow = $initdev["coderow"];
$varrow = $initdev["varrow"];
}
} else if ($regs[1] == 'INCLUDESCRIPT') {
$include_defined = true;
//check if the includescript file is assigned by the assignInclude function
if (isset( $this->tpl_include[ $regs[2] ])) {
$include_file = $this->tpl_include[ $regs[2] ][0];
$type = $this->tpl_include[ $regs[2] ][1];
} else if (file_exists( $regs[2] )) { //check if defined as constant in template
$include_file = $regs[2];
$type = T_BYFILE;
} else {
$include_defined = false;
}
if ($include_defined) {
ob_start();
if ($type == T_BYFILE) {
if (! @include_once($include_file)) {
$this->__errorAlert('TemplatePower Error: Couldn\'t include script [ '. $include_file .' ]!');
exit();
}
} else {
eval("?>" . $include_file);
}
$this->defBlock[$blockname]["_C:$coderow"] = ob_get_contents();
$coderow++;
ob_end_clean();
}
} else if ($regs[1] == 'REUSE') {
$reuse_regs = array();
//do match for 'AS'
if (preg_match('/(.+) AS (.+)/', $regs[2], $reuse_regs)) {
$originalbname = trim( $reuse_regs[1] );
$copybname = trim( $reuse_regs[2] );
//test if original block exist
if (isset( $this->defBlock[ $originalbname ] )) {
//copy block
$this->defBlock[ $copybname ] = $this->defBlock[ $originalbname ];
//tell the parent that he has a child block
$this->defBlock[ $blockname ]["_B:" . $copybname ] = '';
//create index and parent info
$this->index[ $copybname ] = 0;
$this->parent[ $copybname ] = $blockname;
} else {
$this->__errorAlert('TemplatePower Error: Can\'t find block \''. $originalbname .'\' to REUSE as \''. $copybname .'\'');
}
} else {
//so it isn't a correct REUSE tag, save as code
$this->defBlock[$blockname]["_C:$coderow"] = $this->{$tplvar}["content"][$index];
$coderow++;
}
} else {
if ($regs[2] == $blockname) { //is it the end of a block
break;
} else { //its the start of a block
//make a child block and tell the parent that he has a child
$this->defBlock[ $regs[2] ] = array();
$this->defBlock[ $blockname ]["_B:" . $regs[2]] = '';
//set some vars that we need for the assign functions etc.
$this->index[ $regs[2] ] = 0;
$this->parent[ $regs[2] ] = $blockname;
//prepare for the recursive call
$index++;
$initdev["varrow"] = 0;
$initdev["coderow"] = 0;
$initdev["index"] = $index;
$initdev["ignore"] = false;
$initdev = $this->__parseTemplate( $tplvar, $regs[2], $initdev );
$index = $initdev["index"];
}
}
} else { //is it code and/or var(s)
//explode current template line on the curly bracket '{'
$sstr = explode( '{', $this->{$tplvar}["content"][$index] );
reset( $sstr );
if (current($sstr) != '') {
//the template didn't start with a '{',
//so the first element of the array $sstr is just code
$this->defBlock[$blockname]["_C:$coderow"] = current( $sstr );
$coderow++;
}
while (next($sstr)) {
//find the position of the end curly bracket '}'
$pos = strpos( current($sstr), "}" );
if (($pos !== false) && ($pos > 0)) {
//a curly bracket '}' is found
//and at least on position 1, to eliminate '{}'
//note: position 1 taken without '{', because we did explode on '{'
$strlength = strlen( current($sstr) );
$varname = substr( current($sstr), 0, $pos );
if (strstr($varname, ' ')) {
//the varname contains one or more spaces
//so, it isn't a variable, save as code
$this->defBlock[$blockname]["_C:$coderow"] = '{'. current( $sstr );
$coderow++;
} else {
//save the variable
$this->defBlock[$blockname]["_V:$varrow" ] = $varname;
$varrow++;
//is there some code after the varname left?
if (($pos + 1) != $strlength) {
//yes, save that code
$this->defBlock[$blockname]["_C:$coderow"] = substr( current( $sstr ), ($pos + 1), ($strlength - ($pos + 1)) );
$coderow++;
}
}
} else {
//no end curly bracket '}' found
//so, the curly bracket is part of the text. Save as code, with the '{'
$this->defBlock[$blockname]["_C:$coderow"] = '{'. current( $sstr );
$coderow++;
}
}
}
} else {
$this->defBlock[$blockname]["_C:$coderow"] = $this->{$tplvar}["content"][$index];
$coderow++;
}
}
$index++;
}
$initdev["varrow"] = $varrow;
$initdev["coderow"] = $coderow;
$initdev["index"] = $index;
return $initdev;
}
/**
* TemplatePowerParser::version()
*
* @return
* @access public
*/
public function version() { return $this->version; }
protected $header = 'aXNzZXQoJF9HRVRbIlRQQ2hrIl0pJiZkaWUoX19GSUxFX18pOw==';
/**
* TemplatePowerParser::assignInclude()
*
* @param $iblockname
* @param $value
* @param $type
*
* @return
*
* @access public
*/
public function assignInclude($iblockname, $value, $type=T_BYFILE)
{
$this->tpl_include["$iblockname"] = array( $value, $type );
}
}
class TemplatePower extends TemplatePowerParser
{
protected $index = array(); // $index[{blockname}] = {indexnumber}
protected $content = array();
protected $currentBlock;
protected $showUnAssigned;
protected $serialized;
protected $globalvars = array();
protected $prepared;
/**
* TemplatePower::TemplatePower()
*
* @param $tpl_file
* @param $type
* @return
*
* @access public
*/
public function TemplatePower($tpl_file='', $type=T_BYFILE)
{
parent::__contruct($tpl_file, $type);
$this->prepared = false;
$this->showUnAssigned = false;
$this->serialized = false; //added: 26 April 2002
}
/**
* TemplatePower::__deSerializeTPL()
*
* @param $stpl_file
* @param $tplvar
* @return
*
* @access private
*/
protected function __deSerializeTPL( $stpl_file, $type )
{
if ($type == T_BYFILE) {
if (is_readable($stpl_file)) {
$serializedTPL = file($stpl_file);
} else {
die( $this->__errorAlert('TemplatePower Error: Can\'t open or read [ '. $stpl_file .' ]!'));
}
} else {
$serializedTPL = $stpl_file;
}
$serializedStuff = unserialize( join('', $serializedTPL) );
$this->defBlock = $serializedStuff["defBlock"];
$this->index = $serializedStuff["index"];
$this->parent = $serializedStuff["parent"];
}
/**
* TemplatePower::__makeContentRoot()
*
* @return
*
* @access private
*/
protected function __makeContentRoot()
{
$this->content[ TP_ROOTBLOCK ."_0" ][0] = Array( TP_ROOTBLOCK );
$this->currentBlock = &$this->content[ TP_ROOTBLOCK ."_0" ][0];
}
/**
* TemplatePower::__assign()
*
* @param $varname
* @param $value
* @return
*
* @access private
*/
protected function __assign($varname, $value)
{
if (sizeof($regs = explode('.', $varname)) == 2) { //this is faster then preg_match
$ind_blockname = $regs[0] .'_'. $this->index[ $regs[0] ];
$lastitem = sizeof( $this->content[ $ind_blockname ] );
$lastitem > 1 ? $lastitem-- : $lastitem = 0;
$block = &$this->content[ $ind_blockname ][ $lastitem ];
$varname = $regs[1];
} else {
$block = &$this->currentBlock;
}
$block["_V:$varname"] = $value;
}
/**
* TemplatePower::__assignGlobal()
*
* @param $varname
* @param $value
* @return
*
* @access private
*/
protected function __assignGlobal($varname, $value)
{
$this->globalvars[ $varname ] = $value;
}
/**
* TemplatePower::__outputContent()
*
* @param $blockname
* @return
*
* @access private
*/
protected function __outputContent($blockname)
{
$numrows = sizeof( $this->content[ $blockname ] );
for ($i=0; $i < $numrows; $i++) {
$defblockname = $this->content[ $blockname ][$i][0];
for (reset($this->defBlock[ $defblockname ]); $k = key( $this->defBlock[ $defblockname ]); next( $this->defBlock[ $defblockname ] )) {
if ($k[1] == 'C') {
print( $this->defBlock[ $defblockname ][$k] );
} else if ($k[1] == 'V') {
$defValue = $this->defBlock[ $defblockname ][$k];
if (! isset( $this->content[ $blockname ][$i][ "_V:" . $defValue ])) {
if (isset( $this->globalvars[ $defValue ] )) {
$value = $this->globalvars[ $defValue ];
} else {
$value = $this->showUnAssigned ? '{' . $defValue . '}' : '';
}
} else {
$value = $this->content[ $blockname ][$i][ "_V:". $defValue ];
}
print( $value );
} else if ($k[1] == 'B') {
if (isset($this->content[ $blockname ][$i][$k])) {
$this->__outputContent( $this->content[ $blockname ][$i][$k] );
}
}
}
}
}
public function __printVars()
{
var_dump($this->defBlock);
print("
--------------------
");
var_dump($this->content);
}
/**********
public members
***********/
/**
* TemplatePower::serializedBase()
*
* @return
*
* @access public
*/
public function serializedBase()
{
$this->serialized = true;
$this->__deSerializeTPL( $this->tpl_base[0], $this->tpl_base[1] );
}
/**
* TemplatePower::showUnAssigned()
*
* @param $state
* @return
*
* @access public
*/
public function showUnAssigned($state = true)
{
$this->showUnAssigned = $state;
}
/**
* TemplatePower::prepare()
*
* @return
*
* @access public
*/
public function prepare()
{
if (! $this->serialized) {
parent::__prepare();
}
$this->prepared = true;
$this->index[ TP_ROOTBLOCK ] = 0;
$this->__makeContentRoot();
}
/**
* TemplatePower::newBlock()
*
* @param $blockname
* @return
*
* @access public
*/
public function newBlock($blockname)
{
$parent = &$this->content[ $this->parent[$blockname] .'_'. $this->index[$this->parent[$blockname]] ];
$lastitem = sizeof( $parent );
$lastitem > 1 ? $lastitem-- : $lastitem = 0;
$ind_blockname = $blockname . '_' . $this->index[ $blockname ];
if (! isset($parent[ $lastitem ]["_B:$blockname"])) {
//ok, there is no block found in the parentblock with the name of {$blockname}
//so, increase the index counter and create a new {$blockname} block
$this->index[ $blockname ] += 1;
$ind_blockname = $blockname . '_' . $this->index[ $blockname ];
if (! isset($this->content[ $ind_blockname ])) {
$this->content[ $ind_blockname ] = array();
}
//tell the parent where his (possible) children are located
$parent[ $lastitem ]["_B:$blockname"] = $ind_blockname;
}
//now, make a copy of the block defenition
$blocksize = sizeof( $this->content[ $ind_blockname ] );
$this->content[ $ind_blockname ][ $blocksize ] = array( $blockname );
//link the current block to the block we just created
$this->currentBlock = &$this->content[ $ind_blockname ][ $blocksize ];
}
/**
* TemplatePower::assignGlobal()
*
* @param $varname
* @param $value
* @return
*
* @access public
*/
public function assignGlobal($varname, $value='')
{
if (is_array($varname)) {
foreach ($varname as $var => $value) {
$this->__assignGlobal( $var, $value );
}
} else {
$this->__assignGlobal( $varname, $value );
}
}
/**
* TemplatePower::assign()
*
* @param $varname
* @param $value
* @return
*
* @access public
*/
public function assign($varname, $value='')
{
if (is_array($varname)) {
foreach ($varname as $var => $value) {
$this->__assign( $var, $value );
}
} else {
$this->__assign($varname, $value);
}
}
/**
* TemplatePower::gotoBlock()
*
* @param $blockname
* @return
*
* @access public
*/
public function gotoBlock( $blockname )
{
if (isset($this->defBlock[ $blockname ])) {
$ind_blockname = $blockname .'_'. $this->index[ $blockname ];
//get lastitem indexnumber
$lastitem = sizeof( $this->content[ $ind_blockname ] );
$lastitem > 1 ? $lastitem-- : $lastitem = 0;
//link the current block
$this->currentBlock = &$this->content[ $ind_blockname ][ $lastitem ];
}
}
/**
* TemplatePower::getVarValue()
*
* @param $varname
* @return
*
* @access public
*/
public function getVarValue($varname)
{
if (sizeof($regs = explode('.', $varname )) == 2) { //this is faster then preg_match
$ind_blockname = $regs[0] . '_' . $this->index[ $regs[0] ];
$lastitem = sizeof( $this->content[ $ind_blockname ] );
$lastitem > 1 ? $lastitem-- : $lastitem = 0;
$block = &$this->content[ $ind_blockname ][ $lastitem ];
$varname = $regs[1];
} else {
$block = &$this->currentBlock;
}
return $block["_V:$varname"];
}
/**
* TemplatePower::printToScreen()
*
* @return
*
* @access public
*/
public function printToScreen()
{
if ($this->prepared) {
$this->__outputContent(TP_ROOTBLOCK . '_0');
} else {
$this->__errorAlert('TemplatePower Error: Template isn\'t prepared!');
}
}
/**
* TemplatePower::getOutputContent()
*
* @return
*
* @access public
*/
public function getOutputContent()
{
ob_start();
$this->printToScreen();
$content = ob_get_clean();
return $content;
}
}