源码分享站 - 分享有用的

fatfree 展示 template.php源代码

返回 下载fatfree: 单独下载template.php源代码 - 下载整个fatfree源代码 - 类型:.php文件
  1. <?php
  2.  
  3. /*
  4.  
  5.         Copyright (c) 2009-2016 F3::Factory/Bong Cosca, All rights reserved.
  6.  
  7.         This file is part of the Fat-Free Framework (http://fatfreeframework.com).
  8.  
  9.         This is free software: you can redistribute it and/or modify it under the
  10.         terms of the GNU General Public License as published by the Free Software
  11.         Foundation, either version 3 of the License, or later.
  12.  
  13.         Fat-Free Framework is distributed in the hope that it will be useful,
  14.         but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.         General Public License for more details.
  17.  
  18.         You should have received a copy of the GNU General Public License along
  19.         with Fat-Free Framework.  If not, see <http://www.gnu.org/licenses/>.
  20.  
  21. */
  22.  
  23. //! XML-style template engine
  24. class Template extends Preview {
  25.  
  26.         //@{ Error messages
  27.         const
  28.                 E_Method='Call to undefined method %s()';
  29.         //@}
  30.  
  31.         protected
  32.                 //! Template tags
  33.                 $tags,
  34.                 //! Custom tag handlers
  35.                 $custom=[];
  36.  
  37.         /**
  38.         *       Template -set- tag handler
  39.         *       @return string
  40.         *       @param $node array
  41.         **/
  42.         protected function _set(array $node) {
  43.                 $out='';
  44.                 foreach ($node['@attrib'] as $key=>$val)
  45.                         $out.='$'.$key.'='.
  46.                                 (preg_match('/\{\{(.+?)\}\}/',$val)?
  47.                                         $this->token($val):
  48.                                         Base::instance()->stringify($val)).'; ';
  49.                 return '<?php '.$out.'?>';
  50.         }
  51.  
  52.         /**
  53.         *       Template -include- tag handler
  54.         *       @return string
  55.         *       @param $node array
  56.         **/
  57.         protected function _include(array $node) {
  58.                 $attrib=$node['@attrib'];
  59.                 $hive=isset($attrib['with']) &&
  60.                         ($attrib['with']=$this->token($attrib['with'])) &&
  61.                         preg_match_all('/(\w+)\h*=\h*(.+?)(?=,|$)/',
  62.                                 $attrib['with'],$pairs,PREG_SET_ORDER)?
  63.                                         ('['.implode(',',
  64.                                                 array_map(function($pair) {
  65.                                                         return '\''.$pair[1].'\'=>'.
  66.                                                                 (preg_match('/^\'.*\'$/',$pair[2]) ||
  67.                                                                         preg_match('/\$/',$pair[2])?
  68.                                                                         $pair[2]:
  69.                                                                         \Base::instance()->stringify($pair[2]));
  70.                                                 },$pairs)).']+get_defined_vars()'):
  71.                                         'get_defined_vars()';
  72.                 $ttl=isset($attrib['ttl'])?(int)$attrib['ttl']:0;
  73.                 return
  74.                         '<?php '.(isset($attrib['if'])?
  75.                                 ('if ('.$this->token($attrib['if']).') '):'').
  76.                                 ('echo $this->render('.
  77.                                         (preg_match('/^\{\{(.+?)\}\}$/',$attrib['href'])?
  78.                                                 $this->token($attrib['href']):
  79.                                                 Base::instance()->stringify($attrib['href'])).','.
  80.                                         '$this->mime,'.$hive.','.$ttl.'); ?>');
  81.         }
  82.  
  83.         /**
  84.         *       Template -exclude- tag handler
  85.         *       @return string
  86.         **/
  87.         protected function _exclude() {
  88.                 return '';
  89.         }
  90.  
  91.         /**
  92.         *       Template -ignore- tag handler
  93.         *       @return string
  94.         *       @param $node array
  95.         **/
  96.         protected function _ignore(array $node) {
  97.                 return $node[0];
  98.         }
  99.  
  100.         /**
  101.         *       Template -loop- tag handler
  102.         *       @return string
  103.         *       @param $node array
  104.         **/
  105.         protected function _loop(array $node) {
  106.                 $attrib=$node['@attrib'];
  107.                 unset($node['@attrib']);
  108.                 return
  109.                         '<?php for ('.
  110.                                 $this->token($attrib['from']).';'.
  111.                                 $this->token($attrib['to']).';'.
  112.                                 $this->token($attrib['step']).'): ?>'.
  113.                                 $this->build($node).
  114.                         '<?php endfor; ?>';
  115.         }
  116.  
  117.         /**
  118.         *       Template -repeat- tag handler
  119.         *       @return string
  120.         *       @param $node array
  121.         **/
  122.         protected function _repeat(array $node) {
  123.                 $attrib=$node['@attrib'];
  124.                 unset($node['@attrib']);
  125.                 return
  126.                         '<?php '.
  127.                                 (isset($attrib['counter'])?
  128.                                         (($ctr=$this->token($attrib['counter'])).'=0; '):'').
  129.                                 'foreach (('.
  130.                                 $this->token($attrib['group']).'?:[]) as '.
  131.                                 (isset($attrib['key'])?
  132.                                         ($this->token($attrib['key']).'=>'):'').
  133.                                 $this->token($attrib['value']).'):'.
  134.                                 (isset($ctr)?(' '.$ctr.'++;'):'').' ?>'.
  135.                                 $this->build($node).
  136.                         '<?php endforeach; ?>';
  137.         }
  138.  
  139.         /**
  140.         *       Template -check- tag handler
  141.         *       @return string
  142.         *       @param $node array
  143.         **/
  144.         protected function _check(array $node) {
  145.                 $attrib=$node['@attrib'];
  146.                 unset($node['@attrib']);
  147.                 // Grab <true> and <false> blocks
  148.                 foreach ($node as $pos=>$block)
  149.                         if (isset($block['true']))
  150.                                 $true=[$pos,$block];
  151.                         elseif (isset($block['false']))
  152.                                 $false=[$pos,$block];
  153.                 if (isset($true,$false) && $true[0]>$false[0])
  154.                         // Reverse <true> and <false> blocks
  155.                         list($node[$true[0]],$node[$false[0]])=[$false[1],$true[1]];
  156.                 return
  157.                         '<?php if ('.$this->token($attrib['if']).'): ?>'.
  158.                                 $this->build($node).
  159.                         '<?php endif; ?>';
  160.         }
  161.  
  162.         /**
  163.         *       Template -true- tag handler
  164.         *       @return string
  165.         *       @param $node array
  166.         **/
  167.         protected function _true(array $node) {
  168.                 return $this->build($node);
  169.         }
  170.  
  171.         /**
  172.         *       Template -false- tag handler
  173.         *       @return string
  174.         *       @param $node array
  175.         **/
  176.         protected function _false(array $node) {
  177.                 return '<?php else: ?>'.$this->build($node);
  178.         }
  179.  
  180.         /**
  181.         *       Template -switch- tag handler
  182.         *       @return string
  183.         *       @param $node array
  184.         **/
  185.         protected function _switch(array $node) {
  186.                 $attrib=$node['@attrib'];
  187.                 unset($node['@attrib']);
  188.                 foreach ($node as $pos=>$block)
  189.                         if (is_string($block) && !preg_replace('/\s+/','',$block))
  190.                                 unset($node[$pos]);
  191.                 return
  192.                         '<?php switch ('.$this->token($attrib['expr']).'): ?>'.
  193.                                 $this->build($node).
  194.                         '<?php endswitch; ?>';
  195.         }
  196.  
  197.         /**
  198.         *       Template -case- tag handler
  199.         *       @return string
  200.         *       @param $node array
  201.         **/
  202.         protected function _case(array $node) {
  203.                 $attrib=$node['@attrib'];
  204.                 unset($node['@attrib']);
  205.                 return
  206.                         '<?php case '.(preg_match('/\{\{(.+?)\}\}/',$attrib['value'])?
  207.                                 $this->token($attrib['value']):
  208.                                 Base::instance()->stringify($attrib['value'])).': ?>'.
  209.                                 $this->build($node).
  210.                         '<?php '.(isset($attrib['break'])?
  211.                                 'if ('.$this->token($attrib['break']).') ':'').
  212.                                 'break; ?>';
  213.         }
  214.  
  215.         /**
  216.         *       Template -default- tag handler
  217.         *       @return string
  218.         *       @param $node array
  219.         **/
  220.         protected function _default(array $node) {
  221.                 return
  222.                         '<?php default: ?>'.
  223.                                 $this->build($node).
  224.                         '<?php break; ?>';
  225.         }
  226.  
  227.         /**
  228.         *       Assemble markup
  229.         *       @return string
  230.         *       @param $node array|string
  231.         **/
  232.         function build($node) {
  233.                 if (is_string($node))
  234.                         return parent::build($node);
  235.                 $out='';
  236.                 foreach ($node as $key=>$val)
  237.                         $out.=is_int($key)?$this->build($val):$this->{'_'.$key}($val);
  238.                 return $out;
  239.         }
  240.  
  241.         /**
  242.         *       Extend template with custom tag
  243.         *       @return NULL
  244.         *       @param $tag string
  245.         *       @param $func callback
  246.         **/
  247.         function extend($tag,$func) {
  248.                 $this->tags.='|'.$tag;
  249.                 $this->custom['_'.$tag]=$func;
  250.         }
  251.  
  252.         /**
  253.         *       Call custom tag handler
  254.         *       @return string|FALSE
  255.         *       @param $func callback
  256.         *       @param $args array
  257.         **/
  258.         function __call($func,array $args) {
  259.                 if ($func[0]=='_')
  260.                         return call_user_func_array($this->custom[$func],$args);
  261.                 if (method_exists($this,$func))
  262.                         return call_user_func_array([$this,$func],$args);
  263.                 user_error(sprintf(self::E_Method,$func),E_USER_ERROR);
  264.         }
  265.  
  266.         /**
  267.         *       Parse string for template directives and tokens
  268.         *       @return string|array
  269.         *       @param $text string
  270.         **/
  271.         function parse($text) {
  272.                 // Build tree structure
  273.                 for ($ptr=0,$w=5,$len=strlen($text),$tree=[],$tmp='';$ptr<$len;)
  274.                         if (preg_match('/^(.{0,'.$w.'}?)<(\/?)(?:F3:)?'.
  275.                                 '('.$this->tags.')\b((?:\s+[\w-]+'.
  276.                                 '(?:\h*=\h*(?:"(?:.*?)"|\'(?:.*?)\'))?|'.
  277.                                 '\h*\{\{.+?\}\})*)\h*(\/?)>/is',
  278.                                 substr($text,$ptr),$match)) {
  279.                                 if (strlen($tmp)||$match[1])
  280.                                         $tree[]=$tmp.$match[1];
  281.                                 // Element node
  282.                                 if ($match[2]) {
  283.                                         // Find matching start tag
  284.                                         $stack=[];
  285.                                         for($i=count($tree)-1;$i>=0;$i--) {
  286.                                                 $item = $tree[$i];
  287.                                                 if (is_array($item) && array_key_exists($match[3],$item)
  288.                                                 && !isset($item[$match[3]][0])) {
  289.                                                         // Start tag found
  290.                                                         $tree[$i][$match[3]]+=array_reverse($stack);
  291.                                                         $tree=array_slice($tree,0,$i+1);
  292.                                                         break;
  293.                                                 } else $stack[]=$item;
  294.                                         }
  295.                                 }
  296.                                 else {
  297.                                         // Start tag
  298.                                         $node=&$tree[][$match[3]];
  299.                                         $node=[];
  300.                                         if ($match[4]) {
  301.                                                 // Process attributes
  302.                                                 preg_match_all(
  303.                                                         '/(?:\b([\w-]+)\h*'.
  304.                                                         '(?:=\h*(?:"(.*?)"|\'(.*?)\'))?|'.
  305.                                                         '(\{\{.+?\}\}))/s',
  306.                                                         $match[4],$attr,PREG_SET_ORDER);
  307.                                                 foreach ($attr as $kv)
  308.                                                         if (isset($kv[4]))
  309.                                                                 $node['@attrib'][]=$kv[4];
  310.                                                         else
  311.                                                                 $node['@attrib'][$kv[1]]=
  312.                                                                         (isset($kv[2]) && $kv[2]!==''?
  313.                                                                                 $kv[2]:
  314.                                                                                 (isset($kv[3]) && $kv[3]!==''?
  315.                                                                                         $kv[3]:NULL));
  316.                                         }
  317.                                 }
  318.                                 $tmp='';
  319.                                 $ptr+=strlen($match[0]);
  320.                                 $w=5;
  321.                         }
  322.                         else {
  323.                                 // Text node
  324.                                 $tmp.=substr($text,$ptr,$w);
  325.                                 $ptr+=$w;
  326.                                 if ($w<50)
  327.                                         $w++;
  328.                         }
  329.                 if (strlen($tmp))
  330.                         // Append trailing text
  331.                         $tree[]=$tmp;
  332.                 // Break references
  333.                 unset($node);
  334.                 return $tree;
  335.         }
  336.  
  337.         /**
  338.         *       Class constructor
  339.         *       return object
  340.         **/
  341.         function __construct() {
  342.                 $ref=new ReflectionClass(__CLASS__);
  343.                 $this->tags='';
  344.                 foreach ($ref->getmethods() as $method)
  345.                         if (preg_match('/^_(?=[[:alpha:]])/',$method->name))
  346.                                 $this->tags.=(strlen($this->tags)?'|':'').
  347.                                         substr($method->name,1);
  348.         }
  349.  
  350. }
  351.  
单独下载 单独下载template.php源码 - 下载整个fatfree源程序
相关源码/软件:
TSA-Travel-Sentry-master-keys - TSA 主密钥的 3D 再现 2017-05-12
python3-cookbook - 《Python Cookbook》 3rd Edition Translatio 2017-05-12
isso - Disqus 替代 https://posativ.org/isso/ 2017-05-12
hologram - 降价基于文件系统的风格指南。 http://trulia.github.io... 2017-05-12
www.html5rocks.com - .......a 争创一流资源为 web 开发人员 2017-05-12
rolify - Role management library with resource scoping ... 2017-05-13
jquery-mockjax - JQuery Mockjax 插件提供了简单、 极其灵活的接口,以嘲笑或模拟 ajax 请求和响应 2017-05-13
yo - CLI 工具运行自耕农发电机 http://yeoman.io 2017-05-13
GrowingTextView - UITextView 增长/收缩与文本并开始滚动时的含量达到一定数量的行。类似于苹果在 SMS 应用... 2017-05-13
phan - 潘是 php 的静态分析器。潘倾向于避免误报,并试图证明不正确,而不是正确性。 2017-05-13
CRYENGINE - CRYENGINE 是由 Crytek 创建一个功能强大的实时游戏开发平台。 ... 2017-06-11
postal - 2017-06-11
reactide - Reactide 是反应 web 应用程序开发的第一个专用的 IDE。http://reactide... 2017-06-11
rkt - rkt 是为 Linux 的 pod 本机容器引擎。它是可组合、 安全和建筑标准。 2017-06-11
uWebSockets - 小小的 Websocket https://forest.webvrexpe... 2017-06-11
realworld - 真实的世界-动力反应、 角、 节点,Django,和更多的模范 fullstack Medium.c... 2017-06-11
goreplay - GoReplay 是用于捕获和重播活 HTTP 交通到测试环境以不断地测试您的系统与实际数据的开源工... 2017-06-10
pyenv - 简单的 Python 版本管理 2017-06-10
redux-saga - Redux 应用程序替代副作用模型 https://redux-saga.g... 2017-06-10
angular-starter - 2017-06-10

 返回顶部