Aug 17, 2008

Pluggableなテンプレートセットを実現する Templetsフレームワーク

Movable Type Developer ConferenceのLightning Talkで話す予定の内容をフライングで公開しておきます。5分で話し切るのは無理だと思いますので。

はじめに

テンプレートセットは、Movable Typeバージョン4(以降MT4)で導入された概念で、インデックステンプレート、アーカイブテンプレート、テンプレートモジュールなどを含むテンプレートの集合のことです。

MT4では、ブログに配備されているテンプレートセットをまとめて操作するための機能が提供されています。例えば、[一覧]→[テンプレート]→[ブログのテンプレートを初期化]からテンプレートセットをインポートして配備できます(テンプレートセットの選択と入れ替え | Movable Type 4 ドキュメント)。その反対に、export-tsTemplateSetExporterのように、ブログに配備されているテンプレートセットをイクスポートするツールやプラグインも有志の手で実現されています。

また、テンプレートセットはプラグインとして配布できるようになっており、有用なテンプレートセットをユーザ間・システム間で共有するのにも役立つ手段となっています。

しかしながら、テンプレートセットにはいくつか欠点もあります。一つは、操作の粒度がテンプレートセット単位であることです。つまり、テンプレートセットの一部をテンプレートセットとしてインポート・イクスポートすることはできません。もう一つは、インポート操作が排他的であることです。テンプレートセットをインポートすると、それ以前のテンプレートセットの状態が失われてしまいます。

これらの欠点を言い換えるなら、テンプレートセットはテンプレートセットの一部をプラグインとして配布・再利用・共有する目的に使えないということです。

Templetsフレームワーク

Templetsフレームワークは、上述のテンプレートセットの問題を解決するために、テンプレット(pluggableな部分テンプレートセット)を実現するフレームワークです。

Templetsフレームワークを使うと、下図のようにベーステンプレートセットに対して、ウィジェットテンプレートライブラリのテンプレット、iPhone用のテンプレット、携帯電話用のテンプレットなどを追加していくことで、カスタマイズされたテンプレートセットを構築できるようになります。

つまり、テンプレートデザイナーは、すべてのテンプレートをデザインする必要はなく、自分が追加・拡張したいテンプレートだけを定義したテンプレットをプラグイン形式で配布できるようになります。ユーザは、そうしたテンプレットプラグインを組み合わせることで自分の用途に合ったテンプレートセットを柔軟に構築できるようになります。

Templetsフレームワークの実装は、Templetsプラグイン(フレームワークの実装)とテンプレットプラグイン(個々のテンプレットの実装)からなります。以下ではそれぞれについて説明します。

Templetsプラグイン

Templetsプラグインは、Templetsフレームワークのコア機能を実装しています。今のところ、テンプレットを現在のテンプレートセットに追加する機能のみを実現していますが、テンプレット単位でテンプレートセットからテンプレートを削除したり、テンプレットの更新をテンプレートセットに反映したり、テンプレートを選択してテンプレットとして出力したりなどといったフレームワークに必要な機能はゆくゆく実装していく予定にしています。

開発版は以下でダウンロードできます。

Templets-0.01.zip

Templetsプラグインをインストールすると、[一覧]→[テンプレート]のアクションリストに[テンプレットを追加]というリンクが表示されます。テンプレットプラグインが一つ以上システムにインストールされている場合には、[テンプレットを追加]ダイアログからテンプレットを一つ選択して[追加]することができます。

首尾よく追加できると、テンプレート一覧にテンプレットによって追加されたテンプレートが表示されるでしょう。

テンプレットプラグイン

個々のテンプレットは、テンプレットプラグインとしてテンプレートデザイナーが実装することになります。

そう言うと難しく思えますが、テンプレットプラグインは、テンプレートセットプラグイン(テンプレートセットの登録 | Movable Type 4 ドキュメント)とほとんど同じ方法で実装できます。テンプレートセットとテンプレットの違いは、

  • テンプレートセットでは「template_setsのhoge_set」を定義するのに対して、テンプレットでは「templetsのhoge_templet」を定義する。
  • テンプレートセットではhoge_setで使用するすべてのテンプレートを定義する必要があるのに対して、テンプレットでは定義したいテンプレートのみ定義すればよい。

ということだけです。

例として、cremaさんのiPhoneテンプレートfor MTをiPhoneTempletという名前のプラグインとしてテンプレット化することを考えます。

iPhoneテンプレートfor MTは、iPhone用のメインページ(iphone_index)とブログ記事(iphone_entry)の2つのテンプレートを含んでいます。

このときプラグインは、以下のようなディレクトリ構成を採ります。

plugins/iPhoneTemplet/config.yaml (テンプレットプラグインの定義ファイル)
plugins/iPhoneTemplet/templates/iphone_index.mtml (iPhone用のメインページのテンプレート)
plugins/iPhoneTemplet/templates/iphone_entry.mtml (iPhone用のブログ記事のテンプレート)
mt-static/plugins/iPhoneTemplet/ (テンプレートが使用するJavaScriptなどを格納するディレクトリ)

テンプレットプラグインの定義ファイルであるconfig.yamlは、以下のように書きます。

name: iPhone Templet
id: iphone_templet
key: iphone_templet
description: iPhone Templet is a templet for (snipped)
templets:
    iphone_templet:
        base_path: templates
        label: iPhone Templet
        templates:
            index:
                iphone_index:
                    label: Main Index (for iPhone)
                    outfile: i/index.html
                    rebuild_me: 1
            individual:
                iphone_entry:
                    label: Entry (for iPhone)
                    mappings:
                        individual:
                            archive_type: Individual
                            file_template: i/%c/%f

冒頭のname、id、key、descriptionはプラグインのメタ情報を設定するものです。テンプレット本体は、templets以降で記述しています。記述方法自体は、テンプレートセットの登録 | Movable Type 4 ドキュメントのYAMLによる方法とまったく同じであることがお分かりになるでしょう。「template_setsのmy_set」の代わりに「templetsのiphone_templet」を定義しているという点を除いては。

iPhoneTempletの開発版は以下でダウンロードできます。

iPhoneTemplet-0.01.zip

まとめ

テンプレートセットはテンプレートセットの一部をプラグインとして配布・再利用・共有する目的に使えないという問題を解決するために、Templetsフレームワークを実装しました。このフレームワークを利用すると、テンプレートデザイナーが実装したテンプレットを自由に配布・再利用・共有することができ、ユーザは複数のテンプレットを組み合わせて自分でテンプレートセットをカスタマイズできるようになります。

実のところ半日ででっち上げたもの(このドキュメントの方が時間かかってます)なので不具合はあるかもしれません。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com