phplib template 中文注释

<?php
/**
* phplib
*
* 潘春孟注释于2006.11.20 gb2312
* 联系QQ:121169238
*
* @author
* @copyright
* @version
*/

class Template {
       var $classname = "Template";
       var $debug = false; // 是否调试

       var $file = array(); // 包含了所有的模板文件名和模板名的数组

       var $root = ""; // root为模板文件的存放目录

       var $varkeys = array(); // 存放文本元素的键名

       var $varvals = array(); // 存放文本元素的值

       var $unknowns = "remove"; // 如何处理未知的变量

       var $halt_on_error = "yes"; // yes/no 报告错误,继续运行/忽略错误

       var $last_error = ""; // 上一次的错误保存在这里


       /**
       * 构造函数
       * 默认将文件目录设置为相同的目录
       * unknowns默认设置为"remove"
       *
       * @param String $root
       * @param Const $unknowns
       * @return Template
       */
       function Template($root = ".", $unknowns = "remove") {
           $this->set_root($root);
           $this->set_unknowns($unknowns);
       }

       /**
       * 设置根目录
       *
       * @param String $root
       * @return bool
       */
       function set_root($root) {
           if (!is_dir($root)) {
               $this->halt("set_root: $root is not a directory.");
           return false;
           }
    
           $this->root = $root;
           return true;
       }

       /**
       * 对未知变量的处理
       *
       * @param Const $unknowns
       */
       function set_unknowns($unknowns = "keep") {
           $this->unknowns = $unknowns; // "remove|keep"

       }

       /**
       * 该方法在数组$file中根据$handle提供的键名加入值
       *
       * @param String $handle
       * @param String $filename
       * @return bool(false) | no
       */
       function set_file($handle, $filename = "") {
           if (!is_array($handle)) {
               if ($filename == "") {
                   $this->halt("set_file: For handle $handle filename is empty.");
                   return false;
               }
               $this->file[$handle] = $this->filename($filename);
           } else {
               reset($handle);
               while(list($h, $f) = each($handle)) {
                   $this->file[$h] = $this->filename($f);
               }
         }
       }

       /**
       * 取出某个父模板文件中的一个子模板,将其作为块来加载,并用另外一个模板变量取代之
       *
       * @param String $parent 模板文件
       * @param String $handle 文件的句柄
       * @param String $name 子模板文件
       * @return bool | no
       */
       function set_block($parent, $handle, $name = "") {
           if (!$this->loadfile($parent)) {
               $this->halt("错误: 找不到模板 $parent.");
           return false;
           }
    
           if ($name == "") $name = $handle;

           $str = $this->get_var($parent);
           $reg = "/<!--\s+BEGIN $handle\s+-->(.*)\n\s*<!--\s+END $handle\s+-->/sm";
           preg_match_all($reg, $str, $m);
           $str = preg_replace($reg, "{" . "$name}", $str);
           $this->set_var($handle, $m[1][0]);
           $this->set_var($parent, $str);
       }
  
       /**
       * 向$varname和varkeys数组中添加新的键-值对
       *
       * @param String $varname 将被定义的变量名
       * @param String $value 变量的值
       */
       function set_var($varname, $value = "") {
           if (!is_array($varname)) {
               if (!empty($varname))
                   if ($this->debug) print "scalar: set *$varname* to *$value*<br>\n";
                       $this->varkeys[$varname] = "/".$this->varname($varname)."/";
               $this->varvals[$varname] = $value;
           } else {
               reset($varname);
               while(list($k, $v) = each($varname)) {
                   if (!empty($k))
                   if ($this->debug) print "array: set *$k* to *$v*<br>\n";
                   $this->varkeys[$k] = "/".$this->varname($k)."/";
                   $this->varvals[$k] = $v;
             }
         }
       }

     /**
     * 将模板文件中的变化内容替换成确定内容的操作,实现数据和显示的分离
     * 标签=>详细内容
     *
     * @param String $handle 模板名
     * @return bool
     */
     function subst($handle) {
       if (!$this->loadfile($handle)) {
         $this->halt("subst: unable to load $handle.");
         return false;
       }
    
       $str = $this->get_var($handle);
       $str = @preg_replace($this->varkeys, $this->varvals, $str);
       return $str;
     }

     /**
     * 同subst,只是直接输出结果
     *
     * @param String $handle 模板名
     * @return bool
     */
     function psubst($handle) {
       print $this->subst($handle);
    
       return false;
     }

     /**
     * 将$handle代表的一个或多个文件中的内容完成替换.
     * 存放在$target为键值的varvals成员数组无素中或追加到其后
     * @param mixed $target
     * @param String $handle
     * @param bool $append
     * @return mixed
     */
     function parse($target, $handle, $append = false) {
       if (!is_array($handle)) {
         $str = $this->subst($handle);
         if ($append) {
           $this->set_var($target, $this->get_var($target) . $str);
         } else {
           $this->set_var($target, $str);
         }
       } else {
         reset($handle);
         while(list($i, $h) = each($handle)) {
           $str = $this->subst($h);
           $this->set_var($target, $str);
         }
       }
    
       return $str;
     }
  
     /**
     * 同parse方法,只是该方法将结果输出
     *
     * @param mixed $target
     * @param String $handle
     * @param Bool $append
     * @return bool
     */
     function pparse($target, $handle, $append = false) {
       print $this->parse($target, $handle, $append);
       return false;
     }

     /**
     * 返回所有的键-值对中的值所组成的数组
     *
     * @return mixed
     */
     function get_vars() {
       reset($this->varkeys);
       while(list($k, $v) = each($this->varkeys)) {
         $result[$k] = $this->varvals[$k];
       }
    
       return $result;
     }

     /**
     * 根据键名返回对应的键一值勤对应的值
     *
     * @param mixed $varname
     * @return mixed
     */
     function get_var($varname) {
       if (!is_array($varname)) {
         return $this->varvals[$varname];
       } else {
         reset($varname);
         while(list($k, $v) = each($varname)) {
           $result[$k] = $this->varvals[$k];
         }
      
         return $result;
       }
     }

     /**
     * 如果加载文件失败,返回错误并停止
     *
     * @param String $handle
     * @return bool
     */
     function get_undefined($handle) {
       if (!$this->loadfile($handle)) {
         $this->halt("get_undefined: unable to load $handle.");
         return false;
       }
    
       preg_match_all("/\{([^}]+)\}/", $this->get_var($handle), $m);
       $m = $m[1];
       if (!is_array($m))
         return false;

       reset($m);
       while(list($k, $v) = each($m)) {
         if (!isset($this->varkeys[$v]))
           $result[$v] = $v;
       }
    
       if (count($result))
         return $result;
       else
         return false;
     }

     /**
     * 完成对$str的最后的处理工作,利用类的属性$unknowns来确定对模板中无法处理的动态部分的处理方法
     *
     * @param String $str
     * @return String
     */
     function finish($str) {
       switch ($this->unknowns) {
         case "keep":
         break;
      
         case "remove":
           $str = preg_replace('/{[^ \t\r\n}]+}/', "", $str);
         break;

         case "comment":
           $str = preg_replace('/{([^ \t\r\n}]+)}/', "<!-- Template $handle: Variable \\1 undefined -->", $str);
         break;
       }
    
       return $str;
     }

     /**
     * 将参数变量对应的数组中的值处理后输出
     *
     * @access public
     * @param mixed $varname
     */
     function p($varname) {
       print $this->finish($this->get_var($varname));
     }

     /**
     * 参数变量对应的数组中的值处理后返回
     *
     * @access public
     * @param mixed $varname
     * @return mixed
     */
     function get($varname) {
       return $this->finish($this->get_var($varname));
     }
    
     /**
     * 检查并补充给定的文件名
     * 如果文件名前没有"/",这函数给补上"/"
     *
     * @access public
     * @param String $filename
     * @return String
     */
     function filename($filename) {
       if (substr($filename, 0, 1) != "/") {
         $filename = $this->root."/".$filename;
       }
    
       if (!file_exists($filename))
         $this->halt("filename: file $filename does not exist.");

       return $filename;
     }

     /**
     * 对变量名进行处理,将正则表达式中的敏感字符变为转义字符,并在变量名两端加上大括号
     *
     * @access public
     * @param String $varname
     * @return String
     */
     function varname($varname) {
       return preg_quote("{".$varname."}");
     }

     /**
     * 根据$varname加载文件到键-值对中
     *
     * @access public
     * @param mixed $handle
     * @return bool
     */
     function loadfile($handle) {
       if (isset($this->varkeys[$handle]) and !empty($this->varvals[$handle]))
         return true;

       if (!isset($this->file[$handle])) {
         $this->halt("loadfile: $handle is not a valid handle.");
         return false;
       }
       $filename = $this->file[$handle];

       $str = implode("", @file($filename));
       if (empty($str)) {
         $this->halt("loadfile: While loading $handle, $filename does not exist or is empty.");
         return false;
       }

       $this->set_var($handle, $str);
    
       return true;
     }

     /**
     * 出错提示并终止程序运行
     *
     * @access public
     * @param mixed $msg
     * @return bool
     */
     function halt($msg) {
       $this->last_error = $msg;
    
       if ($this->halt_on_error != "no")
         $this->haltmsg($msg);
    
       if ($this->halt_on_error == "yes")
         die("<b>Halted.</b>");
    
       return false;
     }
  
     /**
     * 出错提示,以printf()格式输出参数$msg
     *
     * @access public
     * @param mixed $msg
     */
     function haltmsg($msg) {
       printf("<b>Template Error:</b> %s<br>\n", $msg);
     }
  
  
}
?>

++


  
     /**
       * 将结果写入变量
       * 根据键名$varname提供的变量进行最后处理后写入变量
       *
       * @access public
       * @param string $varname
       * @return string
       */
     function putVar($varname) {
         $newvar = $this->finish($this->get_var($varname));
       return $newvar;
     }


   /**
     * 写入文件
     * 将$handle代表的一个或多个文件中的内容写入文件
     *
     * @access public
     * @param string $filename
     * @param mixed $target   键名
     * @param mixed $handle  
     * @param string $sdir     目录
     * @return bool|no
     */
   function makeHtml($filename,$target,$handle,$sdir="./") {
     if (!is_dir($sdir)) {
         exit("error: $sdir is not a directory.");
         return false;
     }
$fp =   @fopen($sdir."/".$filename,"w");
     @fwrite($fp, $this->parse($target, $handle));
     @fclose($fp);
     // PHP5用file_put_contents() ,   === fopen()+fwrite()+fclose(), 可提高性能
   }

from:http://hi.baidu.com/jyb_cn/blog/item/c2374e1614cba8094b90a77a.html

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
搜索
标签列表
网站分类
最新留言
    文章归档
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your WebSite.Some Rights Reserved.闽ICP备11018667号-2