private final function rtblock($src, $filename) { if (strpos($src, "rt:block") !== false || strpos($src, "rt:extends") !== false) { $blocks = $paths = array(); while (Tag::setof($xml, $this->rtcomment($src), "rt:extends")) { $bxml = Tag::anyhow($src); foreach ($bxml->in("rt:block") as $block) { $name = $block->inParam("name"); if (!empty($name) && !array_key_exists($name, $blocks)) { $blocks[$name] = $block->value(); $paths[$name] = $filename; } } if ($xml->isParam("href")) { $src = File::read($filename = File::absolute(dirname($filename), $xml->inParam("href"))); $this->filename = $filename; } else { $src = File::read($this->filename); } $this->selected_template = $xml->inParam("name"); $src = $this->rttemplate($src); } if (empty($blocks)) { $bxml = Tag::anyhow($src); foreach ($bxml->in("rt:block") as $block) { $src = str_replace($block->plain(), $block->value(), $src); } } else { while (Tag::setof($xml, $src, "rt:block")) { $xml = Tag::anyhow($src); foreach ($xml->in("rt:block") as $block) { $name = $block->inParam("name"); $src = str_replace($block->plain(), array_key_exists($name, $blocks) ? $this->parseUrl($blocks[$name], File::absolute($this->url, File::relative($this->path, dirname($paths[$name])))) : $block->value(), $src); } } } } return $src; /*** ftmp("core/template/base.html",' ======================= <rt:block name="aaa"> base aaa </rt:block> <rt:block name="bbb"> base bbb </rt:block> <rt:block name="ccc"> base ccc </rt:block> <rt:block name="ddd"> base ddd </rt:block> ======================= '); ftmp("core/template/extends1.html",' <rt:extends href="base.html" /> <rt:block name="aaa"> extends1 aaa </rt:block> <rt:block name="ddd"> extends1 ddd <rt:loop param="abc" var="ab"> {$loop_key}:{$loop_counter} {$ab} </rt:loop> <rt:if param="abc"> aa </rt:if> <rt:if param="aa" value="1"> bb </rt:if> <rt:if param="aa" value="2"> bb <rt:else /> cc </rt:if> <rt:if param="zz"> zz </rt:if> <rt:if param="aa"> aa </rt:if> <rt:if param="tt"> true </rt:if> <rt:if param="ff"> false </rt:if> </rt:block> '); ftmp("core/template/sub/extends2.html",' <rt:extends href="../extends1.html" /> <rt:block name="aaa"> <a href="hoge/fuga.html">fuga</a> <a href="{$newurl}/abc.html">abc</a> sub extends2 aaa </rt:block> <rt:block name="ccc"> sub extends2 ccc </rt:block> '); $template = new Template("url=http://rhaco.org,path=".ftpath()."/core/template"); $template->vars("newurl","http://hoge.ho"); $template->vars("abc",array(1,2,3)); $template->vars("aa",1); $template->vars("zz",null); $template->vars("ff",false); $template->vars("tt",true); $result = $template->read("sub/extends2.html"); $ex = text(' ======================= <a href="http://rhaco.org/sub/hoge/fuga.html">fuga</a> <a href="http://hoge.ho/abc.html">abc</a> sub extends2 aaa base bbb sub extends2 ccc extends1 ddd 0:1 1 1:2 2 2:3 3 aa bb cc aa true ======================= '); eq($ex,$result); */ }