Movable Type 備忘録

 プラグインの解読(Minifier Plugin)

こんばんわ^^

今日は中目黒に住んでる同僚が午後出社( 実は寝坊 )してきたので、お詫び( 誰に!? )にヨハンのチーズケーキを買ってきてくれました (●>∀<●) ラッキー
チーズケーキ好きなわたしとしては外せないお店の一つです。機会があったら是非。

さて、訪問者さんからプラグインの作り方について質問がありました。
作り方を教えてくれ・・・言われてもちょと困ってしまうのですが、とにかくたくさんのプラグインのコードを解析して学んでくださいとしか、わたしには言えません (; ̄∇ ̄A
なので、先日ご紹介した Minifier プラグインを例にしてざっくりとプラグインの説明してみますね。
間違ったこと書いてたら教えてください (; ̄∇ ̄A

まずは、Minifier プラグインはそれほど大きなプラグインではないので、全体のコードを以下に記します。

Minifier プラグインコード

  1. package MT::Plugin::Minifier;
  2. use strict;
  3. use base qw( MT::Plugin );
  4.  
  5. use MT;
  6.  
  7. our $VERSION = '0.01';
  8.  
  9. my $plugin = __PACKAGE__->new(
  10.     {
  11.         name => 'Minifier',
  12.         id => 'minifier',
  13.         key => 'minifier',
  14.         description =>
  15.           'Minifier provides mt:cssminifier and mt:jsminifier block tags.',
  16.         doc_link => 'http://code.as-is.net/public/wiki/Minifier',
  17.         author_name => 'Hirotaka Ogawa',
  18.         author_link => 'http://as-is.net/blog/',
  19.         version => $VERSION,
  20.     }
  21. );
  22. MT->add_plugin($plugin);
  23.  
  24. sub instance { $plugin }
  25.  
  26. sub init_registry {
  27.     my $plugin = shift;
  28.     $plugin->registry(
  29.         {
  30.             tags => {
  31.                 block => {
  32.                     'CSSMinifier' => \&_hdlr_css_minifier,
  33.                     'JSMinifier' => \&_hdlr_js_minifier,
  34.                 },
  35.             },
  36.         }
  37.     );
  38. }
  39.  
  40. sub _hdlr_css_minifier {
  41.     my ( $ctx, $args, $cond ) = @_;
  42.     my $builder = $ctx->stash('builder');
  43.     my $tokens = $ctx->stash('tokens');
  44.     defined( my $out = $builder->build( $ctx, $tokens, $cond ) )
  45.       or return $ctx->error( $builder->errstr );
  46.     require CSS::Minifier;
  47.     CSS::Minifier::minify( input => $out );
  48. }
  49.  
  50. sub _hdlr_js_minifier {
  51.     my ( $ctx, $args, $cond ) = @_;
  52.     my $builder = $ctx->stash('builder');
  53.     my $tokens = $ctx->stash('tokens');
  54.     defined( my $out = $builder->build( $ctx, $tokens, $cond ) )
  55.       or return $ctx->error( $builder->errstr );
  56.     require JavaScript::Minifier;
  57.     JavaScript::Minifier::minify( input => $out );
  58. }
  59.  
  60. 1;
  • 10 行目

    package は名前空間を宣言します。名前空間を定義することで変数の重複を防ぐことができます。詳しいことは Perl の書籍をご覧になるか、ネットで検索してください。
    とにかく、いろんなパッケージをロードする際変数が重複することを防ぐ効果があります。名前空間名は何でもいいです。ユニークな名称をつけます。

  • 11 行目

    use strict; は間違った Perl の構文を使用した場合にエラーして教えてくれるものです。必須で記述した方がいいと思います。

  • 12 行目

    MT::Plugin パッケージを継承することを宣言します。これにより MT::Plugin の機能を継承することができます。
    すべてのプラグインは MT::Plugin パッケージを継承しますので必須な記述です。

    MT の各パッケージは mt/lib/MT/ ディレクトリの中の xxx.pm ファイルになります。各ファイルの先頭には package ~ という記述がありますのでご覧ください。

  • 7 ~ 22 行目

    MT::Plugin::Minifier というプラグインを作成します。 new メソッドに渡すパラメータは連想配列です。
    ここで定義したものは name や description、author_name などはプラグイン一覧に表示されます。

    __PACKAGE__ はリテラルという予約語で、10 行目で宣言した名前空間名に置き換えられます。

  • 24 行目

    7 行目で作成したプラグインを登録します。必須な記述です。

  • 26 ~ 29 行目

    よくわかりません (; ̄∇ ̄A
    たぶん誰か( MT のコア!? )がプラグインのインスタンス作成としてこの instance メソッドをコールしてくれるんだと思います。必須です。

  • 35 ~ 47 行目

    プラグインの機能を登録します。これも誰か( MT のコア!? )がプラグイン登録時にこの init_registry メソッドをコールしてくれます。必須です。

    具体的にはプラグインで提供するタグなどを定義することになります。
    MiniFier プラグインの場合だと、MTCSSMinifier と MTJSMinifier というブロックタグ 2 つを提供することになります。
    また、各タグにはハンドラと言われる定義したタグが使用されたばあいに実行されるメソッドもいっしょに宣言することになります。

    たとえば、MTCSSMinifier ブロックタグが使用された場合、_hdlr_css_minifier という 49 ~ 57 行目のメソッドが実行されることになります。
    またファンクションタグを宣言したい場合には、青字の block の変わりに function を使用します。グローバルモディファイアを宣言したい場合には modifier を使用することになります。

  • 49 ~ 57 行目

    MTCSSMinifier ブロックタグのハンドラになります。
    ブロックタグのハンドラは 3 つのパラメータと共に誰か( MT のコア!? )がコールしてくれます( 50 行目 )。最初のパラメータはコンテキストと言われるデータです。2 つ目は MTCSSMinifier ブロックタグといっしょに使用されたモディファイアの連想配列になります。
    最後にコンディションというデータらしく、実際には使われてないとのことです。

    51 行目では、'builder' というキーワードのデータを取得してます。同様に 52 行目でも 'tokens' というキーワードのデータを取得してます。

    53、54 行目で MTCSSMinifier ブロックタグで囲われた、すべての MT タグのハンドラを実行させてます。その出力結果が変数 $out に代入されます。

    55 行目では Minifier プラグインのローカルなパッケージ Minifier/lib/CSS/Minifier.pm を require して、56 行目で CSS::Minifier パッケージの機能を使って CSS の圧縮を行わせてます。
    また、その結果を MTCSSMinifier ブロックタグは返すことになります。

  • 59 ~ 67 行目

    MTCSSMinifier ブロックタグと同様で、ここでは Minifier/lib/JavaScript/Minifier.pm を require してます。

以上ざっとですが Minifier プラグインの解読してみました。
基本的にはこんなかんじなのですが、37 ~ 47 行目の宣言によって様々な機能を提供することになります。

わたしもまだまだ分からないことたっくさんあるのですが、質問していただければ分かる範囲でお答えします。
分からないことはいっしょに解決しましょ (●´∀`●)

以上です。

 Trackback Pings(0)

No trackbacks found.

 Comments(0)

No comments found.

 Post a Comment

 

コメント用フィード