mt-enclosureって何だ

 皆さん、いかが思われてますでしょうか。あれです。Movable Typeのあれです。

 「ブログ記事の編集」画面にある、画像の挿入機能のことです。

 ヤツで画像を挿入すると、こんなソースを吐きやがるんですよ。

<form mt:asset-id="71" class="mt-enclosure mt-enclosure-image" style="display: inline;">
<img alt="xxxxxxxx.jpg" src="http://blog.shimatch.jp/xxxxxxxx.jpg" width="400" height="300" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" />
</form>

 form要素は仕方無いとしましょう。しかし、このclass属性は何だ?style属性は何だ?

 続くimg要素に付くalt属性が、なぜ画像ファイル名なのか?そして、img要素にまでclass要素とstyle属性の二重掛け。しかも!style属性に至っては、マージン決められてますよ!勝手に20pxて!何を基準の20px?ああもう、腹立たしい!

 とまぁ、以前から腹に据え兼ねているものがあったので、直してやろうと思った。

 修正個所を見付け出すのが結構大変でした。/lib/MT/Asset.pm、/lib/MT/Asset/Image.pmの2つです。

 まずは/lib/MT/Asset/Image.pm。258行からのサブルーチン「as_html」がimg要素の中身です。

 289行のmy $wrap_styleが、あの憎き20pxの正体。

my $wrap_style = '';
if ( $param->{wrap_text} && $param->{align} ) {
$wrap_style = 'class="mt-image-' . $param->{align} . '" ';
if ( $param->{align} eq 'none' ) {
$wrap_style .= q{style=""};
}
elsif ( $param->{align} eq 'left' ) {
$wrap_style .= q{style="float: left; margin: 0 20px 20px 0;"};
}
elsif ( $param->{align} eq 'right' ) {
$wrap_style .= q{style="float: right; margin: 0 0 20px 20px;"};
}
elsif ( $param->{align} eq 'center' ) {
$wrap_style .= q{style="text-align: center; display: block; margin: 0 auto 20px;"};
}
}

 見た感じで大体分かるので、ちょいちょい、っと直して上書きです。

 引き続き、/lib/MT/Asset.pm。354行からのサブルーチン「enclose」がform要素(パブリッシュ時にspan要素に置き換えられる)の中身です。

sub enclose {
my $asset = shift;
my ($html) = @_;
my $id = $asset->id;
my $type = $asset->class;
return qq{<form mt:asset-id="$id" class="mt-enclosure mt-enclosure-$type" style="display: inline;">$html</form>};
}

 最後のreturn文をちょちょい、と直せばOKです。

 しまっちはこうしてみました。

<p>
<form mt:asset-id="195">
<img src="http://blog.shimatch.jp/xxxxxxxx.jpg" width="400" height="300" alt="" />
</form>
</p>

 これが、パブリッシュされればこうなります。

<p>
<span>
<img src="http://blog.shimatch.jp/xxxxxxxx.jpg" width="400" height="300" alt="" />
</span>
</p>

 無駄なspan要素が挟まるのは大目に見て進ぜる。

 img要素単体がp要素を構成し得るか、という問いとはずっと向き合っていますが、今はこれでいいかなーと思っている。

 まぁ、そんなわけで。蒸し暑い日が続きますが、皆様、快適なMovable Type生活を!

 あ、こうした改造は個人の責任で行ってくださいね。質問されてもお答えできませーん。

Movable Type 4の画像周りで立ち往生した場合のヒント

 過去にMovable Type 4の画像周りで立ち往生したことがあるので、その内容と、対策を書き残しておく。

画像がアップできない。画像をアップしたら500 Internal Server Errorが発生する。
  • アップしている画像が大き過ぎる。
  • アップしている画像がJPEGでない。
  • 管理画面で複数人が同時にアイテムアップロード作業を行っていて、サーバに負荷がかかり過ぎた。
対処方法
メニューの「一覧」→「アイテム」を選択。

アイテム一覧を開くことができずに500 Internal Server Errorが出る
  1. FTPツールでブログ向けに画像をアップロードしたディレクトリを参照。
  2. アップした画像が存在していたならば、削除する。
  3. 管理画面を一旦ログアウトし、ログインし直す。
  4. メニューの「一覧」→「アイテム」を選択。これでアイテム一覧が表示できるはず。
  5. アップした画像について、サムネイル画像が表示されていないはずなので、一旦、その画像を削除して、アップロードし直す。
アイテム一覧が表示され、アップした画像のサムネイル画像が表示されていない
一旦画像を削除し、アップし直す。
アイテム一覧が開けるが、アップした画像のサムネイル画像が表示されていない
これは、データベースに画像は登録され、画像ファイルはアップできたものの、画像のサムネイル(MTAssets)の生成に失敗している場合が多い。
対処方法
対象画像を削除してみる。

画像が削除された
軽症。画像アップを再度試してみる。GIF画像・BMP画像はちゃんと上げられない。念のため確認。
画像の削除もできない
重症。データベースに画像は登録されているが、MTAssets用の画像が存在しないため、エラーを起こしている。以下の手順により「見た目上、画像が登録された」形を作成せよ。

  1. FTPツールでブログ向けに画像をアップロードしたディレクトリを参照。
  2. アップした画像が存在していたならば、削除する。
  3. FTPツールで引き続き、ブログのルートを参照。「assets_c」というディレクトリがある。この中に、MTAssetsで使用するサムネイル画像が保存されているのだ。
  4. アップした年(例:2009)、アップした月(例:07)のディレクトリの中を見る。
  5. 画像は、(画像名)-thumb-(横サイズ)x(縦サイズ)-(アイテムID).jpgのような名前で格納されている。
  6. 過去に正常にアップされた画像から、240×240、75×75の両サイズが揃っているサムネイルを複製。この2サイズはなぜか自動で生成されることになっていて、両画像の有無でエラーと判断される場合があるため、内容はともかく、サムネイル画像は存在している、という状態を作ってエラーを止める狙い。
  7. 複製したサムネイル2枚の画像名を、(画像名)と(アイテムID)をアップに失敗した画像のものに合わせる。アイテムIDを正しく揃えないと、Movable Typeが騙されてくれないので注意。
  8. 管理画面を一旦ログアウトし、ログインし直す。
  9. メニューの「一覧」→「アイテム」を選択。これでアイテム一覧が表示できるはず。
  10. アップした画像について、サムネイル画像が表示されていないはずなので、一旦、その画像を削除して、アップロードし直す。

 なんせよ、画像のアップロードに失敗したら「assets_c」と画像をアップしたフォルダに何か起こっている、と判断して良い。サムネイルの名前の意味だけでも分かっていれば、起こっている問題の推察はできるはず。

 地味に、assets_cディレクトリの権限が777になってない場合とかもあるので注意。

取り敢えず何か

 取り敢えずなんだけれど、何か一人で逆上してきてしまって、MT4.26に移行する前にブログの体裁が出来上がっている所までをブチ込んでみた。わー検証も何もしてないー。ってか殆ど文字ー。ブログだから当然か。

 ちょいちょい体裁は整えて行く予定。

 今日も暑い。体調は最悪。また明日。