jit.php
2007年12月27日
スキンパースの、<% %>→<?php ?>変換部分をjit.phpとして独立させ、テンプレートのパースルーチンもここに加えた。
アイテムのパースは、ここでは行えない。というのは、コンパイルされたindex.phpではスキンパース・テンプレートパースはすでに行われているが、アイテムのパースは表示するごとに行う必要があるためである。アイテムのパースに同じルーチン(jit.php)を呼び出すと、スピードの上で効率が良くない。
そこで、アイテムパース時に必要なitemvarの情報は、各アイテムに埋め込むことにして、アイテムパース部分はjit.phpから独立させることにする。例えば、
testitemvar|class::method/testitemvar2|class::method/
などの文字列を記事保存時にアイテム用のテーブルに保存しておき、アイテムをパースする時に、この情報に従ってpreg_replaceする。
…かな?現在のところ、jit.phpは170行ほどだから、これをskin.phpに戻してアイテムパースもここから行うほうがいいのかも。
考え中。
(追記)
結局、itemvarの処理ルーチンは、jit.phpに記述した。ただし、<%image%> <%popup%> などの基本的なitemvarは別のところでpreg_replaceで処理し、preItem イベント通過後にまだ<% %>もしくは<?php ?>が残っている場合に、jit::parse_item()を呼び出すことにする。したがって、itemvarの情報を各アイテムに埋め込む方式は取らない。
以下、jit.phpでのテンプレート及びアイテム処理ルーチン(抜粋)。
アイテムのパースは、ここでは行えない。というのは、コンパイルされたindex.phpではスキンパース・テンプレートパースはすでに行われているが、アイテムのパースは表示するごとに行う必要があるためである。アイテムのパースに同じルーチン(jit.php)を呼び出すと、スピードの上で効率が良くない。
そこで、アイテムパース時に必要なitemvarの情報は、各アイテムに埋め込むことにして、アイテムパース部分はjit.phpから独立させることにする。例えば、
testitemvar|class::method/testitemvar2|class::method/
などの文字列を記事保存時にアイテム用のテーブルに保存しておき、アイテムをパースする時に、この情報に従ってpreg_replaceする。
…かな?現在のところ、jit.phpは170行ほどだから、これをskin.phpに戻してアイテムパースもここから行うほうがいいのかも。
考え中。
(追記)
結局、itemvarの処理ルーチンは、jit.phpに記述した。ただし、<%image%> <%popup%> などの基本的なitemvarは別のところでpreg_replaceで処理し、preItem イベント通過後にまだ<% %>もしくは<?php ?>が残っている場合に、jit::parse_item()を呼び出すことにする。したがって、itemvarの情報を各アイテムに埋め込む方式は取らない。
以下、jit.phpでのテンプレート及びアイテム処理ルーチン(抜粋)。
static public function parse_template($tempname,$type,$additional_data=''){ // Get the template string. $tempstr=self::rawTemplate($tempname,$type); // Compile and parse. self::parse_compiled(self::compile($tempstr,'templatevar',$additional_data)); } static public function parse_item($item,$admin=false,$additional_data=''){ // Remove < ? ... ? > from item, if author is not admin. if (!$admin) $item=preg_replace('/<\?/','<?',$item); // Compile and parse. self::parse_compiled(self::compile($item,'itemvar',$additional_data,$admin)); } // To get raw template from table. static public function rawTemplate($tempname,$type){ static $data=array(); if (!isset($data[$tempname])) { self::unbuffered_query("SELECT type, content FROM jit_template WHERE name=<%1%> AND NOT type=''",$tempname); while($row=self::fetch_assoc()) $data[$tempname][$row['type']]=$row['content']; } return $data[$tempname][$type]; }