Oct 20, 2004

Movable Type 3.11 日本語版・修正案

このエントリでは、Movable Type 3.11 日本語版の修正案と未解決の問題点をリストアップしていきます。

今のところ、以下の点に気が付いています。他にも気が付いた問題点やその解決法があったらコメントやトラックバックしていただけると幸いです。

ユーザーインタフェース関連の問題

  1. 管理画面の左上のロゴのリンク先がAdminScriptの指定に関わらず、mt.cgiに固定されている。
  2. 管理画面のMovable Typeニュースのリンクが「http:///?v=3.11-ja」となる(CHOU-FLEURさんからTrackbackいただきました)。

スタティック・ページ(Perl)関連の問題

  1. MTSubCategoriesの中でMTCategoryCountを用いると公開状態でないエントリーも数え上げてしまう。
  2. mt-comments.cgiが生成するプレビューページでMTIfAllowCommentHTMLが常に真になる。

ダイナミック・パブリッシング(PHP)関連の問題

  1. コメントの設定で「TypeKeyからメールアドレスを取得する」にチェックを入れても有効にならない。
  2. CGIPathの末尾に「/」がない場合、MTRemoteSignInLink、MTRemoteSignOutLinkが不正なものになる。
  3. MTIncludeを使ってファイルをインクルードする場合、フルパスを指定する必要がある。
  4. MTArchiveLinkでarchive_typeオプションが無視される
  5. MTEntryLink、MTEntryPermaLinkがアーカイブの設定によっては不正なURLを返す
  6. MTCalendarIfTodayが機能しない。
  7. コメントの設定で「URLを自動的にリンクにする」にチェックを入れても有効にならない。
  8. 日付アーカイブでMTEntryCategoryが不正なものになる。
  9. 「改行を変換する」がエントリやコメントなどに設定されているとき、<dl>~</dl>まわりに余分な改行が入る。

仕様・振る舞いの改善に関する提案

  1. 前々から気が付いてはいたが、dirifyの振る舞いが日本語環境に適していない。
  2. 子カテゴリーにエントリーを追加しても親カテゴリーアーカイブが再構築されない。親カテゴリーにエントリーが一個もないと親カテゴリーアーカイブが生成されない。

以下はそれぞれの問題の説明と(可能であれば)修正方法を述べます。

ユーザーインタフェース関連の問題

管理画面の左上のロゴのリンク先がAdminScriptの指定に関わらず、mt.cgiに固定されている

これは本家のバグトラックシステムで何度か指摘していますが、直してもらえない問題の一つです。lib/MT/App.pmのsub mt_uriがリンク先のURLを生成していますが、「mt.cgi」という名前がhard-codedされています。そのため、mt.cgiの名前を変更すると、mt.cfgでAdminScriptにそのファイル名を指定してあっても、管理画面の左上のロゴのリンク先がmt.cgiのままになります。

以下のように修正すれば、AdminScriptで指定した名前が使われます。

--- lib/MT/App.pm.bak 2004-10-13 18:00:46.000000000 +0900
+++ lib/MT/App.pm 2004-10-20 18:20:30.977192296 +0900
@@ -543,7 +543,7 @@
 
 sub uri { $_[0]->path . $_[0]->script }
 
-sub mt_uri { $_[0]->path . 'mt.cgi' }
+sub mt_uri { $_[0]->path . MT::ConfigMgr->instance->AdminScript }
         # mt_uri refers to mt's script even if we're in a plugin.
 
 sub path_info {

管理画面のMovable Typeニュースのリンクが「http:///?v=3.11-ja」となる

CHOU-FLEUR-DESIGN BLOG : MT3.11のバグ?で解決方法が示されています。

スタティック・ページ(Perl)関連の問題

以下ではスタティック・ページに限らず、Movable TypeのPerlモジュールが引き起こす問題について述べます。

MTSubCategoriesの中でMTCategoryCountを用いると公開状態でないエントリーも数え上げてしまう

静的に生成されるアーカイブにおいて、MTCategoryCountをMTSubCategoriesの中で用いると、「公開」状態でない「下書き」、「指定日」のエントリーも含めた値を返してしまいます。以下のように修正することで公開状態のエントリーのみの個数を正しく返すようになります。

--- lib/MT/Template/Context.pm.bak 2004-10-18 14:50:43.000000000 +0900
+++ lib/MT/Template/Context.pm 2004-10-24 13:12:40.075911264 +0900
@@ -2284,8 +2284,11 @@
             '<$MTCategoryCount$>' ));
     my($count);
     unless ($count = $ctx->stash('category_count')) {
-        require MT::Placement;
-        $count = MT::Placement->count({ category_id => $cat->id });
+ my @args = ({ blog_id => $ctx->stash ('blog_id'),
+        status => MT::Entry::RELEASE() },
+      { 'join' => [ 'MT::Placement', 'entry_id',
+      { category_id => $cat->id } ] });
+ $count = scalar MT::Entry->count(@args);
     }
     $count;
 }

mt-comments.cgiが生成するプレビューページでMTIfAllowCommentHTMLが常に真になる。

コメント・プレビュー画面などmt-comments.cgiが生成するページでMTIfAllowCommentHTMLがコメントの設定に関わらず常に真になります。コメント・プレビュー、コメント・エラーなどのテンプレートでMTCommentFieldsタグを使っている場合には顕在化しません。

以下の修正を行うとこの不具合が直ります。

--- lib/MT/App/Comments.pm.bak 2004-10-19 17:36:02.000000000 +0900
+++ lib/MT/App/Comments.pm 2004-11-24 18:43:21.756357136 +0900
@@ -924,7 +924,8 @@
     }
     require MT::Blog;
     my $blog = MT::Blog->load($entry->blog_id);
-    my %cond = (IfRegistrationRequired => !$blog->allow_unreg_comments,
+    my %cond = (IfAllowCommentHTML => $blog->allow_comment_html,
+                IfRegistrationRequired => !$blog->allow_unreg_comments,
                 IfCommentsAllowed => $blog->allow_reg_comments
                                        || $blog->allow_unreg_comments,
                 IfNeedEmail => $blog->require_comment_emails);

ダイナミック・パブリッシング(PHP)関連の問題

以下ではダイナミック・パブリッシング時に発生する問題を述べています。機能の不具合やスタティック・ページとの動作の(不適切な)相違を取り上げています。

コメントの設定で「TypeKeyからメールアドレスを取得する」にチェックを入れても有効にならない

コメントの設定で「TypeKeyからメールアドレスを取得する」にチェックを入れても、ダイナミック・パブリッシング時にはRemoteSignInLinkの生成するTypeKeyサインイン用のURLに「&need_email=1」が追加されません。このため、「TypeKeyからメールアドレスを取得する」ことができません。

以下のように修正するとよいでしょう。

--- php/lib/function.MTRemoteSignInLink.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTRemoteSignInLink.php 2004-10-20 18:25:29.976737456 +0900
@@ -25,7 +25,7 @@
               ($args['static'] ? 'static=1' : 'static=0') .
               '%26entry_id=' . $entry['entry_id'];
     return $ctx->mt->config['SignOnURL'] .
-        ((isset($blog['require_comment_emails']) && $blog['require_comment_emails']) ? '&need_email=1' : '') .
+        ((isset($blog['blog_require_comment_emails']) && $blog['blog_require_comment_emails']) ? '&need_email=1' : '') .
         '&t=' . $token .
         '&v=' . $ctx->mt->config['TypeKeyVersion'] .
         '&_return=' . $return;

CGIPathの末尾に「/」がない場合、MTRemoteSignInLink、MTRemoteSignOutLinkが不正なものになる

mt.cfgで設定しているCGIPathの末尾に「/」がない場合、ほとんどのMTタグでは「/」を補って処理してくれます。しかし、例外的にダイナミック・パブリッシング時のMTRemoteSignInLinkとMTRemoteSignOutLinkでは補ってくれません。以下のように修正するとよいでしょう。

--- php/lib/function.MTRemoteSignInLink.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTRemoteSignInLink.php 2004-10-24 00:47:48.954994344 +0900
@@ -20,7 +20,11 @@
         }
     }
     $entry = $ctx->stash('entry');
-    $return = $ctx->mt->config['CGIPath'] . $ctx->mt->config['CommentScript'] .
+    $path = $ctx->mt->config['CGIPath'];
+    if (!preg_match('!/$!', $path)) {
+        $path .= '/';
+    }
+    $return = $path . $ctx->mt->config['CommentScript'] .
               '%3f__mode=handle_sign_in%26' .
               ($args['static'] ? 'static=1' : 'static=0') .
               '%26entry_id=' . $entry['entry_id'];
--- php/lib/function.MTRemoteSignOutLink.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTRemoteSignOutLink.php 2004-10-24 00:47:47.094277216 +0900
@@ -3,7 +3,11 @@
     // status: complete
     // parameters: none
     $entry = $ctx->stash('entry');
-    return $ctx->mt->config['CGIPath'] . $ctx->mt->config['CommentScript'] .
+    $path = $ctx->mt->config['CGIPath'];
+    if (!preg_match('!/$!', $path)) {
+        $path .= '/';
+    }
+    return $path . $ctx->mt->config['CommentScript'] .
         '?__mode=handle_sign_in&' .
         ($args['static'] ? 'static=1' : 'static=0') .
         '&entry_id=' . $entry['entry_id'] . '&logout=1';

MTIncludeを使ってファイルをインクルードする場合、フルパスを指定する必要がある

テンプレートの中で<$MTInclude file="filename"$>のように書いていたとします。

スタティック・ページの場合、(1) 絶対パスで指定されたfilename、(2) ローカル・サイト・パス/filename、(3) ローカル・アーカイブ・パス/filename、の順に探して最初に見つかったものをインクルードします。一方、ダイナミック・パブリッシングの場合には(1)しか探しません。したがって、(2)や(3)のファイルがインクルードされることを期待してもうまくいきません。

以下のように変更すると、ダイナミック・パブリッシング時にまず(1)を探し、なければ(2)を探すようになります。ダイナミック・パブリッシングでは現状ローカル・アーカイブ・パスの情報を内部的に保持していないので、スタティック・ページとまったく同じ機能にすることはできません。おそらくその必要もないでしょう。

--- php/lib/function.MTInclude.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTInclude.php 2004-10-22 16:30:38.303009000 +0900
@@ -25,7 +25,18 @@
                 $contents = @file($file);
                 $tmpl = implode('', $contents);
             } else {
-                return $ctx->error("Could not open file '$file'");
+                $blog = $ctx->stash('blog');
+                $path = $blog['blog_site_path'];
+                if (!preg_match('!/$!', $path))
+                    $path .= '/';
+                $path .= $file;
+                if (is_file($path) && is_readable($path)) {
+                    $contents = @file($path);
+                    $tmpl = implode('', $contents);
+                }
+                else {
+                    return $ctx->error("Could not open file '$file'");
+                }
             }
             if ($ctx->_compile_source('evaluated template', $tmpl, $_var_compiled)) {
                 $_include_cache['file:'.$file] = $_var_compiled;

MTArchiveLinkでarchive_typeオプションが無視される

スタティック・ページでは、MTArchiveLinkは、archive_typeオプションがあればその指定に従ったアーカイブのURL、なければカレントコンテキストのarchive_typeに従ったアーカイブのURLを生成します。一方、ダイナミック・パブリッシングでは、archive_typeオプションが無視され、カレントコンテキストのarchive_typeに従ったアーカイブのURLしか生成されません。

以下のように修正することで正常に動作するようになります。

--- php/lib/function.MTArchiveLink.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTArchiveLink.php 2004-11-02 21:35:17.260184600 +0900
@@ -6,7 +6,7 @@
     }
 
     $blog = $ctx->stash('blog');
-    $at = $ctx->stash('current_archive_type');
+    $at = isset($args['archive_type']) ? $args['archive_type'] : $ctx->stash('current_archive_type');
     $ts = $ctx->stash('current_timestamp');
     if ($at == 'Monthly') {
          $ts = substr($ts, 0, 6) . '01000000';

MTEntryLink、MTEntryPermaLinkがアーカイブの設定によっては不正なURLを返す

ダイナミック・パブリッシングにすると、MTCalendarに囲まれたMTEntryLinkが特定のすべて同じ日付のアーカイブのURLを「誤って」生成する、という問題だと思っていましたが、もっと一般的な問題があるようです。MTCalendarの中で使われるMTEntryLinkに関しては、tentativeな回避方法をOgawa::Buzz: ダイナミック・パブリッシング時のカレンダーの不具合をアレする。で述べています。

(1) archive_typeオプションにIndividual, Category以外が指定されている場合、または (2) archive_typeオプションを設定せず、かつアーカイブの設定の「優先するアーカイブのタイプ」でIndividual、Category以外を選択している場合にMTEntryLink、MTEntryPermaLinkが誤ったURLを返す可能性があります。php/lib/mtdb_base.phpのentry_linkという関数がまともに実装されていないのが原因です。

以下のように変更すれば、期待される動作になります。

--- php/lib/mtdb_base.php.bak 2004-10-12 18:57:57.000000000 +0900
+++ php/lib/mtdb_base.php 2004-11-03 06:06:32.474843144 +0900
@@ -177,9 +177,23 @@
                            and templatemap_archive_type='Category'
                            and templatemap_is_preferred = 1";
             } else {
+                $entry = $this->fetch_entry($eid);
+                $ts = $entry['entry_created_on'];
+                if ($at == 'Monthly') {
+                    $ts = substr($ts, 0, 6) . '01000000';
+                } elseif ($at == 'Daily') {
+                    $ts = substr($ts, 0, 8) . '000000';
+                } elseif ($at == 'Weekly') {
+                    require_once("MTUtil.php");
+                    list($ws, $we) = start_end_week($ts);
+                    $ts = $ws;
+                } elseif ($at == 'Yearly') {
+                    $ts = substr($ts, 0, 4) . '0101000000';
+                }
                 $sql = "select fileinfo_url, fileinfo_blog_id
                           from mt_fileinfo, mt_templatemap
                          where fileinfo_templatemap_id = templatemap_id
+                           and fileinfo_startdate = '$ts'
                            and templatemap_archive_type='".$this->escape($at)."'
                            and templatemap_is_preferred = 1";
             }

MTCalendarIfTodayが機能しない

ダイナミック・パブリッシング時に、MTCalendar内で使用できるはずのMTCalendarIfTodayが正常に機能しません。また、カレンダーのパディング部分(MTCalendarIfBlankがTrueになる)で必ずMTIfCalendarTodayがTrueになるという現象が起きます。

以下のように修正するとよいでしょう。

--- php/lib/block.MTCalendar.php.bak 2004-09-22 15:40:54.000000000 +0900
+++ php/lib/block.MTCalendar.php 2004-11-02 15:30:13.888003304 +0900
@@ -49,6 +49,7 @@
         $ctx->stash('cal_pad_end', $pad_end);
         $ctx->stash('cal_days_in_month', $days_in_month);
         $ctx->stash('cal_prefix', $prefix);
+        $ctx->stash('cal_today', $today);
     } else {
         # subseqent iterations:
         $prefix = $ctx->stash('cal_prefix');
@@ -58,6 +59,7 @@
         $days_in_month = $ctx->stash('cal_days_in_month');
         $iter = $ctx->stash('cal_entries');
         $left = $ctx->stash('cal_left');
+        $today = $ctx->stash('cal_today');
     }
     $left or $left = array();
     if ($day <= $pad_start + $days_in_month + $pad_end) {

コメントの設定で「URLを自動的にリンクにする」にチェックを入れても有効にならない。

コメントの設定で「URLを自動的にリンクにする」にチェックを入れても、ダイナミック・パブリッシング時にはMTCommentBodyの生成するコメント本体に含まれるURLをリンクに変換してくれません。

以下のように修正するとよいでしょう。

--- php/lib/function.MTCommentBody.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTCommentBody.php 2004-11-20 23:34:04.530682576 +0900
@@ -4,6 +4,12 @@
     $text = $comment['comment_text'];
 
     $blog = $ctx->stash('blog');
+    if (!$blog['blog_allow_comment_html']) {
+        $text = strip_tags($text);
+        if ($blog['blog_autolink_urls']) {
+            $text = preg_replace('!(http://\S+)!', '<a href="$1">$1</a>', $text);
+        }
+    }
     $cb = $blog['blog_convert_paras_comments'];
     if ($cb == '1' || $cb == '__default__') {
         $cb = 'convert_breaks';

日付アーカイブでMTEntryCategoryが不正なものになる。

日付アーカイブでMTEntryCategoryタグ(エントリのプライマリカテゴリーの名前を返す)を使用すると、すべてのエントリのカテゴリーが同一のものになるという不具合があります。典型的にはテンプレートに以下のように書いていると不具合が確認できます。

<a href="<$MTEntryLink archive_type="Category"$>"><$MTEntryCategory$></a>

修正方法を見つけていません。が、上記のような記述の代わりに下記のように記述すれば問題を回避できます。当然のことですが、この場合はエントリーに付与されているプライマリカテゴリー以外のカテゴリーも列挙されますから、上記とまったく同じ出力結果が得られるわけではありません。

<MTEntryCategories glue=", ">
<a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a>
</MTEntryCategories>

「改行を変換する」がエントリやコメントなどに設定されているとき、<dl>~</dl>まわりに余分な改行が入る。

以下をエントリ本文に保存したとします。

<dl>
<dt>DDBJ</dt>
<dd>DNA Data Bank of Japan</dd>
</dl>

スタティック・ページではこのまま表示されますが、ダイナミック・パブリッシング時には以下のようにマークアップされるため余分な改行が入ります。

<p><dl><br />
<dt>DDBJ</dt><br />
<dd>DNA Data Bank of Japan</dd><br />
</dl></p>

以下の修正でスタティック・ページと同様のマークアップがなされるようになります。

--- php/lib/MTUtil.php.bak 2004-10-13 14:27:46.000000000 +0900
+++ php/lib/MTUtil.php 2004-11-29 11:41:25.099006392 +0900
@@ -513,7 +513,7 @@
         return '';
     }
     foreach ($paras as $k => $p) {
-        if (!preg_match('/^<\/?(?:h1|h2|h3|h4|h5|h6|table|ol|ul|menu|dir|p|pre|center|form|select|fieldset|blockquote|address|div|hr)/', $p)) {
+        if (!preg_match('/^<\/?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|select|fieldset|blockquote|address|div|hr)/', $p)) {
             $p = preg_replace('/\r?\n/', "<br />\n", $p);
             $p = "<p>$p</p>";
             $paras[$k] = $p;

仕様・振る舞いの改善に関する提案

前々から気が付いてはいたが、dirifyの振る舞いが日本語環境に適していない。

Ogawa::Buzz: dirifyについて考えてみた。に分離して書きました。

子カテゴリーにエントリーを追加しても親カテゴリーアーカイブが再構築されない。親カテゴリーにエントリーが一個もないと親カテゴリーアーカイブが生成されない。

Ogawa::Buzz: サブカテゴリー機能について考えてみた。に分離して書きました。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

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