General

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でのテンプレート及びアイテム処理ルーチン(抜粋)。

    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('/<\?/','&lt;?',$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];
    }

コメント

コメントはありません

コメント送信