Power by Ease Template!');}"; var $Compile = array(); var $Analysis = array(); var $Emc = array(); /** * 声明模板用法 */ function ETCoreStart( $set = array( 'ID' =>'1', //缓存ID 'TplType' =>'htm', //模板格式 'CacheDir' =>'cache', //缓存目录 'TemplateDir'=>'template' , //模板存放目录 'AutoImage' =>'on' , //自动解析图片目录开关 on表示开放 off表示关闭 'LangDir' =>'language' , //语言文件存放的目录 'Language' =>'default' , //语言的默认文件 'Copyright' =>'off' , //版权保护 'MemCache' =>'' , //Memcache服务器地址例如:127.0.0.1:11211 ) ){ $this->TplID = (defined('TemplateID')?TemplateID:( ((int)@$set['ID']<=1)?1:(int)$set['ID']) ).'_'; $this->CacheDir = (defined('NewCache')?NewCache:( (trim($set['CacheDir']) != '')?$set['CacheDir']:'cache') ).'/'; $this->TemplateDir = (defined('NewTemplate')?NewTemplate:( (trim($set['TemplateDir']) != '')?$set['TemplateDir']:'template') ).'/'; $this->Ext = (@$set['TplType'] != '')?$set['TplType']:'htm'; $this->AutoImage = (@$set['AutoImage']=='off')?0:1; $this->Copyright = (@$set['Copyright']=='off')?0:1; $this->Server = (is_array($GLOBALS['_SERVER']))?$GLOBALS['_SERVER']:$_SERVER; $this->version = (trim($_GET['EaseTemplateVer']))?die('Ease Templae E3!'):''; //载入语言文件 $this->LangDir = (defined('LangDir')?LangDir:( ((@$set['LangDir']!='language' && @$set['LangDir'])?$set['LangDir']:'language') )).'/'; if(is_dir($this->LangDir)){ $this->Language = (defined('Language')?Language:( (($set['Language']!='default' && $set['Language'])?$set['Language']:'default') )); if(@is_file($this->LangDir.$this->Language.'.php')){ $lang = array(); @include_once $this->LangDir.$this->Language.'.php'; $this->LangData = $lang; } }else{ $this->Language = 'default'; } //缓存目录检测以及运行模式 if(@ereg(':',$set['MemCache'])){ $this->RunType = 'MemCache'; $memset = explode(":",$set['MemCache']); $this->Emc = memcache_connect($memset[0], $memset[1]) OR die("Could not connect!"); }else{ $this->RunType = (@substr(@sprintf('%o', @fileperms($this->CacheDir)), -3)==777 && is_dir($this->CacheDir))?'Cache':'Replace'; } $CompileBasic = array( '/(\{\s*|)/eis', '//is', '//is', '//is', '//is', '//is', '//', '//is', '/(\{\s*|)/eis', '/(\{\s*|)/eis', '/(\{\s*|)/eis', '/(\{\s*|)/eis', '/(\{\s*|)\s*(.+?)\s*(\{|)/is', '/(\{\s*|)/is', '/\{([a-zA-Z0-9_\'\"\[\]\$]{1,100})\}/', ); $this->Compile = (is_array($this->Compile))?array_merge($this->Compile,$CompileBasic):$CompileBasic; $AnalysisBasic = array( '$this->inc_php("\\2")', '";if($ET_Del==true){echo"', '";if(\\2){echo"', '";}elseif(\\2){echo"', '";}else{echo"', '";}echo"', '";\$_i=0;foreach((array)\\1 AS \\3){\$_i++;echo"', '";\$_i=0;while(\\1){\$_i++;echo"', '$this->lang("\\2")', '$this->Row("\\2")', '$this->Color("\\2")', '$this->Dirs("\\2")', '";\\3;echo"', '";\\2;echo"', '";echo \$\\1;echo"', ); $this->Analysis = (is_array($this->Analysis))?array_merge($this->Analysis,$AnalysisBasic):$AnalysisBasic; } /** * 设置数值 * set_var(变量名或是数组,设置数值[数组不设置此值]); */ function set_var( $name, $value = '' ){ if (is_array($name)){ $this->ThisValue = @array_merge($this->ThisValue,$name); }else{ $this->ThisValue[$name] = $value; } } /** * 设置模板文件 * set_file(文件名,设置目录); */ function set_file( $FileName, $NewDir = '' ){ //当前模板名 $this->ThisFile = $FileName.'.'.$this->Ext; //目录地址检测 $this->FileDir[$this->ThisFile] = (trim($NewDir) != '')?$NewDir.'/':$this->TemplateDir; $this->IncFile[$FileName] = $this->FileDir[$this->ThisFile].$this->ThisFile; if(!is_file($this->IncFile[$FileName]) && $this->Copyright==1){ die('Sorry, The file '.$this->IncFile[$FileName].' does not exist.'); } //bug 系统 $this->IncList[] = $this->ThisFile; } //解析替换程序 function ParseCode( $FileList = '', $CacheFile = '' ){ //模板数据 $ShowTPL = ''; //解析续载 if (@is_array($FileList) && $FileList!='include_page'){ foreach ($FileList AS $K=>$V) { $ShowTPL .= $this->reader($V.$K); } }else{ //如果指定文件地址则载入 $SourceFile = ($FileList!='')?$FileList:$this->FileDir[$this->ThisFile].$this->ThisFile; if(!is_file($SourceFile) && $this->Copyright==1){ die('Sorry, The file '.$SourceFile.' does not exist.'); } $ShowTPL = $this->reader($SourceFile); } //引用模板处理 $ShowTPL = $this->inc_preg($ShowTPL); //检测run方法 $run = 0; if (eregi("run:",$ShowTPL)){ $run = 1; //Fix = $ShowTPL = preg_replace('/(\{|)\s*=/','{run:}echo ',$ShowTPL); $ShowTPL = preg_replace('/(\{|)\s*(.+?)\s*(\{|)/is', '(T_T)\\3;(T_T!)',$ShowTPL); } //Fix XML if (eregi("/is', '\\1', $ShowTPL); } //修复代码中\n换行错误 $ShowTPL = str_replace('\\','\\\\',$ShowTPL); //修复双引号问题 $ShowTPL = str_replace('"','\"',$ShowTPL); //编译运算 $ShowTPL = @preg_replace($this->Compile, $this->Analysis, $ShowTPL); //分析图片地址 $ShowTPL = $this->ImgCheck($ShowTPL); //Fix 模板中金钱符号 $ShowTPL = str_replace('$','\$',$ShowTPL); //修复php运行错误 $ShowTPL = @preg_replace("/\";(.+?)echo\"/e", '$this->FixPHP(\'\\1\')', $ShowTPL); //Fix Run 2 if ($run==1){ $ShowTPL = preg_replace("/\(T_T\)(.+?)\(T_T!\)/ise", '$this->FixPHP(\'\\1\')', $ShowTPL); } //还原xml $ShowTPL = (strrpos($ShowTPL,''))?@preg_replace('/ET>(.+?)<\/ET/is', '?\\1?', $ShowTPL):$ShowTPL; //修复"问题 $ShowTPL = str_replace('echo ""','echo "\"',$ShowTPL); //从数组中将变量导入到当前的符号表 @extract($this->Value()); ob_start(); ob_implicit_flush(0); @eval('echo "'.$ShowTPL.'";'); $contents = ob_get_contents(); ob_end_clean(); //Cache htm if($this->HtmID){ $this->writer($this->HtmDir.$this->HtmID,$this->Hacker."?>".$contents); } //编译模板 if ($this->RunType=='Cache'){ $this->CompilePHP($ShowTPL,$CacheFile); } //错误检查 if(strlen($contents)<=0){ //echo $ShowTPL; die('
Sorry, Error or complicated syntax error exists in '.$SourceFile.' file.'); } return $contents; } /** * 多语言 */ function lang( $str = '' ){ if (is_dir($this->LangDir)){ //采用MD5效验 $id = md5($str); //不存在数据则写入 if($this->LangData[$id]=='' && $this->Language=='default'){ //语言包文件 if (@is_file($this->LangDir.$this->Language.'.php')){ unset($lang); @include($this->LangDir.$this->Language.'.php'); } //如果检测到有数据则输出 if ($lang[$id]){ $out = str_replace('\\','\\\\',$lang[$id]); return str_replace('"','\"',$out); } //修复'多\问题 $str = str_replace("\\'","'",$str); //语言文件过大时采取建立新文件 if(strlen($docs)>400){ $this->writer($this->LangDir.$this->Language.'.'.$id.'.php',''); $docs= substr($str,0,40); //简要说明 $docs = str_replace('\"','"',$docs); $docs = str_replace('\\\\','\\',$docs); $str = 'o(O_O)o.ET Lang.o(*_*)o'; //语言新文件 }else{ $docs = str_replace('\"','"',$str); $docs = str_replace('\\\\','\\',$docs); } //文件安全处理 $data = (!is_file($this->LangDir.'default.php'))?"Language."\n*/\n\n\n":''; if (trim($str)){ //写入数据 $data .= "/**".date("Y.m.d",time())."\n"; $data.= $docs."\n"; $data.= "*/\n"; $data.= '$lang["'.$id.'"] = "'.$str.'";'."\n\n"; $this->writer($this->LangDir.'default.php',$data,'a+'); } } //单独语言文件包 if($this->LangData[$id]=='o(O_O)o.ET Lang.o(*_*)o'){ unset($etl); include($this->LangDir.$this->Language.".".$id.".php"); $this->LangData[$id] = $etl; } $out = ($this->LangData[$id])?$this->LangData[$id]:$str; //输出部分要做处理 if(($this->RunType=='Replace' || $this->RunType!='Replace') && $data==''){ $out = str_replace('\\','\\\\',$out); $out = str_replace('"','\"',$out); } return $out; }else{ return $str; } } /** * inc引用函数 */ function inc_preg( $content ){ return preg_replace('/<\!--\s*\#include\s*file\s*=(\"|\')([a-zA-Z0-9_\.\|]{1,100})(\"|\')\s*-->/eis', '$this->inc("\\2")', preg_replace('/(\{\s*|)/eis', '$this->inc("\\2")', $content)); } /** * 引用函数运算 */ function inc( $Files = '' ){ if($Files){ if (!strrpos($Files,$this->Ext)){ $Files = $Files.".".$this->Ext; } $FileLs = $this->TemplateDir.$Files; $contents =$this->ParseCode($FileLs,$Files); if($this->RunType=='Cache'){ //引用模板 $this->IncList[] = $Files; $cache_file = $this->CacheDir.$this->TplID.$Files.".".$this->Language.".php"; return " {inc_php:".$cache_file."} {run:@eval('echo \"'.\$EaseTemplate3_Cache.'\";')} "; }elseif($this->RunType=='MemCache'){ //cache date memcache_set($this->Emc,$Files.'_date', time()) OR die("Failed to save data at the server."); memcache_set($this->Emc,$Files, $contents) OR die("Failed to save data at the server"); return "".$contents; }else{ //引用模板 $this->IncList[] = $Files; return $contents; } } } /** * 编译解析处理 */ function CompilePHP( $content='', $cachename = '' ){ if ($content){ //如果没有安全文件则自动创建 if($this->RunType=='Cache' && !is_file($this->CacheDir.'index.htm')){ $Ease_name = 'Ease Template!'; $Ease_base = "$Ease_name$Ease_name"; $this->writer($this->CacheDir.'index.htm',$Ease_base); $this->writer($this->CacheDir.'index.html',$Ease_base); $this->writer($this->CacheDir.'default.htm',$Ease_base); } //编译记录 $content = str_replace("\\","\\\\",$content); $content = str_replace("'","\'",$content); $content = str_replace('echo"";',"",$content); //替换多余数据 $wfile = ($cachename)?$cachename:$this->ThisFile; $this->writer($this->FileName($wfile,$this->TplID) ,$this->Hacker.'$EaseTemplate3_Cache = \''.$content.'\';'); } } //修复PHP执行时产生的错误 function FixPHP( $content='' ){ $content = str_replace('\\\\','\\',$content); return '";'.str_replace('\\"','"',str_replace('\$','$',$content)).'echo"'; } /** * 检测缓存是否要更新 * filename 缓存文件名 * settime 指定事件则提供更新,只用于memcache */ function FileUpdate($filname,$settime=0){ //检测设置模板文件 if (is_array($this->IncFile)){ unset($k,$v); $update = 0; $settime = ($settime>0)?$settime:@filemtime($filname); foreach ($this->IncFile AS $k=>$v) { if (@filemtime($v)>$settime){$update = 1;} } //更新缓存 if($update==1){ return false; }else { return $filname; } }else{ return $filname; } } /** * 输出运算 * Filename 连载编译输出文件名 */ function output( $Filename = '' ){ switch($this->RunType){ //Mem编译模式 case'MemCache': if ($Filename=='include_page'){ //直接输出文件 return $this->reader($this->FileDir[$this->ThisFile].$this->ThisFile); }else{ $FileNames = ($Filename)?$Filename:$this->ThisFile; $CacheFile = $this->FileName($FileNames,$this->TplID); //检测记录时间 $updateT = memcache_get($this->Emc,$CacheFile.'_date'); $update = $this->FileUpdate($CacheFile,$updateT); $CacheData = memcache_get($this->Emc,$CacheFile); if(trim($CacheData) && $update){ //获得列表文件 unset($ks,$vs); preg_match_all('/<\!-- ET\_inc\_cache\[(.+?)\] -->/',$CacheData, $IncFile); if (is_array($IncFile[1])){ foreach ($IncFile[1] AS $ks=>$vs) { $this->IncList[] = $vs; $listDate = memcache_get($this->Emc,$vs.'_date'); echo @filemtime($this->TemplateDir.$vs).' - '.$listDate.'
'; //更新inc缓存 if (@filemtime($this->TemplateDir.$vs)>$listDate){ $update = 1; $this->inc($vs); } } //更新数据 if ($update == 1){ $CacheData = $this->ParseCode($this->FileList,$Filename); //cache date @memcache_set($this->Emc,$CacheFile.'_date', time()) OR die("Failed to save data at the server."); @memcache_set($this->Emc,$CacheFile, $CacheData) OR die("Failed to save data at the server."); } } //Close memcache_close($this->Emc); return $CacheData; }else{ if ($Filename){ $CacheData = $this->ParseCode($this->FileList,$Filename); //cache date @memcache_set($this->Emc,$CacheFile.'_date', time()) OR die("Failed to save data at the server."); @memcache_set($this->Emc,$CacheFile, $CacheData) OR die("Failed to save data at the server."); //Close memcache_close($this->Emc); return $CacheData; }else{ $CacheData = $this->ParseCode(); //cache date @memcache_set($this->Emc,$CacheFile.'_date', time()) OR die("Failed to save data at the server."); @memcache_set($this->Emc,$CacheFile, $CacheData) OR die("Failed to save data at the server2"); //Close memcache_close($this->Emc); return $CacheData; } } } break; //编译模式 case'Cache': if ($Filename=='include_page'){ //直接输出文件 return $this->reader($this->FileDir[$this->ThisFile].$this->ThisFile); }else{ $FileNames = ($Filename)?$Filename:$this->ThisFile; $CacheFile = $this->FileName($FileNames,$this->TplID); $CacheFile = $this->FileUpdate($CacheFile); if (@is_file($CacheFile)){ @extract($this->Value()); ob_start(); ob_implicit_flush(0); include $CacheFile; //获得列表文件 if($EaseTemplate3_Cache!=''){ unset($ks,$vs); preg_match_all('/<\!-- ET\_inc\_cache\[(.+?)\] -->/',$EaseTemplate3_Cache, $IncFile); if (is_array($IncFile[1])){ foreach ($IncFile[1] AS $ks=>$vs) { $this->IncList[] = $vs; //更新inc缓存 if (@filemtime($this->TemplateDir.$vs)>@filemtime($this->CacheDir.$this->TplID.$vs.'.'.$this->Language.'.php')){ $this->inc($vs); } } } @eval('echo "'.$EaseTemplate3_Cache.'";'); $contents = ob_get_contents(); ob_end_clean(); return $contents; } }else{ if ($Filename){ return $this->ParseCode($this->FileList,$Filename); }else{ return $this->ParseCode(); } } } break; //替换引擎 default: if($Filename){ if ($Filename=='include_page'){ //直接输出文件 return $this->reader($this->FileDir[$this->ThisFile].$this->ThisFile); }else { return $this->ParseCode($this->FileList); } }else{ return $this->ParseCode(); } } } /** * 连载函数 */ function n(){ //连载模板 $this->FileList[$this->ThisFile] = $this->FileDir[$this->ThisFile]; } /** * 输出模板内容 * Filename 连载编译输出文件名 */ function r( $Filename = '' ){ return $this->output($Filename); } /** * 打印模板内容 * Filename 连载编译输出文件名 */ function p( $Filename = '' ){ echo $this->output($Filename); } /** * 分析图片地址 */ function ImgCheck( $content ){ //Check Image Dir if($this->AutoImage==1){ $NewFileDir = $this->FileDir[$this->ThisFile]; //FIX img if(is_array($this->ImgDir)){ foreach($this->ImgDir AS $rep){ $rep = trim($rep); //检测是否执行替换 if(strrpos($content,$rep."/")){ if(substr($rep,-1)=='/'){ $rep = substr($rep,0,strlen($rep)-1); } $content = str_replace($rep.'/',$NewFileDir.$rep.'/',$content); } } } //FIX Dir $NewFileDirs = $NewFileDir.$NewFileDir; if(strrpos($content,$NewFileDirs)){ $content = str_replace($NewFileDirs,$NewFileDir,$content); } } return $content; } /** * 获得所有设置与公共变量 */ function Value(){ return (is_array($this->ThisValue))?array_merge($this->ThisValue,$GLOBALS):$GLOBALS; } /** * 清除设置 */ function clear(){ $this->RunType = 'Replace'; } /** * 静态文件写入 */ function htm_w( $w_dir = '', $w_filename = '', $w_content = '' ){ $dvs = ''; if($w_dir && $w_filename && $w_content){ //目录检测数量 $w_dir_ex = explode('/',$w_dir); $w_new_dir = ''; //处理后的写入目录 unset($dvs,$fdk,$fdv,$w_dir_len); foreach((array)$w_dir_ex AS $dvs){ if(trim($dvs) && $dvs!='..'){ $w_dir_len .= '../'; $w_new_dir .= $dvs.'/'; if (!@is_dir($w_new_dir)) @mkdir($w_new_dir, 0777); } } //获得需要更改的目录数 foreach((array)$this->FileDir AS $fdk=>$fdv){ $w_content = str_replace($fdv,$w_dir_len.str_replace('../','',$fdv),$w_content); } $this->writer($w_dir.$w_filename,$w_content); } } /** * 改变静态刷新时间 */ function htm_time($times=0){ if((int)$times>0){ $this->HtmTime = (int)$times; } } /** * 静态文件存放的绝对目录 */ function htm_dir($Name = ''){ if(trim($Name)){ $this->HtmDir = trim($Name).'/'; } } /** * 产生静态文件输出 */ function HtmCheck( $Name = '' ){ $this->HtmID = md5(trim($Name)? trim($Name).'.php' : $this->Server['REQUEST_URI'].'.php' ); //检测时间 if(is_file($this->HtmDir.$this->HtmID) && (time() - @filemtime($this->HtmDir.$this->HtmID)<=$this->HtmTime)){ ob_start(); ob_implicit_flush(0); include $this->HtmDir.$this->HtmID; $HtmContent = ob_get_contents(); ob_end_clean(); return $HtmContent; } } /** * 打印静态内容 */ function htm_p( $Name = '' ){ $output = $this->HtmCheck($Name); if ($output){ die($this->HtmCheck($Name)); } } /** * 输出静态内容 */ function htm_r( $Name = '' ){ return $this->HtmCheck($Name); } /** * 解析文件 */ function FileName( $name, $id = '1' ){ $extdir = explode("/",$name); $dircnt = @count($extdir) - 1; $extdir[$dircnt] = $id.$extdir[$dircnt]; return $this->CacheDir.implode("_",$extdir).".".$this->Language.'.php'; } /** * 检测引入文件 */ function inc_php( $url = '' ){ $parse = parse_url($url); unset($vals,$code_array); foreach((array)explode('&',$parse['query']) AS $vals){ $code_array .= preg_replace('/(.+)=(.+)/',"\$_GET['\\1']= \$\\1 ='\\2';",$vals); } return '";'.$code_array.' @include(\''.$parse['path'].'\');echo"'; } /** * 换行函数 * Row(换行数,换行颜色); * Row("5,#ffffff:#e1e1e1"); */ function Row( $Num = '' ){ $Num = trim($Num); if($Num != ''){ $Nums = explode(",",$Num); $Numr = ((int)$Nums[0]>0)?(int)$Nums[0]:2; $input = (trim($Nums[1]) == '')?'':$Nums[1]; if(trim($Nums[1]) != ''){ $Co = explode(":",$Nums[1]); $OutStr = "if(\$_i%$Numr===0){\$row_count++;echo(\$row_count%2===0)?'':'';}"; }else{ $OutStr = "if(\$_i%$Numr===0){echo '$input';}"; } return '";'.$OutStr.'echo "'; } } /** * 间隔变色 * Color(两组颜色代码); * Color('#FFFFFF,#DCDCDC'); */ function Color( $color = '' ){ if($color != ''){ $OutStr = preg_replace("/(.+),(.+)/","_i%2===0)?'\\1':'\\2';",$color); if(strrpos($OutStr,"%2")){ return '";echo(\$'.$OutStr.'echo "'; } } } /** * 映射图片地址 */ function Dirs( $adds = '' ){ $adds_ary = explode(",",$adds); if(is_array($adds_ary)){ $this->ImgDir = (is_array($this->ImgDir))?@array_merge($adds_ary, $this->ImgDir):$adds_ary; } } /** * 读取函数 * reader(文件名); */ function reader( $filename ){ $get_fun = @get_defined_functions(); return (in_array('file_get_contents',$get_fun['internal']))?@file_get_contents($filename):@implode("", @file($filename)); } /** * 写入函数 * writer(文件名,写入数据, 写入数据方式); */ function writer( $filename, $data = '', $mode='w' ){ if(trim($filename)){ $file = @fopen($filename, $mode); $filedata = @fwrite($file, $data); @fclose($file); } if(!is_file($filename)){ die('Sorry,'.$filename.' file write in failed!'); } } /** * 引入模板系统 * 察看当前使用的模板以及调试信息 */ function inc_list(){ if(is_array($this->IncList)){ $EXTS = explode("/",$this->Server['REQUEST_URI']); $Last = count($EXTS) -1; //处理清除工作 START if(strrpos($EXTS[$Last],'Ease_Templatepage=Clear') && trim($EXTS[$Last]) != ''){ $dir_name = $this->CacheDir; if(file_exists($dir_name)){ $handle=@opendir($dir_name); while($tmp_file=@readdir($handle)){ if(@file_exists($dir_name.$tmp_file)){ @unlink($dir_name.$tmp_file); } } @closedir($handle); } $GoURL = urldecode(preg_replace("/.+?REFERER=(.+?)!!!/","\\1",$EXTS[$Last])); die(''); } //处理清除工作 END $list_file = array(); $file_nums = count($this->IncList); $AllSize = 0; foreach($this->IncList AS $Ks=>$Vs){ $FSize[$Ks] = @filesize($this->TemplateDir.$Vs); $AllSize += $FSize[$Ks]; } foreach($this->IncList AS $K=>$V){ $File_Size = @round($FSize[$K] / 1024 * 100) / 100 . 'KB'; $Fwidth = @floor(100*$FSize[$K]/$AllSize); $list_file[] = "".$this->TemplateDir.$V." ".$File_Size."
"; } //连接地址 $BackURL = preg_replace("/.+\//","\\1",$this->Server['REQUEST_URI']); $NowPAGE = 'http://'.$this->Server['HTTP_HOST'].$this->Server['SCRIPT_NAME']; $clear_link = $NowPAGE."?Ease_Templatepage=Clear&REFERER=".urlencode($BackURL)."!!!"; $sf13 = ' style="font-size:13px;color:#666666"'; echo '
'.implode("",$list_file)."
Include Templates (Num:'.count($this-> IncList).') '; if($this->RunType=='Cache'){ echo '[Clear Cache]'; } echo '
Cache File ID: '.substr($this->TplID,0,-1).' Index: '.((count($this->FileList)==0)?'False':'True').' Format: '.$this->Ext.' Cache: '.($this->RunType=='MemCache'?'Memcache Engine':($this->RunType == 'Replace'?'Replace Engine':$this->CacheDir)).' Template: '.$this->TemplateDir.'
"; } } } ?>