WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

TWiki : スキンをカスタマイズ(前編)

まだまだ [[TWiki>http://twiki.org]] シリーズが続きます(^^;。前回の設定のカスタマイズに続き、今回はスキンのカスタマイズに挑戦してみました。TWiki は前回の ''TWiki Variables'' に似た書式のテンプレートシステムを搭載しており、それによって各ページのテンプレートが記述されています。また、複数のテンプレートセットを保持しておき、それらを切り替えることも可能です。
*TWiki Templates まずは TWiki のテンプレートシステムからご紹介しましょう。TWiki のテンプレートは、すべて $TWiki/templetes に配置されています($TWiki は ''TWiki'' のインストールディレクトリ)。大量のファイルがありますが、その中からサンプルとして "searchformat.tmpl" の中を覗いてみましょう。 %TMPL:INCLUDE{"twiki"}% %TMPL:DEF{"titleaction"}%(search result) %TMPL:END% %TMPL:DEF{"webaction"}% %WEBTOPICLIST% %TMPL:END% %TMPL:DEF{"topicaction"}% %TMPL:END% %TMPL:P{"htmldoctype"}% %TMPL:P{"head"}% #PageTop
%TMPL:P{"standardheader"}%
%SPLIT%Search: %SEARCHSTRING%

%SPLIT%%REPEAT%%REPEAT%%SPLIT%Number of topics: %NTOPICS%

%SPLIT% %TMPL:P{"standardfooter"}% %TMPL:P{"topicinfo"}% #PageBottom なにやら [[HTML]] のタグと ''TWiki Variables'' に似た書式が入り混じっていますね。これが TWiki Templates です。%〜% の部分が実際のコンテンツの内容に応じて適切に置き換えられて、最終的な [[HTML]] が生成されます。blog/Wiki やその他の CMS を使ったことがあれば、なんとなく何をやっているかは想像がつくのではないでしょうか。 ちなみに、この %〜% の部分を「ディレクティブ」と呼ぶようです。TWiki Templates の記述はこのディレクティブの使いこなしがポイントになります。 **ディレクティブの種類 ディレクティブには以下のものがあります。 |~ディレクティブ|機能| |%TMPL:INCLUDE{"<テンプレート名>"}%|''テンプレート名'' のテンプレートを挿入する| |%TMPL:DEF{"<ブロック名>"}%|ブロックの開始| |%TMPL:END%|ブロックの終了| |%TMPL:P{"<ブロック名>"}%|ブロックの内容を挿入| |%{〜}%|コメント| このほか、通常の TWiki Variables も使用可能なようです。 **ブロックについて TWiki Templates で重要なのがブロックの概念です。これはテンプレート内で展開文字列を定義できる機能で、とくに複数のファイルでテンプレートを構成する場合に便利です。例えば、以下のような内容の "base.tmpl" があったとします。 %TMPL:DEF{"head"}% Hello page %TMPL:END% %TMPL:DEF{"body"}%

Hello!

%TMPL:END% そして、以下のような "sub.tmpl" を展開するとします。 %TMPL:INCLUDE{"base"}% %TMPL:P{"head"}% %TMPL:P{"body"}% すると、展開結果は以下のようになります。 Hello page

Hello!

TWiki では、このような方法で全ページで共通な要素はひとつのファイル("twiki.tmpl")にまとめられており、個々のテンプレートはそれをインクルードすることで統一されたレイアウトを実現しています。 **ブロック展開のパラメータ ブロック展開では、展開時に内容を指定できるパラメータを含めることもできます。例えば、以下のようなブロックを定義したとします。 %TMPL:DEF{"title"}% Page no.%n% %TMPL:END% そして、以下のように展開します。 %TMPL:P{"title" n="10"}% すると、展開結果はこうなります。 Page no.10 %n% が ''TMPL:P'' で指定した "10" に置き換えられたわけです。 **ブロックの条件付き展開 ブロック展開では、現在のコンテキストによって展開するブロックを選択することもできます。例えば、以下のテンプレートはユーザーが認証されていれば「ようこそ!」、そうでなければ「ログインしてください」に展開されます。 %TMPL:DEF{"auth"}% ようこそ! &TMPL:END% %TMPL:DEF{"noauth"}% ログインしてください %TMPL:END% %TMPL:P{context="authenticated" then="auth" else="noauth"}% 現在のコンテキストが context="〜" で指定した条件を満たしていれば、then="〜" で指定したブロックが、そうでなければ else="〜" で指定したブロックが展開されます。コンテキストについては、[[こちらのページ>http://twiki.org/cgi-bin/view/TWiki04/IfStatements]]をご覧ください。 *TWiki のスキンについて ここまででテンプレートのシステムをご紹介してきました。次は、''TWiki'' がスキンを実現する仕組みについて見ていこうと思います。ポイントとなるのはテンプレートを読み込む際の検索アルゴリズムにあります。スキンの設定によって読み込むテンプレートファイルの一部(もしくはすべて)を差し替えられるようにすることで、スキンの変更が実現されています。 **テンプレートの検索順位 テンプレートがリクエストされたとき、''TWiki'' はカレント Web やスキンの設定をもとにして複数のファイルやページを検索し、最初に見つかったものを読み込みます。例えば、カレント Web が "Sandbox"、スキンが "pattern" だったときにテンプレート "view" を読み込もうとしたときは、以下の順番で検索されます。 +$TWiki/templates/''view''.''pattern''.tmpl +$TWiki/templates/''view''.tmpl +"''Sandbox''.''Pattern''Skin''View''Template" のページ(複数のスキンが指定されている場合、それぞれが順番に検索される) +"''Sandbox''.''View''Template" のページ +"TWiki.''Pattern''Skin''View''Template" のページ(複数のスキンが指定されている場合、それぞれが順番に検索される) +"TWiki.''View''Template" のページ ※特殊なものや下位互換のための規則は除いてあります。 テンプレートの TMPL:INCLUDE ディレクティブでインクルードする際も同じアルゴリズムが適用されます。例外として、テンプレート名に拡張子 ".tmpl" を付加すると、"$TWiki/templates" ディレクトリにあるその名前のファイルが直接読み込まれます。この場合、上記の検索は実行されません。 スキンの実現に話を絞ると、重要なのは 3, 5 の規則です。設定されているスキン(この場合は ''pattern'')の名前によって読み込むテンプレートが変化するので、ここでスキンの切り替えが実現できます。 また、''TWiki'' では複数のスキンを同時に指定でき、その場合は 3, 5 の段階で指定された順番に検索されます。例えばスキンの設定が "print,pattern" となっていた場合は、3 の段階で "''Sandbox''.''Print''Skin''View''Template", "''Sandbox''.''Pattern''Skin''View''Template" の順で検索されます。 **各ページで読み込まれるテンプレート ''TWiki'' の機能は "$TWiki/bin" 以下にインストールされる複数の [[Perl]] スクリプトで実現されています。例えば、ページの表示には "$TWiki/bin/view"、ページの編集は "$TWiki/bin/edit" という感じです。 そして、それぞれのスクリプトが表示に使用するのは、基本的にそのスクリプト名と同じです。"$TWiki/bin/view" であれば、"view" というテンプレートファイルを前述の検索アルゴリズムで検索し、そのテンプレートを使ってページを構築します。 ただし、"view", "edit" スクリプトに対応するテンプレートに限っては、それぞれ "VIEW_TEMPLATE", "EDIT_TEMPLATE" の ''TWiki Variables'' で変更することができます。特定のページだけテンプレートを変更したい場合などに使用するようです。 **スキンの指定方法 使用するスキンは、''TWiki Variables'' の ''SKIN''、''COVER'' で指定します。それぞれ複数のスキン名をコンマ区切りで記述できます。検索の順番はまず ''COVER'' に記述されたスキンが検索され、次に ''SKIN'' が検索されます。 この 2 つの変数の使い分けですが、''SKIN'' でベースとなるスキンを指定し、必要に応じて ''COVER'' 変数で追加のスキンを指定します。サイト全体のスキンを ''SKIN'' で指定し、''COVER'' で WEB ごとのカスタマイズを追加する、などでしょうか。 また、''TWiki Variables'' による設定とは別に、[[CGI]] パラメータでもスキンを指定できます。[[URL]] に "?skin=print,pattern" などと指定することにより、 ''TWiki Variables'' の指定を上書き(cover の場合は追加)できます。印刷用ページの表示などはこの方法でスキンを差し替えて実現されています。 まとめると、スキンは以下の順番で検索されます。 +[[CGI]] パラメータの ''cover'' による指定 +''TWiki Variables'' の ''COVER'' による指定 +[[CGI]] パラメータの ''skin'' があればその指定、なければ ''TWiki Variables'' の ''SKIN'' [[CGI]] パラメータの ''skin'' が指定されていた場合、''TWiki Variables'' の ''SKIN'' による指定は無視されることに注意してください。 今回は、スキンカスタマイズの前編ということで、ベースとなる知識についてご紹介しました。更なる詳細に関しては、リファレンスマニュアルの以下のページをご参照ください。 -[[TWiki Templates>http://twiki.org/cgi-bin/view/TWiki04/TWikiTemplates]] -[[TWiki Skins>http://twiki.org/cgi-bin/view/TWiki04/TWikiSkins]] 次回は実際にスキンをカスタマイズしながら、具体的な手順をご紹介しようと思います。
関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles