Skip to content

Japanese plugin dev 1 6

uehatsu edited this page May 10, 2011 · 13 revisions

グローバル・モディファイアプラグインの開発について

はじめに

今回は具体的なプラグインとしてグローバル・モディファイアプラグインを作成していく手順を解説します。

グローバル・モディファイアとは?

グローバル・モディファイアは与えられた文字列に対して、すべて大文字に変換する、一部分にURLを付加するなどの加工処理を行います。

グローバル・モディファイアは、利用する際に’<MTEntryTitle lower_case=“1”>’といった形で、タグに対して付与し利用します。

プラグインの仕様とテストケースの作成

プラグインの仕様を決定し、それを元にテストケースの作成を作成しましょう。

プラグインの仕様

  1. タグによって与えられた文章を rot13暗号 を用いて暗号化するグローバル・モディファイアを実装する。
  2. 呼び出し時の引数が1のときのみ動作する rot13="1"

テストケース(00-compile.t)

前回行ったMyPlugin03の内容と基本的に同じです。

use strict;
use lib qw( t/lib lib extlib );
use warnings;
use MT;
use Test::More tests => 5;
use MT::Test;

ok(MT->component ('MyPlugin04'), "MyPlugin04 plugin loaded correctry");

require_ok('MyPlugin04::L10N');
require_ok('MyPlugin04::L10N::ja');
require_ok('MyPlugin04::L10N::en_us');
require_ok('MyPlugin04::Tags');

1;

テストケース(01-tags.t)

前回行ったテストからJSON部分を修正し利用します。エントリーを1件取得し、そのタイトルに対してrot13暗号をかけます。

テストするのは以下の4項目です。

  1. 空文字列をインプットすると、空文字列が戻ってくる。
  2. エントリー1件を取得し、そのタイトル"A Rainy Day"が戻ってくる。
  3. エントリー1件を取得し、そのタイトル"A Rainy Day"をrot13暗号化しない"A Rainy Day"が戻ってくる。(rot13=“0”)
  4. エントリー1件を取得し、そのタイトル"A Rainy Day"をrot13暗号化した"N Enval Qnl"が戻ってくる。(rot13=“1”)
(前略)

#===== Edit here
my $test_json = <<'JSON';
[
{ "r" : "1", "t" : "", "e" : ""},
{ "r" : "1", "t" : "<MTEntries lastn=\"1\"><MTEntryTitle></MTEntries>", "e" : "A Rainy Day"},
{ "r" : "1", "t" : "<MTEntries lastn=\"1\"><MTEntryTitle rot13=\"0\"></MTEntries>", "e" : "A Rainy Day"},
{ "r" : "1", "t" : "<MTEntries lastn=\"1\"><MTEntryTitle rot13=\"1\"></MTEntries>", "e" : "N Enval Qnl"}
]
JSON
#=====

(後略)

rot13グローバル・モディファイアの開発(Perl)

前章で作成したMyPlugin03を元にプラグインを作成します。

config.yaml

グローバル・モディファイアを追加には以下のように"tags"=> “modifier”=> “モディファイア名” => $プラグイン名::ハンドラ名 を記述します。

id: MyPlugin04
name: <__trans phrase="Sample Plugin rot13 globale modifier">
version: 1.0
description: <__trans phrase="_PLUGIN_DESCRIPTION">
author_name: <__trans phrase="_PLUGIN_AUTHOR">
author_link: http://www.example.com/about/
doc_link: http://www.example.com/docs/
l10n_class: MyPlugin04::L10N

tags:
    modifier:
        rot13: $MyPlugin04::MyPlugin04::Tags::_hdlr_rot13

L10N.pm

package MyPlugin04::L10N;
use strict;
use base 'MT::Plugin::L10N';

1;

L10N/en_us.pm

package MyPlugin04::L10N::en_us;

use strict;
use base 'MyPlugin04::L10N';
use vars qw( %Lexicon );

%Lexicon = (
    '_PLUGIN_DESCRIPTION' => 'Sample rot13 global modifier',
    '_PLUGIN_AUTHOR' => 'Plugin author',
);

1;

L10N/ja.pm

package MyPlugin04::L10N::ja;

use strict;
use base 'MyPlugin04::L10N::en_us';
use vars qw( %Lexicon );

%Lexicon = (
    'Sample Plugin rot13 globale modifier' => 'サンプルプラグイン rot13 グローバル・モディファイア',
    '_PLUGIN_DESCRIPTION' => 'rot13 テストプラグイン',
    '_PLUGIN_AUTHOR' => 'プラグイン作者',
);

1;

Tags.pm

rot13の実装です。$arg(引数)に1が設定されていない場合は、そのままreturnします。1が設定されていた場合はrot13暗号をかけた$strをreturnします。

package MyPlugin04::Tags;
use strict;

sub _hdlr_rot13 {
    my ($str, $arg, $ctx) = @_;
    return $str if $arg != 1;

    $str =~ tr/a-zA-Z/n-za-mN-ZA-M/;

    return $str;
}

1;

ファイルの配置

$MT_DIR/
|__ plugins/
   |__ MyPlugin04/
      |__ config.yaml
      |__ lib/
      |  |_ MyPlugin04/
      |     |__ L10N.pm
      |     |_ L10N/
      |     |  |_ en_us.pm
      |     |  |_ ja.pm
      |     |_ Tags.pm
      |__ t/
         |_00-compile.t
         |_01-tags.t

rot13グローバル・モディファイアの開発(PHP)

PHP版のプラグイン開発を行います。

modifier.rot13.php

ファイル名はグローバル・モディファイアである事と、モディファイア名がrot13である事から、modifier.rot13.phpとなります。

<?php
    function smarty_modifier_rot13($str, $args) {
        if ($args != 1) {
            return $str;
        }

        return str_rot13($str);
    }
?>

function名はsmarty記法にのっとってsmarty_modifier_rot13となります。

また実装に関してはPHP4.2以降にはrot13を行う"str_rot13()"関数があるので、そちらを用います。

ファイルの配置

$MT_DIR/
|__ plugins/
   |__ MyPlugin04/
      |__ config.yaml
      |__ lib/
      |  |_ MyPlugin04/
      |     |__ L10N.pm
      |     |_ L10N/
      |     |  |_ en_us.pm
      |     |  |_ ja.pm
      |     |_ Tags.pm
      |__ php/
      |  |_modifier.rot13.php
      |__ t/
         |_00-compile.t
         |_01-tags.t

テストの実行

では、作成したプラグインに対してテストを行います。

00-compile.t

$ perl plugins/MyPlugin04/t/00-compile.t 
1..5
ok 1 - MyPlugin04 plugin loaded correctry
ok 2 - require MyPlugin04::L10N;
ok 3 - require MyPlugin04::L10N::ja;
ok 4 - require MyPlugin04::L10N::en_us;
ok 5 - require MyPlugin04::Tags;

01-tags.t

$ perl plugins/MyPlugin04/t/01-tags.t
1..7
ok 1 - 'blog-name' template found
ok 2 - Test blog loaded
ok 3 - Test entry loaded

ok 4 - perl test 1
A Rainy Day
ok 5 - perl test 2
N Enval Qnl
ok 6 - perl test 3
ok 7 - ok - php test 1 ok - php test 2 ok - php test 3 

proveコマンドでのテスト

$ prove plugins/MyPlugin04/t/*.t
plugins/MyPlugin04/t/00-compile....ok                                        
plugins/MyPlugin04/t/01-tags.......ok                                        
All tests successful.
Files=2, Tests=12, 24 wallclock secs (12.23 cusr +  4.98 csys = 17.21 CPU)

全てのテストにパスし、初めに考えた仕様どおりに動作している事がわかります。

まとめ

グローバル・モディファイアは色々な場面で利用されます。( グローバル・モディファイアリファレンス

新規でファンクションタグを作成しなくても、新規にグローバル・モディファイアを作成する方が簡単な場合があります。これは状況や条件によるので、ケースバイケースでプラグインを作成してください。

プラグイン開発ステップ・バイ・ステップ シーズン1はこれで終了です。プラグイン作成の大枠を体感していただけたでしょうか?シーズン2ではさらにブロックタグやコンディショナルタグなどの解説に進む予定です。

プラグインダウンロード

MyPlugin04.zip(5.94KB)

プラグイン開発ガイド インデックス

  1. プラグイン開発のためのファーストステップ
  2. レジストリ、YAMLについて
  3. 環境変数について
  4. プラグインのローカライゼーションについて
  5. テストドリブンでのプラグインの開発について
  6. グローバル・モディファイアプラグインの開発について
  7. ファンクションタグ プラグインの開発について
  8. ブロックタグ プラグインの開発について
  9. コンディショナルタグ プラグインの開発について
  10. プラグインのデバッグ
  11. プラグインの設定方法
  12. コールバックとフックポイント
  13. スケジュールタスクの開発
  14. MTオブジェクトの利用方法
  15. 独自オブジェクトの作成
  16. 新規アプリケーションの作成
  17. Transformerプラグインの開発
  18. 管理画面のメニュー修正
  19. リストアクションの追加
  20. 動作モードの追加とモーダルウィンドウの表示
  21. 外部Web APIとの連携
  22. 権限とロール
Clone this wiki locally