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; }