ブログ管理ソフトで最も一般的なMovable Typeのメリットはカスタマイズ性
が非常に高いことである.テンプレートやスタイルシートをカスタマイズすることで
Blogのデザインを自在に変えることができる.また,各種プラグインを組み込むことで,
様々な機能を追加することができる.
本報告では,Movable Typeの特徴の一つであるプラグインの作成方法について,
簡単な例を挙げ説明する.なお,今回取り上げる例はグローバル・フィルターのみである.
Movable Typeはブログを管理するソフトであり,そのカスタマイズ性が高いことから,
もっとも一般的に利用されており,多くのユーザを持つ.
テンプレートやスタイルシート,また各種プラグインを組み込むことで,
さまざまな機能を追加することができるようになっている.
本報告では,カスタマイズする項目の中でもプラグインに注目し,
その作成方法について,例を用い説明する.
プラグインにはいくつかの種類があるが, 主にテンプレートに機能を追加するためによく使われる. 下記にプラグインの種類を挙げる.
テンプレートで使用するタグは,アトリビュートを指定することで,出力の形式を 変えられるものがある.例を以下に示す.
<MTEntries lastn="5"> <p><$MTEntryTitle$></p> </MTEntries lastn="5">
テンプレート上で,上記のようなタグを用いると, エントリーのタイトル出力をできるのだが,『lastn="5"』の数値を変えることで, 表示するエントリーの数を指定できる. このようなタグに付加した属性(アトリビュート)を用いることで, タグにフィルターをかけ,様々な形で表示することができるようになる.
変数タグは,タグが呼び出されたら,基本的にはその内容に置き換えるという機能を持つ. テンプレート内では,『<$MTEntryTitle$>』などが変数タグに相当し, HTMLタグと区別をつけるために,『$』を付ける.
Movable Typeの標準の機能には,最近コメントのあったエントリーを表示する機能があり, 下記のように表記することで最近コメントのあったエントリーのタイトルを繰り返し処理で取得することができる.
<MTCommentEntry> <p><$MTEntryTitle$></p> </MTCommentEntry>
このような,繰り返し機能を持つタグをプラグインで作成することができる.
条件によってテンプレートの処理を分ける場合には, 条件を指定することで実現する. 以下の例では,エントリーでキーワードを設定していれば, 『<MTIfNonEmpty tag="MTEntryKeywords">』〜 『</MTIfNonEmpty>』で囲まれた文字列,つまりキーワードを出力する.
<MTIfNonEmpty tag="MTEntryKeywords"> キーワード:<em><$MTEntryKeywords$></em> </MTIfNonEmpty>
条件タグは,繰り返しを行うコンテナ・タグと組み合わせる場合が多く, コンテナ・タグで利用できる変数タグを用い,条件分岐を行うことで利用される.
続いて,簡単なプラグインの作り方を説明する. なお,Movable TypeではPerlのAPIが用意されており, 全てPerlでプラグインを記述する.
プラグインの中で最もシンプルなグローバルフィルターの例を挙げる.
下記に特定文字に対して,色付けを行うプラグインプログラムを示す.
ダウンロード先URL:
http://mikilab.doshisha.ac.jp/dia/research/report/2005/0813/009/plugins/sampleGF.txt
(右クリックで保存し,拡張子をplに変更)
1| package MT::Plugin::sampleGF;
2| use strict;
3| use MT::Template::Context;
4| use Jcode;
5|
6| # Global Filter sampleGF の定義
7| MT::Template::Context->add_global_filter(sampleGF => \&sampleGF);
8|
9| # Filter によって起動されるメソッド
10| sub sampleGF {
11| my ($text, $arg, $ctx) = @_;
12|
13| my $charset1 = 'sjis';
14| my $charset2 = 'utf8';
15|
16| my $before="強調";
17| my $after="<font color=red>$before</font>";
18|
19| $text = Jcode->new($text)->$charset1();
20| $text =~ s/$before/$after/ig;
21| $text = Jcode->new($text)->$charset2();
22| }
23|
24| 1;
1行目では,MT::Plugin::[パッケージ名]とパッケージの宣言をすることで, パッケージの名前を宣言する.
1| package MT::Plugin::sampleGF;
3,4行目で,プラグインの中で使うクラスを宣言する.MT::Template::Context クラスにでは,再構築中のテンプレートについて,さまざまな情報を管理するものであり, テンプレートタグのプラグインには,このクラスのオブジェクトが渡される. また,プラグインの中で日本語を扱う場合,文字コードを変換する必要があるので, Jcodeクラスを宣言しておく必要がある.
3| use MT::Template::Context; 4| use Jcode;
続いて,グローバル・フィルターをMovable Typeに登録する.それには,
MT::Template::Contextクラスの「add_global_filter」というメソッドを使う.
このメソッドの書き方は,以下の通りである.
MT::Template::Context->add_global_filter(グローバル・フィルターの名前 => \&処理を行う関数);
6| # Global Filter sampleGF の定義 7| MT::Template::Context->add_global_filter(sampleGF => \&sampleGF);
グローバル・フィルターの関数には,Movable Typeのシステムから,3つのパラメータが渡される.
11行目では,それらのパラメータを$text, $arg, $ctxの各変数に代入していく.
1つ目のパラメータ($text)は,処理中のテンプレートタグの文字列を表す.
例えば,「<$MTCategoryLabel sampleGF="Melody"$>」のように書いた場合,
カテゴリー名が$textに代入されることになる.
2つ目のパラメータ($arg)は,属性(アトリビュート)に指定されている値が代入される.
先程と同じように書いた場合には,「Melody」が$argに代入される.
3つ目のパラメータ($ctx)には,MT::Template::Contxtクラスのオブジェクトが渡される.
(この例では使用していない)
sub グローバル・フィルターの関数{ my($text, $arg, $ctx) = $_; $textと$argを元にタグの値を処理 処理結果 }
これらのパラメータから,テンプレートタグの文字列に対して処理を行い,その結果を返すように することにより,グロバール・フィルターとなる.
10| sub sampleGF {
11| my ($text, $arg, $ctx) = @_;
12|
13| my $charset1 = 'sjis';
14| my $charset2 = 'utf8';
15|
16| my $before="強調";
17| my $after="<font color=red>$before</font>";
18|
19| $text = Jcode->new($text)->$charset1();
20| $text =~ s/$before/$after/ig;
21| $text = Jcode->new($text)->$charset2();
22| }
この例では,文中に現れた「強調」文字の色を赤に変える機能を持つ. なお,ここでの処理は一般的なperlによるものなので,説明は省略する.
作成したプラグインは,ファイル名を付け「プラグイン名前.pl」という形式で保存する.
なお,上記の例で示したプラグインの場合,「sampleGF.pl」となる.
続いて,このファイルをMovable Typeのインストール先のpluginsフォルダの中にコピーする.
基本的にプラグインのインストール作業は以上であり,
後はプラグインを用いた処理を利用したい箇所のテンプレートを変更する.
テンプレートで「メインページ」(もしくわ「index.html」)の中で,
『<$MTEntryBody$>』を探し,『<$MTEntryBody sampleGF="1"$>』と変更し,
サイトを再構築した場合,Fig.1に示すように「強調」という文字の色が赤色となる.
特定文字の色を変更するsampleGF.plプラグインでは, 色を変更する対象文字はプログラム上で変更しなければならなかったが, 属性(アトリビュート)で指定することができるように変更できる. 以下が変更後のプログラムである.
1| package MT::Plugin::sampleGF;
2| use strict;
3| use MT::Template::Context;
4| use Jcode;
5|
6| # Global Filter sampleGF の定義
7| MT::Template::Context->add_global_filter(sampleGF => \&sampleGF);
8|
9| # Filter によって起動されるメソッド
10| sub sampleGF {
11| my ($text, $arg, $ctx) = @_;
12|
13| my $charset1 = 'sjis';
14| my $charset2 = 'utf8';
15|
16| my $before=$arg;
17| my $after="<font color=red>$before</font>";
18|
19| $text = Jcode->new($text)->$charset1();
20| $text =~ s/$before/$after/ig;
21| $text = Jcode->new($text)->$charset2();
22| }
23|
24| 1;
このようにプログラムを書き換えると,例えばテンプレートで 『<$MTEntryBody sampleGF="赤"$>』としたならば, 赤という文字が赤色となる. このように,ユーザはテンプレートのみの変更でプラグインの利用 効果を変えることができるようになる.
本報告では,Movbale Typeにおけるプラグインの基本的な作成方法を説明した.
Movable Typeでは,プラグインを作成の際に利用できるAPIが用意されており,
このためシンプルにプラグインを記述することができ非常に便利である.
プラグインは基本的にタグに関する処理が多いが,今後はタグ以外の処理を調査
する.
Copyright (C) 2005 Tomoyuki Hiroyasu, All rights reserved. Copyright (C) 2005 Mitsunori Miki, All rights reserved. Copyright (C) 2005 Masashi Miyazaki, All rights reserved. No part of this document may be reproduced, copied, distributed, transferred, modified, or transmitted, in any form or by any means, without the prior written permission of the authors. In no event shall the authors be liable for any damages caused in any way out of the use of this document.