Jul 17, 2004

Movable Type 3.01D 日本語版・修正案

このエントリでは、Movable Type 3.01D 日本語版の修正案を述べています。

今のところ、以下の7点。ときどき気ままに追加・修正されることがあります。現状の動作に特に不具合を感じていないのであれば、以下の修正を適用する必要はありません。

  1. PublishCharsetがShift_JISのとき、dirifyが意味のない文字列を生成する。
  2. PublishCharsetがUTF-8以外のとき、コメント・トラックバックの通知メールのタイトルなどが文字化けする(translateの問題)。
  3. 広告リンクなどを自動的に挿入するサイトでは、コメンターURLへのリダイレクトが失敗する。
  4. MySQLを使っている場合(おそらくPostgreSQLの場合も)、月別アーカイブおよび日別アーカイブのMTArchiveCountが誤った値を返す場合がある。
  5. バグではないが、lib/MT/Mail.pmがJcode.pmを直接ハンドルしている。
  6. lib/MT/I18N.pmのfirst_n_textが改行を除去しない。
  7. mt-tb.cgiがHTTP HeaderにPublishCharsetを返すため、本文のencodingと矛盾している。

Ogawa::Buzz: MT3.01D 日本語版「勝手にパッチパッケージ」Release 1では、これらの不具合を修正するためのUnofficial patchを配布しています。

(1) PublishCharsetがShift_JISのとき、dirifyが意味のない文字列を生成する(例:ベッド→xbh)。

これはUTF-8、EUC-JPでは2バイト(以上の)文字が0x80-0xFF領域で表現されるのに対し、Shift_JISでは2バイト目が0x40-0x7F領域になる文字があるためです。以下のパッチは、前もってUTF-8に変換しておくことでこの問題を回避します。EUC-JPに変換するようにしても構いません。

(2) PublishCharsetがUTF-8以外のとき、コメント・トラックバックの通知メールのタイトルなどが文字化けする(translateの問題)。

典型的にはlib/MT/App/Comments.pmなどで以下のようなコードが含まれています。

$app->translate('New Comment Posted to \'[_1]\'', $entry->title)

仮にPublishCharsetがShift_JISで、Entry Titleが日本語を含んでいたとすると、上はShift_JISとUTF-8のmixtureを生成しますから当然文字化けします。以下のパッチはtranslateの二番目以降の引数をあらかじめめUTF-8に変換しておくことでこの問題を回避します。

コード判定のコストやミスの可能性を考えると、上記のようなすべての局面で以下のように修正する方がよいのかもしれませんが、ソースのあちこちに点在しているため網羅するのは非常に大変です。

$app->translate('New Comment Posted to \'[_1]\'',
                MT::I18N::encode_text($entry->title,'','utf-8'))

(3) 広告リンクなどを自動的に挿入するサイトでは、コメンターURLへのリダイレクトが失敗する。

コメンター情報としてURLを入力した場合、MTCommentAuthorLinkは通常そのURLへのリダイレクトページ(mt-comments.cgi?__mode=red;id=XXX)へのリンクを生成します。

<html><head><title>Redirecting...</title>
<meta name="robots" content="noindex, nofollow">
<script type="text/javascript">
window.onload = function() { document.location = document.links[0].href; };
</script></head>
<body>
<p><a href="http://...">Click here</a> if you are not redirected</p>
</body>
</html>

このHTMLの意味するところは、ページ内に存在する最初のリンクにリダイレクトするということです。通常は「<a href="http://...">Click here</a>」がその該当リンクとなりますが、広告リンクなどを自動的に挿入するサイトではこのリンクの前に広告リンクが挿入され、リダイレクトはそのページに対して行われることになります。これは期待される動作ではありません。

この問題を解決するには、lib/MT/App/Comments.pmの111行目あたりを以下のように修正する必要があります。また、この修正を行っても広告が挿入されないサイトも通常通り動作します。

(4) MySQLを使っている場合(おそらくPostgreSQLの場合も)、月別アーカイブおよび日別アーカイブのMTArchiveCountが誤った値を返す場合がある。

MySQLを使っている場合(おそらくPostgreSQLの場合もですが)、月別アーカイブおよび日別アーカイブに限って、下書きとして保存したエントリがMTArchiveCountに数え上げられてしまいます。具体的には以下のテンプレートを再構築したときにこの現象が観測できます。

<ul>
<MTArchiveList archive_type="Monthly">
<li><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a>
(<$MTArchiveCount$>)</li>
</MTArchiveList>
</ul>

これはMT3.0で導入されたlib/MT/ObjectDriver/DBI.pmのcount_group_byという高速化ルーチンを使うコードの周辺で起きています。具体的には以下の修正が必要です。

上の修正の代わりに、count_group_byを使わないようにlib/MT/Template/Context.pmの1795行目あたりに定義されているSPEEDUP_ENABLEDという定数を0にセットするという回避方法もありますが、処理速度が低下します。

(5) バグではないが、lib/MT/Mail.pmがJcode.pmを直接ハンドルしている。

単純にプログラム書法の問題です。以下のパッチでは、lib/MT/I18N.pmにmime_encode関数を定義し、lib/MT/Mail.pmではこれを利用するように修正します。こうしておくと、例えば、lib/MT/I18N.pmを差し替えるだけでEncode.pmに対応できます。

(6) lib/MT/I18N.pmのfirst_n_textが改行を除去しない。

MT::I18N::first_n_textはさまざまな局面で使われていますが、Ogawa::Buzz: Movable Type 3.0のIndividual Entry Archiveの命名方式の問題点で述べているように、改行を除去しないことに起因する問題があります。以下のパッチは、1個以上の連続する改行を1個のスペースに置換するように動作を変更します。

(7) mt-tb.cgiがHTTP HeaderにPublishCharsetを返すため、本文のencodingと矛盾している。

mt-tb.cgiはHTTP Headerにmt.cfgで設定しているPublishCharsetを返すようになっていますが、本文は必ずUTF-8にencodingして出力します。一般的には何の不都合もありませんが、Trackback URLをブラウザなどで閲覧した際に怒られることはあり得ます。

これを解決するには、mt-tb.cgiが返すHTTP HeaderのcharsetをPublishCharsetからUTF-8に変更するとよいでしょう(以下参照)。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com