[PHP-users 30070] Re: テンプレートマニュアル
sasada nobbuhir
dwrd @ hotmail.co.jp
2006年 8月 18日 (金) 13:18:29 JST
続きで、別ファイルになります。
No.2
htmltemplate
-----------------------------------------
<?php
/*
Htmltemplate for PHP4
Copyright (C) 2003 Hiroshi Ayukawa
This program is free software; you can redistribute it and/or
modify it under the terms of the Artistic License version 2.0,
or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the Artistic License version 2.0 for more details.
You should have received a copy of the Artistic License version 2.0
along with this program; if not, visit:
http://dev.perl.org/perl6/rfc/346.html
*/
/*
----- Class diagram ------------------
+--------------+ (use)
| htmltemplate |<---------- Client
+--------------+
<>
| (use to parse documents)
V
+--------------+
|StandardParser|
+--------------+
|
|
--
V
+----------------+
| TemplateParser |
+----------------+
<>
|
| (use to parse each tags)
|
V
+----------+ +----------+ +-------------+
| TagBasis |<|---| DataTag |---------| ConcreteTags|
+----------+ | ArrayTag | +-------------+
+----------+ tag_val,tag_each,,,,etc.
*/
define("FILE_READ_UNIT",8192);
/*
* Tag definition
*/
/* the origine class of all tags */
class TagBasis{
var $matchregexp;
var $fromstring;
var $tostring;
var $closestring;
var $regardasarray=false;
function getLabelArray($str){
$ans=array();
preg_match_all($this->matchregexp,$str,$regans,PREG_SET_ORDER);
foreach($regans as $x){
$ans[]=$x[1];
}
return $ans;
}
function parse($str,$multilabels){
while(preg_match($this->matchregexp,$str,$match)){
$ind=$this->getIndex($match[1],$multilabels);
$str=str_replace(
call_user_func_array("sprintf",array_merge(array($this->fromstring),array_slice($match,1))),
call_user_func_array("sprintf",array_merge(array($this->tostring),array($ind),array_slice($match,1))),
$str);
}
$str=$this->closeTag($str);
return $str;
}
function closeTag($str){
if($this->closestring){
$str=str_replace($this->closestring,
"<?php
}
?>",
$str);
}
return $str;
}
function getIndex($m,$multilabels){}
}
/* the super class of tags which handle non-array data */
class DataTag extends TagBasis{
function getIndex($m,$multilabels){
$ar=split("/",$m);
$ind="";
$rui=array();
foreach($ar as $x){
array_push($rui,$x);
$ind.="[\"$x\"]";
if(in_array(join("/",$rui),$multilabels)){
$ind.="[\$cnt[\"".join("/",$rui)."\"]]";
}
}
return $ind;
}
}
/* the super class of tags which handle array structure
like {each *} */
class ArrayTag extends TagBasis{
function getIndex($m,$multilabels){
$ar=split("/",$m);
$ind="";
$rui=array();
$mattan=0;
foreach($ar as $x){
array_push($rui,$x);
$ind.="[\"$x\"]";
if($mattan!=count($ar)-1 && in_array(join("/",$rui),$multilabels)) {
$ind.="[\$cnt[\"".join("/",$rui)."\"]]";
}
$mattan++;
}
return $ind;
}
}
/*
* parser classes
*/
/* main definition of parser */
class TemplateParser{
var $tags=array("simple"=>array(),"multi"=>array());
function add($tag){
if($tag->regardasarray) $this->tags["multi"][]=$tag;
else $this->tags["simple"][]=$tag;
return $this;
}
function remove($tagname){
$this->_remove($tagname,$this->tags["multi"]);
$this->_remove($tagname,$this->tags["simple"]);
}
function clear(){
$this->tags=array("simple"=>array(),"multi"=>array());
}
function _remove($tagname,&$tags){
for($i=0;$i<count($tags);$i++){
if(get_class($tags[$i])==strtolower($tagname)){
array_splice($tags,$i,1);
$i--;
}
}
}
function parse($str){
reset($this->tags["multi"]);
$multilabels=array();
foreach($this->tags["multi"] as $x){
$multilabels=array_merge($multilabels,$x->getLabelArray($str));
}
reset($this->tags["multi"]);
foreach($this->tags["multi"] as $x){
$str=$x->parse($str,$multilabels);
}
reset($this->tags["simple"]);
foreach($this->tags["simple"] as $x){
$str=$x->parse($str,$multilabels);
}
return $str;
}
}
////////////////////////////////////////////////////
/*
* Standard tag classes
* these tags are defined as previous version of htmltemplate
*/
class tag_val extends DataTag{
var $matchregexp='/\{val ([^\}]+)\}/i';
var $fromstring="{val %s}";
var $tostring="<?php @print nl2br(\$val%1\$s); ?>\n";
}
class tag_rval extends DataTag{
var $matchregexp='/\{rval ([^\}]+)\}/i';
var $fromstring="{rval %s}";
var $tostring="<?php @print \$val%1\$s; ?>\n";
}
// contributed by Osamu Shigematsu
class tag_def extends ArrayTag{
var $matchregexp='/<!--\{def ([^\}]+)\}-->/i';
var $fromstring="<!--{def %s}-->";
var $tostring="<?php
if(@count(\$val%1\$s) && (is_array(\$val%1\$s) || strlen(\$val%1\$s))){
?>";
var $closestring="<!--{/def}-->";
}
//contributed by Ahiru,FB,masao,,,,
class tag_ndef extends ArrayTag{
var $matchregexp='/<!--\{ndef ([^\}]+)\}-->/i';
var $fromstring="<!--{ndef %s}-->";
var $tostring="<?php
if(!(@count(\$val%1\$s) && (is_array(\$val%1\$s) ||
strlen(\$val%1\$s)))){ ?>";
var $closestring="<!--{/ndef}-->";
}
// this vdef is an experimental tag.
class tag_vdef extends DataTag{
var $matchregexp='/<!--\{vdef ([^\}]+)\}-->/i';
var $fromstring="<!--{vdef %s}-->";
var $tostring="<?php
if(@\$val%1\$s && ((gettype(\$val%1\$s)!='array' && \$val%1\$s!=\"\") or
(gettype(\$val%1\$s)=='array' && count(\$val%1\$s)>0))){ ?>";
var $closestring="<!--{/vdef}-->";
var $regardasarray=1;
}
class tag_each extends ArrayTag{
var $matchregexp='/<!--\{each ([^\}]+)\}-->/i';
var $fromstring="<!--{each %s}-->";
var $tostring="<?php
for(@\$cnt[\"%2\$s\"]=0;@\$cnt[\"%2\$s\"]<count(@\$val%1\$s);@\$cnt[\"%2\$s\"]++){
?>";
var $closestring="<!--{/each}-->";
var $regardasarray=true;
}
/*<!--{comment}--> *** <!--{/comment}-->
* comment
* remove all characters between these tags.
*/
class tag_comment extends ArrayTag{
var $matchregexp='/<!--\{comment\}-->/i';
var $fromstring="<!--{comment}-->";
var $tostring="<?php if(FALSE){?>";
var $closestring="<!--{/comment}-->";
}
/*
* StandardParser
* parser defined with above tags.
* behave as previous htmltemplate
*/
class StandardParser extends TemplateParser{
function StandardParser(){
$this->add(new tag_val());
$this->add(new tag_rval());
$this->add(new tag_def());
$this->add(new tag_ndef());
$this->add(new tag_vdef());
$this->add(new tag_each());
$this->add(new tag_comment());
}
}
/*
* htmltemplate
* the APIs defined after the manner of htmltemplate for PHP4
* tmp file generation has not been implemented yet.(2003-07-08)
*/
class htmltemplate{
var $parser;
// the constructor
function htmltemplate(){
$this->parser=new StandardParser();
}
// the static method to get the singleton instance
function &getInstance(){
static $instance;
if(! $instance) $instance=new htmltemplate();
return $instance;
}
// adds tag instance
function add($tag){
// This method is obsolete.Use addTag() instead.
$inst=&htmltemplate::getInstance();
$inst->parser->add($tag);
}
// adds a tag class
function addTag($tagclassname){
$inst=&htmltemplate::getInstance();
$inst->parser->add(new $tagclassname());
}
// removes a tag class
function removeTag($tagclassname){
$inst=&htmltemplate::getInstance();
$inst->parser->remove($tagclassname);
}
// remove all tags
function removeAllTag(){
$inst=&htmltemplate::getInstance();
$inst->parser->clear();
}
// sets a parser instance
function setParser($parser){
$inst=&htmltemplate::getInstance();
$inst->parser=$parser;
}
// parses given template string
function parse($str){
$inst=&htmltemplate::getInstance();
return $inst->parser->parse($str);
}
// parses a template file and displays it
function t_include($file,&$data){
$inst=&htmltemplate::getInstance();
print $inst->t_buffer($file,$data);
}
// parses a template file and gives it back
function t_buffer($file,&$data){
$val=&$data;
$inst=&htmltemplate::getInstance();
$handle=fopen($file,"rb");
$all="";
do {
$bytedata = fread($handle, FILE_READ_UNIT);
if (strlen($bytedata) == 0) {
break;
}
$all .= $bytedata;
} while(true);
return $inst->buffer($all,$val);
}
function buffer($template_str,&$val){
$inst=&htmltemplate::getInstance();
$code=$inst->parse($template_str);
ob_start();
eval('?>' .$code);
$cnt=ob_get_contents();
ob_end_clean();
return $cnt;
}
}
?>
_________________________________________________________________
ドコモ900i、901i、902iシリーズユーザーだけにお得な特典!
http://promotion.live.jp/messenger/mobile.htm
PHP-users メーリングリストの案内