mirror of
https://gitee.com/fastadminnet/framework.git
synced 2026-07-06 23:02:48 +08:00
Think\TagLib类 改成 Think\Template\Taglib类
This commit is contained in:
@@ -717,236 +717,4 @@ class Template {
|
|||||||
return $template;
|
return $template;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ThinkPHP标签库TagLib解析基类
|
|
||||||
* @category Think
|
|
||||||
* @package Think
|
|
||||||
* @subpackage Template
|
|
||||||
* @author liu21st <liu21st@gmail.com>
|
|
||||||
*/
|
|
||||||
class TagLib {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 标签库定义XML文件
|
|
||||||
* @var string
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected $xml = '';
|
|
||||||
protected $tags = [];// 标签定义
|
|
||||||
/**
|
|
||||||
* 标签库名称
|
|
||||||
* @var string
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected $tagLib ='';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 标签库标签列表
|
|
||||||
* @var string
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected $tagList = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 标签库分析数组
|
|
||||||
* @var string
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected $parse = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 标签库是否有效
|
|
||||||
* @var string
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected $valid = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 当前模板对象
|
|
||||||
* @var object
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
public $tpl;
|
|
||||||
|
|
||||||
protected $comparison = [' nheq '=>' !== ',' heq '=>' === ',' neq '=>' != ',' eq '=>' == ',' egt '=>' >= ',' gt '=>' > ',' elt '=>' <= ',' lt '=>' < '];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TagLib标签属性分析 返回标签属性数组
|
|
||||||
* @access public
|
|
||||||
* @param string $tagStr 标签内容
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function parseXmlAttr($attr,$tag) {
|
|
||||||
if(''== trim($attr)) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
//XML解析安全过滤
|
|
||||||
$attr = str_replace('&','___', $attr);
|
|
||||||
$xml = '<tpl><tag '.$attr.' /></tpl>';
|
|
||||||
$xml = simplexml_load_string($xml);
|
|
||||||
if(!$xml) {
|
|
||||||
exit('_XML_TAG_ERROR_ : '.$attr);
|
|
||||||
}
|
|
||||||
$xml = (array)($xml->tag->attributes());
|
|
||||||
$array = array_change_key_case($xml['@attributes']);
|
|
||||||
if($array) {
|
|
||||||
$tag = strtolower($tag);
|
|
||||||
if(isset($this->tags[$tag]['attr'])) {
|
|
||||||
$attrs = explode(',',$this->tags[$tag]['attr']);
|
|
||||||
if(isset($this->tags[strtolower($tag)]['must'])){
|
|
||||||
$must = explode(',',$this->tags[$tag]['must']);
|
|
||||||
}else{
|
|
||||||
$must = [];
|
|
||||||
}
|
|
||||||
foreach($attrs as $name) {
|
|
||||||
if( isset($array[$name])) {
|
|
||||||
$array[$name] = str_replace('___','&',$array[$name]);
|
|
||||||
}elseif(false !== array_search($name,$must)){
|
|
||||||
exit('_PARAM_ERROR_:'.$name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $array;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 解析条件表达式
|
|
||||||
* @access public
|
|
||||||
* @param string $condition 表达式标签内容
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function parseCondition($condition) {
|
|
||||||
$condition = str_ireplace(array_keys($this->comparison),array_values($this->comparison),$condition);
|
|
||||||
$condition = preg_replace('/\$(\w+):(\w+)\s/is','$\\1->\\2 ',$condition);
|
|
||||||
$condition = preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1["\\2"] ',$condition);
|
|
||||||
|
|
||||||
if(false !== strpos($condition, '$Think'))
|
|
||||||
$condition = preg_replace('/(\$Think.*?)\s/ies',"\$this->parseThinkVar('\\1');" , $condition);
|
|
||||||
return $condition;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 自动识别构建变量
|
|
||||||
* @access public
|
|
||||||
* @param string $name 变量描述
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function autoBuildVar($name) {
|
|
||||||
if('Think.' == substr($name,0,6)){
|
|
||||||
// 特殊变量
|
|
||||||
return $this->parseThinkVar($name);
|
|
||||||
}elseif(strpos($name,'.')) {
|
|
||||||
$vars = explode('.',$name);
|
|
||||||
$var = array_shift($vars);
|
|
||||||
$name = '$'.$var;
|
|
||||||
foreach ($vars as $key=>$val){
|
|
||||||
if(0===strpos($val,'$')) {
|
|
||||||
$name .= '["{'.$val.'}"]';
|
|
||||||
}else{
|
|
||||||
$name .= '["'.$val.'"]';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}elseif(strpos($name,':')){
|
|
||||||
// 额外的对象方式支持
|
|
||||||
$name = '$'.str_replace(':','->',$name);
|
|
||||||
}elseif(!defined($name)) {
|
|
||||||
$name = '$'.$name;
|
|
||||||
}
|
|
||||||
return $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用于标签属性里面的特殊模板变量解析
|
|
||||||
* 格式 以 Think. 打头的变量属于特殊模板变量
|
|
||||||
* @access public
|
|
||||||
* @param string $varStr 变量字符串
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function parseThinkVar($varStr){
|
|
||||||
$vars = explode('.',$varStr);
|
|
||||||
$vars[1] = strtoupper(trim($vars[1]));
|
|
||||||
$parseStr = '';
|
|
||||||
if(count($vars)>=3){
|
|
||||||
$vars[2] = trim($vars[2]);
|
|
||||||
switch($vars[1]){
|
|
||||||
case 'SERVER': $parseStr = '$_SERVER[\''.$vars[2].'\']';break;
|
|
||||||
case 'GET': $parseStr = '$_GET[\''.$vars[2].'\']';break;
|
|
||||||
case 'POST': $parseStr = '$_POST[\''.$vars[2].'\']';break;
|
|
||||||
case 'COOKIE':
|
|
||||||
if(isset($vars[3])) {
|
|
||||||
$parseStr = '$_COOKIE[\''.$vars[2].'\'][\''.$vars[3].'\']';
|
|
||||||
}else{
|
|
||||||
$parseStr = '$_COOKIE[\''.$vars[2].'\']';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'SESSION':
|
|
||||||
if(isset($vars[3])) {
|
|
||||||
$parseStr = '$_SESSION[\''.$vars[2].'\'][\''.$vars[3].'\']';
|
|
||||||
}else{
|
|
||||||
$parseStr = '$_SESSION[\''.$vars[2].'\']';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'ENV': $parseStr = '$_ENV[\''.$vars[2].'\']';break;
|
|
||||||
case 'REQUEST': $parseStr = '$_REQUEST[\''.$vars[2].'\']';break;
|
|
||||||
case 'CONST': $parseStr = strtoupper($vars[2]);break;
|
|
||||||
case 'LANG':
|
|
||||||
$parseStr = 'L("'.$vars[2].'")';break;
|
|
||||||
case 'CONFIG':
|
|
||||||
if(isset($vars[3])) {
|
|
||||||
$vars[2] .= '.'.$vars[3];
|
|
||||||
}
|
|
||||||
$parseStr = 'C("'.$vars[2].'")';break;
|
|
||||||
}
|
|
||||||
}else if(count($vars)==2){
|
|
||||||
switch($vars[1]){
|
|
||||||
case 'NOW': $parseStr = "date('Y-m-d g:i a',time())";break;
|
|
||||||
case 'VERSION': $parseStr = 'THINK_VERSION';break;
|
|
||||||
default: if(defined($vars[1])) $parseStr = $vars[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $parseStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 对模板变量使用函数
|
|
||||||
* 格式 {$varname|function1|function2=arg1,arg2}
|
|
||||||
* @access protected
|
|
||||||
* @param string $name 变量名
|
|
||||||
* @param array $varArray 函数列表
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function parseVarFunction($name,$varArray){
|
|
||||||
//对变量使用函数
|
|
||||||
$length = count($varArray);
|
|
||||||
for($i=0;$i<$length ;$i++ ){
|
|
||||||
$args = explode('=',$varArray[$i],2);
|
|
||||||
//模板函数过滤
|
|
||||||
$fun = strtolower(trim($args[0]));
|
|
||||||
switch($fun) {
|
|
||||||
case 'default': // 特殊模板函数
|
|
||||||
$name = '('.$name.')?('.$name.'):'.$args[1];
|
|
||||||
break;
|
|
||||||
default: // 通用模板函数
|
|
||||||
if(isset($args[1])){
|
|
||||||
if(strstr($args[1],'###')){
|
|
||||||
$args[1] = str_replace('###',$name,$args[1]);
|
|
||||||
$name = "$fun($args[1])";
|
|
||||||
}else{
|
|
||||||
$name = "$fun($name,$args[1])";
|
|
||||||
}
|
|
||||||
}else if(!empty($args[0])){
|
|
||||||
$name = "$fun($name)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取标签定义
|
|
||||||
public function getTags(){
|
|
||||||
return $this->tags;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
243
Think/Template/Taglib.php
Normal file
243
Think/Template/Taglib.php
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
<?php
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | TOPThink [ WE CAN DO IT JUST THINK ]
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Copyright (c) 2013 http://topthink.com All rights reserved.
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Author: liu21st <liu21st@gmail.com>
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// $Id$
|
||||||
|
namespace Think\Template;
|
||||||
|
/**
|
||||||
|
* ThinkPHP标签库TagLib解析基类
|
||||||
|
* @category Think
|
||||||
|
* @package Think
|
||||||
|
* @subpackage Template
|
||||||
|
* @author liu21st <liu21st@gmail.com>
|
||||||
|
*/
|
||||||
|
class TagLib {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标签库定义XML文件
|
||||||
|
* @var string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $xml = '';
|
||||||
|
protected $tags = [];// 标签定义
|
||||||
|
/**
|
||||||
|
* 标签库名称
|
||||||
|
* @var string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $tagLib ='';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标签库标签列表
|
||||||
|
* @var string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $tagList = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标签库分析数组
|
||||||
|
* @var string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $parse = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标签库是否有效
|
||||||
|
* @var string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $valid = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前模板对象
|
||||||
|
* @var object
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
public $tpl;
|
||||||
|
|
||||||
|
protected $comparison = [' nheq '=>' !== ',' heq '=>' === ',' neq '=>' != ',' eq '=>' == ',' egt '=>' >= ',' gt '=>' > ',' elt '=>' <= ',' lt '=>' < '];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TagLib标签属性分析 返回标签属性数组
|
||||||
|
* @access public
|
||||||
|
* @param string $tagStr 标签内容
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function parseXmlAttr($attr,$tag) {
|
||||||
|
if(''== trim($attr)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
//XML解析安全过滤
|
||||||
|
$attr = str_replace('&','___', $attr);
|
||||||
|
$xml = '<tpl><tag '.$attr.' /></tpl>';
|
||||||
|
$xml = simplexml_load_string($xml);
|
||||||
|
if(!$xml) {
|
||||||
|
exit('_XML_TAG_ERROR_ : '.$attr);
|
||||||
|
}
|
||||||
|
$xml = (array)($xml->tag->attributes());
|
||||||
|
$array = array_change_key_case($xml['@attributes']);
|
||||||
|
if($array) {
|
||||||
|
$tag = strtolower($tag);
|
||||||
|
if(isset($this->tags[$tag]['attr'])) {
|
||||||
|
$attrs = explode(',',$this->tags[$tag]['attr']);
|
||||||
|
if(isset($this->tags[strtolower($tag)]['must'])){
|
||||||
|
$must = explode(',',$this->tags[$tag]['must']);
|
||||||
|
}else{
|
||||||
|
$must = [];
|
||||||
|
}
|
||||||
|
foreach($attrs as $name) {
|
||||||
|
if( isset($array[$name])) {
|
||||||
|
$array[$name] = str_replace('___','&',$array[$name]);
|
||||||
|
}elseif(false !== array_search($name,$must)){
|
||||||
|
exit('_PARAM_ERROR_:'.$name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析条件表达式
|
||||||
|
* @access public
|
||||||
|
* @param string $condition 表达式标签内容
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function parseCondition($condition) {
|
||||||
|
$condition = str_ireplace(array_keys($this->comparison),array_values($this->comparison),$condition);
|
||||||
|
$condition = preg_replace('/\$(\w+):(\w+)\s/is','$\\1->\\2 ',$condition);
|
||||||
|
$condition = preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1["\\2"] ',$condition);
|
||||||
|
|
||||||
|
if(false !== strpos($condition, '$Think'))
|
||||||
|
$condition = preg_replace('/(\$Think.*?)\s/ies',"\$this->parseThinkVar('\\1');" , $condition);
|
||||||
|
return $condition;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动识别构建变量
|
||||||
|
* @access public
|
||||||
|
* @param string $name 变量描述
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function autoBuildVar($name) {
|
||||||
|
if('Think.' == substr($name,0,6)){
|
||||||
|
// 特殊变量
|
||||||
|
return $this->parseThinkVar($name);
|
||||||
|
}elseif(strpos($name,'.')) {
|
||||||
|
$vars = explode('.',$name);
|
||||||
|
$var = array_shift($vars);
|
||||||
|
$name = '$'.$var;
|
||||||
|
foreach ($vars as $key=>$val){
|
||||||
|
if(0===strpos($val,'$')) {
|
||||||
|
$name .= '["{'.$val.'}"]';
|
||||||
|
}else{
|
||||||
|
$name .= '["'.$val.'"]';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}elseif(strpos($name,':')){
|
||||||
|
// 额外的对象方式支持
|
||||||
|
$name = '$'.str_replace(':','->',$name);
|
||||||
|
}elseif(!defined($name)) {
|
||||||
|
$name = '$'.$name;
|
||||||
|
}
|
||||||
|
return $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于标签属性里面的特殊模板变量解析
|
||||||
|
* 格式 以 Think. 打头的变量属于特殊模板变量
|
||||||
|
* @access public
|
||||||
|
* @param string $varStr 变量字符串
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function parseThinkVar($varStr){
|
||||||
|
$vars = explode('.',$varStr);
|
||||||
|
$vars[1] = strtoupper(trim($vars[1]));
|
||||||
|
$parseStr = '';
|
||||||
|
if(count($vars)>=3){
|
||||||
|
$vars[2] = trim($vars[2]);
|
||||||
|
switch($vars[1]){
|
||||||
|
case 'SERVER': $parseStr = '$_SERVER[\''.$vars[2].'\']';break;
|
||||||
|
case 'GET': $parseStr = '$_GET[\''.$vars[2].'\']';break;
|
||||||
|
case 'POST': $parseStr = '$_POST[\''.$vars[2].'\']';break;
|
||||||
|
case 'COOKIE':
|
||||||
|
if(isset($vars[3])) {
|
||||||
|
$parseStr = '$_COOKIE[\''.$vars[2].'\'][\''.$vars[3].'\']';
|
||||||
|
}else{
|
||||||
|
$parseStr = '$_COOKIE[\''.$vars[2].'\']';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'SESSION':
|
||||||
|
if(isset($vars[3])) {
|
||||||
|
$parseStr = '$_SESSION[\''.$vars[2].'\'][\''.$vars[3].'\']';
|
||||||
|
}else{
|
||||||
|
$parseStr = '$_SESSION[\''.$vars[2].'\']';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'ENV': $parseStr = '$_ENV[\''.$vars[2].'\']';break;
|
||||||
|
case 'REQUEST': $parseStr = '$_REQUEST[\''.$vars[2].'\']';break;
|
||||||
|
case 'CONST': $parseStr = strtoupper($vars[2]);break;
|
||||||
|
case 'LANG':
|
||||||
|
$parseStr = 'L("'.$vars[2].'")';break;
|
||||||
|
case 'CONFIG':
|
||||||
|
if(isset($vars[3])) {
|
||||||
|
$vars[2] .= '.'.$vars[3];
|
||||||
|
}
|
||||||
|
$parseStr = 'C("'.$vars[2].'")';break;
|
||||||
|
}
|
||||||
|
}else if(count($vars)==2){
|
||||||
|
switch($vars[1]){
|
||||||
|
case 'NOW': $parseStr = "date('Y-m-d g:i a',time())";break;
|
||||||
|
case 'VERSION': $parseStr = 'THINK_VERSION';break;
|
||||||
|
default: if(defined($vars[1])) $parseStr = $vars[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $parseStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对模板变量使用函数
|
||||||
|
* 格式 {$varname|function1|function2=arg1,arg2}
|
||||||
|
* @access protected
|
||||||
|
* @param string $name 变量名
|
||||||
|
* @param array $varArray 函数列表
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function parseVarFunction($name,$varArray){
|
||||||
|
//对变量使用函数
|
||||||
|
$length = count($varArray);
|
||||||
|
for($i=0;$i<$length ;$i++ ){
|
||||||
|
$args = explode('=',$varArray[$i],2);
|
||||||
|
//模板函数过滤
|
||||||
|
$fun = strtolower(trim($args[0]));
|
||||||
|
switch($fun) {
|
||||||
|
case 'default': // 特殊模板函数
|
||||||
|
$name = '('.$name.')?('.$name.'):'.$args[1];
|
||||||
|
break;
|
||||||
|
default: // 通用模板函数
|
||||||
|
if(isset($args[1])){
|
||||||
|
if(strstr($args[1],'###')){
|
||||||
|
$args[1] = str_replace('###',$name,$args[1]);
|
||||||
|
$name = "$fun($args[1])";
|
||||||
|
}else{
|
||||||
|
$name = "$fun($name,$args[1])";
|
||||||
|
}
|
||||||
|
}else if(!empty($args[0])){
|
||||||
|
$name = "$fun($name)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取标签定义
|
||||||
|
public function getTags(){
|
||||||
|
return $this->tags;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
// +----------------------------------------------------------------------
|
// +----------------------------------------------------------------------
|
||||||
|
|
||||||
namespace Think\Template\Taglib;
|
namespace Think\Template\Taglib;
|
||||||
use Think\TagLib;
|
use Think\Template\TagLib;
|
||||||
/**
|
/**
|
||||||
* CX标签库解析类
|
* CX标签库解析类
|
||||||
* @category Think
|
* @category Think
|
||||||
|
|||||||
Reference in New Issue
Block a user