<?

 define
"TPLF_VOID",    1);
 
define"TPLF_BOOL",    2);
 
define"TPLF_CLEAR",   4);
 
define"TPLF_RST",     8);
 
define"TPLF_STRIP",  16);
 
define"TPLF_SUBST",  32);
 
define"TPLF_SUBSD",  64);
 
define"TPLF_ADD",   128);
 
define"TPLF_RF",    256);
 
define"TPLF_RR",    512);

class 
dvTPL {
 var 
$file "";
 var 
$tpl "";
 var 
$dbs = array();

 function 
dvTPL$_file) {  $this->file $_file;  }
 function 
tpl_read() {
   if ( !
file_exists$this->file)) {
     echo( 
"error reading " $this->file "<br><br>");
     
$this->tpl "error reading " $this->file "<br><br>";
     return;  }
   
$this->tpl implode"", ( @file$this->file)));
   if ( 
$this->tpl == "") echo( "error2 reading " $this->file "<br><br>");
   return;  }

 function 
tpl_split() {
   
$d_s "BEGIN DYNAMIC BLOCK";
   
$d_e "END DYNAMIC BLOCK";
   
$tmpi0 substr_count$this->tpl$d_s);
   
$tmpi1 substr_count$this->tpl$d_e);
   if ( ( 
$tmpi0 $tmpi1) < 1) return;
   if ( 
$tmpi0 != $tmpi1) return;
   
$lines split"\n"$this->tpl);
   
// init
   
$this->dbs""] = array( """", array(), "");
   
// get all dynamic blocks
   
$cnt count$lines);
   
$i 0;
   
$this->split_helper$lines$i$cnt$this->dbs);
 }

 
// return stop
 
function split_helper( &$_lines$_start$_stop, &$_node) {
   
$d_s "BEGIN DYNAMIC BLOCK";
   
$d_e "END DYNAMIC BLOCK";
   
// get all dynamic blocks
   
$parsed_lines 0;
//echo( "ENTER TO " . $_node[ 0] . "|\n");
   
for ( $i $_start$i $_stop$i++) {
     
$v $_lines$i];
     
$pos_s "";  $pos_e "";
     
// get block name and start line
     
if ( ( $pos_s strstr"<!-- " $v$d_s)) != "") {
       
$tt "/^" $d_s ": (\S*)/i";
       
preg_match$tt$pos_s$mt);
       
$cnt count$_node2]);
       
$ts "TMP_D_" $mt1];   $tts "{" $ts "}";
       
$_node1] .= $tts "\n";
       
$_node2][ $cnt] = array( $ts"", array(), "");
       
$i $this->split_helper$_lines$i 1$_stop$_node2][ $cnt]);
       
$parsed_lines $i;
       continue;  }
     
// get block stop line
     
if ( ( $pos_s strstr"<!-- " $v$d_e)) != "") return( $i);
     
// add str to dyn_blocks
//echo( "V:$i:" . $_node[ 0] . ":$v\n");
     
$_node1] .= "$v\n";  }
   return( 
$i);  }
 
 function 
walk$_path$_func, &$_args$_flags, &$_ret) {
//echo( "------------- start $_func(" . $this->flags_to_str( $_flags) . ") for " . $_path . "\n");
   
$this->walk_helper$_path"."$this->dbs$_func$_args$_flags$_ret);  }

 function 
walk_helper$_path$_curp, &$_arr$_func, &$_args$_flags, &$_ret) {
//echo( "now in " . $_arr[ 0] . " of $_path\n");
   
if ( !is_array$_arr)) return;
   if ( !
is_array$_arr2])) return;
   
$do_act $this->can_act$_curp$_path$_arr0]);

   
reset$_arr2]);
   if ( 
$do_act != && ( $_flags TPLF_CLEAR) && $_arr0] == ""$_arr3] = "";
   if ( 
$do_act != && ( $_flags TPLF_RST) && $_arr0] == ""$_arr3] = $_arr1];
   while ( list( 
$k$v) = each$_arr2])) {
//echo( "going to {" . $v[ 0] . "} from \"" . $_arr[ 0] . "\"...<br>\n");
     
$tp = ( $_curp "." $v0]);
     
$this->walk_helper$_path$tp$_arr2][ $k], $_func$_args$_flags$tmprN);

     
$do_sact $this->can_act$tp$_path$_arr2][ $k][ 0]);
     if ( 
$do_sact == 0) continue;
     if ( 
$do_sact == && $_flags TPLF_VOID) {  continue;  }
     if ( 
$do_sact == && $_flags TPLF_CLEAR) {  $_arr2][ $k][ 3] = $tmprN;  continue;  }
     if ( 
$do_sact == && $_flags TPLF_RST) {  $_arr2][ $k][ 3] = $tmprN;  continue;  }
     if ( 
$do_sact == && $_flags TPLF_SUBST) {  $_arr2][ $k][ 3] = $tmprN;  continue;  }
// realy need?
     
if ( $_flags TPLF_ADD) {  $_arr2][ $k][ 3] .= $tmprN;  continue;  }
     if ( 
$_flags TPLF_SUBSD) {
       
$dk "\{" $v0] . "}";  $dd "{" $v0] . "}";
       
$tr ereg_replace$dk$tmprN "$dd"$_arr3]);
//echo( "---------------------:$tr (" . $tr . ")\n");
       
$_arr3] = $tr;
//echo( "-- subst $dd in " . $_arr[ 3] . "\n\n");
          
}
     ;  } 
// end of dyn
   
if ( $do_act == 0) {  $_ret "";  return;  }
//echo( "do job \"$_func\" for {" . $_curp . "} ");
//echo( "with flags:" . $this->flags_to_str( $_flags) . "<br>\n");
   
$tmpr0 call_user_func$_func$_path$_curp$_arr$_args$_flags);
   if ( 
$_arr0] == "" || $do_act == 2) {
     if ( 
$_flags TPLF_CLEAR$_arr3] = $tmpr0;
     if ( 
$_flags TPLF_RST$_arr3] = $tmpr0;
     if ( 
$_flags TPLF_SUBST$_arr3] = $tmpr0;
     if ( 
$_flags TPLF_STRIP$_arr3] = $tmpr0;
    }
//echo( "func RET:$tmpr0<br>\n");
   
$_ret $tmpr0;
   return;  }

 function 
can_act$_curp$_path$_me) {
   
$ret 0;
//   if ( strpos( $_path, ".", 0) == 0 && strstr( $_curp, $_path)) $ret = 1;
   
if ( $_path0] == '.' && strstr$_curp$_path)) $ret 1;
   if ( !
strpos$_path"."0) && $_path == $_me$ret 2;
//echo( "CAN$ret:$_path of $_me " . ( $_path == $_me ? "TRUE" : "") . "\n");
   
return( $ret);  }

 function 
flags_to_str$_flags) {
   
$ret "";
   if ( 
$_flags TPLF_VOID$ret .= "void|";
   if ( 
$_flags TPLF_BOOL$ret .= "bool|";
   if ( 
$_flags TPLF_CLEAR$ret .= "clear|";
   if ( 
$_flags TPLF_RST$ret .= "rst|";
   if ( 
$_flags TPLF_SUBST$ret .= "subst|";
   if ( 
$_flags TPLF_SUBSD$ret .= "subsd|";
   if ( 
$_flags TPLF_ADD$ret .= "add|";
   if ( 
$_flags TPLF_STRIP$ret .= "strip|";
   if ( 
$_flags TPLF_RR$ret .= "rr|";
   if ( 
$_flags TPLF_RF$ret .= "rf|";
   return( 
$ret);  }

// end of class   

 
function tpl_func$_path$_curp, &$_arr, &$_args$_flags) {
   
$ret $_arr3];
   if ( 
$_flags TPLF_CLEAR$ret "";
   if ( 
$_flags TPLF_RST$ret $_arr1];
   if ( ( 
$_flags TPLF_SUBST) || ( $_flags TPLF_ADD)) {
     
reset$_args);
     while ( list( 
$k$v) = each$_args)) {
       
$k "{" $k "}";
//echo( "REP:$k to $v\n");
       
$ret ereg_replace"$k""$v"$ret);  }  }
   if ( 
$_flags TPLF_STRIP$ret ereg_replace"\n\{([A-Z0-9_]+)}\n""\n"$ret);
   if ( 
$_flags TPLF_STRIP$ret ereg_replace"\{([A-Z0-9_]+)}"""$ret);
   if ( 
$_flags TPLF_VOID) return( "");
   return( 
$ret);  }

 function 
tpl_echo$_path$_curp, &$_arr, &$_args$_fls) {
   echo( 
"P:$_curp\n");
   
reset$_args);
   while ( list( 
$k$v) = each$_arr)) echo( "K:" $k ":" $_arr$k] . "\n");
   return( 
"");  }

 function 
tpl_find_d$_path$_curp, &$_arr, &$_args$_fls) {
   if ( 
$_arr0] == $_args0]) return( true);
   return( 
false);  }

 function 
tpl_find_k$_path$_curp, &$_arr, &$_args$_fls) {
   if ( 
strstr$_arr3], $_args0])) return( true);
   return( 
false);  }

 function 
tpl_eval_file$_file, &$_ret) {
   if ( !
file_exists$_file)) {
      
$_ret "error reading " $_file "<br><br>";
      return;  }
   
ob_start();
   
$cc implode"", ( @file$_file)));
   eval( 
"?>$cc<?");
   
$_ret ob_get_contents();
   
ob_end_clean();  }

?>