cszx
新手上路

UID 92907
精华
0
积分 31
帖子 11
金钱 31 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2007-5-12
状态 离线
|
不知道有多少位能够读懂
<?php /* * 模板处理程序 * * 这不是一个免费程序 * * @开发时间:2006年10月18日 22:29 * @开发者:zx * @版本:1.0 * * 对象假定: * 先使用readInfo接口读取模板 * 假设模板循环参数的首参数为循环数组,第二个参数为数组值标识符, * 第三个参数为数组键值标识符 */
class zxtemplate implements zxtemplateInterface { private $kernel; /* * 库主控文件 * * @var kernel * @access private */ private $content; /* * 模板内容 * * @var string * @access private */ private $compiler; /* * 重新编译 * * @var bool * @access private */ private $parameter; /* * 模板参数 * * @var array * @access private */ private $assigns; /* * 模板参数值 * * @var array * @access private */ private $tags = array ( 'left' => '{', 'right' => '}', 'var' => '$', 'assign' => '=', 'system' => array ( 'for' => array ( 'name' => 'for', 'endName' => 'endfor', ), 'if' => array ( 'name' => 'if', 'endName' => 'endif', 'else' => 'else', 'elseIf' => 'elseif' ), ), 'function' => array ( 'left' => '(', 'right' => ')', 'split' => ',' ), 'order' => array ( 'start' => '[', 'end' => ']', 'split' => ';' ) ); /* * 模板标识符 * * @var array * @access private */ private $code = array ( 'var' => '$', 'start' => '<?', 'echo' => '=', 'end' => '?>', 'suffix' => '.php', 'split' => ';', 'sub' => array ( 'start' => '{', 'end' => '}' ), 'function' => array ( 'left' => '(', 'right' => ')', 'split' => ',' ) ); /* * 定义PHP程序标识符 * * @var array * @access private */ private $path = array ( 'compilerDir' => './compiler/', 'compilerPath' => '', 'templateDir' => './template/', 'templateFile' => '' ); /* * 路径信息设定 * * @var array * @access private */ public function __construct($kernel) { $this->kernel = &$kernel; } public function setLeftSign($sign) { $this->tags['left'] = $sign; } public function getLeftSign( ) { return($this->tags['left']); } public function setRightSign($sign) { $this->tags['right'] = $sign; } public function getRightSign( ) { return($this->tags['right']); } public function setVarSign($sign) { $this->tags['var'] = $sign; } public function getVarSign( ) { return($this->tags['var']); } public function setFunctionLeftSign($sign) { $this->tags['function']['left'] = $sign; } public function getFunctionLeftSign( ) { return($this->tags['function']['left']); } public function setFunctionRightSign($sign) { $this->tags['function']['right'] = $sign; } public function getFunctionRightSign( ) { return($this->tags['function']['right']); } public function setFunctionSplitSign($sign) { $this->tags['function']['split'] = $sign; } public function getFunctionSplitSign( ) { return($this->tags['function']['split']); } public function setOrderStartSign($sign) { $this->tags['order']['start'] = $sign; } public function getOrderStartSign( ) { return($this->tags['order']['start']); } public function setOrderEndSign($sign) { $this->tags['order']['end'] = $sign; } public function getOrderEndSign( ) { return($this->tags['order']['end']); } public function setOrderSplitSign($sign) { $this->tags['order']['split'] = $sign; } public function getOrderSplitSign( ) { return($this->tags['order']['split']); } public function getForTag( ) { return($this->tags['system']['for']['name']); } public function getEndForTag( ) { return($this->tags['system']['for']['endName']); } public function getIfTag( ) { return($this->tags['system']['if']['name']); } public function getElseIfTag( ) { return($this->tags['system']['if']['elseIf']); } public function getElseTag( ) { return($this->tags['system']['if']['else']); } public function getEndIfTag( ) { return($this->tags['system']['if']['endName']); } /*获取程序开始标记*/ private function getProgramStart( ) { return($this->code['start']); } /*获取程序结束标记*/ private function getProgramEnd( ) { return($this->code['end']); } /*获取程序输出标记*/ private function getProgramEcho( ) { return($this->code['echo']); } /*获取程序变量标识*/ private function getProgramVar( ) { return($this->code['var']); } /*获取程序函数左标记*/ private function getProgramFunctionLeft( ) { return($this->code['function']['left']); } /*获取程序函数右标记*/ private function getProgramFunctionRight( ) { return($this->code['function']['right']); } /*获取程序函数参数分隔标记*/ private function getProgramFunctionSplit( ) { return($this->code['function']['split']); } /*获取程序子过程起始标记*/ private function getProgramSubStart( ) { return($this->code['sub']['start']); } /*获取程序子过程结束标记*/ private function getProgramSubEnd( ) { return($this->code['sub']['end']); } /*获取程序分隔标记*/ private function getProgramSplit( ) { return($this->code['split']); } /*获取程序文件后缀名*/ private function getProgramSuffix( ) { return($this->code['suffix']); } /*设置编译目录(路径)*/ public function setCompilerDir($dir) { $this->path['compilerDir'] = $dir; } public function setCompiler($close=true) { $this->compiler = $close; } public function isCompiler( ) { return(true); } public function readInfo($templateFile) { /*获取模板路经*/ $filePath = self::getTemplatePath($templateFile); /*如果需要读取模板则*/ if(self::isReadTemplate($filePath)) { /*如果模板文件存在则*/ if(fileExists($filePath)) { /*读取并保存模板文件*/ $templateContent = self::readFile($filePath); self::saveContent($templateContent); /*提取模板参数*/ if(self::pickUpParameter( )) { /*转换模板文件为模板程序文件并保存模板程序文件*/ $phpFile = self::converToProgram( ); self::saveProgram($phpFile); return(true); } else { return(false); } } else { /*处理错误*/ self::errorReport('{$Template}{$File}{$Not}{$Found}', 'readInfo("' . $templateFile . '")', ERROR_PROGRAME); return(false); } } return(true); } /*获取模板文件路径(文件名)*/ private function getTemplatePath($file) { return(fileExists($file) ? $file : $this->path['templateDir'] . $file); } /*是否读取模板(模板路径)*/ private function isReadTemplate($file) { return((!self::programExists($file) || self::isCompiler( )) ? true : false); } /*程序文件存在(模板路径)*/ private function programExists($templateFile='') { $programPath = self::getProgramPath($templateFile); return(fileExists($programPath)); } /*获取程序文件名(模板文件)*/ private function getProgramFile($templateFile='') { if($templateFile) { $this->path['templateFile'] = $templateFile; } $this->path['compilerPath'] = md5($this->path['templateFile']) . self::getProgramSuffix( ); return($this->path['compilerPath']); } /*获取模板程序文件路径*/ private function getProgramPath($templateFile='') { $programFile = self::getProgramFile($templateFile); return($this->path['compilerDir'] . $programFile); } /*读取文件内容(文件路径)*/ private function readFile($file) { $files = &$this->kernel->object('zxfiles'); return($files->read($file)); } /*保存模板内容(内容)*/ private function saveContent($content) { $this->content = $content; } /*获取模板内容*/ private function getContent( ) { return($this->content); } /*提取模板参数()*/ private function pickUpParameter( ) { /*提取模板中所有的PHP标记*/ $tags = self::searchTags(); if($tags) { /*保存模板标记*/ self::saveTags($tags); return(true); } return(false); } /*保存模板标记(模板标记数组)*/ private function saveTags($tags) { $this->parameter = $tags; } /*获取模板标记*/ private function getTags( ) { return($this->parameter); } /*搜索模板标记(模板内容)*/ private function searchTags( ) { /*标记的存储结构:名称(name),起始位置(start),长度(len)*/ /*获取模板内容*/ $content = self::getContent( ); $contentLen = strLen($content); /*获取标记左边界符*/ $leftSign = self::getLeftSign( ); $leftSignLen = strLen($leftSign); /*获取标记右边界符*/ $rightSign = self::getRightSign( ); $rightSignLen = strLen($rightSign); /*遍历模板内容*/ $pos = 0; $tags = array( ); $leftSignStack = array( ); $lastID = 0;
for($i = 0; $i < $contentLen; $i++) { /*如果匹配到左标记则*/ if(self::isLeftSign(subStr($content, $i, $leftSignLen))) { /*将标记及其位置入标记栈*/ arrayPush($leftSignStack, $i); } /*如果匹配到右标记则*/ else if(self::isRightSign(subStr($content, $i, $rightSignLen))) { /*如果左标记栈不为空则*/ if(arrayNotNull($leftSignStack)) { /*弹出左标记,将左标记与右标记之间的内容保存*/ $leftSignPos = arrayPop($leftSignStack); $nameStart = $leftSignPos + $leftSignLen; $tagLen = $i - $nameStart; $tags[$lastID++] = array ( 'name' => subStr($content, $nameStart, $tagLen), 'start' => $leftSignPos, 'len' => $leftSignLen + $tagLen + $rightSignLen ); } else { /*提示出错,找不到左标记符*/ self::errorReport('{$Not}{$Found}{$LeftSign}', 'searchTags( )', ERROR_PROGRAMEE); return(false); } } } /*返回模板标记信息数组*/ return($tags); } /*是否是左标记(标记)*/ private function isLeftSign($sign) { /*获取标记左边界符*/ $leftSign = self::getLeftSign( ); return(isSameStr($sign, $leftSign) ? true : false); } /*是否是右标记(标记)*/ private function isRightSign($sign) { /*获取标记右边界符*/ $rightSign = self::getRightSign( ); return(isSameStr($sign, $rightSign) ? true : false); }
/*模板转换为程序()*/ private function converToProgram( ) { /*获取模板内容*/ $content = self::getContent( ); if(!$content) { return(''); } /*获取模板参数*/ $parameters = self::getTags( ); $parametersLen = arrayCount($parameters); $program = ''; $code['start'] = self::getProgramStart( ); $code['end'] = self::getProgramEnd( ); $code['echo'] = self::getProgramEcho( ); $code['subStart'] = self::getProgramSubStart( ); $code['subEnd'] = self::getProgramSubEnd( ); $converPoint = 0; for($i = 0; $i < $parametersLen; $i++) { $program .= subStr($content, $converPoint, $parameters[$i]['start'] - $converPoint) . $code['start']; $converPoint = $parameters[$i]['start'] + $parameters[$i]['len']; if(self::isVarTag($parameters[$i]['name'])) { $program .= $code['echo'] . self::converVarTag($parameters[$i]['name']); } else if(self::isForTag($parameters[$i]['name'])) { $program .= self::converForTag($parameters[$i]['name']) . $code['subStart'] . entry( ); } else if(self::isEndForTag($parameters[$i]['name'])) { $program .= self::converEndForTag($parameters[$i]['name']) . $code['subEnd'] . entry( ); } else if(self::isIfTag($parameters[$i]['name'])) { $program .= self::converIfTag($parameters[$i]['name']) . $code['subStart'] . entry( ); } else if(self::isElseIfTag($parameters[$i]['name'])) { $program .= entry( ) . $code['subEnd'] . self::converElseIfTag($parameters[$i]['name']) . $code['subStart'] . entry( ); } else if(self::isElseTag($parameters[$i]['name'])) { $program .= entry( ) . $code['subEnd'] . self::converElseTag($parameters[$i]['name']) . $code['subStart'] . entry( ); } else if(self::isEndIfTag($parameters[$i]['name'])) { $program .= self::converEndIfTag($parameters[$i]['name']) . $code['subEnd'] . entry( ); } else if(self::isFunctionTag($parameters[$i]['name'])) { $program .= $code['echo'] . self::converFunctionTag($parameters[$i]['name']); } else if(self::isOrderTag($parameters[$i]['name'])) { $program .= self::converOrderTag($parameters[$i]['name']); } $program .= $code['end']; } $program .= subStr($content, $converPoint); /*返回转换后的程序*/ return($program); }
/*是否是变量标记(标记名)*/ private function isVarTag($tag) { $tag = trim($tag); /*获取变量标识符*/ $varSign = self::getVarSign( ); $varSignLen = strLen($varSign); return(isSameStr(strToLower(subStr($tag, 0, $varSignLen)), $varSign) ? true : false); } /*转换变量标记(标记名)*/ private function converVarTag($tag) { /*获取变量标识符*/ $varSign = self::getVarSign( ); /*获取程序变量标识*/ $programVarSign = self::getProgramVar( ); $varSignLen = strLen($varSign); return($programVarSign . subStr($tag, $varSignLen)); } /*是否是循环起始标记(标记名)*/ private function isForTag($tag) { /*获取函数左标记*/ $leftSign = self::getFunctionLeftSign( ); /*获取循环起始标记*/ $for = self::getForTag( ); $nameLen = searchStr($leftSign, $tag); if(!$nameLen) { return(false); } else if(!isSameStr(strToLower(subStr($tag, 0, $nameLen)), $for)) { return(false); } return(true); } /*转换循环起始标记(标记名)*/ private function converForTag($tag) { /*假设模板循环参数的首参数为循环数组,第二个参数为数组值标识符,第三个参数为数组键值标识符*/ /*获取函数左标记*/ $leftSign = self::getFunctionLeftSign( ); $leftSignLen = strLen($leftSign); /*获取函数右标记*/ $rightSign = self::getFunctionRightSign( ); /*获取函数分隔标记*/ $splitSign = self::getFunctionSplitSign( ); /*获取循环起始标记*/ $for = self::getForTag( ); $parameterStart = searchStr($leftSign, $tag) + $leftSignLen; $parameterLen = lastSearchStr($rightSign, $tag) - $parameterStart; $parameter = subStr($tag, $parameterStart, $parameterLen); $parameters = split($splitSign, $parameter); $parametersLen = arrayCount($parameters); for($i = 0; $i < $parametersLen; $i++) { if(!self::isVarTag($parameters[$i])) { self::errorReport('{$Template}{$Loop}{$Parameters}{$Must}{$Is}{$Var}', 'converForTag("' . $tag . '")', ERROR_PROGRAME); | |