Movable Type7 文字置換プラグイン

らら
らら

はじめに

ウェブページの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とか。変えても問題ないです。。サポートしていませんから。。

では・・

関連記事