印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
DownloadMovableTypePlugin IMG タグ抽出プラグイン 1.0

カテゴリを 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. 改行その他の空白文字を、スペース1つに置き換え
  2. <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)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments

「概要(excerpt)」に何も書かないと、構築に失敗することが分かった。注意が必要。
--
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.
--

Posted by: n at March 27, 2004 01:40

バージョン 1.1 でこの問題は解決。
http://nlogn.ath.cx/archives/000113.html

Posted by: n at March 27, 2004 14:30

すみません。こちらにコメント欄があったのですね。
プラグイン使わせていただいてありがとうございました。大変重宝しております。
熱の方、大丈夫ですか?
ゆっくり睡眠をとって休養してください。
あちらのコメントは削除していただいて結構です。
それでは。

Posted by: ヨンシマイ at October 08, 2006 01:45
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?