网友支招:生成smarttemplate模板处理程序框架

<?php
/**
* 生成smarttemplate模板处理程序框架
*
* smarttemplate 模板类具有极高的工作效率,代码尺寸很小。
* 他的可扩展模板函数更是有独到之处。
*
* 尽管只有不多的几个方法,使用起来也很简单。
* 但是在多此调整模板文件以后,要使处理程序与模板对应起来可是要花些工夫了。

* 本程序用于分析模板文件、并给出模板处理程序的框架
**/

ob_start();
$template_name = "include/main.html";
$str = file_get_contents($template_name);
preg_match_all("/<!--.*-->{\w.*}/u",$str,$regs);

$stack = array();
$vars = array();
$functions = array();
$key = 0; // = chr(ord("i")+count($stack));
$lf = "\r\n";
$outstr = "";
foreach($regs[0] as $v)
{
  if(preg_match_all("/<!-- begin (\w+) -->/",$v, $r))
  {
    array_push($stack,$r[1][0]);
    $k = chr(ord("i")+$key++);
    $outstr .= str_repeat(chr(9), $key-1)."/* 对数组 \${$r[1][0]} 赋值 */$lf";
    $outstr .= str_repeat(chr(9), $key-1)."for(\$k=0;\$k<1;\$k++) \{$lf"; 
  }

  elseif(preg_match_all("/<!-- end (\w+) -->/",$v, $r))
  {
    $v = array_pop($stack);
    $outstr .= str_repeat(chr(9), --$key)."
  }

  $lf";
  if($key)
  {
    $k = chr(ord("i")+$key-1);
    $p = $stack[$key-1];
    $outstr .= str_repeat(chr(9), $key)."\${$p}[\$k][$v] = \$v;$lf";
  }

  else
  $outstr .= "\$data[$v] = \$v;$lf";
}

elseif(preg_match_all("/{(\w+)}/",$v, $r))
{
  if(count($stack))
  {
    $v = $stack[$key-1];
    $k = chr(ord("i")+$key-1);
    $outstr .= str_repeat(chr(9), count($stack))."\${$v}[\$k][{$r[1][0]}] = {$r[1][0]}测试;$lf";
    $ch = "\$data[".join("][][",$stack)."][{$r[1][0]}]";
    if(! in_array($ch, $vars))
    $vars[] = $ch; 
  }

  else
  if(! in_array("\$data[{$r[1][0]}]", $vars))
  { 
    $vars[] = "\$data[{$r[1][0]}]";
    $outstr .= "\$data[{$r[1][0]}] = {$r[1][0]}测试;$lf"; 
   }
}

else

if(preg_match_all("/{(\w+):([^}]+)/",$v, $r))
{ 
  $ch = $r[1][0]."({$r[2][0]})";
  $define = true;
  if(! @include("smarttemplate_extensions/smarttemplate_extension_serverr.php"))
  $define = false;
  $functions[] = array(name=>$ch, define=>$define);
  foreach(split(",",$r[2][0]) as $v)
  if($v[0] != ")
  if(! in_array($v, $vars))
  {
    $vars[] = "\$data[$v]";
    $outstr .= "\$data[$v] = $v测试;$lf";
   }
}

else
if(preg_match_all("/<!-- if (\w+)/",$v, $r))
{ 
  if(! in_array("\$data[{$r[1][0]}]", $vars)) 
  {
    $vars[] = "\$data[{$r[1][0]}]";
    $outstr .= "\$data[{$r[1][0]}] = {$r[1][0]}测试;$lf";
  }
}

echo <<< text
<?php
/**
* 模板 $template_name
* 使用了如下变量,请对其赋值

text;
foreach($vars as $v)
echo " * $v$lf";
echo " *$lf";
echo " * 使用了如下模板函数$lf";
$ar = array();
foreach($functions as $k=>$v)
{
  echo " * $v[name]$lf";
  if(! $v[define]) $ar[] = $k;
}
if(count($ar))
{
  $path = "smarttemplate_extensions";
  if(! is_dir($path))
  {
    mkdir($path,0666);
    chmod($path,0666); 
  }
  echo " *$lf";
  echo " * 其中以下函数未定义,请定义$lf";
  foreach($ar as $k)
  {
    $v = $functions[$k][name];
    $name = preg_replace("/(\w+).*/","\\1",$v);
    echo " * $v => $path/{$path}_$name.php$lf"; 
    $fp = fopen("$path/{$path}_$name.php","w");
    fwrite($fp,"<?php$lf");
    fwrite($fp,"function {$path}_$v \{$lf");
    fwrite($fp," return 函数$v;$lf");
    fwrite($fp,"}$lf?>$lf");
    fclose($fp);
  }
}
echo <<< text
**/

/** 对模板变量赋值的可能形式 **/

text;
echo $outstr;
echo <<< text

/** 加载并执行模板 **/
require_once "class.smarttemplate.php";
\$page = new smarttemplate("$template_name");
\$page->assign(\$data);
\$page->output();
?>

text;

$code = ob_get_contents();
ob_end_clean();

$fname = basename($template_name);
$fname = substr($fname,0,strrpos($fname,".")+1)."php";

$fp = fopen($fname,"w");
fwrite($fp,$code);
fclose($fp);

include "$fname";

?>

时间: 2024-08-03 14:35:00

网友支招:生成smarttemplate模板处理程序框架的相关文章

生成smarttemplate模板处理程序框架

程序|模板 <?php/*** 生成smarttemplate模板处理程序框架* * smarttemplate 模板类具有极高的工作效率,代码尺寸很小.* 他的可扩展模板函数更是有独到之处.* * 尽管只有不多的几个方法,使用起来也很简单.* 但是在多此调整模板文件以后,要使处理程序与模板对应起来可是要花些工夫了. * 本程序用于分析模板文件.并给出模板处理程序的框架**/ ob_start(); $Template_name = "include/main.html";$st

MSN全球多地区被脱机网友支招非长久之计

本报讯(记者杨汛)微软的即时通讯软件MSN一直拥有较高的使用率,但从昨天上午开始,不少MSN用户发现登录后状态明明显示在线,然而好友看到自己的状态总是脱机.这一"被脱机"故障甚至引来了技术高超的 网友"支招".而MSN方面则回应称,暂时无法确定这一问题何时能解决. 昨日下午,记者在MSN技术论坛看到,关于"被脱机"一事的网友询问数量已经接近百条. 针对这一情况,MSN中国相关负责人表示,MSN 中国已经注意到这一问题,并已经就此上报美国总部.据悉

2013年部分节假日安排引热议 网友支招如何变出56天假

*深色为2013年国家部分节假日安排 网友拼出56天最牛http://www.aliyun.com/zixun/aggregation/35450.html">请假攻略见红框 国务院办公厅发布2013年部分节假日安排的通知.明年元旦.春节.清明节.劳动节.端午节.中秋节和国庆节7个节假日共放假29天,剔除周六日假期剩11天.该安排发布后引起广泛热议.不少网友"开动脑筋",将明年的假期"变身",其中最长的假期将长达56天. [放假详情:元旦放3天,春节

网友支招:PHP之学习mvc框架6点经验分享

新手如何入门mvc框架,根据自己工作总结的下面总6点经验与大家分享. 一.选择一个框架 至于选哪一种框架,主要看个人. 1.最好是身边朋友都有人在用,因为你不懂的时候方便解决.有时候论坛,手册上的解答你未必理解的通透,特别是没有接触过框架的phper来说,更是不知所云. 2.选择此框架论坛比较活跃的,这是身有同感,前一段时间玩qeephp框架的时间,论坛冷冷清清的,工作需要,没办法,只能硬着上了,遇到问题的时候,回答的问题的人很少,同时手册之类只写了某部分,还有很多部分并没有写上去. 二.熟悉数

网友支招:PHP网站开发kohana框架里的几个写法

1.字符比较: 比较适用于比较字符是否是大小写: 程序代码 $class='Rfdsaffsadfsadfasdfsadf';$type=($class[0]<'a')?'libraries':'helpers';echo$type; 程序代码 echo('大写A:');echoord('A');echo('<hr/>');echo('小写a:');echoord('a'); 输出是:大写A:65小写a:97 1.这样的比较应该是先转成ASCII比较的; 2.第字符是中文,用$class

网友支招每月15元也可3G冲浪

对于大多数手机用户而言,3G上网资费咋样?怎一个贵字了得!但是,你有没有试验过,利用目前运营商2G/3G转换中的一些疏忽,以2G的流量包月资费满足3G上网的快感呢?近日,有 网友表示,可以合理地实现15元包月不限流量和时间的3G冲浪.此等好事,如何实现?大家不妨一起来看看高人的高招.你能不能实现"便宜的3G",那就看你有没有网友一样的钻研精神了. 文.图片整理/记者 李光焱 15元套餐也能玩3G 据网友介绍,他是中国移动的用户,在一次进行2G+3G的"奇异组合"时发

快递公司丢件怎么办?网友支招如何索赔_生活健康

快递公司丢件怎么办?对于网购族,可能有网友碰到过这种情况.一般这种情况下,如果你是买家,可以直接和卖家联系,由卖家退款给你,剩下的事情由卖家和快递公司交涉.如果你是卖家,即使你也很烦恼,你也要保证你的客户满意,否则下次就很难有回头客.跟快递公司交涉也有也有一些处理技巧,具体请看下文. 快递公司丢件怎么办?(资料图) 快递公司丢件 卖家怎么办? 第一步:做出你的诚意,压住你自己的烦恼,向客户解释 遇到这种情况,做为卖家,本来就是比客户更烦,但在这种情况下,第一个应该做的是打电话给客户,向客户解释,

网友支招

网友@弓长小丰色:5号我的车被泥灌车剐了,我的办法是问题不解决完,不还行车证和驾照. 网友@辽台二丫:先通知对方的http://www.aliyun.com/zixun/aggregation/6173.html">保险公司,然后起诉对方及保险公司. 网友@老茂侃车:现在可以代位求偿了.找你的保险公司索赔! 网友@陈俊-追梦三太郎:上次我也碰到一外地人,撞了我车,交警处理时态度好得很,又道歉又认错,待到4S店后,溜了!这年头你还跑得了?最后我报警,并电话告知他我不在乎你付不付钱,但我已报警

手机失窃搜身惹争议 网友支招巧用360手机卫士

"先搜身,再下车!"近日一起手机失窃案引发了广泛争议.失主在乘公交车途中手机丢失,由于车门途中没开过,到场的警察允许失主对车上乘客进行搜身.各界普遍认为,搜查权是警察特有的,失主对他人搜身缺乏依据.有网友建议,360手机卫士等安全软件的防盗功能,在公交车等封闭场所有奇效,也不会给他人造成麻烦. &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 图1:失主在对乘客现场搜身 据了解,失主黄小姐在乘车