Movable Type 3.121 日本語版・修正案
Movable Type 3.121 日本語版でましたね。平田さんにパッチを送ったかいもあって随分採用していただけようです。3.11で比較的クリティカルだった問題は解決されています。でも最近追加した分を送っていなかったのでほんの一部積み残しになってしまいました。
Movable Type 日本語版サイト: Movable Type 3.121の提供を開始
mtchanges - Movable Typeの更新履歴
引き続き、このスレはMovable Type 3.121 日本語版の修正内容を検討していきたいと思います。
パッチをまとめてダウンロード: MT-3.121-ja-p01.zip
ユーザーインタフェース関連の問題
- タイトルに「"<>」を含むサイトでクイックポストをしようとすると、不適切なHTMLが生成される。(05/01/21追加)
スタティック・ページ(Perl)関連の問題
- mt-comments.cgiが生成するプレビューページでMTIfAllowCommentHTMLが常に真になる。
ダイナミック・パブリッシング(PHP)関連の問題
- コメントの設定で「URLを自動的にリンクにする」にチェックを入れても有効にならない。
- 日付アーカイブでMTEntryCategoryが不正なものになる。(04/12/03更新)
- 「改行を変換する」がエントリーやコメントなどに設定されているとき、<dl>~</dl>まわりに余分な改行が入る。
- MTCommentBodyの改行ないし<br />が必ず削除されてしまう。(04/12/03追加)
- エントリーの設定で「エントリーの表示順」を設定しても反映されない。(04/12/04追加)
- コメントの設定で「コメントの表示順」を設定しても反映されない。(04/12/04追加)
- MTEntriesWithSubCategoriesでサブカテゴリーのエントリーが表示されない。(04/12/16)
- MTCalendarでcategoryオプションが無視される。(05/01/15)
- wordsオプションが正常に機能しない。(05/01/16)
ユーザーインタフェース関連の問題
タイトルに「"<>」を含むサイトでクイックポストをしようとすると、不適切なHTMLが生成される。
例えば「書籍 > 小説」というタイトルを持つサイトでクイックポストしようとすると生成されるHTMLは以下のようになります。
<a title="書籍 > 小説" href="...">書籍 > 小説</a>
以下のようなHTMLが生成される方が望ましいでしょう。
<a title="書籍 > 小説" href="...">書籍 > 小説</a>
以下の修正を行うことでこの不具合が直ります。
--- lib/MT/App/CMS.pm.bak 2004-11-12 12:43:35.000000000 +0900
+++ lib/MT/App/CMS.pm 2005-01-17 16:36:38.820235624 +0900
@@ -917,6 +917,7 @@
$param{selected_text} = $param{text};
my $enc = MT::I18N::guess_encoding($q->param('link_title') . $param{text});
my $bm_link_title = MT::I18N::encode_text(CGI::unescape(scalar $q->param('link_title')),$enc,undef);
+ $bm_link_title = encode_html($bm_link_title);
my $bm_link_href = scalar $q->param('link_href');
my $bm_text = MT::I18N::encode_text(CGI::unescape($param{text}),$enc,undef);
スタティック・ページ(Perl)関連の問題
以下ではスタティック・ページに限らず、Movable TypeのPerlモジュールが引き起こす問題について述べます。
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)関連の問題
以下ではダイナミック・パブリッシング時に発生する問題を述べています。機能の不具合やスタティック・ページとの動作の(不適切な)相違を取り上げています。
コメントの設定で「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タグ(エントリのプライマリカテゴリーの名前を返す)を使用すると、すべてのエントリのカテゴリーが同一のものになるという不具合があります。典型的にはテンプレートに以下のように書いていると不具合が確認できます。MTEntryLinkの方は正しくカテゴリーアーカイブのURLを返しますが、MTEntryCategoryは日付アーカイブの最後のエントリのプライマリカテゴリーの名前になってしまいます。
<MTEntries> ... <a href="<$MTEntryLink archive_type="Category"$>"><$MTEntryCategory$></a> ... </MTEntries>
以下のように修正するとよいでしょう。
--- php/lib/mtdb_base.php.bak 2004-11-08 10:52:03.000000000 +0900
+++ php/lib/mtdb_base.php 2004-12-03 20:31:00.000000000 +0900
@@ -822,9 +822,9 @@
if (is_array($results)) {
foreach ($results as $row) {
$entry_id = $row['placement_entry_id'];
- $this->_cat_id_cache['e'.$entry_id] = &$row;
+ $this->_cat_id_cache['e'.$entry_id] = $row;
$cat_id = $row['category_id'];
- $this->_cat_id_cache['c'.$cat_id] = &$row;
+ $this->_cat_id_cache['c'.$cat_id] = $row;
}
}
}
「改行を変換する」がエントリやコメントなどに設定されているとき、<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;
MTCommentBodyの改行ないし<br />が必ず削除されてしまう。
3.121からMTCommentBodyへのサニタイズチェックが有効になったことにより顕在化した問題(3.11でチェックしていなかったのがバグだったわけですが)。
コメント中の<br />がサニタイズ処理の過程で削除されてしまいます。手で記述した<br />の場合も、「改行を変換する」によって生成された<br />の場合も症状は共通です。これはサニタイズルールのパーザ部分で終了タグのないタグに関するルールが正しく解釈できないために起きています。
以下の修正でこの問題は解決します。
--- php/lib/sanitize_lib.php.bak 2004-10-20 15:43:59.000000000 +0900
+++ php/lib/sanitize_lib.php 2004-12-03 08:24:50.858524904 +0900
@@ -100,7 +100,7 @@
}
} else {
if (preg_match('!/$!', $tag)) {
- $tag = substr($tag, 0, strlen($tag) - 2);
+ $tag = substr($tag, 0, strlen($tag) - 1);
$style = '/';
}
}
エントリーの設定で「エントリーの表示順」を設定しても反映されない。
ダイナミック・パブリッシングでは、エントリーの設定で「エントリーの表示順」を設定しておいても無視されてしまい、MTEntriesにsort_orderオプションを明示的に与えない限り表示順を制御できません。また、MTEntriesにrecently_commented_onオプションをsort_orderオプションと一緒に与えた場合、後者の指定はスタティック・ページでは無視されます(リーズナブルな仕様)が、ダイナミック・パブリッシングでは無視されません。
スタティック・ページと同様の振る舞いにするためには以下の修正を行う必要があります。
--- php/lib/mtdb_base.php.bak 2004-11-08 10:52:03.000000000 +0900
+++ php/lib/mtdb_base.php 2004-12-04 08:49:41.286954000 +0900
@@ -285,10 +285,17 @@
if (isset($args['offset'])) {
$offset = 'offset '.intval($args['offset']);
}
- if (isset($args['sort_order']) && ($args['sort_order'] == 'ascend')) {
- $order = 'asc';
- } else {
+ if (!isset($rco)) {
$order = 'desc';
+ if (isset($args['sort_order'])) {
+ if ($args['sort_order'] == 'ascend') {
+ $order = 'asc';
+ }
+ } elseif (isset($blog) && isset($blog['blog_sort_order_posts'])) {
+ if ($blog['blog_sort_order_posts'] == 'ascend') {
+ $order = 'asc';
+ }
+ }
}
$sort_field or $sort_field = 'entry_created_on';
if (isset($args['sort_by'])) {
コメントの設定で「コメントの表示順」を設定しても反映されない。
ダイナミック・パブリッシングでは、コメントの設定で「コメントの表示順」を設定しておいても無視されてしまい、MTCommentsにsort_orderオプションを明示的に与えない限り表示順を制御できません。
スタティック・ページと同様の振る舞いにするためには以下の修正を行う必要があります。
--- php/lib/mtdb_base.php.bak 2004-11-08 10:52:03.000000000 +0900
+++ php/lib/mtdb_base.php 2004-12-04 08:49:41.286954000 +0900
@@ -709,12 +716,15 @@
} else {
$limit = '';
}
- $order = '';
+ $order = 'desc';
if (isset($args['sort_order'])) {
if ($args['sort_order'] == 'ascend') {
$order = 'asc';
- } elseif ($args['sort_order'] == 'descend') {
- $order = 'desc';
+ }
+ } elseif (isset($args['blog_id'])) {
+ $blog =& $this->fetch_blog($args['blog_id']);
+ if ($blog['blog_sort_order_comments'] == 'ascend') {
+ $order = 'asc';
}
}
$comments = $this->get_results("
--- php/lib/block.MTComments.php.bak 2004-09-22 15:40:54.000000000 +0900
+++ php/lib/block.MTComments.php 2004-12-04 06:49:13.992670264 +0900
@@ -5,6 +5,7 @@
$ctx->localize($localvars);
$entry = $ctx->stash('entry');
$args['entry_id'] = $entry['entry_id'];
+ $args['blog_id'] = $ctx->stash('blog_id');
$comments = $ctx->mt->db->fetch_comments($args);
$ctx->stash('_comments', $comments);
$counter = 0;
MTEntriesWithSubCategoriesでサブカテゴリーのエントリーが表示されない。
カテゴリーアーカイブなどでMTEntriesWithSubCategoriesを使った場合、スタティック・ページと異なり、ダイナミック・パブリッシングではそのカテゴリーに含まれるエントリーしか表示されません(サブカテゴリーのエントリーは表示されません)。
正常に動作させるには、以下の修正を行う必要があります。
--- php/lib/mtdb_base.php.bak 2004-11-08 10:52:03.000000000 +0900
+++ php/lib/mtdb_base.php 2004-12-16 20:57:10.206545232 +0900
@@ -442,11 +449,13 @@
if (isset($args['children'])) {
if (isset($this->_cat_id_cache['c'.$args['category_id']])) {
$cat = $this->_cat_id_cache['c'.$args['category_id']];
- $children = &$cat['_children'];
- if ($children === false) {
- return null;
- } else {
- return $children;
+ if (isset($cat['_children'])) {
+ $children = &$cat['_children'];
+ if ($children === false) {
+ return null;
+ } else {
+ return $children;
+ }
}
}
MTCalendarでcategoryオプションが無視される。
MTCalendarに与えるcategoryオプションがダイナミック・パブリッシングでは実装されていないため使用できません。以下の変更でcategoryオプションが有効になります。
--- php/lib/block.MTCalendar.php.bak 2004-11-08 10:43:09.000000000 +0900
+++ php/lib/block.MTCalendar.php 2005-01-15 06:39:32.248295400 +0900
@@ -30,7 +30,7 @@
$prefix = $today;
}
// gather category name...
- $cat_name = '';
+ $cat_name = isset($args['category']) ? $args['category'] : '';
// caching isn't necessary since we're not building
// entire site-- just one page
$today .= strftime("%d", time());
@@ -43,6 +43,9 @@
$pad_end = 6 - wday_from_ts($y, $m, $days_in_month);
$this_day = $prefix . sprintf("%02d", $day - $pad_start);
$args = array('current_timestamp' => $start, 'current_timestamp_end' => $end, 'blog_id' => $blog_id, 'lastn' => -1, 'sort_order' => 'ascend');
+ if ($cat_name) {
+ $args['category'] = $cat_name;
+ }
$iter = $ctx->mt->db->fetch_entries($args);
$ctx->stash('cal_entries', $iter);
$ctx->stash('cal_pad_start', $pad_start);
wordsオプションが正常に機能しない。
MTEntryBodyなどにwordsオプションを与えたとき、日本語版では指定した文字数分を返すべきですが、全文字列を返してしまうという問題があります。以下の修正が必要です。
--- php/lib/MTUtil.php.bak 2004-12-01 17:46:36.000000000 +0900
+++ php/lib/MTUtil.php 2005-01-15 12:00:41.359945168 +0900
@@ -592,7 +592,6 @@
function first_n_text($text, $n) {
$text = strip_tags($text);
$text = preg_replace('/\r?\n/', " ", $text);
- substr_text($text, 0, $n);
- return $text;
+ return substr_text($text, 0, $n);
}
?>
このエントリーのトラックバックURL: http://as-is.net/mt/mt-tb.cgi/210
Comments (0)