はじめに
ウェブページのdescriptionをpagebodyから引用するときに全角スペース、タブコートが存在する場合、削除できるようにする
MTタグのstrip_linefeeds系の使用方法で対応できるようにプラグイン化する。
Filters.pmに追加すれば簡単だが、バージョンアップも踏まえてプラグイン化で。。。
コードハックしてみる
\lib\MT\Template\Context.pmの最後のほうにadd_global_filterの使い方が書いてある。
For example, the following adds a I filter:
MT::Template::Context->add_global_filter(rot13 => sub {
(my $s = shift) =~ tr/a-zA-Z/n-za-mN-ZA-M/;
$s;
});
Which can be used like this:
<$MTEntryTitle rot13="1"$>
Another example: if we wished to implement the built-in I filter
using I, we would use this:
MT::Template::Context->add_global_filter(trim_to => sub {
my($str, $len, $ctx) = @_;
$str = substr $str, 0, $len if $len < length($str);
$str;
});
ふむふむ
プラグイン化してみる
よく使う簡易な定義
これでプラグインリストにそれなりに表示できるはず。
package MT::Plugin::CcvStripTab;
use Encode;
use vars qw( $PLUGINNAME $VERSION );
$PLUGINNAME = 'CcvStripTab';
$VERSION = '1.0.0';
use base qw( MT::Plugin );
my $plugin = __PACKAGE__->new({
id => $PLUGINNAME,
key => $PLUGINNAME,
name => $PLUGINNAME,
version => $VERSION,
author_name => '電脳職人村',
author_link => 'http://www.omakase.net/',
doc_link => 'http://www.omakase.net/',
description => <<HTMLHEREDOC,
This plugin for Strip Tab.
HTMLHEREDOC
});
MT->add_plugin( $plugin );
使い方では
第一引数 $str 変換される文字列
第二引数 $len rot13="1"で指定した1の部分
第三引数 $ctx ビルドするときの例のやつ
MT::Template::Context->add_global_filter(引数名 => sub {
my($str, $len, $ctx) = @_;
ここに書きたいものを書く
$str;
});
実際の処理
\tはタブコード
\x{3000}は全角スペース
上記を削除する正規表現で書く
if($len) {
$str =~ s/\t//gm;
$str =~ s/[\x{3000}]+//gm;
}
値が2のとき、全角スペース削除は
0以外は、タブ削除 2の時は、タブ削除と全角スペース削除
$str =~ s/\t//gm if($len);
$str =~ s/[\x{3000}]+//gm if($len == 2);
最終的には
package MT::Plugin::CcvStripTab;
use Encode;
use vars qw( $PLUGINNAME $VERSION );
$PLUGINNAME = 'CcvStripTab';
$VERSION = '1.0.0';
use base qw( MT::Plugin );
my $plugin = __PACKAGE__->new({
id => $PLUGINNAME,
key => $PLUGINNAME,
name => $PLUGINNAME,
version => $VERSION,
author_name => '電脳職人村',
author_link => 'http://www.omakase.net/',
doc_link => 'http://www.omakase.net/',
description => <<HTMLHEREDOC,
This plugin for Strip Tab.
HTMLHEREDOC
});
MT->add_plugin( $plugin );
use MT::Template::Context;
MT::Template::Context->add_global_filter(strip_tab => sub {
my($str, $len, $ctx) = @_;
if($len) {
$str =~ s/\t//gm;
$str =~ s/[\x{3000}]+//gm;
}
$str;
});
上記を、CcvStripTabフォルダーを作成してその中にCcvStripTab.plという名前で保存してプラグインフォルダーの中にいれれば完了です。
呼び出しは、こんな感じ
<MTタグ strip_tab="1">
どんな時に使う?
個人的には、いつも、カスタムフィールドにウェブページのdescription、記事のdescriptionを各システムオブジェクトで作成します。
カスタムフィールドで登録されなかったら、ウェブページの本体を出す
こうすれば、カスタムフィールドで入力されなかった場合、記事の内容を出すことができます。
気に入らない場合は、カスタムフィールドで入れます。
<mt:if tag="カスタムフィールドで定義したテンプレートタグ">
<mt:カスタムフィールドで定義したテンプレートタグ remove_html="1" encede_html="1">
<mt:else>
<mt:pagebody remove_html="1" encede_html="1" strip_linefeeds="1" strip_tab="1" trim_to="100+...">
</mt:if>
<meta name="description" content="上記タグを改行なしでここに書く">
追記
Movable Type Pro r.4706で Registryに登録してね!ってプラグインリストエラーがでるようになったので
MT::Template::Context::add_global_filterはRegistry (path: tags, modifier)に直してください。
下記の定義を追加した。チェックが厳しくなったのね。
sub init_registry {
my $plugin = shift;
$plugin->registry({
global_filters => {
'strip_tab' => \&strip_tab
},
tags => {
block => {
strip_tab => \&strip_tab,
},
function => {
strip_tab => \&strip_tab,
},
modifier => {
strip_tab => \&strip_tab,
},
},
});
}
sub strip_tab {
my($str, $len, $ctx) = @_;
$str =~ s/\t//gm if($len);
$str =~ s/[\x{3000}]+//gm if($len);
$str;
}
さいごに
こっちで文字加工したいとき、いろいろ自作できます。
十分にテストしてから・・・・・
author_nameとか。変えても問題ないです。。サポートしていませんから。。
では・・