6月 27 2010

[MTお勉強] 赤ちゃん語変換プラグイン – MTBabyTalk

Posted by きつねのボタン in MovableType, MTプラグイン(お勉強中)

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で書いた内容が反映されてる。いえー♪

2010-06-27_0255

MTテンプレート

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.html2010-06-30_0051

既知の問題

日本語の変換ができてないーorz….

明日会社に行ったら誰かに教えてもらおう  To be continued..

6/29   utf8プラグマを有効にする1行を追加して解決デキタ気がする。

 use utf8; # utf8プラグマを有効にする
  • 日本語などマルチバイト文字をソース内に記述するときは、ソースコードをUTF-8で保存し、その上でutf8プラグマを有効にする。
  • ソースをUTF-8で保存すると、文字列リテラルはUTF-8バイト文字列になる。
  • utf8プラグマを有効にすると、UTF-8バイト文字列を内部文字列に変換する。
  • 内部文字列同士であれば、正規表現がちゃんと動く。

●参考にしたサイト
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)