01 January 2012

MovableTypeでWide character in subroutine entryエラー

MovableTypeで新規ページを公開しようとしたら、"Wide character in subroutine entry"というエラーが表示される。(エラーが表示されても、ページ自体は公開されるので、特に問題ないのかもしれないが…)

なぜこのエラーが突然出るようになったのか、今までこのバグをうまく回避していたのかはよく分からない。

■ 検証環境
・MovableType 5.01
・SQLite 3.6.14.2

■ 参考にしたWebページ
Movable TypeのMarkdownプラグインのエラー対策
"Wide character in subroutine entry" に悩まされてMarkdown.plをいじってdiffってみた
Bug in plugins/Markdown/Markdown.pl

■ 解決方法
参考にしたWebページにあるように、mt/plugins/Markdown/Markdown.pl を数カ所変更して、md5_hex関数に渡す"記事内容"を、強制的にutf8フラグを落とすencode_utf8関数を通すようにすると解決するらしい…

mt/plugins/Markdown/Markdown.pl ファイルの先頭付近

#
# Markdown -- A text-to-HTML conversion tool for web writers
#
# Copyright (c) 2004 John Gruber
# <http://daringfireball.net/projects/markdown/>
#


package Markdown;
require 5.006_000;
use strict;
use warnings;
use bytes;

use Digest::MD5 qw(md5_hex);
use vars qw($VERSION);
$VERSION = '1.0.1';
# Tue 14 Dec 2004

## Disabled; causes problems under Perl 5.6.1:
# use utf8;
# binmode( STDOUT, ":utf8" ); # c.f.: http://acis.openlib.org/dev/perl-unicode-struggle.html

use Encode qw(encode_utf8);

#
# Global default settings:
#
my $g_empty_element_suffix = " />"; # Change to ">" for HTML output
my $g_tab_width = 4;

〜 以下省略 〜

mt/plugins/Markdown/Markdown.pl ファイルの200行目付近

sub _HashHTMLBlocks {
my $text = shift;
my $less_than_tab = $g_tab_width - 1;

my $block_tags_a = qr/p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del/;
my $block_tags_b = qr/p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math/;

$text =~ s{
( # save in $1
^ # start of line (with /m)
<($block_tags_a) # start tag = $2
\b # word break
(.*\n)*? # any number of lines, minimally matching
</\2> # the matching end tag
[ \t]* # trailing spaces/tabs
(?=\n+|\Z) # followed by a newline or end of document
)
}{
my $key = md5_hex(encode_utf8($1));
# my $key = md5_hex($1);

$g_html_blocks{$key} = $1;
"\n\n" . $key . "\n\n";
}egmx;


$text =~ s{
( # save in $1
^ # start of line (with /m)
<($block_tags_b) # start tag = $2
\b # word break
(.*\n)*? # any number of lines, minimally matching
.*</\2> # the matching end tag
[ \t]* # trailing spaces/tabs
(?=\n+|\Z) # followed by a newline or end of document
)
}{
my $key = md5_hex(encode_utf8($1));
# my $key = md5_hex($1);

$g_html_blocks{$key} = $1;
"\n\n" . $key . "\n\n";
}egmx;
$text =~ s{
(?:
(?<=\n\n) # Starting after a blank line
| # or
\A\n? # the beginning of the doc
)
( # save in $1
[ ]{0,$less_than_tab}
<(hr) # start tag = $2
\b # word break
([^<>])*? #
/?> # the matching end tag
[ \t]*
(?=\n{2,}|\Z) # followed by a blank line or end of document
)
}{
my $key = md5_hex(encode_utf8($1));
# my $key = md5_hex($1);

$g_html_blocks{$key} = $1;
"\n\n" . $key . "\n\n";
}egx;
$text =~ s{
(?:
(?<=\n\n) # Starting after a blank line
| # or
\A\n? # the beginning of the doc
)
( # save in $1
[ ]{0,$less_than_tab}
(?s:
<!
(--.*?--\s*)+
>
)
[ \t]*
(?=\n{2,}|\Z) # followed by a blank line or end of document
)
}{
my $key = md5_hex(encode_utf8($1));
# my $key = md5_hex($1);

$g_html_blocks{$key} = $1;
"\n\n" . $key . "\n\n";
}egx;


return $text;
}