画像の挿入時に出力されるコードの内容をカスタマイズする
ウィジウィグエディタから画像を挿入した際の、出力されるコードのフォーマットを指定したい
MTのウィジウィグエディタには「画像の挿入」ボタンより画像を本文に挿入する機能がありますが、「画像の挿入」ボタンを押した際に出てくるダイアログ内に、「位置」と言う項目があり、そこで画像と文章のレイアウトを選択する事が出来ます。
しかし、レイアウトの選択結果は、例えば「左」を選択した場合、本文に次のように反映されます。
<p><img alt="ほげふが" src="/hoge/fuga.png" width="100" height="100" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></p>
画像は必ずpタグで囲われ、回り込みの為のインラインスタイルが入る形になります。
標準の機能では、この予め挿入される内容をカスタマイズする事は出来ません。
MTで管理するウェブサイトでは、独自のスタイルを使う、と言った事もあるので、この標準のレイアウト指定機能と整合性が無く、かえって邪魔になったりする事もあります。
今回は、このウィジウィグエディタの「画像の挿入」ボタンからレイアウトを指定した際に挿入されるhtmlコードについて、カスタマイズしてみます。
カスタマイズの詳細
エディタの本文に出力されるhtmlソースの生成を直接司っているのは、MT本体ディレクトリ内の、/lib/MT/Asset/Image.pm の300行目あたり、関数as_html です。
https://github.com/movabletype/movabletype/blob/master/lib/MT/Asset/Image.pm
330-347行目あたりでダイアログの入力項目「位置」の値に応じたインラインスタイルを生成しています。
349-402行目あたりは、出力するhtmlソースを生成している箇所です。関数sprintfの実行結果が、出力されるhtmlソースである事が分かります。
以降に、例示としてカスタマイズ後のソースを示します。
※今回変更点が多いので、ソースの表示のみとしています。diffツールでオリジナルのソース(GitのImage.pm)と突き合わせるなどして、差分を確認してみて下さい。
sub as_html {
    my $asset   = shift;
    my ($param) = @_;
    my $text    = '';
    my $text_original = '';
    my $attr_class_sneak = '';
    my $app = MT->instance;
    $param->{enclose} = 0 unless exists $param->{enclose};
    if ( $param->{include} ) {
        my $fname = $asset->file_name;
        require MT::Util;
        my $thumb = undef;
        if ( $param->{thumb} ) {
            $thumb = MT::Asset->load( $param->{thumb_asset_id} )
                || return $asset->error(
                MT->translate(
                    "Cannot load image #[_1]",
                    $param->{thumb_asset_id}
                )
                );
        }
        my $dimensions = sprintf(
            'width="%s" height="%s"',
            (   $thumb
                ? ( $thumb->image_width, $thumb->image_height )
                : ( $asset->image_width, $asset->image_height )
            )
        );
        my $wrap_style = '';
        if ( $param->{wrap_text} && $param->{align} ) {
            $wrap_style = 'class="mt-image-' . $param->{align} . ' ' . $wrap_style . '" ';
        }
        if ( $param->{popup} && $param->{popup_asset_id} ) {
            my $popup = MT::Asset->load( $param->{popup_asset_id} )
                || return $asset->error(
                MT->translate(
                    "Cannot load image #[_1]",
                    $param->{popup_asset_id}
                )
                );
            my $link
                = $thumb
                ? sprintf(
                '<img src="%s" %s alt="%s" %s />',
                MT::Util::encode_html( $thumb->url ),   $dimensions,
                MT::Util::encode_html( $asset->label ), $wrap_style
                )
                : MT->translate('View image');
            $text_original = sprintf(
                q|<a href="%s" onclick="window.open('%s','popup','width=%d,height=%d,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false">%s</a>|,
                MT::Util::encode_html( $popup->url ),
                MT::Util::encode_html( $popup->url ),
                $asset->image_width,
                $asset->image_height,
                $link,
            );
        }
        else {
            if ( $param->{thumb} ) {
                $text_original = sprintf(
                    '<a href="%s"><img alt="%s" src="%s" %s %s /></a>',
                    MT::Util::encode_html( $asset->url ),
                    MT::Util::encode_html( $asset->label ),
                    MT::Util::encode_html( $thumb->url ),
                    $dimensions,
                    $wrap_style,
                );
            }
            else {
                $text_original = sprintf(
                    '<img alt="%s" src="%s" %s %s />',
                    MT::Util::encode_html( $asset->label ),
                    MT::Util::encode_html( $asset->url ),
                    $dimensions, $wrap_style,
                );
            }
        }
#>>kmatsumoto_141011_1550:出力されるhtmlソースの定義箇所。
        if ( $param->{wrap_text} && $param->{align} ) {
            if ( $param->{align} eq 'none' ) {
                $text = $text_original;
            }
            elsif ( $param->{align} eq 'left' ) {
                $text = <<"EOS";
<div class="wrap">
<div class="img-wrap">
<p>$text_original</p>
<p class="caption">caption</p>
</div>
<p>\(^0^)/<p>
</div>
<p>next text</p>
EOS
            }
            elsif ( $param->{align} eq 'right' ) {
               $text = <<"EOS";
<div class="wrap">
<div class="img-wrap">
<p>$text_original</p>
<p class="caption">caption</p>
</div>
<p>(-_-)<p>
</div>
<p>next text</p>
EOS
            }
            elsif ( $param->{align} eq 'center' ) {
                $text = <<"EOS";
<p class="set-center">$text_original</p>
<p>next text</p>
EOS
            }
        }
        else{
            $text = $text_original;
        }
#<<kmatsumoto_1011_1550
    }
    else {
        require MT::Util;
        $text = sprintf(
            '<a href="%s">%s</a>',
            MT::Util::encode_html( $asset->url ),
            MT::Util::encode_html( $asset->display_name )
        );
    }
    return $param->{enclose} ? $asset->enclose($text) : $text;
}
あとがき
今回は、本体のperlコードを直接いじる方法を採りました。
プログラミングの得意でない人には、少し難易度が高いかもしれません。
別の方法として、MT本体ディレクトリ配下の、/tmpl/cms/dialog/asset_insert.tmpl をカスタマイズする方法でも行けるかもしれませんが、今回はここまで(´ー`)。