MT4i相互乗り入れ実験

Ver1.81β3で新たに追加になった「自Blog内のMT4i表示」機能ですが、やっぱり他のMT4i利用サイトさんへのリンクも、そのままMT4iで表示するようにしたいわけです。

さて、太鉄さんが実装された「自Blog内のMT4i表示」は、PermalinkのURLを正規表現で自Blog内かどうかを判断し、エントリーIDを取り出して表示するというものです。でも、他Blogではそういう訳にもいきません。

そこで他サイトのMT4iと連携する方法をいくつか考えてみましたが、一番現実的なのはやはりHTMLに<link rel=”alternate” …>でMT4iへのリンクを指定する方法ではないかと思います。

MT4iでそれをパースし、見つかった時はMT4iのリンクを優先すればよいわけです。

で、さっそく実験してみます。思い立ったが吉日ってやつです。

まず、MTのテンプレートをいじります。今回はとりあえずMain Indexと、Individual Archiveのみ。(カテゴリーアーカイブなんかもやろうと思えばできると思いますが)

もしmt.cgiと同じディレクトリにmt4i.cgiを配置しているのなら、Main Index Templateの、<link rel=”stylesheet” …の下辺りに、

<link rel="alternate" type="application/x-httpd-cgi" title="MT4i" href="<$MTCGIPath$>mt4i.cgi?id=<$MTBlogID$>" /> 

Individual Archive Templateの、<link rel=”stylesheet” …の下辺りに、

<link rel="alternate" type="application/x-httpd-cgi" title="MT4i" href="<$MTCGIPath$>mt4i.cgi?id=<$MTBlogID$>&mode=individual&eid=<$MTEntryID$>" />

などと追加します。

要するに、hrefがそのページのMT4i版URLを正しく示すように、<link…/>タグをTemplateに追加します。

MT4i側では、

# リンク先を取得
my $mt4ilink = "";
require LWP::Simple;
my $content = LWP::Simple::get($url);
if ($content) {
  require HTML::TokeParser;
  if (my $p = HTML::TokeParser->new(\$content)) {
  while (my $token = $p->get_tag('link')) {
    # attr check
    my $rel   = $token->[1]{rel};   # alternate
    # ダブル・シングルクォーテーションを取り除く
   $rel =~ s/"//g;
    $rel =~ s/'//g;
    # MT4iへの完全URL
    my $href  = $token->[1]{href};
    # application/x-httpd-cgi
    my $type  = $token->[1]{type}; 
    my $title = $token->[1]{title}; # MT4i
    $title =~ s/"//g;
    $title =~ s/'//g;
    if ((lc $rel) eq 'alternate' 
            && (lc $title) eq 'mt4i') {
      $mt4ilink = $href;
    }
  }
}

のようなコードを追加して、linkタグのhrefに指定されているMT4iリンクを取得してそれに置き換えます。これで他のBlogについても、Mt4iで表示できるようになります。(CPANモジュールのLWP::SimpleとHTML::TokeParserを利用しています)

ただ、いくつか問題もあります。

HTMLヘッダーで<link rel=”alternate=”…>が指定されていないサイトへのリンクは当然MT4iへのリンクにはなりません。これは仕方がないですが(苦笑)

あともう一つは、既にお気づきの方もいらっしゃるかもしれませんが「記事の通し番号」(noで取り回されているもの)がTemplateで指定できないこと。こちらのほうは、MT4i側で通し番号の扱いを変更するしかないのかな・・・。

とりあえず今回は実験なので、noを指定しないでやってみました。したがってIndividualではタイトル表示で通し番号が表示されていません。更に「前の記事へ」というリンクが表示されません。

動作サンプルはこちら

自動相互乗り入れ機能をご覧になるには、ここの「この記事」というリンクをたどってみてください。リンク先は自Blog内なのでイマイチ分かり辛と思いますが、ご勘弁を。

変更したmt4i.cgiはここに置いておきます。

13 Comments

  • Pingback: 人生迷い箸

  • Pingback: 人生迷い箸

  • コメントを残す

    メールアドレスが公開されることはありません。