MovableType から、
はてなダイアリーキーワードへ
リンクを貼る
プラグインは幾つか存在するようですが、
折角に訪問頂いたビジターを外部コンテンツに安易に誘導することは少なからず勿体無い気がします。
当サイトでは
Tagwire plugin を使って独自にタグデータベースを蓄積していますので、
これを上手に使って似たようなことができないでしょうか?
そこで、ビジターに一つでも多くの記事を参照してもらう機会を増やせるよう、
はてなのキーワード
リンクよろしく記事文中に現れた文字列に自動的にタグ
リンクを張れるようにしてみました。
Regexp::TrieEUC の導入
Regexp::TrieEUC は文字列のリストから TRIE の生成を行い、
それを
Perl の正規表現式として変換するためのモジュールです。オリジナルは、
404 Blog Not Foundの
Dan Kogaiさんが、
TRIE-Optimized Regexp で公開されている
mk_trie_regexp.pl です。
これを使用することで、大量のキーワード文字列を効率的にパターンマッチ可能な正規表現式を得ることができます。
今回は、これを
日本語(euc-jp)で動作するように少し手を入れています。
以下のコードを
(MovableType のインストールパス)/extlib/Regexp/TrieEUC.pmとして保存します
(アーカイブが
ダウンロードできます)
少し長いですがガンバってください(?)
Ogawa::Memorandaで公開されている
小川宏高さん作の
Tagwire pluginに以下のコードを追加します
(修正済みアーカイブが
ダウンロードできます)
MTTagsAsKeyword の処理については、再びDan Kogaiさん公開の
Click'n Hatenizeを
大変参考にさせて頂きましたm(_ _)m ありがとうございます。
Jcode.pm のアップグレード 
MovableType のパッケージに添付されている Jcode.pm (3.2ja2 のものはバージョン 0.88)では、
UTF8 などの環境で
文字化けが発生する例が報告されています。
Tagwire plugin w/ TrieEUC 0.11 でこの問題は解決されていますが、
これと併せて Jcode.pm のバージョンを 1.99 以上にアップグレードする必要があります。
- 新しいバージョンの Jcode.pm パッケージを取得します
- MovableType の(インストールディレクトリ)/etlib に含まれる Jcode.pm と Jcode ディレクトリに、取得したアーカイブに含まれる同名のファイル/ディレクトリで上書きします
参考リンク:Shift_JIS に含まれない文字をエスケープ (Jcode.pm編)
今回、
Tagwire plugin に以下の
テンプレートタグを追加しました。
- MTTagsAsRegexp
- Tagwire plugin に登録されている全てのタグから、
後述するオプションで指定された条件に合致するタグを表す正規表現式を生成するためのテンプレートタグです。
生成された正規表現式は MTTagsAsKeyword で使用することができます。
- cutoff_score
- 指定されたスコア未満のタグを正規表現式に含みません。
タグの使用頻度に基づいてフィルタをしたい場合に使用します。
0 から 100 までの整数値を指定します。
指定が無い場合のデフォルト値は 0 で、スコアが 0 点以上のタグ、即ち全てのタグが対象になります。
- cutoff_length
- 指定された文字列長さ未満のタグを正規表現式に含みません。
0 以上の整数値を指定します。
指定が無い場合のデフォルト値は 0 で、0 文字以上のタグ、即ち全てのタグが対象になります。
- case_sensitive
- タグの大文字/小文字の区別を 0 か 1 で指定します。
指定が無い場合のデフォルト値は 1 で、大文字と小文字を区別します。
- MTTagsAsKeyword
- 文字列中にタグが出現した場合、それをパターンで置き換えるためのコンテナタグです。
- repeat_count
- タグを発見した場合、そのタグの repeat_count 回数目の登場までをキーワードリンクとします。
指定がない場合のデフォルト値は 0 で、登場する全ての場合がキーワードリンクになります。
- keyword_pattern
- 発見したタグを指定されたパターンで置き換えます。
置換パターン中の HTML エンティティはエスケープしておいてください。
パターン中で以下の文字列を使用することができます。
- %k
- 該当するタグそのものに置換されます。
- %e
- 該当するタグを URL エンコードしたものに置換されます。
keyword_pattern="<a href="/tag/%e">%k</a>"
- regexp_file
- 指定されたファイルの内容をタグ検索のための正規表現式として使用します。
その動作は <$MTInclude file="..."$> に準じます。
- regexp_template
- 指定されたインデックステンプレートによって生成されたファイルの内容をタグ検索のための正規表現式として使用します。
その動作は <$MTLink template="..."$> に準じます。
- regexp_module
- 指定されたテンプレートモジュールの構築結果を、タグ検索のための正規表現式として使用します。
その動作は <$MTInclude module="..."$> に準じます。
構築のたびに正規表現式の生成が行われるため、タグ数が増えた場合にパフォーマンス上の問題となる可能性があります。
regexp_file、regexp_template、regexp_module が何れも指定されていない場合、
内部的にデフォルトパラメータを用いて MTTagsAsRegexp を呼び出します。
そのため、構築のたびに正規表現式の生成が行われるため、
タグ数が増えた場合にパフォーマンス上の問題となる可能性があります。
- ignore_tags
- デフォルトで a,blockquote,pre,textarea,script 内部に含まれるテキストにはタグリンクを生成しません。
他に追加していしたい HTML タグがある場合、それらのタグをコンマで区切って指定することができます。
ignore_tags="span,address"
- apply_tags
- ignore_tags とは逆に、その内部でタグリンクを生成させたい HTML タグをコンマで区切って指定することができます。
apply_tags="a,textarea"
これらの指定はデフォルトのignore_tags < ignore_Tags < apply_tags の順に優先されます。
正規表現式の生成とテンプレートタグの修正
タグを抽出するための正規表現式を生成し、この正規表現式を使って文章中のタグに
リンクを与えます。
これには
MTTagsAsRegexp と
MTTagsAsKeyword を使用します。
case 1. 正規表現式が外部ファイルの場合
別途ファイルとして用意された正規表現式の、そのファイル名を指定する方法です。
この場合は MTTagsAsRegexp を使用しません。
MTTagsAsKeyword の regexp_file オプションでファイル名を指定します。
case 2. インデックステンプレートを使用する場合
MTTagsAsRegexp をインデックス
テンプレート内で使用し、
テンプレートを構築することで正規表現式をファイルに書き出します。
書き出されたファイルは MTTagsAsKeyword から regexp_template オプションで、
その
テンプレート名を指定することで使用することができます。
Tags Regexp Template インデックステンプレート
case 3. モジュールテンプレートを使用する場合
MTTagsAsRegexp をモジュール
テンプレート内で使用し、再構築毎に正規表現式を生成します。
正規表現式は MTTagsAsKeyword の regexp_module オプションで指定します。
MTTagsAsKeyword が出現するたびに、内部的に MTTagsAsRegexp が呼ばれるため、
パフォーマンス上の問題となる場合があります。
Tags Regexp Module モジュールテンプレート
既知の不具合
- 単語境界を判別しません。そのため "IE" タグは "BOOGIE-WOOGIE(ヴギウギ)" に反応します
Tagwire plugin; Copyright 2005, Hirotaka Ogawa (hirotaka.ogawa at gmail.com)
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
mk_trie_regexp.pl is the original of TrieEUC. Copyright 2005, dankogai
雑記
とりあえず動くところまでは何とかなったものの、もしかすると効率の悪いことをやっているかも知れず。
何かありましたら遠慮なくツッ込んで頂けると有り難いです。
今回、自分で作った部分は大した事をしていなくて、
コードの骨格や重要な部分はネット上の様々な先輩方の功績から拝借させて頂いたものです。
有用なリソースを精力的に公開されている方々に改めて感謝をいたしますm(_ _)m
しかし、登録されているタグが高々 150 個程度では、それほど面白いことになりませんでした。
そういう意味ではハテナの有する20万を超えるキーワードは非常に貴重なコンテンツなんだと思い知らされました。
寄せられたコメント (最新 5 件を表示しています)
Tagwire pluginが0.26にアップしたので、Tagwire plugin の改造をやり直しているのですがどうも上手くいきません。
Tagwireのコードが変わってしまっているせいだろうとは思うのですが、当然素人が手を出せるものでは無さそうです。
どこをどうしたらいいのでしょうか?
とりとめのない質問で申し訳ありませんが、(今更という気もしますが)対応をお願いします。
13:やすひささんと同様に、
keyword_pattern="<a href="/tag/%e">%k</a>"
の%kが文字化けを起こして正しく表示されません。
その後、この問題は解決されたのでしょうか?
解決方法があれば、教えてください。お願いします。
内部で文字コードの変換をしている部分があるのですが、
ここでの処理に失敗しているのでしょうか??
# (MTの文字コード)→EUC-JP→(MTの文字コード)という感じ
この部分、ちょっと(かなり?)いい加減なところがあるので少し見直してみますね…
こんにちは。ご無沙汰しております。
試しにPerl5.8.7のサーバ(前と同じくxrea.comですが、サーバ違い)に設置してみると、「〜」の文字化けはなくなりました。
ただ、キーワードパターンの「%k」に限って、2バイト文字のタグだと化ける用になってしまいました。
※「%k」でも1バイト文字のタグと、「%e」では問題ありませんでした。
また、Perl4.6.1のサーバではこの現象が起きていませんでした。
どうぞ、よろしくお願いします。
パッチを当てることはできました。
あとはコンパイルできれば何とかなりそうなのですが、環境になくコンパイルできません。
次元の低い話で申し訳ありません…。
ちなみに、Perl 4.8.1 にアップしようとサーバを変えてみようとか思いましたが、エントリーがうまく移行できなかったのであきらめました。