//
//著作権?2000-2001、Roland Roberts
// 2001 Alister Bulman
// PHP3 ポート: Copyright ?1999 CDI
// Perl バージョン: Copyright ?1998 Jason Moore
// RCS リビジョン
// @(#) $Id: class.rFastTemplate.php,v 1.22 2001/10/18 21:36:53 roland Exp $
// $Source : /home/cvs/projects/php/tools/class.rFastTemplate.php,v $
//
// 著作権表示
//
// このプログラムはフリー ソフトウェアです。あなたは、
// Free Software Foundation によって発行された GNU General Public License の条項に基づいて、再配布および/または変更を行うことができます。バージョン 2、または (オプションで)
// それ以降のバージョン
//
// class.rFastTemplate.php は、役立つことを期待して配布されています
// ただし、いかなる保証もありません。
// 商品性や特定目的への適合性の暗黙の保証もありません。 詳細については、GNU
// 一般公衆利用許諾書を参照してください。
//
// コメント
//
// CDI
// 彼の PHP3 ポートに添付されている著作権表示を指摘していただきました
//
// この作品は class.FastTemplate.php3 バージョン 1.1.0 から派生しています。 as
// http://www.thewebmasters.net/ から入手できます。 この作品では
// 「GNU General Artistic License」への言及が行われています。 著者との通信
// その意図は GNU 一般公衆利用許諾書を使用することでした。
// この作品も同様です
//
// 著者
//
// Roland Roberts
// アリスター・ブルマン
// Michal Rybarik
// CDI
// Jason Moore
//
// 概要
//
// require ("PATH-TO-TEMPLATE-CODE/class.Template.php");
// $t = new Template("PATH-TO-TEMPLATE-DIRECTORY");
// $t->define (array (MAIN => "diary.html"));
// $t->setkey (VAR1, "何らかのテキスト");
// $t->subst (INNER, "inner")
// $t->setkey (VAR1, "その他のテキスト");
// $t->gt;subst (INNER, ".inner")
// $t->setkey (VAR2, "var2 text") ;
// $t->subst (CONTENT, "main");
// $t->print (CONTENT);
//
// 説明
//
// これはクラスです。FastTemplate .php3 の代替品。
// 同じインターフェイスのほとんどを提供しますが、ネストされた動的テンプレートを実行する機能があります。
// デフォルトでは、動的テンプレート展開が行われ、これを行うために特別なアクションは必要ありません
// これを行うためには必要ありません
//
// class.FastTemplate.php3 メソッドは実装されていません
//
// clear_parse
// 同じ明らかなように。 実際、これは FastTemplate のクリアと同じでした。
// clear_all
// 本当にこれが必要だと思う場合は、試してみてください
// unset $t;
// $t = new Template ($path);
/ / 同じ効果が得られます。
// clear_tpl
// 代わりにアンロードを使用してください。 これには、すべての親テンプレート
// と兄弟テンプレートがアンロードされるという副作用があり、予想よりも大幅な影響になる可能性があります
// class.FastTemplate.php3 とは異なります。 この違いは
// 埋め込まれたテンプレートのリロードを強制できる唯一の方法が親テンプレートと兄弟テンプレートのリロードを強制することであるため、必要です
//
// class.FastTemplate.php3 別の名前によるメソッド
//
// これらの関数の存在は歴史的な成果です。 私
// 当初は、同等の機能をゼロから作成することを念頭に置いていました。
// その後、我に返り、class.FastTemplate.php3 を取得し、
// ハッキングを開始しました。 したがって、右側の名前を使用できますが、左側の名前は同等であり、元の
// class.FastTemplate.php3.
//
// parse --> で使用されている名前です。 subst
// get_assiged --> getkey
// assign --> setkey
// clear_href --> unsetkey
// clear_assign --> unsetkey
// FastPrint --> xprint
//
class rFastTemplate {
// デバッグ出力に使用されるファイル名。 ファイルが開かれるとこれは無視されるため、
// オプション設定コマンド (debug、debugall、
// strict、dynamic) 以外を呼び出す前に設定する必要があります。
var $DEBUGFILE = '/tmp/class .rFastTemplate.php.dbg';
// デバッグ出力用のファイル記述子。
var $DEBUGFD = -1;
// 個々のメンバー関数の配列。 $this->debug(FUNCTION_NAME)
var $DEBUG = array ();
// これをオンにすると、
経由ですべてのメンバー関数のデバッグが有効になります。 // $this->debugall(). $this->debugall(false);
var $DEBUGALL = false;
// 実際のテンプレートの名前を使用してオフにします。 各要素は、テンプレートを含む配列になります
// 元のファイル、ファイルの読み込みステータス、親
// テンプレート、変数リスト、実際のテンプレートの内容などの情報
var $TEMPLATE = array();
// パスを保持します-to-templates (set_root と FindTemplate を参照)
var $ROOT = array();
// parse() によって解析された最後のテンプレートへのハンドルを保持します
var $LAST = '';
// 厳密テンプレートのチェック。 テンプレート内の未解決の変数は
// 警告を生成します。
var $STRICT = true;
// true の場合、$STRICT=true によって生成される警告が抑制されます。
var $QUIET = false;
// ハンドルを保持しますparse() への呼び出しによって割り当てられます。
var $HANDLE = array();
// 割り当てられたすべての変数名と値を保持します。
var $VAR = array();
// true に設定すると、これはWIN32サーバー。 これは
// class.FastTemplate.php3 実装の一部であり、実際に機能する唯一の場所
// は、$ROOT の値、つまりすべてのテンプレートが存在する
// パスに終端文字を設定することです。
var $WIN32 = false;
// 動的テンプレートのテンプレートを自動的にスキャンし、HTML コメントで使用されている名前に基づいて新しい値
// を TEMPLATE に割り当てます。 これは
// 最初の parse() が呼び出されるまでは変更できます。 まあ、
// いつでも変更できますが、既に読み込まれている
// テンプレートには影響しません。 また、動的テンプレートがある場合は、parse
// への最初の呼び出しですべてのテンプレートが読み込まれるため、その後にテンプレートを変更すると
// 定義されたテンプレートには影響しません。
var $DYNAMIC = true;
// うーん。 読みやすくするために、これらの非常に長い正規表現を
// 複数行に分割しないでください。 実行すると、PHP 4.03pl1 が停止します。
// 理由は、括弧で囲まれた不明瞭な何かだと思います
// 一致します。Tcl にも同じ種類のものがある可能性がありますが、よくわかりません。
//動的/劣悪
// テンプレートの先頭に一致する正規表現。 重要なのは、(1)
// 一致全体、および (2) 動的テンプレートの名前の 2 つの部分が必要であるということです。 最初の部分は
// strstr() を実行してバッファを 2 つに分割するため必須です
// 動的テンプレート宣言の前のすべてと
// 後のすべて。 2 番目が必要なのは、BEGIN を見つけた後に END を検索するためです
// 両方とも同じ名前を持つ必要があります
// テンプレートの形式が正しくないと判断され、スローされてエラーになります。
// これらは両方とも書かれていますPCRE (Perl 互換の正規
// 式) を使用するのは、
//
// BEGIN/END の場合、HTML コメント マーカーの末尾を超えて読まれないことを保証するための非欲張り演算子が必要だからです。ブロックにはタグ名の後にコメントが続きます。
var $REGEX_DYNBEG = '/()/';
// 動的/劣悪な
// テンプレートの末尾に一致する正規表現。 BEGIN マッチに関するコメントを参照してください。
var $REGEX_DYNEND = '/()/';
// テンプレート内の変数に一致する正規表現
var $REGEX_VAR = '/{[A-Za-z][ -_A-Za-z0-9]*}/';
//
// description
// Constructor.
//
function rFastTemplate ($pathToTemplates = '') {
// $pathToTemplates もset_root で処理されるテンプレート ルートの配列
global $php_errormsg;
if (!empty($pathToTemplates)) {
$this->set_root ($pathToTemplates);
}
$this->DEBUG = array ('サブサブ' => false,
'parse_internal' => false,
'parse_internal_1' => 'parsed' => false、
'clear' => false、
'clear_dynamic' => ,
'load' => false);
return $this;
}
//
// 説明
// デバッグ出力に使用する名前を設定します。 別のファイルが既に開かれている場合は、
// 次回の logwrite 呼び出しでこの名前で再度開くように
// function debugfile ($name) {
$this->DEBUGFILE = $name;
}
//
// 説明
// 個々のメンバー関数のデバッグ出力をオン/オフにします。
//
function debug ($what, $on = true) {
$this->DEBUG[$what] = $on;
}
//
// 説明
// デバッグ出力をオン/オフしますすべてのメンバー関数。
//
function debugall ($on = true) {
$this->DEBUGALL = $on;
}
//
// 説明
// 自動動的テンプレート拡張をオン/オフします。 劣等な動的テンプレートが埋め込まれた
// テンプレートも
// 解析されますが、メイン テンプレートの一部であるかのようにのみ行われることに注意してください。 この
// がオンになると、本格的な
// テンプレートであるかのように解析されるため、解析して別の
// エンティティとして追加することができます。
//
関数動的($on = true) {
$this->DYNAMIC = $on;
}
//
// 説明
// 厳格なテンプレートのチェックをオン/オフにします。 オンの場合、すべてのテンプレート タグ
// を割り当てる必要があります。そうでないとエラーがスローされます (ただし、
// テンプレートは解析されます)。
//
function strict ($on = true) {
$this->STRICT = $ on;
}
function Quiet ($on = true) {
$this->QUIET = true;
}
//
// 説明
// class.FastTemplate.php3.
//
function no_strict(){
$ this-> strict = false;
} // ->DEBUGFD $this->DEBUGFD = fopen ($this->DEBUGFILE, 'a');
}
fputs ($this->DEBUGFD,
strftime ('%Y / %m/%d %H:%M:%S ') . $msg . "n");
}
//
// 説明
// これはclass.FastTemplate.php3からそのまま引用されました。 使用されている
// プラットフォームに基づいて、パス指定が
// 適切なパス区切り文字で終わることが確認されます。つまり、UNIX システムではスラッシュ、WIN32 システムでは
// バックスラッシュです。 Mac または VMS で実行できるようになったら、
// 他の文字について心配することになると思います....
//
// $root は、検索されるテンプレート ルートの配列にできるようになりました
//最初に一致する名前。
function set_root ($root) {
if (!is_array($root)) {
$trailer = substr ($root, -1);
if ($trailer != ($this-> WIN32 ? '\' : '/'))
$root .= ($this->WIN32 ? '\' : '/');
if (!is_dir($root)) {
$this-> ;error (「指定された ROOT ディレクトリ [$root] はディレクトリではありません」、true);
return false;
}
$this->ROOT[] = $root;
} else {
リセット($root);
while(list($k, $v) = each($root)) {
if (is_dir($v)) {
$trailer = substr ($v,-1);
if ($trailer != ($this->WIN32 ? '\' : '/'))
$v .= ($this->WIN32 ? '\' : '/');
$this-> ROOT[] = $v;
} else
$this->error (「指定された ROOT ディレクトリ [$v] はディレクトリではありません」、true);
}
}
}
//
// 説明
// ファイルをテンプレート名に関連付けます。
//
// ため息。 少なくとも CVS バージョンの PHP では、$dynamic = false で
// true に設定されます。
//
function define ($fileList, $dynamic = 0) {
reset ($fileList);
while (list ($ tpl, $file) = each ($fileList)) {
$this->TEMPLATE[$tpl] = array ('file' => $file, 'dynamic' => $dynamic);
}
return true;
}
function define_dynamic ($tplList, $parent='') {
if (is_array($tplList)) {
reset ($tplList);
while (list ($tpl, $parent) = each ( $tplList)) {
$this->TEMPLATE[$tpl]['parent'] = $parent;
$this->TEMPLATE[$tpl]['dynamic'] = true;
}
} else {
// $tplList は配列ではなく、単一の子/親のペアです。
$this->TEMPLATE[$tplList]['parent'] = $parent;
$this->TEMPLATE[$tplList][ 'dynamic'] = true;
}
}
//
// 説明
// 文字列(ファイルではなく)からテンプレートを定義します。この関数は
// 元の PERL モジュールから CDI の
// class.FastTemplate.php3 に移植されておらず、rFastTemplate
// クラスに戻ってきました。データベースまたは共有メモリに保存されたテンプレートを使用したい場合に便利です。
// function define_raw ($stringList, $dynamic = 0) {
reset ($stringList);
while (list( $tpl, $string) = each ($stringList)) {
$this->TEMPLATE[$tpl] = array ('string' => $string, 'dynamic' => $dynamic, 'loaded' = > 1);
}
return true;
}
//
// 説明
// 一致するテンプレートが見つかるまで、ルート候補のリストを順番に試します
//
関数 FindTemplate ($file) {
// まず、現在のディレクトリのショートパス for
// 絶対ファイル名
if (substr($file, 0, 1) == '/') {
if (file_exists($) file)) {
return $file;
}
}
// 一致するファイルのパスを検索
reset($this->ROOT);
while(list($k, $v) = each($this->ROOT)) {
$f = $v 。 $ file; this->ROOT), true);
return false;
}
//
// 説明
// 基になるファイルからテンプレートをメモリに読み込みます。
//
function &load ($file) {
$debug = $this->デバッグ || $this->DEBUG['load'];
if (! count($this->ROOT)) {
if ($debug)
$this->logwrite ("load: テンプレート $file を開けません、テンプレートのベース ディレクトリが設定されていません");
$this->error ("テンプレート $file を開けません、テンプレートのベース ディレクトリが設定されていません", true);
return false;
} else {
$contents = '';
$filename = $this->FindTemplate ($file);
if ($filename)
$contents = implode ('', (@file($filename)));
if (!($contents) or ( empty($contents)) または (! $filename)) {
if ($debug)
$this->logwrite ("load: $file のロードに失敗しました、$php_errormsg");
$this->error ( "load($file) の失敗: $php_errormsg", true);
} else {
if ($debug)
$this->logwrite ("load: $filename が見つかりました");
$contents;
}
}
}
//未完待ち续呵呵 ——————by 孤狼