Source: easytemplate-1.5.phps - download
<?php
/***************************************************************************
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.

@ Project: EasyTemplate 1.5
 @ Link: http://daif.net/easy/
 @ Author: Daifallh Al-Otaibi <daif55@gmail.com>
 @ Developer: AzzozHSN <www.azzozhsn.net>
 @ Developer: Saleh AlMatrafe <www.saleh.cc>
 @ Date: 2007-10-06
 **************************************************************************/
    
class EasyTemplate{
        var 
$vars//Reference to $GLOBALS
        
var $HTML//html page content
        
var $Temp='.';// your template path OR '.'
        
var $Cache='easycache';// must be writeable check permission OR use $_ENV["TEMP"];
        
var $color = array();
        var 
$reg = array('var'=>'/([{]{1,2})+([A-Z0-9_\.]+)[}]{1,2}/i',
                               
'color'=>'/="((([A-Z0-9])|([#_\-\/\.]))+(\|)+(.+))"/iU'
        
);
        function 
EasyTemplate(){
            if(
phpversion()<'4.3.0'$this->_error("Update Your PHP version To 4.3.0 Or later, Your's ".phpversion());
            
$this->vars = &$GLOBALS;
        }
    
//Function to load a template file.
        
function _load_file($FileName){
            if(!
file_exists($this->Temp)) $this->_error('Template Folder <i>'.$this->Temp.'</i> Not Exists');
            if(!
file_exists($FileName)) $this->_error('Template File <i>'.$FileName.'</i> Not Exists');
            
$this->HTML file_get_contents($FileName);//it is the preferred way to read the contents of a file into a string.
        
}
        
//Function to parse the Template Tags
        
function _parse(){
            
$this->HTML preg_replace_callback('/<IF (.+)>/iU',array('EasyTemplate','_if_callback'),$this->HTML);
            
$this->HTML preg_replace_callback('/{(.+)\?(.+):(.+)}/iU',array('EasyTemplate','_iif_callback'),$this->HTML);
            
$this->HTML preg_replace_callback('/<LOOP (.+)>/iU',array('EasyTemplate','_loop_callback'),$this->HTML);
            
$this->HTML preg_replace_callback($this->reg['var'],array('EasyTemplate','_vars_callback'),$this->HTML);
            
$this->HTML preg_replace_callback($this->reg['color'],array('EasyTemplate','_color_callback'),$this->HTML);
            
$this->HTML preg_replace('/<SWITCH\s+NAME\s*=\s*"([A-Z0-9_]{1,})"\s*CASE\s*=\s*"(.+)"\s*VALUE\s*=\s*"(.+)"\s*>/i','<?= $this->_switch($this->vars["\\1"],"\\2","\\3")?>',$this->HTML);
            
$this->HTML preg_replace('/<INCLUDE\s+NAME\s*=\s*"(.+)"\s*>/iU','<?= EasyTemplate::_include("\\1",array($this->Temp,$this->Cache)); ?>',$this->HTML);
            
$this->HTML preg_replace('/(<\/LOOP>|<\/IF>)/i','<? } ?>',$this->HTML);
            
$this->HTML preg_replace('/(<ELSE>|<ELSE \/>)/i','<? }else{ ?>',$this->HTML);
        }
        
//if tag
        
function _if_callback($matches){
            
$char  = array(' eq ',' lt ',' gt ');
            
$reps  = array('==','<','>');
            
$atts $this->_get_attributes($matches[0]);
            
$con = ($atts[NAME])?$atts[NAME]:$atts[LOOP];
            if(
preg_match('('.implode('|',$char).')'$con)){
                
$con str_replace($char,$reps,$con);
            }else{
                
$con = ($atts[NAME])?'{'.$con.'}':'{{'.$con.'}}';
                
$con $this->_var_callback($con);
            }
            return 
'<? if('.$con.'){ ?>';
        }
        
//iif tag
        
function _iif_callback($matches){
            
$con '$this->vars["'.$matches[1].'"]';
            
$true  = ($matches[2]{0}!="'")?'$this->vars["'.$matches[2].'"]':$matches[2];
            
$false  = ($matches[3]{0}!="'")?'$this->vars["'.$matches[3].'"]':$matches[3];
            return 
"<?= (".$con.")?".$true.":".$false."; ?>";
        }
        
//loop tag
        
function _loop_callback($matches){
            
$atts $this->_get_attributes($matches[0]);
            
$name = ($atts[NAME])?$atts[NAME]:$atts[LOOP];
            
$var = ($atts[NAME])?$this->_var_callback('{'.$atts[NAME].'}'):$this->_var_callback('{{'.$atts[LOOP].'}}');
            if(
$atts[LIMIT] && !$atts[SQL]){
                
$out .= ' $this->_limit("'.$name.'",'.$atts[LIMIT].');';
            }
            if(
$atts[SQL]){
                
$out .= ' $'.$name.'_q=$this->_query("'.$atts[SQL].'","'.$atts[LINK].'");';
                
$out .= ' while($var = $this->_fetch($'.$name.'_q)) {';
            }else{
                
$out .= ' foreach('.$var.' as $key=>$var){';
                
$out .= ' $this->vars["_key"] = $key;$this->vars["_var"] = $var;';
            }
            return 
"<? $out ?>";
        }
        
//make variable printable
        
function _vars_callback($matches){
            
$var $this->_var_callback($matches);
            return(
'<?= '.$var.'?>');
        }
        
//variable replace
        
function _var_callback($matches){
            if(!
is_array($matches)){
                
preg_match($this->reg['var'],$matches,$matches);
            }
            
$s $matches[1];
            
$var str_replace('.','\'][\'',$matches[2]);
            if(
$s=='{{'){
                
$var '$var[\''.$var.'\']';
            }else{
                
$var '$this->vars[\''.$var.'\']';
            }
            return(
$var);
        }
        
//att variable replace
        
function _var_callback_att($matches){
            return(
'{'.$this->_var_callback($matches).'}');
        }
        
//color callback
        
function _color_callback($matches){
            return 
'=<?= $this->_sw('.rand().',"'.$matches[1].'") ?>';
        }
        
//swich colors
        
function _sw($index,$vars){
            
$vars explode('|',$vars);
            if(
$this->color[$index]>=count($vars) OR !$this->color[$index]){
                
$this->color[$index]=0;
            }
            return(
'"'.$vars[$this->color[$index]++].'"');
        }
        
//Error logger
        
function _error($error){
            exit(
"<b>ERROR:</b> $error");
        }
        
//get tag  attributes
        
function _get_attributes($tag){
            
preg_match_all('/([a-z]+)="(.+)"/iU',$tag,$attribute);
            for(
$i=0;$i<count($attribute[1]);$i++){
                
$att strtoupper($attribute[1][$i]);
                if(
preg_match('/NAME|LOOP/',$att)){
                    
$attributes[$att] = preg_replace_callback($this->reg['var'],array('EasyTemplate','_var_callback'),$attribute[2][$i]);
                }else{
                    
$attributes[$att] = preg_replace_callback($this->reg['var'],array('EasyTemplate','_var_callback_att'),$attribute[2][$i]);
                }
            }
            return(
$attributes);
        }
        
//query
        
function _query($sql,$resource=null){
            return (
is_resource($this->vars["$resource"]))?mysql_query($sql,$this->vars["$resource"]):mysql_query($sql);
        }
        
//fetch query
        
function _fetch($q){
            return 
mysql_fetch_assoc($q);
        }
        
//switch Tag
        
function _switch($var,$case,$value){
            
$case  explode(',',$case);
            
$value explode(',',$value);
            foreach(
$case as $k=>$val)
            if(
$var==$val) return $value[$k];
        }
        
//include Tag
        
function _include($fn,$config){
            
$this->Temp  $config[0];
            
$this->Cache $config[1];
            list(,, 
$ex,) = array_values(pathinfo($fn));
            if(
$ex =='php'){
                return(include(
$fn));
            }else{
                return(
$this->display($fn));
            }
        }
        
//Assign Veriables
        
function assign($var,&$to){
            
$GLOBALS[$var] = $to;
        }
        
//Function to make limited Array
        
function _limit($arr_name,$limit=10){
            
$count  count($this->vars[$arr_name]);
            
$page   $this->vars[_GET][$arr_name.'_PS'];
            
$pagestart = ($page*$limit >= $count)?$count-$limit:$page*$limit;
            
$pageend   = ($page*$limit+$limit $count)?$count:$page*$limit+$limit;
            for(
$i=$pagestart;$i<$pageend;$i++) $page_array[] = $this->vars[$arr_name][$i];
            
$query preg_replace("/(\&|)$arr_name+_PS=\\d+/i",'',$_SERVER['QUERY_STRING']);
            
$prefix = ($query)?"?$query&":'?';
            if(
count($this->vars[$arr_name])/$limit>1)
            for(
$i=0;$i<count($this->vars[$arr_name])/$limit;$i++)
            
$this->vars[$arr_name.'_paging'] .= ($page==$i)?' <b>'.$i.'</b> ':' <a href="'.$prefix.$arr_name.'_PS='.$i.'" class="paging">'.$i.'</a> ';
            
$this->vars[$arr_name] = $page_array;
        }
        
//load parser and return page content
        
function display($FileName) {
            if(!
file_exists($this->Cache)) mkdir($this->Cache);
            
$this->Cache = (!is_writeable($this->Cache))?$_ENV["TEMP"]:$this->Cache;
            
$file         realpath($this->Temp)."/".$FileName;
            
$cache    realpath($this->Cache)."/".str_replace(array('\\','/',':'), array('/','-',''), $file).".php";
            if(@
filemtime($file)>=@filemtime($cache)){
                
$this->_load_file($file);
                
$this->_parse();
                
$fp fopen($cache,'w');
                
fwrite($fp,$this->HTML);
                
fclose($fp);
            }
            
ob_start();
            include(
$cache);
            
$this->page ob_get_contents();
            
ob_end_clean();
            return(
$this->page);
        }
    }
?>