-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdoc_dev_plugins.html
257 lines (250 loc) · 30.7 KB
/
doc_dev_plugins.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="keywords" content="blosxom,日本語,翻訳">
<title>blosxomサイトの日本語訳::開発者向け - プラグイン</title>
<LINK REV="MADE" HREF=" ">
<LINK rel="INDEX" href="index.html">
<link rel="stylesheet" href="style/blosxom.css" type="text/css">
</head>
<body>
<div id="header"><span class="en">blosxom</span>::日本語訳</div>
<table id="frame" cellspacing="0" cellpadding="0" summary="フレーム">
<tbody>
<tr>
<td id="menu">
<h4>翻訳について</h4>
<ul class="mid">
<li><a href="index.html" title="お読みください">お読みください</a></li>
</ul>
<h4 class="en">blosxom</h4>
<ul class="mid">
<li><a href="about.html" title="Blosxomについて"><span class="en">Blosxom</span>について</a></li>
<li><a href="features.html" title="Blosxomの機能">機能</a></li>
<li><a href="colophon.html" title="奥付">奥付</a></li>
<li><a href="http://www.raelity.org/archives/computers/internet/weblogs/blosxom/" title="ニュース">ニュース(英語)</a></li>
<li><a href="http://groups.yahoo.com/group/blosxom/" title="メーリングリスト">メーリングリスト(英語)</a></li>
<li><a href="http://s1.amazon.com/exec/varzea/pay/T3ENE5Z31EQZ0O" title="寄贈">寄贈(英語)</a></li>
</ul>
<h4>ユーザ向けドキュメント</h4>
<ul class="mid">
<li><a href="doc_users_overview.html" title="Blosxomの概要">概要</a></li>
<li><a href="doc_users_install_dynamic.html" title="Blosxomのインストール">インストール</a></li>
<li><a href="doc_users_configure.html" title="Blosxomの設定">環境設定</a></li>
<li><a href="doc_users_blog.html" title="ウェブログ">ウェブログ</a></li>
<li><a href="doc_users_view.html" title="ウェブログの閲覧">閲覧</a></li>
<li><a href="doc_users_flavour.html" title="フレーバー">フレーバー</a></li>
<li><a href="doc_users_syndicate.html" title="シンジケート">シンジケート</a></li>
<li><a href="doc_users_plugins.html" title="プラグイン">プラグイン</a></li>
<li><a href="plugin_registry.html" title="プラグイン登録ページ">プラグイン登録ページ</a></li>
<li><a href="doc_users_configure_static.html" title="静的表示の設定">静的表示の設定</a></li>
<li><a href="faq.html" title="良くある質問"><span class="en">faq</span></a></li>
<li>使用例*</li>
</ul>
<h4>開発者向けドキュメント</h4>
<ul class="mid">
<li><a href="doc_dev_overview.html" title="概要:開発者向け">概要</a></li>
<li><a href="doc_dev_plugins.html" title="プラグイン:開発者向け">プラグイン</a></li>
<li><a href="doc_dev_plugin_register.html" title="開発者向け:プラグイン登録">プラグインの登録</a></li>
</ul>
<h4>ダウンロード</h4>
<ul class="mid">
<li><a href="downloads.html#macosx" title="Macintosh"><span class="en">mac</span></a></li>
<li><span class="en">windows</span>*</li>
<li><a href="downloads.html" title="全ての人へ">全ての人へ</a></li>
<li><a href="license.html" title="ライセンス">ライセンス</a></li>
<li>共同制作*</li>
</ul>
<p>*公式サイトで未執筆</p>
</td>
<td id="contents"><h1><a name="top" class="bl">プラグイン</a></h1><p><span class="en">Blosxom</span>のプラグインアーキテクチャによって<span class="en">Blosxom</span>の核となる部分は軽量かつスマートのままに、異なる環境や利用方法に対する拡張性を提供しています。</p><h2>プラグイン</h2><h3>プラグイン登録ページ...</h3><p><a href="plugin_registry.html">プラグインの登録ページ</a>を見て必要なプラグインを探して下さい。</p><p>そこにはちょうど貴方のような<span class="en">Blosxom</span>ユーザが開発したプラグインがリストアップさえており、成長を続けています。そこではプラグインが陳列されていて、プラグインについてのコメントを読んだりしたり、他にも追加テンプレートがあったりします。画像プラグインは画像参照からサイズ変更まで全てを提供していますのでギャラリーを構築する事ができます。入力系のプラグインは返信(コメントとトラックバック)、因果関係の追跡、メールをウェブログにすると言った機能を提供しています。</p><p>コミュニティと共有できるプラグインをお持ちですか? <a href="doc_dev_plugin_register.html">ここでプラグを差してください!</a></p><h2>プラグインとは?</h2><p><span class="en">Perl</span>をある程度知っていれば<span class="en">Blosxom</span>のプラグインを書く事ができます。プラグインは単純な<span class="en">Perl</span>スクリプトで、<span class="en">Blosxom</span>がアクセスすることのできる<span class="be">plugins</span>ディレクトリに置き、<span class="en">Blosxom</span>の実行時に特定の位置で呼び出されるサブルーチンや関数を定義します。</p><h3>プラグインを使う...</h3><p><a href="doc_users_overview.html">ユーザ向けのプラグインドキュメント</a>でプラグインサポートの有効化、プラグインのインストール、プラグインの実行順番の変更、プラグインの削除等を理解して下さい。</p><h3>
<span class="be">Plugin</span>の心...</h3><p>もちろん、貴方の好きなようにすればよいのですが、私は<span class="en">Blosxom</span>のプラグインは誰もがその力のコンビネーションと簡単使用を十分に感じ取れ、そして<span class="en">Blosxom</span>の魂を感じて欲しいと望むのです。どうぞできるだけ簡単にインストールでき、設定でき、そして動作できるよう、心がけて下さい。</p><p>理想的には、プラグインとは<strong class="se">plugins</strong>ディレクトリにドロップできる単一ファイルであり、オプションで環境を設定できるものです。</p><p>何か追加する必要があったり、他のモジュールを必要とする場合にはプラグインとしてそれら全てを提供し、<strong class="se">plugins</strong>フォルダに一まとめにしてドロップできるようにサブディレクトリにまとめるようにして下さい。ユーザが専門家になったりコンパイルしたり<span class="en">Perl</span>モジュールをインストールしなくてはならないなど、過度な条件を必要としないようにして下さい。</p><p>また、常にクロスプラットフォームの問題を念頭においてください。<span class="en">Blosxom</span>はどこでも動作する。私が作成した全てのモジュールがそうであるように。私は何か少しセクシーさに欠けるものがどこでも快調に動作する一方で<span class="en">Linux</span>でのみ動作する何かセクシーなものを作成するのは恥ずかしく思っています。</p><h3>プラグインを書く...</h3><p><span class="en">Blosxom</span>のプラグインアークテクチャを理解する最も良い方法は、順番に各項目を進んでいくことです。</p><h3>...<span class="be">Blosxom</span>変数</h3><p>各プラグインで可能なことは、キーとなる<span class="en">Blosxom</span>の変数(読み込み:通例では読み込み専用)を参照する事です。その大部分は<span class="en">Blosxom</span>の<span class="be">#--- Configurable varibles ---</span>セクションに現われ、<a href="doc_users_configure.html">設定ドキュメント</a>内で説明されています。以下は完全な変数リストです:</p><ul class="mid">
<li class="en">$blog_title</li>
<li class="en">
$blog_description</li>
<li class="en">
$blog_language</li>
<li class="en">
$datadir</li>
<li class="en">
$url</li>
<li class="en">
$depth</li>
<li class="en">
$num_entries</li>
<li class="en">
$file_extension</li>
<li class="en">
$default_flavour</li>
<li class="en">
$plugin_dir</li>
<li class="en">
@plugins</li>
<li class="en">
$static_dir</li>
<li class="en">
$static_password</li>
<li class="en">
@static_flavours</li>
<li class="en">
$static_entries</li>
<li class="en">
$path_info</li>
<li class="en">
$flavour</li>
<li class="en">
$static_or_dynamic</li>
<li class="en">
$output</li>
<li class="en">
$version </li>
</ul><p> これらの変数の全てはメインの<span class="be">Blosxom</span>の名前空間で使えます。<span class="be">$blosxom::datadir</span>、<span class="be">@blosxom::plugin</span>のようにして参照します。</p><p>各サブルーチンに適切に渡された変数は参照と変更のためにコンテキストに固有なものです(例 話題の本文の参照は<span class="be">story()</span>サブルーチンに渡されます)。</p><h3>...良いスタートを切る</h3><p>全てのプラグインはプラグインの識別で始まる事になっています。幾つかのコメントが付いた慣例の行で始まるのが良い方法です...</p><pre class="en">
# Blosxom Plugin: sample
# Author(s): Rael Dornfest
# Version: 0+1i
# Blosxom Home/Docs/Licensing: http://www.raelity.org/apps/blosxom/
</pre><p>貴方のプラグインはそのプラグインの名前空間で操作するようにして、他のプラグインと全ての変数とサブルーチンが競合しないようにすべきです。Perlでは<span class="be">package</span>でこれを行います:</p><pre class="en">package sample;</pre><p>この例では、<span class="be">sample</span>と言う名前のパッケージになります。</p><p>各プラグインはそれ自身のパッケージで動作するだけでなく、それ自身のファイルに置きます。ファイルは<strong class="se">plugins</strong>ディレクトリに置くようにし、ファイル名はパッケージ名と厳密に同じ名前にしなくてはなりません。そのため、この例ではプラグインは<strong class="se">plugins/sample</strong>となります。</p><p>プラグインが読み込まれる順番をコントロールしたいのであれば、ファイル名を次のようにします:<span class="be">00loadfirst</span>、<span class="be">50loadsomtime</span>、<span class="be">99loadlast</span>等。プラグインはアルファベット順で読み込まれるのでこのようにすると順番を強制的に変更する事ができます。<span class="en">Blosxom</span>はプラグイン名から数字を取り外すのでパッケージ名でプラグインを参照できます(例 <span class="be">loadfirst</span>)。</p><h3>...環境設定、変数、モジュール</h3><p>ここからは貴方の<span class="en">Perl</span>は自由に動作します。以下は理解、使用、貴方へのプラグインへの適用についての私の提案です。</p><p><span class="en">Blosxom</span>それ自体ではユーザが変更できる変数は一緒にまとめるべきです。ファイルの先頭から環境設定変数部分の全てはユーザへの情報と変更を意図したものにすることを提案します。以下のような感じです:</p><pre class="en">
# --- Configration Variables -----
$email_address = 'me@example';
# --------------------------------
</pre><p>環境設定変数はユーザがプラグインを適切に使えるようにするために必要なものにすべきです。</p><p>プラグインに便利な変数を定義する時間です:</p><pre class="en">$title_and_path = '';
$story_number = 1;</pre><p>貴方が定義したこれらの変数の全てはフレーバーテンプレートで使用できます。それには名前空間を付加して<span class="be">$title_and_path</span>はテンプレート内で典型的な<span class="en">Perl</span>スタイルの<span class="be">$sample::title_and_path</span>で参照されます。</p><p>実際のところ、プラグインアーキテクチャの使用は<span class="en">Blosxom</span>本体に無い変数を貴方が単に定義することです。</p><p>貴方のプラグインに必要な<span class="en">Perl</span>モジュールを必要とするには以下のようにします。もしかすると<span class="en">CGI</span>モジュールの素晴らしい関数にアクセスする必要があるかもしれません:</p><pre class="en">use CGI qw/:standard/; </pre><h3>...サブルーチン</h3><p><span class="en">Blosxom</span>のプラグインアーキテクチャは一連のフックを定義します。これは各プラグインが動作する機会を与える<span class="en">Blosxom</span>の実行内の場所です。これらのフックは --単にサブルーチンです-- は実行の順番があります:<span class="be">start, entries, filter, head, sort, date, story, foot, end</span>。唯一必要なサブルーチンは<span class="en">start</span>です。</p><h3>...サブルーチン ...<span class="en">start</span></h3><p><span class="en">start</span>サブルーチンが必要です。これの目的は読み込むプラグインがあり、そしてそれらを有効にするようにするという事を<span class="en">Blosxom</span>に知らせることです。 <span class="en">Blosxom</span>の流儀ではそれを1(<span class="en">true</span>)を返すことで行います。以下は最も簡単な例です:</p><pre class="en">
sub start {
1;
}
</pre><p>これは<span class="en">Blosxom</span>にプラグインが生きていて各コールバック地点でプラグインが振舞えるようにと言う事を<span class="en">Blosxom</span>に知らせます。</p><p><span class="en">start</span>ルーチンは動的、または静的表示にプラグインの操作を制限する完全な位置です:</p><pre class="en">
sub start {
return $blosxom::static_or_dynamic eq 'dynamic' ? 1 : 0;
}
</pre><p>上記例では<span class="en">Blosxom</span>が現在動的に動作している場合にのみプラグインが動作するようにしています。そうでない場合にはプラグインの動作を停止させます。</p><h3>...サブルーチン ...<span class="be">template</span></h3><p> <span class="be">template</span>サブルーチンはプラグインに標準の<span class="en">template</span>サブルーチンを置き換える機会を与えます(一つは貴方のテンプレートを提供するものです)。</p><p><span class="be">template</span>フックは標準(<span class="en">Blosxom</span>本体で<span class="be">$template</span>で定義され割り当てられている)の場所で使われる匿名関数への参照を返さなくてはなりません。</p><p>パス、テンプレート、チャンク(例 <span class="en">"head"</span>や<span class="en">"foot"</span>)そしてフレーバーを与えます。サブルーチンはテンプレートコンポーネントのコンテンツを返さなくてはなりません。</p><p>以下の例ではメインのデータディレクトリではなくて代わりの<span class="be">"flavour"</span>ディレクトリからテンプレートを読み込みます。ウェブログ記事からはフレーバーを切り離しています:</p><pre class="en">
sub template {
return sub {
my ($path, $chunk, $flavour) = @_;
$path =~ s!^/*!!; $path = "/$path";
my $p = $path;
do {
return join '', <$fh> if
$fh->open("< $flavour_dir/$p/$chunk.$flavour");
} while ($p =~ s/(\/*[^\/]*)$// and $1);
return join '', ($blosxom::template{$flavour}{$chunk}
|| $blosxom::template{error}{$chunk}
|| '');
};
}
</pre><p>貴方のプラグインがデフォルトのものを上書きしないようにする場合は単に未定義の値を返しすようにします:</p><pre class="en">
sub template {
#
return undef;
}
</pre><p>このようにすると後続のプラグインは標準の<span class="en">template</span>サブルーチンを上書きする機会を与えられます。</p><h3>...サブルーチン ...<span class="be">entries</span></h3><p><span class="be">entries</span>サブルーチンはデフォルトの記事検索サブルーチン(貴方の全てのウェブログ記事を見つける)を置き換える機会を提供します。</p><p> <span class="be">entries</span>フックは<span class="en">Blosxom</span>本体で<span class="en">$entries</span>として定義されてる標準のものを扱う匿名関数への参照を返さなくてはなりません。</p><p>サブルーチンはファイルのハッシュと他のインデックス(静的表示の場合)への参照を返さなくてはなりません。</p><p>以下の簡単な例は<span class="en">%files</span>ハッシュを一つのログ、 <span class="en">$datadir/just/one/story.txt</span>に関連付けします:</p><pre class="en">
sub entries {
#
return sub {
my(%files, %indexes);
#
$files{"$blosxom::datadir/just/one/story.txt"} =
stat("$blosxom::datadir/just/one/story.txt")->mtime;
#
# indexes to be constructed when building statically
return (\%files, \%indexes);
};
}</pre><p>より総合的で現実的な例が<a href="plugin_registry.html" class="en">entries_index</a>プラグインで見られます。</p><p>標準のものを上書きしたくない場合には単に未定義の値を返すようにします:</p><pre class="en">
sub entries {
#
return undef;
}
</pre><p>後続のプラグインは標準の<span class="en">entries</span>サブルーチンを上書きできる機会を与えられます。</p><h3>...サブルーチン ...<span class="be">filter</span></h3><p><span class="be">filter</span>サブルーチンは<a href="doc_users_configure.html">データディレクトリ</a>で<span class="en">Blosxom</span>が見つけた全ての記事のリストを変更する機会を与えます。</p><p>サブルーチンにはファイルのハッシュへのリファレンス(<span class="be">$files_ref</span>)を渡します。ハッシュは キー/値 からなり、キーは記事のフルパスで、値は<span class="en">Unix</span>形式の修正時間(<span class="en">mtime</span>)です。</p><pre class="en">
sub filter {
my($pkg, $files_ref) = @_;
1;
}
</pre><p>フィルタリングの一つの例として、ローカル検索の結果に基づいてリストを再構築するものを紹介します。これを行う<span class="en">Lucene</span>プラグインを私のサイトで使っています。以下の例は<span class="en">"spiffy"</span>と言う単語を含まない全てのファイルを取り除きます:</p><pre class="en">
sub filter {
my($pkg, $files_ref) = @_;
foreach ( keys %$files_ref ) {
$_ =~ /spiffy/ or delete $files_ref->{$_};
}
1;
}
</pre><p>1でサブルーチンが終了していることに注意して下さい。意図したように動作した場合に<span class="en">true</span>(1)を返すのが正しい流儀です。問題が生じた時には<span class="en">false</span>(0)を返すようにします。<span class="en">Blosxom</span>は0の実行や何か実行が厳しい時に中断しません。静的に動作している時に各プラグインで何が起こったかをレポートします。</p><h3>...サブルーチン ...<span class="be">skip</span></h3><p><span class="be">skip</span>サブルーチンは<span class="en">Blosxom</span>が実際に出力を生成するのを開始する時に呼び出されます。プラグインは<span class="bl">1</span>を返すことでログを短く切り出す事ができます。もちろん<span class="bl">1</span>を返す最初のプラグインは呼び出された最後のプラグインです。</p><p><span class="be">skip</span>ルーチンは便利で、例えば、プラグインが何らかの理由によりリダイレクトを返したり、ブラウザにバイナリストリームを送信したり(例 画像)、わざわざウェブログの記事を生成する理由が無い場合などです。</p><h3>...サブルーチン ...<span class="be">interpolate</span></h3><p><span class="be">interpolate</span>サブルーチンはデフォルトの置換サブルーチンを置き換える機会を提供します(<span class="be">$title</span>と<span class="be">$someplugin::somevariale</span>を置き換えます)。</p><p><span class="be">interpolate</span>をフックする最初のプラグインは<span class="en">blosxom.cgi</span>自体の中の<span class="be">$interpolate</span>に関連したコードを持つデフォルトの場所で使われる匿名関数へのリファレンスを返します。</p><p><span class="be">$interpolate</span>に割り当てられたサブルーチンはテンプレートコンポーネントを呼び出します(例 <span class="en">head</span>、<span class="en">story</span>、<span class="en">foot</span>)。適切な置換のためにコンテンツを渡します。</p><p><a href="plugin_registry.html" class="en">interpolate_conditional</a>プラグインは、例えば、次のものを含む条件付置換の全ての約束を提供します。定義された、定義されていない、*に一致、*より大きい、*より小さい、再帰(話題自体無いにテンプレート変数を使うことで可能です)。</p><p>プラグインが何も上書きをしたくない場合には単に未定義の値を返しすようにします:</p><pre class="en">
sub interpolate {
# for some reason determine that you don't want to override the default...
return undef;
}
</pre><p>後続のプラグインは標準の置換サブルーチンを上書きする機会を得ます。</p>
<h3><a name="head" class="anc">...サブルーチン ...<span class="be">head</span></a></h3><p><span class="en">Bloxsom</span>は<strong class="se">head.flavour</strong>で読み込んだ後、そしてテンプレートコンポーネントに対して値の入れ替えを行う前に<span class="be">head</span>サブルーチンを呼び出します。</p><p>このサブルーチンには現在の作業ディレクトリ(パスで定義されている)と生の<strong class="se">head.flavour</strong>ソースへの参照を渡します。</p><pre class="en">
sub head {
my($pkg, $currentdir, $head_ref) = @_;
1;
}
</pre><p><span class="be">head</span>サブルーチンは出力ストリームをヘッダに追加する前に生のヘッダソースを変更し、または何らかの変数を変更する機会を提供します。</p><p>これはまた、これらのカスタムな話題に関係の無いテンプレート変数を変更するのに良い手段です。ここでは、例えば、タイトルへの<span class="be">URL</span>行に渡したパスを追加しています。<span class="be">"::"</span>ではさまれています。</p><pre class="en">
sub head {
my($pkg, $currentdir, $head_ref) = @_;
$title_and_path = $blosxom::blog_title;
$blosxom::path_info and $title_and_path .= " :: /$blosxom::path_info";
1;
}
</pre><p>私は私の<span class="be">head.flavour</span>に<span class="be">$blog_title::$path_info</span>を単純に含める事でこれを達成していません。なぜなら<span class="en">URL</span>行にパスが特定されていない場合に<span class="en">"::"</span>が表示されてしまうので、<span class="en">"raelity bytes::"</span>を作成しています。</p><p>より試験的ではない例は私のサイトで使用している<span class="en">readme</span>プラグインを作成するために使っています。現在の作業ディレクトリ(<span class="be">$currentdir</span>)に現われた<strong class="se">readme</strong>、または<strong class="se">readme.flavour</strong>ファイルが読み込まれ、生のヘッダソースに追加されます(<span class="be">$head_ref</span>)。</p><h3>...サブルーチン ...<span class="be">sort</span></h3><p><span class="en">sort</span>サブルーチンは表示するウェブログの順番(標準では日付順:新しいのが最初)を決定する標準の並べ替えサブルーチンを置き換える機会を提供します。</p><p><span class="en">entries</span>フックは<span class="en">blosxom.cgi</span>本体で<span class="en">$entries</span>に割り当てられてた標準の場所で使われてい匿名関数への参照を返さなくてはなりません。</p><p>このサブルーチンは完全限定のファイル名のリストを返さなくてはなりません。</p><p>以下の例は日付順(古いのが先)で記事を並べ替えます。これは標準とは逆です:</p><pre class="en">
sub sort {
return sub {
my($files_ref) = @_;
return sort { $files_ref->{$a} <=> $files_ref->{$b} } keys
%$files_ref;
};
}
</pre><p>何も上書きしたくない場合には単に1を返しすようにします:</p><pre class="en">
sub sort {
#
return undef;
}
</pre><p>後続のプラグインは標準の並べ替えサブルーチンを上書きする機会を得ます。</p><h3>..サブルーチン ...<span class="be">date</span></h3><p><span class="en">Bloxsom</span>は日付が新しくなると<span class="en">date</span>を呼び出します。それは適切な<strong class="se">date.flavour</strong>で表示した後で、そしてテンプレートコンポーネントのための値を入れ替える前です。</p><p>このサブルーチンには現在のディレクトリと生の<strong class="se">date.flavour</strong>ソース、<span class="en">Unix</span>スタイルの日付に対する最新の記事の修正日、そして修正日から来る幾つかの便利な日付が渡されます。</p><pre class="en">
sub date {
my ($pkg, $currentdir, $date_ref, $mtime, @date_bits) = @_;
my($dw,$mo,$mo_num,$da,$ti,$yr) = @date_bits;
1;
}
</pre><p><span class="be">date</span>は生の<span class="en">date</span>テンプレートの修正と完全に新しい日付の構築の機会を提供しています。以下のコードは、例えば、英語の月の名前をフランス語、日本語等に変換します。</p><pre class="en">
sub date {
my ($pkg, $date_ref, $mtime, $dw,$mo,$mo_num,$da,$ti,$yr) = @_;
#
$$date_ref =~ s/\$mo(?!_num)/$months[$mo_num]/mg;
1;
}
</pre>
<h3>...サブルーチン ...<span class="be">story</span></h3><p><span class="en">Bloxsom</span>は<span class="be">story</span>を各々、そして全ての記事に対して呼び出します。それは適切な<strong class="se">story.fvalour</strong>で読み込んだ後と、テンプレートコンポーネントに対して値を入れ替える前です。</p><p>このサブルーチンには記事のパス、ファイル名、生の<strong class="se">story.flavour</strong>ソースへの参照、記事のタイトルへの参照、そして記事の本文への参照が渡されます。</p><pre class="en">
sub story {
my ($pkg, $path, $filename, $story_ref, $title_ref, $body_ref)
1;
}
</pre><p>生の<span class="en">story.flavour</span>ソースの変更、テンプレートに渡される前にタイトルと本文の変更等が行えます。</p><p>簡単な例として、ウェブログの番号を表す<span class="be">$story_number</span>変数を使ってみましょう。</p><pre class="en">
sub story {
my ($pkg, $path, $filename, $story_ref, $title_ref, $body_ref)
$$title_ref = "#" . $story_number++ . ". " . $$title_ref;
1;
}
</pre><p>または、より良い例として私のサイトで使っている単純化した(十分では有りませんが)<span class="en">TrackBack</span>プラグインをあげてみましょう。これはスタンドアロンの<span class="en">TrackBack</span>からトラックバックの数を取り出し、<span class="en">$trackback</span>変数に結果を保存します。値は私の<span class="be">story.flavour</span>内で<span class="en">$trackbacks::trackback</span>と入れ替えられます。</p><pre class="en">
$trackback = '';
sub story {
my ($pkg, $path, $filename, $story_ref, $title_ref, $body_ref)
#
$trackback =
qq{<a href="$tb_url?__mode=list&tb_id=$tb_id">trackbacks ($tb_count)</a>};
1;
}
</pre><h3>..サブルーチン ...<span class="be">foot</span></h3><p><a href="#head"><span class="en">head</span>サブルーチン</a>と似て(レコードのA面とB面のような関係)、<span class="en">Blosxom</span>は適切な<strong class="se">foot.flavour</strong>で読み込んだ後、そしてテンプレートコンポーネントに対する値の入れ替えの前に<span class="be">foot</span>サブルーチンを呼び出します。</p><p>このサブルーチンには現在の作業ディレクトリ(パスで定義される)と生の<span class="en">foot.flavour</span>ソースへの参照が渡されます。</p><pre class="en">
sub foot {
my($pkg, $currentdir, $foot_ref) = @_;
1;
}
</pre><p><span class="be">foot</span>サブルーチンは生のフッタソースの変更や出力ストリームへのフッタの追加の前の変数の変更を提供します。</p><h3>...サブルーチン ...<span class="be">end</span></h3><p><span class="en">end</span>サブルーチンは最後に呼び出されます。それは全ての出力が処理されてブラウザに送られた後で、<span class="en">Blosxom</span>が実行を終了する前です。</p><pre class="en">
sub end {
1;
}
</pre><p>このサブルーチンには何も渡されません。</p><p>ここはクリーンナップまたは便利と思う処理を行う最後の場所です。私はたくさんの利用方法を見つけました。それは<span class="en">"touch file"</span>の修正日から何か変更がある場合かどうか<span class="en">weblogs.com</span>に<span class="en">ping</span>を打ったり何時間も経過したあとに新しいウェブログを投稿したと言う事をメーリングリストにメールを送信するような使い方です。</p><h3>...サブルーチン ...<span class="be">last</span></h3><p><span class="en">last</span>サブルーチンフックはブラウザで表示される、またはファイルを保存する(静的表示の場合)と言うよりも、ヘッダが出力され、全ての<span class="en">kit-and-karboodle</span>が生成ルーチンで返される前に呼び出されます。</p><p>このサブルーチンには<span class="en">Blosxom</span>から何も渡されません。</p><p class="nextLink"><a href="#top">[ページの先頭へ戻る]</a></p></td>
</tr>
</tbody>
</table>
<div id="footer"> </div>
</body>
</html>