画像の挿入時に出力されるコードの内容をカスタマイズする
ウィジウィグエディタから画像を挿入した際の、出力されるコードのフォーマットを指定したい
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 をカスタマイズする方法でも行けるかもしれませんが、今回はここまで(´ー`)。