カテゴリを Photo にした場合、Aggreg8 などの RSS リーダではタイトルしか表示されない(RSS リーダだとタイトルしか見えないエントリ参照)。この問題を解決するためにプラグインを書くことにした。
■ ■ ■
これまで、「Recent Photos」を表示させるために Photo thumbnail [dh's memoranda] で紹介されている方法をとり、インデックステンプレートには次のように書いていた。
<div class="sidetitle">
Recent Photos
</div>
<MTEntries category="Photo" lastn="5">
<div class="thumbnail">
<a href="<$MTEntryLink$>"><$MTEntryExcerpt$></a>
</div>
</MTEntries>
この方法は、カテゴリを「Photo」にしたとき、同時に「概要(excerpt)」に <img> タグを書いておいて、インデックス側で <$MTEntryExcerpt$> を参照して <img> タグを表示するものである。しかし、これには次のような不便な点があった。
- 「概要」に <img> タグ以外の文字を書くと、「Recent Photos」にもその文字が表示されてしまう
- 「概要」に <img> タグだけを書くと、「Recent Photos」は正しく表示されるが、RSS リーダで読むと内容が表示されない
つまり、RSS リーダは、「概要」があればそれを優先して読む。しかし <img> タグなので表示できないという訳である。
この問題を解決するには、
- エントリを登録する際に、概要と <img> タグの両方を「概要(exerpt)」に書いておく
- 参照する側で <img> タグだけを抽出する
を行えばよい。
<img> タグを抽出するプラグインは次の通り。
use strict;
use MT::Template::Context;
MT::Template::Context->add_container_tag(CExtractImgTag => \&CExtractImgTag);
sub CExtractImgTag {
my ($ctx, $args) = @_;
my $tokens = $ctx->stash('tokens');
my $builder = $ctx->stash('builder');
defined(my $html = $builder->build($ctx, $tokens))
or return $ctx->error($builder->errstr);
my $out;
$html =~ s/\s+/ /g;
while ($html =~ m/(<img.*?>)/ig) {
$out .= $1;
}
$out;
}
1;
赤字の部分だけが本質的なところで、その他はおまじないである。やっているのは
- 改行その他の空白文字を、スペース1つに置き換え
- <img> タグだけを抽出
だけである。タグの大文字小文字は区別せず、タグが複数あっても抽出可能とした。
プラグインを導入すると、メインインデックスは次のようになる。
<div class="sidetitle">
Recent Photos
</div>
<MTEntries category="Photo" lastn="5">
<div class="thumbnail">
<a href="<$MTEntryLink$>"><MTCExtractImgTag><$MTEntryExcerpt$></MTCExtractImgTag></a>
</div>
</MTEntries>
コンテナタグを追加するにも関わらず、コンテナタグの中で使うタグを追加しない、という不思議なプラグインになった。
プラグインのダウンロードとインストール方法についてまとめたページはこちら:
何だかんだ言っても、Aggreg8 を結構使っていることに気がついた。
Trackback to: Photo thumbnail [dh's memoranda]
Posted by n at 2004-03-23 21:58 | Edit | Comments (3) | Trackback(0)
「概要(excerpt)」に何も書かないと、構築に失敗することが分かった。注意が必要。
Posted by: n at March 27, 2004 01:40--
An error occurred:
テンプレート 'Main Index' の作成に失敗しました:
MT::App::CMS=HASH(0x8399fe4) Use of uninitialized value in concatenation (.) or string at CGIPath/lib/MT/Builder.pm line 121.
--
バージョン 1.1 でこの問題は解決。
Posted by: n at March 27, 2004 14:30http://nlogn.ath.cx/archives/000113.html
すみません。こちらにコメント欄があったのですね。
Posted by: ヨンシマイ at October 08, 2006 01:45プラグイン使わせていただいてありがとうございました。大変重宝しております。
熱の方、大丈夫ですか?
ゆっくり睡眠をとって休養してください。
あちらのコメントは削除していただいて結構です。
それでは。