⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dedetemplate.class.php

📁 这是matlab的一个小程序
💻 PHP
📖 第 1 页 / 共 3 页
字号:
		$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 + -