画像の挿入時に出力されるコードの内容をカスタマイズする

ウィジウィグエディタから画像を挿入した際の、出力されるコードのフォーマットを指定したい

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 をカスタマイズする方法でも行けるかもしれませんが、今回はここまで(´ー`)。

関連するタグ

MT6, Perl, TinyMCE