MTのEntryBodyタグのwordsモディファイアについて
MTのEntryBodyタグのwordsモディファイアについて調べてみました。
1.はじめに
本文に次のような記述があるとします。
XXXについて紹介します。
<img src="http://user-domain/" alt="hoge" />
XXXは最近とても人気があります。
この本文のHTMLタグ以外の日本語を抽出したい場合、MTEntryBodyタグにremove_htmlモディファイアを記述すると思います。
<$mt:EntryBody remove_html="1"$>
が、次のようにwordsモディファイアでも日本語だけの可能です。
<$mt:EntryBody words="100"$>
なぜwordsモディファイアでも実現可能なのかちょっと気になったので、このモディファイアの実装を調べてみました。
2.wordsモディファイアの実装
wordsモディファイアは、MT::Template::Tags::Entry::_hdlr_entry_bodyで次の赤色部分の実装が該当します。
sub _hdlr_entry_body {
my ( $ctx, $args ) = @_;
:
return first_n_text( $text, $args->{words} ) if exists $args->{words};
return $text;
}
first_n_text()はMT::I18Nのメソッドで、次のように定義されています。
sub first_n { _handle( first_n => @_ ) }
sub first_n_text { _handle( first_n => @_ ) } # for backward compatibility
_handle()メソッドは、MT::I18Nで次のような実装です。
sub _handle {
my $meth = shift;
my $lang = _language();
my $class = 'MT::I18N::' . $lang;
$class->$meth(@_);
}
ここでは$langに"ja"が設定されているので、MT::I18N::jaのfirst_n()が起動されます。
sub first_n_ja {
return __PACKAGE__->first_n_encode(@_);
}
さらにfirst_n_encode()が起動され、ようやく実際の実装が登場します。
sub first_n_encode {
my $class = shift;
my ( $text, $length, $enc ) = @_;
require MT::Util;
$text = MT::Util::remove_html($text);
$text =~ s/(\r?\n)+/ /g;
$text = substr( $text, 0, $length );
return $text;
}
first_n_encode()ではまずremove_html()を実施しています。
そして改行をスペースに変換して、最後に必要な文字数を抽出しています。
つまりwordsモディファイアの動作は、
- 不要なHTMLタグはカウント対象外
- 改行はスペースに置き換え
ということになります。
Posted by yujiro このページの先頭に戻る
- MTテンプレートタグのlastnモディファイアとlimitモディファイアの違い
- strip_tagsモディファイアとremove_htmlモディファイアの違い
トラックバックURL
コメントする
greeting