Tagwireプラグイン

エントリーのキーワードをイワユル「タグ」として利用するための機能を提供するプラグイン。

tagwire.zip

本ソフトウェアは個人用・商用を問わず無償で提供されています。継続的な開発をご支援くださる方はご寄付をご考慮ください。

更新履歴

  • 0.10 (2005.03.19):
    • AllKeywords Pluginを公開開始。
  • 0.20 (2005.06.24):
    • Tagwire Pluginに改名、英語ドキュメントとともに公開開始。
  • 0.21 (2005.06.25):
    • encode_urlplusフィルタを追加。
  • 0.22 (2005.06.30):
    • 目立たないバグを修正。
    • MT3.?の新しいプラグインインタフェースをサポート。
  • 0.23 (2005.07.06):
    • SQLiteを使っている場合に限り、PluginDataが重複してしまう問題を解決。
  • 0.24 (2005.07.13):
    • MTTagDateタグ、MTRelatedTagsコンテナタグ、MTXSearchTagsコンテナタグを追加。
    • PluginDataをバージョン管理するように変更。
    • PluginDataの削除を行うツールを追加。
  • 0.24a (2005.07.14):
    • バグフィックス。
  • 0.25 (2005.07.20):
    • さらにバグフィックス。
  • 0.26 (2006.05.28):
    • $ENABLE_PD_INDEXES, $ENABLE_REQ_CACHEオプションを削除した。利用できる場合には利用するように動作を変更した。
    • FastCGIなどの常駐環境でMT-XSearchを使うと激しくメモリーリークする問題を解決した。
    • エントリーを削除した際にPluginDataが更新されない問題を解決した。
    • エントリーのキーワード欄に「#」を記述すると、それ以降の文字列はタグとして解釈しないように動作を変更した。
    • その他、細かい修正。

概要

Tagwire Plugin(aka AllKeywords Plugin)は、Movable Typeのエントリーのキーワード部分を使ったタグハンドリングを実現するプラグインです(参考: 四畳半フォークソノミーの実現に向けて - Ogawa::Memoranda)。目的を同じくするTags Plugin、Tagslite Pluginと比較すると、以下の特徴を持っています:

  • 多言語タグのサポート
  • 柔軟なタグ形式のサポート
  • カテゴリーを使わない実現: Tagwireはエントリーのキーワード部分だけを使用します。カテゴリーは本来の目的で利用できます。
  • full-fledgedなタグハンドリング機能: 利用されているタグやその個数をリストアップする機能、指定したタグにマッチするエントリーをリストアップする機能、類似度が高い(現在のエントリーとマッチするタグの数が多い)エントリーをリストアップする機能などが利用できます。
  • 実用に堪える再構築時間: カテゴリーを使用しないトレードオフとして、Tagwire Pluginはタグ情報のインデクシングをDB支援なしで実現しますが、PluginDataやRequest Cacheの活用によって十分な再構築速度を達成しています。
  • MT-XSearchとの連携による動的タグアーカイブ: 静的にタグアーカイブを生成しない代わりに、MT-XSearchと連携して動的なタグアーカイブの生成を支援します。タグアーカイブの再構築コストがかからず、また複数のタグを含むエントリーを抽出することもできます。

インストール方法

Tagwireプラグインをインストールするには、パッケージに含まれるtagwire.plをMovable Typeのプラグインディレクトリにアップロードもしくはコピーしてください。

正しくインストールできていれば、Movable TypeのメインメニューにTagwire Pluginが新規にリストアップされます。

タグ形式

エントリーのキーワード欄に記述された文字列は自動的にタグとして認識されます。ブラケット[]、シングルクォート・ダブルクォートで囲まれた文字列は一個のタグとして認識します。また、「;,|」は区切り文字として機能します。キーワード欄に「;,|」が含まれない場合には空白文字が区切り文字として機能します。

下記の例はすべて「Movable Type」と「Plugin」という二個のタグとして認識します。

"Movable Type" Plugin
Movable Type, Plugin
Movable Type|Plugin|
[Movable Type][Plugin]

また、以下の例は「MT」と「Plugin」という二個のタグとして認識します。

MT Plugin

追加されるタグ・フィルタ

以下ではTagwireプラグインによって導入されるMovable Typeのタグについて説明します。

MTTagsコンテナタグ

ブログ内のすべてのタグをリストアップするコンテナタグ。

オプション

glue="glue"
リストアップ時にglueで指定された文字列をタグの間に挿入・表示します。例えば、タグを「,」で区切って表示したい場合に役に立ちます。
sort_by="tag|tag-case|count"
リストアップする順序を、大文字・小文字を区別しないアルファベット順(tag)、大文字・小文字を区別するアルファベット順(tag-case)、出現頻度順(count)の中から選択します。デフォルトでは大文字・小文字を区別しないアルファベット順です(sort_by="tag")。
sort_order="ascend|descend"
リストアップする順序を昇順(ascend)か降順(descend)かを選択します。デフォルトでは昇順(ascend)です。
lastn="N"
リストをN個まで表示します。デフォルトではすべて表示します。
case_sensitive="0|1"
キーワードの大文字・小文字を区別するかどうかを指定します。区別する場合にはプラグインは「Apple」と「appLE」を異なるタグとみなしますが、区別しない場合には同一のタグとみなします。デフォルトでは区別します(case_sensitive="1")。

このコンテナタグの中で利用可能なタグ

<$MTTag$>
タグを表示します。
<$MTTagCount$>
タグの出現回数を表示します。
<$MTTagDate$>
タグが最後に追加された日時を表示します。MTEntryDateなどと同様にformat, language, utcオプションが使えます。
<$MTTagsTotal$>
すべてのタグの個数を表示します。MTTagsコンテナの直後でも利用可能です。
<$MTTagsTotalSum$>
すべてのタグの出現回数の総和を表示します。MTTagsコンテナの直後でも利用可能です。

使用例

出現頻度の高い10個のタグをリストアップしてそれぞれをTechnorati Tagにリンクするには、以下のように記述します。

<ul>
  <MTTags sort_by="count" sort_order="descend" lastn="10">
  <li><a href="http://www.technorati.com/tag/<$MTTag encode_url="1"$>"
    rel="TAG" title="TAG:<$MTTag$>"><$MTTag$></a> (<$MTTagCount$>)</li>
  </MTTags>
</ul>
<ul>
  <li>Total Tags: <$MTTagsTotal$></li>
  <li>Total Tags(Sum): <$MTTagsTotalSum$></li>
</ul>

また、Ogawa::Memoranda TagsはMTTagsを使った例の一つです。

MTEntryTagsコンテナタグ

エントリーコンテキスト(MTEntriesの内部、または個別アーカイブ内)でMTTagなどを利用可能にするコンテナタグ。

オプション

glue="glue"
リストアップ時にglueで指定された文字列をタグの間に挿入・表示します。例えば、タグを「,」で区切って表示したい場合に役に立ちます。
case_sensitive="0|1"
キーワードの大文字・小文字を区別するかどうかを指定します。デフォルトでは区別します(case_sensitive="1")。

このコンテナタグの中で利用可能なタグ

<$MTTag$>
タグを表示します。

使用例

各エントリーのタグをリストアップしてそれぞれをTechnorati Tagにリンクするには、以下のように記述します。

<MTEntries lastn="10">
<h2><$MTEntryTitle$></h2>
 
<ul>
  <MTEntryTags>
  <li><a href="http://www.technorati.com/tag/<$MTTag$>"
    rel="TAG" title="TAG:<$MTTag encode_url="1"$>"><$MTTag$></a></li>
  </MTEntryTags>
</ul>
 
<$MTEntryBody$>
</MTEntries>

MTRelatedTagsコンテナタグ

タグコンテキスト(MTTags、MTEntryTags、MTXSearchTagsの内部)で現在のタグに関連するタグをリストアップするコンテナタグ。関連するタグとは、各エントリーで共通に使用されているタグのことです。

オプション

glue="glue"
リストアップ時にglueで指定された文字列をタグの間に挿入・表示します。例えば、タグを「,」で区切って表示したい場合に役に立ちます。
sort_by="tag|tag-case|count"
リストアップする順序を、大文字・小文字を区別しないアルファベット順(tag)、大文字・小文字を区別するアルファベット順(tag-case)、出現頻度順(count)の中から選択します。デフォルトでは大文字・小文字を区別しないアルファベット順です(sort_by="tag")。
sort_order="ascend|descend"
リストアップする順序を昇順(ascend)か降順(descend)かを選択します。デフォルトでは昇順(ascend)です。
lastn="N"
リストをN個まで表示します。デフォルトではすべて表示します。
case_sensitive="0|1"
キーワードの大文字・小文字を区別するかどうかを指定します。デフォルトでは区別します(case_sensitive="1")。

このコンテナタグの中で利用可能なタグ

<$MTTag$>
タグを表示します。
<$MTTagCount$>
タグの出現回数を表示します。
<$MTTagDate$>
タグが最後に追加された日時を表示します。MTEntryDateなどと同様にformat, language, utcオプションが使えます。

使用例

エントリーのタグと、それらに関連するタグをリストアップし、それぞれをTechnorati Tagにリンクするには、以下のように記述します。

<MTEntries lastn="10">
<h2><$MTEntryTitle$></h2>
 
<ul>
  <MTEntryTags>
  <li><a href="http://www.technorati.com/tag/<$MTTag encode_url="1"$>"
    rel="TAG" title="TAG:<$MTTag$>"><$MTTag$></a>
    <ul>
      <MTRelatedTags>
      <li><a href="http://www.technorati.com/tag/<$MTTag encode_url="1"$>"
        rel="TAG" title="TAG:<$MTTag$>"><$MTTag$></a></li>
      </MTRelatedTags>
    </ul>
  </li>
  </MTEntryTags>
</ul>
 
<$MTEntryBody$>
</MTEntries>

MTEntriesWithTagsコンテナタグ

指定したタグを含むエントリーを(作成時刻順に)リストアップするコンテナタグ。

オプション

tags="tag-list"
リストアップする対象となるタグを一個以上指定します。
delimiter="区切り文字"
tagsオプションで指定したタグリストからキーワードを切り出す際に使用するデリミタ文字を指定します。例えば、「tags="fruits,apple" delimiter=","」とするとカンマで区切られた語を一個のタグと認識します。デフォルトでは空白文字(スペース、タブ)をデリミタとします。
case_sensitive="0|1"
キーワードの大文字・小文字を区別するかどうかを指定します。デフォルトでは区別します(case_sensitive="1")。
sort_order="ascend|descend"
リストアップする順序を昇順(ascend)か降順(descend)かを選択します。デフォルトでは降順(descend)です。
lastn="N"
リストをN個まで表示します。デフォルトではすべて表示します。

このコンテナタグの中で利用可能なタグ

MTEntriesコンテナと同様に「MTEntry*」というタグが一通り利用できます。

使用例

"movable"と"type"というタグを含むエントリーをすべてリストアップし、タイトルと本文を表示するには、以下のように記述します。

<MTEntriesWithTags tags="movable type">
<h2><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h2>
 
<$MTEntryBody$>
<$MTEntryExtended$>
 
</MTEntriesWithTags>

MTMostRelatedEntriesコンテナタグ

エントリーコンテキスト(MTEntriesの内部、または個別アーカイブ)で関連するタグを持つ他のエントリーをリストアップするコンテナタグ。関連度が高い(関連するタグの個数が多い)エントリーから順にリストアップします。

オプション

case_sensitive="0|1"
キーワードの大文字・小文字を区別するかどうかを指定します。デフォルトでは区別します(case_sensitive="1")。
lastn="N"
リストをN個まで表示します。デフォルトではすべて表示します(lastn="0")。

このコンテナタグの中で利用可能なタグ

MTEntriesコンテナと同様に「MTEntry*」というタグが一通り利用できます。

使用例

MTEntriesで最近の10件をリストアップし、そのそれぞれのエントリーについて関連するエントリーを10件リストアップするには、以下のように記述します。

<MTEntries lastn="10">
  <h2><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h2>
  <$MTEntryBody$>
 
  <ul>
    <MTMostRelatedEntries lastn="10">
    <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
    </MTMostRelatedEntries>
  </ul>
</MTEntries>

MTXSearchTagsコンテナタグ

MT-XSearchのクエリー文字列として与えられたタグをリストアップするコンテナタグ。このコンテナタグはMT-XSearchのテンプレートの中でのみ利用できます。

オプション

glue="glue"
リストアップ時にglueで指定された文字列をタグの間に挿入・表示します。例えば、タグを「,」で区切って表示したい場合に役に立ちます。

このコンテナタグの中で利用可能なタグ

<$MTTag$>
タグを表示します。

使用例

MT-XSearchのクエリー文字列として与えられたタグと、それらに関連するタグをリストアップし、それぞれをTechnorati Tagにリンクするには、以下のように記述します。

<MTXSearchTags>
<h2><$MTTag$></h2>
 
<ul>
  <MTRelatedTags>
  <li><a href="http://www.technorati.com/tag/<$MTTag encode_url="1"$>"
    rel="TAG" title="TAG:<$MTTag$>"><$MTTag$></a></li>
  </MTRelatedTags>
</ul>
</MTXSearchTags>

encode_urlplusフィルタ

encode_urlフィルタの代替として利用できるフィルタです。encode_urlではフィルタ対象となる文字列の空白文字が「%20」に変換されますが、encode_urlplusでは「+」に変換されます。

使用例

以下のようにURL文字列を生成する際にencode_urlフィルタの代わりにencode_urlplusフィルタを使用できます。

<ul>
  <MTEntryTags>
  <li><a href="http://www.technorati.com/tag/<$MTTag encode_urlplus="1"$>"
    rel="TAG" title="TAG:<$MTTag$>"><$MTTag$></a></li>
  </MTEntryTags>
</ul>

少し進んだトピックス

デバッグオプション

tagwire.plの最初のところに定義されている変数を変更することでプラグインの動作を微調整することができます。特に動作に問題がない場合には変更しないことをお勧めします。

$FORCE_PD_REFRESH
タグのインデックス情報を一から生成するか($FORCE_PD_REFRESH=1)、すでに格納されているインデックスとの差分から生成するか($FORCE_PD_REFRESH=0)を選択します。デフォルトでは後者で、エントリー保存時のオーバーヘッドが前者より小さくなります。ただし、PluginDataが何らかの理由で破壊された場合などは一旦このオプションを1に変更してインデックス情報を一から作り直すことで回復できます。

AllKeywords Pluginとの互換性

Tagwire Pluginは以前のAllKeywords Pluginとほぼ互換性があります。AllKeywords Plugin用に書かれたテンプレートはTagwire Pluginでもほぼそのまま利用できます。いくつかのマイナーなオプションは無視されて期待するのと異なる結果が得られる可能性がありますが、再構築に失敗することはありません。

PluginDataのクリーンアップ

Tagwire Pluginはデフォルトでエントリーの保存時にタグのインデックス情報をPluginDataに格納しますが、以前のバージョンのバグでSQLiteを使用している場合にはこのインデックス情報が重複して作られていることがあります。

tagwire.zipに同梱されているtagwire-pdcleaner.cgiを利用すると、Tagwire Pluginが作成したPluginDataを完全に削除することができます。

利用するためには、tagwire-pdcleaner.cgiをmt.cgiなどと同じディレクトリにアップロードまたはコピーし、実行パーミッションを設定してください。Webブラウザなどでtagwire-pdcleaner.cgiにアクセスするとPluginDataが削除されます。削除後は速やかにtagwire-pdcleaner.cgiを削除することをお勧めします。

See Also

TODO

  • ドキュメントの整備
  • ダイナミックパブリッシングのサポート

License

This code is released under the Artistic License. The terms of the Artistic License are described at http://www.perl.com/language/misc/Artistic.html.

Author & Copyright

Copyright 2005,2006 Hirotaka Ogawa (hirotaka.ogawa at gmail.com)