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);
        }
    }
?>