MTのプラグインが書けるようになりたいなーと思って、ただいまPerlとMTのお勉強中。その1。
「あたちもMTのプラグイン書けるようになりたいっ」と社内SEに泣きついたら、「しょーがねーなー」とひと肌脱いでくれまして、先週から社内でMTお勉強会してもらってます。
勉強会のおさらいと、 コードネーム’歩実ちゃん’(知人の子供)誕生を記念して、 赤ちゃん語変換を行うプラグインを書いてみた。
ブロックタグ<mt:BabyTalk> を提供し、このタグで囲まれた範囲内に たとえば「~です。」と書いてあったら「~でちゅ。」になるような。。。
一応マイ・ファースト・MTプラグインでちゅ^^;
とはいえ、自力で1からは無理ぽorz…と思ったので
bzbellさんのプラグイン「RemoveBlank」を参考にさせてもらって、Perlの入門書にあったサンプルコードを 合体ぐにゅぐにゅして作ったですよ ^^;
PlugInソース ちなみに、元の「RemoveBlank」プラグインはこんな感じ。
perlの1ファイルだけの構成。
http://sourceforge.jp/projects/nekotama/downloads/31094/RemoveBlank-1.03.zip/
これをベースに、
1) config.yamlで書いてみた(先週やった勉強会のおさらいさ~)。
Blockタグの宣言は↓こんな風に書けば良いらしい。
cf.) http://www.movabletype.org/documentation/developer/declaring-template-tags.html
tags: block: BabyTalk: $convert_babytalk::BabyTalk::convert_babytalk
で、こうなる↓(むちゃくちゃシンプル ^^;)
/plugins/BabyTalk/config.yaml
name: BabyTalk id: BabyTalk version: 1.0 author_link: http://foxbitz.jp/ author_name: fox_b doc_link: http://foxbitz.jp/doc/ description: Convert text to BabyTalk between a tag. tags: block: BabyTalk: $convert_babytalk::BabyTalk::convert_babytalk
2) RemoveBlankではタグや空行があったら削除変換するところを、赤ちゃん語に変えてplugins/BabyTalk/lib配下に置いただけー。
それが↓コレ
plugins/BabyTalk2/lib/BabyTalk.pm
package BabyTalk;
use strict;
use utf8; # utf8プラグマを有効にする ←6/29追加した
use MT::Template::Context;
use base qw(MT::Plugin);
sub convert_babytalk {
my ($ctx, $args, $cond) = @_;
my $builder = $ctx->stash('builder'); #このへん何やってんのかイマイチわかってないがまーヨシとする
my $tokens = $ctx->stash('tokens');
my $out = $builder->build ($ctx, $tokens, $cond);
return $ctx->error ($builder->errstr) if !defined $out;
my @list = split(/[\r\n]/, $out);
$out = do_convert(@list);
$out;
}
sub do_convert {
my @out = @_;
my $txt = '';
for (@out) {
s/a/(=^..^=)/g; #for debug(なんか日本語だと変換されないから orz...)
s/さ/ちゃ/g;
s/し/ち/g;
s/す/ちゅ/g;
s/せ/ちぇ/g;
s/そ/ちょ/g;
s/。/ばぶー。/g;
$txt .= $_ . "\n" if ($_ ne '');
}
return $txt;
}
1; # Every module must return true
yamlで書いた内容が反映されてる。いえー♪
MTテンプレにタグ埋め込み。
変換前後がわかるようにこんな風に書いた。
<div class="asset-body"> <h2>変換前:</h2> <$mt:EntryBody$> <h2>変換後:</h2> <mt:BabyTalk><$mt:EntryBody$></mt:BabyTalk> </div>
http://mt.foxbitz.jp/b1/blog/2010/06/convert-to-babytalk.html
日本語の変換ができてないーorz….
明日会社に行ったら誰かに教えてもらおう To be continued..
6/29 utf8プラグマを有効にする1行を追加して解決デキタ気がする。
use utf8; # utf8プラグマを有効にする
●参考にしたサイト
Encode – 日本語などのマルチバイト文字列を適切に処理する / Perlモジュール徹底解説 :: サンプルコードによるPerl入門
http://d.hatena.ne.jp/perlcodesample/20091118/1246679588
なおよくわからないこと
今回utf8プラグマの1行追加しただけで動いているっぽいのだけれど、 このプラグインに受け渡される文字列は、すでに”内部文字列”ちゅうやつなんかしら?!
$out を最初と最後にdecode/encodeする必要はあるのかな?!
こーいうのホントは必要だった? MTの仕様を確認すればわかるんかな。。。To be continued…
↓
use Encode qw/encode decode/;
# UTF-8バイト文字列を内部文字列にデコード
$str1 = decode('UTF-8', $str1)