1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264 |
- <?php if(!defined('DEDEINC')) exit("Request Error!");
- /**
- * Dede织梦模板类
- *
- * @version $Id: dedetag.class.php 1 10:33 2010年7月6日Z tianya $
- * @package DedeCMS.Libraries
- * @copyright Copyright (c) 2007 - 2010, DesDev, Inc.
- * @license http://help.dedecms.com/usersguide/license.html
- * @link http://www.dedecms.com
- */
- /**
- * class DedeTag 标记的数据结构描述
- * function c____DedeTag();
- *
- * @package DedeTag
- * @subpackage DedeCMS.Libraries
- * @link http://www.dedecms.com
- */
- class DedeTag
- {
- var $IsReplace=FALSE; //标记是否已被替代,供解析器使用
- var $TagName=""; //标记名称
- var $InnerText=""; //标记之间的文本
- var $StartPos=0; //标记起始位置
- var $EndPos=0; //标记结束位置
- var $CAttribute=""; //标记属性描述,即是class DedeAttribute
- var $TagValue=""; //标记的值
- var $TagID = 0;
- /**
- * 获取标记的名称和值
- *
- * @access public
- * @return string
- */
- function GetName()
- {
- return strtolower($this->TagName);
- }
- /**
- * 获取值
- *
- * @access public
- * @return string
- */
- function GetValue()
- {
- return $this->TagValue;
- }
- //下面两个成员函数仅是为了兼容旧版
- function GetTagName()
- {
- return strtolower($this->TagName);
- }
- function GetTagValue()
- {
- return $this->TagValue;
- }
- //获取标记的指定属性
- function IsAttribute($str)
- {
- return $this->CAttribute->IsAttribute($str);
- }
- function GetAttribute($str)
- {
- return $this->CAttribute->GetAtt($str);
- }
- function GetAtt($str)
- {
- return $this->CAttribute->GetAtt($str);
- }
- function GetInnerText()
- {
- return $this->InnerText;
- }
- }
- /**
- * DedeTagParse Dede织梦模板类
- * function c____DedeTagParse();
- *
- * @package DedeTagParse
- * @subpackage DedeCMS.Libraries
- * @link http://www.dedecms.com
- */
- class DedeTagParse
- {
- var $NameSpace = 'dede'; //标记的名字空间
- var $TagStartWord = '{'; //标记起始
- var $TagEndWord = '}'; //标记结束
- var $TagMaxLen = 64; //标记名称的最大值
- var $CharToLow = TRUE; // TRUE表示对属性和标记名称不区分大小写
- var $IsCache = FALSE; //是否使用缓冲
- var $TempMkTime = 0;
- var $CacheFile = '';
- var $SourceString = ''; //模板字符串
- var $CTags = array(); //标记集合
- var $Count = -1; //$Tags标记个数
- var $refObj = ''; //引用当前模板类的对象
- var $taghashfile = '';
- function __construct()
- {
- if(!isset($GLOBALS['cfg_tplcache']))
- {
- $GLOBALS['cfg_tplcache'] = 'N';
- }
- if($GLOBALS['cfg_tplcache']=='Y')
- {
- $this->IsCache = TRUE;
- }
- else
- {
- $this->IsCache = FALSE;
- }
- if ( DEDE_ENVIRONMENT == 'development' )
- {
- $this->IsCache = FALSE;
- }
- $this->NameSpace = 'dede';
- $this->TagStartWord = '{';
- $this->TagEndWord = '}';
- $this->TagMaxLen = 64;
- $this->CharToLow = TRUE;
- $this->SourceString = '';
- $this->CTags = array();
- $this->Count = -1;
- $this->TempMkTime = 0;
- $this->CacheFile = '';
- }
- function DedeTagParse()
- {
- $this->__construct();
- }
- /**
- * 设置标记的命名空间,默认为dede
- *
- * @access public
- * @param string $str 字符串
- * @param string $s 开始标记
- * @param string $e 结束标记
- * @return void
- */
- function SetNameSpace($str, $s="{", $e="}")
- {
- $this->NameSpace = strtolower($str);
- $this->TagStartWord = $s;
- $this->TagEndWord = $e;
- }
- /**
- * 重置成员变量或Clear
- *
- * @access public
- * @return void
- */
- function SetDefault()
- {
- $this->SourceString = '';
- $this->CTags = array();
- $this->Count=-1;
- }
-
- /**
- * 强制引用
- *
- * @access public
- * @param object $refObj 隶属对象
- * @return void
- */
- function SetRefObj(&$refObj)
- {
- $this->refObj = $refObj;
- }
- function GetCount()
- {
- return $this->Count+1;
- }
- function Clear()
- {
- $this->SetDefault();
- }
- // ------------------------------------------------------------------------
-
- /**
- * CheckDisabledFunctions
- *
- * COMMENT : CheckDisabledFunctions : 检查是否存在禁止的函数
- *
- * @access public
- * @param string
- * @return bool
- */
- function CheckDisabledFunctions($str,&$errmsg='')
- {
- global $cfg_disable_funs;
- $cfg_disable_funs = isset($cfg_disable_funs)? $cfg_disable_funs : 'phpinfo,eval,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,file_put_contents,fsockopen,fopen,fwrite';
- // 模板引擎增加disable_functions
- if (defined('DEDEDISFUN')) {
- $tokens = token_get_all_nl('<?php'.$str."\n\r?>");
- $disabled_functions = explode(',', $cfg_disable_funs);
- foreach ($tokens as $token)
- {
- if (is_array($token))
- {
- if ($token[0] = '306' && in_array($token[1], $disabled_functions))
- {
- $errmsg = 'DedeCMS Error:function disabled "'.$token[1].'" <a href="http://help.dedecms.com/install-use/apply/2013/0711/2324.html" target="_blank">more...</a>';
- return FALSE;
- }
- }
- }
- }
- return TRUE;
- }
- /**
- * 检测模板缓存
- *
- * @access public
- * @param string $filename 文件名称
- * @return string
- */
- function LoadCache($filename)
- {
- global $cfg_tplcache,$cfg_tplcache_dir;
- if(!$this->IsCache)
- {
- return FALSE;
- }
- $cdir = dirname($filename);
- $cachedir = DEDEROOT.$cfg_tplcache_dir;
- $ckfile = str_replace($cdir,'',$filename).substr(md5($filename),0,16).'.inc';
- $ckfullfile = $cachedir.'/'.$ckfile;
- $ckfullfile_t = $cachedir.'/'.$ckfile.'.txt';
- $this->CacheFile = $ckfullfile;
- $this->TempMkTime = filemtime($filename);
- if(!file_exists($ckfullfile)||!file_exists($ckfullfile_t))
- {
- return FALSE;
- }
- //检测模板最后更新时间
- $fp = fopen($ckfullfile_t,'r');
- $time_info = trim(fgets($fp,64));
- fclose($fp);
- if($time_info != $this->TempMkTime)
- {
- return FALSE;
- }
- //引入缓冲数组
- include($this->CacheFile);
- $errmsg = '';
- //把缓冲数组内容读入类
- if( isset($z) && is_array($z) )
- {
- foreach($z as $k=>$v)
- {
- $this->Count++;
- $ctag = new DedeTAg();
- $ctag->CAttribute = new DedeAttribute();
- $ctag->IsReplace = FALSE;
- $ctag->TagName = $v[0];
- $ctag->InnerText = $v[1];
- $ctag->StartPos = $v[2];
- $ctag->EndPos = $v[3];
- $ctag->TagValue = '';
- $ctag->TagID = $k;
- if(isset($v[4]) && is_array($v[4]))
- {
- $i = 0;
- $ctag->CAttribute->Items = array();
- foreach($v[4] as $k=>$v)
- {
- $ctag->CAttribute->Count++;
- $ctag->CAttribute->Items[$k]=$v;
- }
- }
- $this->CTags[$this->Count] = $ctag;
- }
- }
- else
- {
- //模板没有缓冲数组
- $this->CTags = '';
- $this->Count = -1;
- }
- return TRUE;
- }
- /**
- * 写入缓存
- *
- * @access public
- * @param string
- * @return string
- */
- function SaveCache()
- {
- $fp = fopen($this->CacheFile.'.txt',"w");
- fwrite($fp,$this->TempMkTime."\n");
- fclose($fp);
- $fp = fopen($this->CacheFile,"w");
- flock($fp,3);
- fwrite($fp,'<'.'?php'."\r\n");
- $errmsg = '';
- if(is_array($this->CTags))
- {
- foreach($this->CTags as $tid=>$ctag)
- {
- $arrayValue = 'Array("'.$ctag->TagName.'",';
- if (!$this->CheckDisabledFunctions($ctag->InnerText, $errmsg)) {
- fclose($fp);
- @unlink($this->taghashfile);
- @unlink($this->CacheFile);
- @unlink($this->CacheFile.'.txt');
- die($errmsg);
- }
- $arrayValue .= '"'.str_replace('$','\$',str_replace("\r","\\r",str_replace("\n","\\n",str_replace('"','\"',str_replace("\\","\\\\",$ctag->InnerText))))).'"';
- $arrayValue .= ",{$ctag->StartPos},{$ctag->EndPos});";
- fwrite($fp,"\$z[$tid]={$arrayValue}\n");
- if(is_array($ctag->CAttribute->Items))
- {
- fwrite($fp,"\$z[$tid][4]=array();\n");
- foreach($ctag->CAttribute->Items as $k=>$v)
- {
- $v = str_replace("\\","\\\\",$v);
- $v = str_replace('"',"\\".'"',$v);
- $v = str_replace('$','\$',$v);
- $k = trim(str_replace("'","",$k));
- if($k=="")
- {
- continue;
- }
- if($k!='tagname')
- {
- fwrite($fp,"\$z[$tid][4]['$k']=\"$v\";\n");
- }
- }
- }
- }
- }
- fwrite($fp,"\n".'?'.'>');
- fclose($fp);
- }
-
- /**
- * 载入模板文件
- *
- * @access public
- * @param string $filename 文件名称
- * @return string
- */
- function LoadTemplate($filename)
- {
- $this->SetDefault();
- if(!file_exists($filename))
- {
- $this->SourceString = " $filename Not Found! ";
- $this->ParseTemplet();
- }
- else
- {
- $fp = @fopen($filename, "r");
- while($line = fgets($fp,1024))
- {
- $this->SourceString .= $line;
- }
- fclose($fp);
- if($this->LoadCache($filename))
- {
- return '';
- }
- else
- {
- $this->ParseTemplet();
- }
- }
- }
- // 仅用于兼容旧版本
- function LoadTemplet($filename)
- {
- $this->LoadTemplate($filename);
- }
- // 仅用于兼容旧版本
- function LoadFile($filename)
- {
- $this->LoadTemplate($filename);
- }
- /**
- * 载入模板字符串
- *
- * @access public
- * @param string $str 字符串
- * @return void
- */
- function LoadSource($str)
- {
- /*
- $this->SetDefault();
- $this->SourceString = $str;
- $this->IsCache = FALSE;
- $this->ParseTemplet();
- */
- //优化模板字符串存取读取方式
- $this->taghashfile = $filename = DEDEDATA.'/tplcache/'.md5($str).'.inc';
- if( !is_file($filename) )
- {
- file_put_contents($filename, $str);
- }
- $this->LoadTemplate($filename);
- }
- function LoadString($str)
- {
- $this->LoadSource($str);
- }
- /**
- * 获得指定名称的Tag的ID(如果有多个同名的Tag,则取没有被取代为内容的第一个Tag)
- *
- * @access public
- * @param string $str 字符串
- * @return int
- */
- function GetTagID($str)
- {
- if($this->Count==-1)
- {
- return -1;
- }
- if($this->CharToLow)
- {
- $str=strtolower($str);
- }
- foreach($this->CTags as $id=>$CTag)
- {
- if($CTag->TagName==$str && !$CTag->IsReplace)
- {
- return $id;
- break;
- }
- }
- return -1;
- }
- /**
- * 获得指定名称的CTag数据类(如果有多个同名的Tag,则取没有被分配内容的第一个Tag)
- *
- * @access public
- * @param string $str 字符串
- * @return string
- */
- function GetTag($str)
- {
- if($this->Count==-1)
- {
- return '';
- }
- if($this->CharToLow)
- {
- $str=strtolower($str);
- }
- foreach($this->CTags as $id=>$CTag)
- {
- if($CTag->TagName==$str && !$CTag->IsReplace)
- {
- return $CTag;
- break;
- }
- }
- return '';
- }
- /**
- * 通过名称获取标记
- *
- * @access public
- * @param string $str 字符串
- * @return string
- */
- function GetTagByName($str)
- {
- return $this->GetTag($str);
- }
- /**
- * 获得指定ID的CTag数据类
- *
- * @access public
- * @param string 标签id
- * @return string
- */
- function GetTagByID($id)
- {
- if(isset($this->CTags[$id]))
- {
- return $this->CTags[$id];
- }
- else
- {
- return '';
- }
- }
- /**
- * 给_vars数组传递一个元素
- *
- * @access public
- * @param string $vname 标签名
- * @param string $vvalue 标签值
- * @return string
- */
- function AssignVar($vname, $vvalue)
- {
- if(!isset($_sys_globals['define']))
- {
- $_sys_globals['define'] = 'yes';
- }
- $_sys_globals[$vname] = $vvalue;
- }
- /**
- * 分配指定ID的标记的值
- *
- * @access public
- * @param string $i 标签id
- * @param string $str 字符串
- * @param string $runfunc 运行函数
- * @return void
- */
- function Assign($i, $str, $runfunc = TRUE)
- {
- if(isset($this->CTags[$i]))
- {
- $this->CTags[$i]->IsReplace = TRUE;
- $this->CTags[$i]->TagValue = $str;
- if( $this->CTags[$i]->GetAtt('function')!='' && $runfunc )
- {
- $this->CTags[$i]->TagValue = $this->EvalFunc( $str, $this->CTags[$i]->GetAtt('function'),$this->CTags[$i] );
- }
- }
- }
- /**
- * 分配指定名称的标记的值,如果标记包含属性,请不要用此函数
- *
- * @access public
- * @param string $tagname 标签名称
- * @param string $str 字符串
- * @return void
- */
- function AssignName($tagname, $str)
- {
- foreach($this->CTags as $id=>$CTag)
- {
- if($CTag->TagName==$tagname)
- {
- $this->Assign($id,$str);
- }
- }
- }
- /**
- * 处理特殊标记
- *
- * @access public
- * @return void
- */
- function AssignSysTag()
- {
- global $_sys_globals;
- for($i=0;$i<=$this->Count;$i++)
- {
- $CTag = $this->CTags[$i];
- $str = '';
- //获取一个外部变量
- if( $CTag->TagName == 'global' )
- {
- $str = $this->GetGlobals($CTag->GetAtt('name'));
- if( $this->CTags[$i]->GetAtt('function')!='' )
- {
- //$str = $this->EvalFunc( $this->CTags[$i]->TagValue, $this->CTags[$i]->GetAtt('function'),$this->CTags[$i] );
- $str = $this->EvalFunc( $str, $this->CTags[$i]->GetAtt('function'),$this->CTags[$i] );
- }
- $this->CTags[$i]->IsReplace = TRUE;
- $this->CTags[$i]->TagValue = $str;
- }
- //引入静态文件
- else if( $CTag->TagName == 'include' )
- {
- $filename = ($CTag->GetAtt('file')=='' ? $CTag->GetAtt('filename') : $CTag->GetAtt('file') );
- $str = $this->IncludeFile($filename,$CTag->GetAtt('ismake'));
- $this->CTags[$i]->IsReplace = TRUE;
- $this->CTags[$i]->TagValue = $str;
- }
- //循环一个普通数组
- else if( $CTag->TagName == 'foreach' )
- {
- $arr = $this->CTags[$i]->GetAtt('array');
- if(isset($GLOBALS[$arr]))
- {
- foreach($GLOBALS[$arr] as $k=>$v)
- {
- $istr = '';
- $istr .= preg_replace("/\[field:key([\r\n\t\f ]+)\/\]/is",$k,$this->CTags[$i]->InnerText);
- $str .= preg_replace("/\[field:value([\r\n\t\f ]+)\/\]/is",$v,$istr);
- }
- }
- $this->CTags[$i]->IsReplace = TRUE;
- $this->CTags[$i]->TagValue = $str;
- }
- //设置/获取变量值
- else if( $CTag->TagName == 'var' )
- {
- $vname = $this->CTags[$i]->GetAtt('name');
- if($vname=='')
- {
- $str = '';
- }
- else if($this->CTags[$i]->GetAtt('value')!='')
- {
- $_vars[$vname] = $this->CTags[$i]->GetAtt('value');
- }
- else
- {
- $str = (isset($_vars[$vname]) ? $_vars[$vname] : '');
- }
- $this->CTags[$i]->IsReplace = TRUE;
- $this->CTags[$i]->TagValue = $str;
- }
- //运行PHP接口
- if( $CTag->GetAtt('runphp') == 'yes' )
- {
- $this->RunPHP($CTag, $i);
- }
- if(is_array($this->CTags[$i]->TagValue))
- {
- $this->CTags[$i]->TagValue = 'array';
- }
- }
- }
- //运行PHP代码
- function RunPHP(&$refObj, $i)
- {
- $DedeMeValue = $phpcode = '';
- if($refObj->GetAtt('source')=='value')
- {
- $phpcode = $this->CTags[$i]->TagValue;
- }
- else
- {
- $DedeMeValue = $this->CTags[$i]->TagValue;
- $phpcode = $refObj->GetInnerText();
- }
- $phpcode = preg_replace("/'@me'|\"@me\"|@me/i", '$DedeMeValue', $phpcode);
- @eval($phpcode); //or die("<xmp>$phpcode</xmp>");
- $this->CTags[$i]->TagValue = $DedeMeValue;
- $this->CTags[$i]->IsReplace = TRUE;
- }
- /**
- * 把分析模板输出到一个字符串中
- * 不替换没被处理的值
- *
- * @access public
- * @return string
- */
- function GetResultNP()
- {
- $ResultString = '';
- if($this->Count==-1)
- {
- return $this->SourceString;
- }
- $this->AssignSysTag();
- $nextTagEnd = 0;
- $strok = "";
- for($i=0;$i<=$this->Count;$i++)
- {
- if($this->CTags[$i]->GetValue()!="")
- {
- if($this->CTags[$i]->GetValue()=='#@Delete@#')
- {
- $this->CTags[$i]->TagValue = "";
- }
- $ResultString .= substr($this->SourceString,$nextTagEnd,$this->CTags[$i]->StartPos-$nextTagEnd);
- $ResultString .= $this->CTags[$i]->GetValue();
- $nextTagEnd = $this->CTags[$i]->EndPos;
- }
- }
- $slen = strlen($this->SourceString);
- if($slen>$nextTagEnd)
- {
- $ResultString .= substr($this->SourceString,$nextTagEnd,$slen-$nextTagEnd);
- }
- return $ResultString;
- }
- /**
- * 把分析模板输出到一个字符串中,并返回
- *
- * @access public
- * @return string
- */
- function GetResult()
- {
- $ResultString = '';
- if($this->Count==-1)
- {
- return $this->SourceString;
- }
- $this->AssignSysTag();
- $nextTagEnd = 0;
- $strok = "";
- for($i=0;$i<=$this->Count;$i++)
- {
- $ResultString .= substr($this->SourceString,$nextTagEnd,$this->CTags[$i]->StartPos-$nextTagEnd);
- $ResultString .= $this->CTags[$i]->GetValue();
- $nextTagEnd = $this->CTags[$i]->EndPos;
- }
- $slen = strlen($this->SourceString);
- if($slen>$nextTagEnd)
- {
- $ResultString .= substr($this->SourceString,$nextTagEnd,$slen-$nextTagEnd);
- }
- return $ResultString;
- }
- /**
- * 直接输出解析模板
- *
- * @access public
- * @return void
- */
- function Display()
- {
- echo $this->GetResult();
- }
- /**
- * 把解析模板输出为文件
- *
- * @access public
- * @param string $filename 要保存到的文件
- * @return string
- */
- function SaveTo($filename)
- {
- $fp = @fopen($filename,"w") or die("DedeTag Engine Create File False");
- fwrite($fp,$this->GetResult());
- fclose($fp);
- }
- /**
- * 解析模板
- *
- * @access public
- * @return string
- */
- function ParseTemplet()
- {
- $TagStartWord = $this->TagStartWord;
- $TagEndWord = $this->TagEndWord;
- $sPos = 0; $ePos = 0;
- $FullTagStartWord = $TagStartWord.$this->NameSpace.":";
- $sTagEndWord = $TagStartWord."/".$this->NameSpace.":";
- $eTagEndWord = "/".$TagEndWord;
- $tsLen = strlen($FullTagStartWord);
- $sourceLen=strlen($this->SourceString);
-
- if( $sourceLen <= ($tsLen + 3) )
- {
- return;
- }
- $cAtt = new DedeAttributeParse();
- $cAtt->charToLow = $this->CharToLow;
- //遍历模板字符串,请取标记及其属性信息
- for($i=0; $i < $sourceLen; $i++)
- {
- $tTagName = '';
- //如果不进行此判断,将无法识别相连的两个标记
- if($i-1 >= 0)
- {
- $ss = $i-1;
- }
- else
- {
- $ss = 0;
- }
- $sPos = strpos($this->SourceString,$FullTagStartWord,$ss);
- $isTag = $sPos;
- if($i==0)
- {
- $headerTag = substr($this->SourceString,0,strlen($FullTagStartWord));
- if($headerTag==$FullTagStartWord)
- {
- $isTag=TRUE; $sPos=0;
- }
- }
- if($isTag===FALSE)
- {
- break;
- }
- //判断是否已经到倒数第三个字符(可能性几率极小,取消此逻辑)
- /*
- if($sPos > ($sourceLen-$tsLen-3) )
- {
- break;
- }
- */
- for($j=($sPos+$tsLen);$j<($sPos+$tsLen+$this->TagMaxLen);$j++)
- {
- if($j>($sourceLen-1))
- {
- break;
- }
- else if( preg_match("/[\/ \t\r\n]/", $this->SourceString[$j]) || $this->SourceString[$j] == $this->TagEndWord )
- {
- break;
- }
- else
- {
- $tTagName .= $this->SourceString[$j];
- }
- }
- if($tTagName!='')
- {
- $i = $sPos+$tsLen;
- $endPos = -1;
- $fullTagEndWordThis = $sTagEndWord.$tTagName.$TagEndWord;
-
- $e1 = strpos($this->SourceString,$eTagEndWord, $i);
- $e2 = strpos($this->SourceString,$FullTagStartWord, $i);
- $e3 = strpos($this->SourceString,$fullTagEndWordThis,$i);
-
- //$eTagEndWord = /} $FullTagStartWord = {tag: $fullTagEndWordThis = {/tag:xxx]
-
- $e1 = trim($e1); $e2 = trim($e2); $e3 = trim($e3);
- $e1 = ($e1=='' ? '-1' : $e1);
- $e2 = ($e2=='' ? '-1' : $e2);
- $e3 = ($e3=='' ? '-1' : $e3);
- //not found '{/tag:'
- if($e3==-1)
- {
- $endPos = $e1;
- $elen = $endPos + strlen($eTagEndWord);
- }
- //not found '/}'
- else if($e1==-1)
- {
- $endPos = $e3;
- $elen = $endPos + strlen($fullTagEndWordThis);
- }
- //found '/}' and found '{/dede:'
- else
- {
- //if '/}' more near '{dede:'、'{/dede:' , end tag is '/}', else is '{/dede:'
- if($e1 < $e2 && $e1 < $e3 )
- {
- $endPos = $e1;
- $elen = $endPos + strlen($eTagEndWord);
- }
- else
- {
- $endPos = $e3;
- $elen = $endPos + strlen($fullTagEndWordThis);
- }
- }
- //not found end tag , error
- if($endPos==-1)
- {
- echo "Tag Character postion $sPos, '$tTagName' Error!<br />\r\n";
- break;
- }
- $i = $elen;
- $ePos = $endPos;
- //分析所找到的标记位置等信息
- $attStr = '';
- $innerText = '';
- $startInner = 0;
- for($j=($sPos+$tsLen);$j < $ePos;$j++)
- {
- if($startInner==0 && ($this->SourceString[$j]==$TagEndWord && $this->SourceString[$j-1]!="\\") )
- {
- $startInner=1;
- continue;
- }
- if($startInner==0)
- {
- $attStr .= $this->SourceString[$j];
- }
- else
- {
- $innerText .= $this->SourceString[$j];
- }
- }
- //echo "<xmp>$attStr</xmp>\r\n";
- $cAtt->SetSource($attStr);
- if($cAtt->cAttributes->GetTagName()!='')
- {
- $this->Count++;
- $CDTag = new DedeTag();
- $CDTag->TagName = $cAtt->cAttributes->GetTagName();
- $CDTag->StartPos = $sPos;
- $CDTag->EndPos = $i;
- $CDTag->CAttribute = $cAtt->cAttributes;
- $CDTag->IsReplace = FALSE;
- $CDTag->TagID = $this->Count;
- $CDTag->InnerText = $innerText;
- $this->CTags[$this->Count] = $CDTag;
- }
- }
- else
- {
- $i = $sPos+$tsLen;
- break;
- }
- }//结束遍历模板字符串
- if($this->IsCache)
- {
- $this->SaveCache();
- }
- }
- /**
- * 处理某字段的函数
- *
- * @access public
- * @param string $fieldvalue 字段值
- * @param string $functionname 函数名称
- * @param object $refObj 隶属对象
- * @return string
- */
- function EvalFunc($fieldvalue,$functionname,&$refObj)
- {
- $DedeFieldValue = $fieldvalue;
- $functionname = str_replace("{\"","[\"",$functionname);
- $functionname = str_replace("\"}","\"]",$functionname);
- $functionname = preg_replace("/'@me'|\"@me\"|@me/i",'$DedeFieldValue',$functionname);
- $functionname = "\$DedeFieldValue = ".$functionname;
- @eval($functionname.";"); //or die("<xmp>$functionname</xmp>");
- if(empty($DedeFieldValue))
- {
- return '';
- }
- else
- {
- return $DedeFieldValue;
- }
- }
- /**
- * 获得一个外部变量
- *
- * @access public
- * @param string $varname 变量名称
- * @return string
- */
- function GetGlobals($varname)
- {
- $varname = trim($varname);
- //禁止在模板文件读取数据库密码
- if($varname=="dbuserpwd"||$varname=="cfg_dbpwd")
- {
- return "";
- }
- //正常情况
- if(isset($GLOBALS[$varname]))
- {
- return $GLOBALS[$varname];
- }
- else
- {
- return "";
- }
- }
- /**
- * 引入文件
- *
- * @access public
- * @param string $filename 文件名
- * @param string $ismake 是否需要编译
- * @return string
- */
- function IncludeFile($filename, $ismake='no')
- {
- global $cfg_df_style;
- $restr = '';
- if($filename=='')
- {
- return '';
- }
- if( file_exists(DEDEROOT."/templets/".$filename) )
- {
- $okfile = DEDEROOT."/templets/".$filename;
- }
- else if(file_exists(DEDEROOT.'/templets/'.$cfg_df_style.'/'.$filename) )
- {
- $okfile = DEDEROOT.'/templets/'.$cfg_df_style.'/'.$filename;
- }
- else
- {
- return "无法在这个位置找到: $filename";
- }
- //编译
- if($ismake!="no")
- {
- require_once(DEDEINC."/channelunit.func.php");
- $dtp = new DedeTagParse();
- $dtp->LoadTemplet($okfile);
- MakeOneTag($dtp,$this->refObj);
- $restr = $dtp->GetResult();
- }
- else
- {
- $fp = @fopen($okfile,"r");
- while($line=fgets($fp,1024)) $restr.=$line;
- fclose($fp);
- }
- return $restr;
- }
- }
- /**********************************************
- //class DedeAttribute Dede模板标记属性集合
- function c____DedeAttribute();
- **********************************************/
- //属性的数据描述
- class DedeAttribute
- {
- var $Count = -1;
- var $Items = ""; //属性元素的集合
- //获得某个属性
- function GetAtt($str)
- {
- if($str=="")
- {
- return "";
- }
- if(isset($this->Items[$str]))
- {
- return $this->Items[$str];
- }
- else
- {
- return "";
- }
- }
- //同上
- function GetAttribute($str)
- {
- return $this->GetAtt($str);
- }
- //判断属性是否存在
- function IsAttribute($str)
- {
- if(isset($this->Items[$str])) return TRUE;
- else return FALSE;
- }
- //获得标记名称
- function GetTagName()
- {
- return $this->GetAtt("tagname");
- }
- // 获得属性个数
- function GetCount()
- {
- return $this->Count+1;
- }
- }
- /*******************************
- //属性解析器(本版本中已经支持使用\'这种语法,和用.间隔表示name属性,如 field.body)
- function c____DedeAttributeParse();
- ********************************/
- class DedeAttributeParse
- {
- var $sourceString = "";
- var $sourceMaxSize = 1024;
- var $cAttributes = "";
- var $charToLow = TRUE;
- function SetSource($str='')
- {
- $this->cAttributes = new DedeAttribute();
- $strLen = 0;
- $this->sourceString = trim(preg_replace("/[ \r\n\t]{1,}/"," ",$str));
-
- //为了在function内能使用数组,这里允许对[ ]进行转义使用
- $this->sourceString = str_replace('\]',']',$this->sourceString);
- $this->sourceString = str_replace('[','[',$this->sourceString);
- /*
- $this->sourceString = str_replace('\>','>',$this->sourceString);
- $this->sourceString = str_replace('<','>',$this->sourceString);
- $this->sourceString = str_replace('{','{',$this->sourceString);
- $this->sourceString = str_replace('\}','}',$this->sourceString);
- */
-
- $strLen = strlen($this->sourceString);
- if($strLen>0 && $strLen <= $this->sourceMaxSize)
- {
- $this->ParseAttribute();
- }
- }
- //解析属性
- function ParseAttribute()
- {
- $d = '';
- $tmpatt = '';
- $tmpvalue = '';
- $startdd = -1;
- $ddtag = '';
- $hasAttribute=FALSE;
- $strLen = strlen($this->sourceString);
- $this->cAttributes->Items = array();
- // 获得Tag的名称,解析到 cAtt->GetAtt('tagname') 中
- for($i=0; $i<$strLen; $i++)
- {
- if($this->sourceString[$i]==' ')
- {
- $this->cAttributes->Count++;
- $tmpvalues = explode('.', $tmpvalue);
- $this->cAttributes->Items['tagname'] = ($this->charToLow ? strtolower($tmpvalues[0]) : $tmpvalues[0]);
- if(isset($tmpvalues[1]) && $tmpvalues[1]!='')
- {
- $this->cAttributes->Items['name'] = $tmpvalues[1];
- }
- $tmpvalue = '';
- $hasAttribute = TRUE;
- break;
- }
- else
- {
- $tmpvalue .= $this->sourceString[$i];
- }
- }
- //不存在属性列表的情况
- if(!$hasAttribute)
- {
- $this->cAttributes->Count++;
- $tmpvalues = explode('.', $tmpvalue);
- $this->cAttributes->Items['tagname'] = ($this->charToLow ? strtolower($tmpvalues[0]) : $tmpvalues[0]);
- if(isset($tmpvalues[1]) && $tmpvalues[1]!='')
- {
- $this->cAttributes->Items['name'] = $tmpvalues[1];
- }
- return ;
- }
- $tmpvalue = '';
- //如果字符串含有属性值,遍历源字符串,并获得各属性
- for($i; $i<$strLen; $i++)
- {
- $d = $this->sourceString[$i];
- //查找属性名称
- if($startdd==-1)
- {
- if($d != '=')
- {
- $tmpatt .= $d;
- }
- else
- {
- if($this->charToLow)
- {
- $tmpatt = strtolower(trim($tmpatt));
- }
- else
- {
- $tmpatt = trim($tmpatt);
- }
- $startdd=0;
- }
- }
- //查找属性的限定标志
- else if($startdd==0)
- {
- switch($d)
- {
- case ' ':
- break;
- case '"':
- $ddtag = '"';
- $startdd = 1;
- break;
- case '\'':
- $ddtag = '\'';
- $startdd = 1;
- break;
- default:
- $tmpvalue .= $d;
- $ddtag = ' ';
- $startdd = 1;
- break;
- }
- }
- else if($startdd==1)
- {
- if($d==$ddtag && ( isset($this->sourceString[$i-1]) && $this->sourceString[$i-1]!="\\") )
- {
- $this->cAttributes->Count++;
- $this->cAttributes->Items[$tmpatt] = trim($tmpvalue);
- $tmpatt = '';
- $tmpvalue = '';
- $startdd = -1;
- }
- else
- {
- $tmpvalue .= $d;
- }
- }
- }//for
- //最后一个属性的给值
- if($tmpatt != '')
- {
- $this->cAttributes->Count++;
- $this->cAttributes->Items[$tmpatt] = trim($tmpvalue);
- }
- //print_r($this->cAttributes->Items);
- }// end func
- }
|