📄 dedetemplate.class.php
字号:
$encodeStr = substr(md5($tmpfile),0,24);
return $encodeStr;
}
//解析模板
function ParseTemplate()
{
if($this->makeLoop > 5)
{
return ;
}
$this->count = -1;
$this->cTags = array();
$this->isParse = true;
$sPos = 0;
$ePos = 0;
$tagStartWord = $this->tagStartWord;
$fullTagEndWord = $this->fullTagEndWord;
$sTagEndWord = $this->sTagEndWord;
$tagEndWord = $this->tagEndWord;
$startWordLen = strlen($tagStartWord);
$sourceLen = strlen($this->sourceString);
if( $sourceLen <= ($startWordLen + 3) )
{
return;
}
$cAtt = new TagAttributeParse();
$cAtt->CharToLow = true;
//遍历模板字符串,请取标记及其属性信息
$t = 0;
$preTag = '';
$tswLen = strlen($tagStartWord);
for($i=0; $i<$sourceLen; $i++)
{
$ttagName = '';
//如果不进行此判断,将无法识别相连的两个标记
if($i-1>=0)
{
$ss = $i-1;
}
else
{
$ss = 0;
}
$tagPos = strpos($this->sourceString,$tagStartWord,$ss);
//判断后面是否还有模板标记
if($tagPos==0 && ($sourceLen-$i < $tswLen
|| substr($this->sourceString,$i,$tswLen)!=$tagStartWord ))
{
$tagPos = -1;
break;
}
//获取TAG基本信息
for($j = $tagPos+$startWordLen; $j < $tagPos+$startWordLen+$this->tagMaxLen; $j++)
{
if(ereg("[ >/\r\n\t\}\.]",$this->sourceString[$j]))
{
break;
}
else
{
$ttagName .= $this->sourceString[$j];
}
}
if($ttagName!='')
{
$i = $tagPos + $startWordLen;
$endPos = -1;
//判断 '/}' '{tag:下一标记开始' '{/tag:标记结束' 谁最靠近
$fullTagEndWordThis = $fullTagEndWord.$ttagName.$tagEndWord;
$e1 = strpos($this->sourceString,$sTagEndWord, $i);
$e2 = strpos($this->sourceString,$tagStartWord, $i);
$e3 = strpos($this->sourceString,$fullTagEndWordThis,$i);
$e1 = trim($e1); $e2 = trim($e2); $e3 = trim($e3);
$e1 = ($e1=='' ? '-1' : $e1);
$e2 = ($e2=='' ? '-1' : $e2);
$e3 = ($e3=='' ? '-1' : $e3);
if($e3==-1)
{
//不存在'{/tag:标记'
$endPos = $e1;
$elen = $endPos + strlen($sTagEndWord);
}
else if($e1==-1)
{
//不存在 '/}'
$endPos = $e3;
$elen = $endPos + strlen($fullTagEndWordThis);
}
//同时存在 '/}' 和 '{/tag:标记'
else
{
//如果 '/}' 比 '{tag:'、'{/tag:标记' 都要靠近,则认为结束标志是 '/}',否则结束标志为 '{/tag:标记'
if($e1 < $e2 && $e1 < $e3 )
{
$endPos = $e1;
$elen = $endPos + strlen($sTagEndWord);
}
else
{
$endPos = $e3;
$elen = $endPos + strlen($fullTagEndWordThis);
}
}
//如果找不到结束标记,则认为这个标记存在错误
if($endPos==-1)
{
echo "Character postion $tagPos, '$ttagName' Error!<br />\r\n";
break;
}
$i = $elen;
//分析所找到的标记位置等信息
$attStr = '';
$innerText = '';
$startInner = 0;
for($j = $tagPos+$startWordLen; $j < $endPos; $j++)
{
if($startInner==0)
{
if($this->sourceString[$j]==$tagEndWord)
{
$startInner=1; continue;
}
else
{
$attStr .= $this->sourceString[$j];
}
}
else
{
$innerText .= $this->sourceString[$j];
}
}
$ttagName = strtolower($ttagName);
//if、php标记,把整个属性串视为属性
if(ereg("^if[0-9]{0,}$",$ttagName))
{
$cAtt->cAttributes = new TagAttribute();
$cAtt->cAttributes->count = 2;
$cAtt->cAttributes->items['tagname'] = $ttagName;
$cAtt->cAttributes->items['condition'] = ereg_replace("^if[0-9]{0,}[\r\n\t ]","",$attStr);
$innerText = eregi_replace("\{else\}",'<'."?php\r\n}\r\nelse{\r\n".'?'.'>',$innerText);
}
else if($ttagName=='php')
{
$cAtt->cAttributes = new TagAttribute();
$cAtt->cAttributes->count = 2;
$cAtt->cAttributes->items['tagname'] = $ttagName;
$cAtt->cAttributes->items['code'] = '<'."?php\r\n".trim(ereg_replace("^php[0-9]{0,}[\r\n\t ]","",$attStr))."\r\n?".'>';
}
else
{
//普通标记,解释属性
$cAtt->SetSource($attStr);
}
$this->count++;
$cTag = new Tag();
$cTag->tagName = $ttagName;
$cTag->startPos = $tagPos;
$cTag->endPos = $i;
$cTag->cAtt = $cAtt->cAttributes;
$cTag->isCompiler = false;
$cTag->tagID = $this->count;
$cTag->innerText = $innerText;
$this->cTags[$this->count] = $cTag;
}
else
{
$i = $tagPos+$startWordLen;
break;
}
}//结束遍历模板字符串
if( $this->count > -1 && $this->isCompiler )
{
$this->CompilerAll();
}
}
//把模板标记转换为PHP代码
function CompilerAll()
{
$this->loopNum++;
if($this->loopNum > 10)
{
return; //限制最大递归深度为 10 以防止因标记出错等可能性导致死循环
}
$ResultString = '';
$nextTagEnd = 0;
for($i=0; isset($this->cTags[$i]); $i++)
{
$ResultString .= substr($this->sourceString, $nextTagEnd, $this->cTags[$i]->startPos - $nextTagEnd);
$ResultString .= $this->CompilerOneTag($this->cTags[$i]);
$nextTagEnd = $this->cTags[$i]->endPos;
}
$slen = strlen($this->sourceString);
if($slen > $nextTagEnd)
{
$ResultString .= substr($this->sourceString,$nextTagEnd,$slen-$nextTagEnd);
}
$this->sourceString = $ResultString;
$this->ParseTemplate();
}
//获得最终结果
function GetResult()
{
if(!$this->isParse)
{
$this->ParseTemplate();
}
$addset = '';
$addset .= '<'.'?php'."\r\n".'if(!isset($GLOBALS[\'_vars\'])) $GLOBALS[\'_vars\'] = array(); '."\r\n".'$fields = array();'."\r\n".'?'.'>';
return ereg_replace("\?".">[ \r\n\t]{0,}<"."\?php","",$addset.$this->sourceString);
}
//编译单个标记
function CompilerOneTag(&$cTag)
{
$cTag->isCompiler = true;
$tagname = $cTag->tagName;
$varname = $cTag->GetAtt('name');
$rsvalue = "";
//用于在模板中设置一个变量以提供作扩展用途
//此变量直接提交到 this->tpCfgs 中,并会生成与模板对应的缓存文件 ***_config.php 文件
if( $tagname == "config" )
{
$this->tpCfgs[$varname] = $cTag->GetAtt('value');
}
else if( $tagname == "global" )
{
$cTag->tagValue = $this->CompilerArrayVar('global',$varname);
if( $cTag->GetAtt('function')!='' )
{
$cTag->tagValue = $this->CompilerFunction($cTag->GetAtt('function'), $cTag->tagValue);
}
$cTag->tagValue = '<'.'?php echo '.$cTag->tagValue.'; ?'.'>';
}
else if( $tagname == "cfg" )
{
$cTag->tagValue = '$GLOBALS[\'cfg_'.$varname.'\']'; //处理函数
if( $cTag->GetAtt('function')!='' )
{
$cTag->tagValue = $this->CompilerFunction($cTag->GetAtt('function'), $cTag->tagValue);
}
$cTag->tagValue = '<'.'?php echo '.$cTag->tagValue.'; ?'.'>';
}
else if( $tagname == "object" )
{
list($_obs,$_em) = explode('->',$varname);
$cTag->tagValue = "\$GLOBALS['{$_obs}']->{$_em}"; //处理函数
if( $cTag->GetAtt('function')!='' )
{
$cTag->tagValue = $this->CompilerFunction($cTag->GetAtt('function'), $cTag->tagValue);
}
$cTag->tagValue = '<'.'?php echo '.$cTag->tagValue.'; ?'.'>';
}
else if($tagname == "var")
{
$cTag->tagValue = $this->CompilerArrayVar('var',$varname);
if( $cTag->GetAtt('function')!='' )
{
$cTag->tagValue = $this->CompilerFunction($cTag->GetAtt('function'), $cTag->tagValue);
}
$cTag->tagValue = '<'.'?php echo '.$cTag->tagValue.'; ?'.'>';
}
else if($tagname == 'field')
{
$cTag->tagValue = '$fields[\''.$varname.'\']';
if( $cTag->GetAtt('function')!='' )
{
$cTag->tagValue = $this->CompilerFunction($cTag->GetAtt('function'), $cTag->tagValue);
}
$cTag->tagValue = '<'.'?php echo '.$cTag->tagValue.'; ?'.'>';
}
else if( ereg("^key[0-9]{0,}",$tagname) || ereg("^value[0-9]{0,}",$tagname))
{
if( ereg("^value[0-9]{0,}",$tagname) && $varname!='' )
{
$cTag->tagValue = '<'.'?php echo '.$this->CompilerArrayVar($tagname,$varname).'; ?'.'>';
}
else
{
$cTag->tagValue = '<'.'?php echo $'.$tagname.'; ?'.'>';
}
}
else if( ereg("^if[0-9]{0,}$",$tagname) )
{
$cTag->tagValue = $this->CompilerIf($cTag);
}
else if( $tagname=='php' )
{
if(trim($cTag->GetInnerText())=='') $cTag->tagValue = $cTag->GetAtt('code');
else
{
$cTag->tagValue = '<'."?php\r\n".trim($cTag->GetInnerText())."\r\n?".'>';
}
}
//遍历数组
else if( ereg("^array[0-9]{0,}",$tagname) )
{
$kk = '$key';
$vv = '$value';
if($cTag->GetAtt('key')!='')
{
$kk = '$key'.$cTag->GetAtt('key');
}
if($cTag->GetAtt('value')!='')
{
$vv = '$value'.$cTag->GetAtt('value');
}
$addvar = '';
if(!ereg("\(",$varname))
{
$varname = '$GLOBALS[\''.$varname.'\']';
}
else
{
$addvar = "\r\n".'$myarrs = $pageClass->'.$varname.";\r\n";
$varname = ' $myarrs ';
}
$rsvalue = '<'.'?php '.$addvar.' foreach('.$varname.' as '.$kk.'=>'.$vv.'){ ?'.">";
$rsvalue .= $cTag->GetInnerText();
$rsvalue .= '<'.'?php } ?'.">\r\n";
$cTag->tagValue = $rsvalue;
}
//include 文件
else if($tagname == "include")
{
$filename = $cTag->GetAtt('file');
if($filename=='')
{
$filename = $cTag->GetAtt('filename');
}
$cTag->tagValue = $this->CompilerInclude($filename,false);
if($cTag->tagValue=='')
{
$cTag->tagValue = "File Not Find: $filename ";
}
else
{
$cTag->tagValue = '<'.'?php include $this->CompilerInclude("'.$filename.'"); ?'.'>';
}
}
else if( $tagname=='label' )
{
$bindFunc = $cTag->GetAtt('bind');
$rsvalue = 'echo '.$bindFunc.";\r\n";
$rsvalue = '<'.'?php '.$rsvalue.' ?'.">\r\n";
$cTag->tagValue = $rsvalue;
}
else if( $tagname=='datalist' )
{
//生成属性数组
foreach($cTag->cAtt->items as $k=>$v)
{
$v = $this->TrimAtts($v);
$rsvalue .= '$atts[\''.$k.'\'] = \''.str_replace("'","\\'",$v)."';\r\n";
}
$rsvalue = '<'.'?php'."\r\n".'$atts = array();'."\r\n".$rsvalue;
$rsvalue .= '$blockValue = $this->refObj->GetArcList($atts,$this->refObj,$fields); '."\r\n";
$rsvalue .= 'foreach( $blockValue as $key=>$fields )'."\r\n{\r\n".'?'.">";
$rsvalue .= $cTag->GetInnerText();
$rsvalue .= '<'.'?php'."\r\n}\r\n".'?'.'>';
$cTag->tagValue = $rsvalue;
}
else if( $tagname=='pagelist' )
{
//生成属性数组
foreach($cTag->cAtt->items as $k=>$v)
{
$v = $this->TrimAtts($v);
$rsvalue .= '$atts[\''.$k.'\'] = \''.str_replace("'","\\'",$v)."';\r\n";
}
$rsvalue = '<'.'?php'."\r\n".'$atts = array();'."\r\n".$rsvalue;
$rsvalue .= ' echo $this->refObj->GetPageList($atts,$this->refObj,$fields); '."\r\n".'?'.">\r\n";
$cTag->tagValue = $rsvalue;
}
else
{
$bindFunc = $cTag->GetAtt('bind');
$bindType = $cTag->GetAtt('bindtype');
$rstype = ($cTag->GetAtt('resulttype')=='' ? $cTag->GetAtt('rstype') : $cTag->GetAtt('resulttype') );
$rstype = strtolower($rstype);
//生成属性数组
foreach($cTag->cAtt->items as $k=>$v)
{
if(eregi("(bind|bindtype)",$k))
{
continue;
}
$v = $this->TrimAtts($v);
$rsvalue .= '$atts[\''.$k.'\'] = \''.str_replace("'","\\'",$v)."';\r\n";
}
$rsvalue = '<'.'?php'."\r\n".'$atts = array();'."\r\n".$rsvalue;
//绑定到默认函数还是指定函数(datasource属性指定)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -