「lily でブログカスタマイズ第1回」では、lily の導入と基本的な記事の投稿方法を解説しました。
「lily でブログカスタマイズ第2回」では、デザインをカスタマイズするための flavour という仕組みを解説しました。
ここまで連載を読んできてくださった方は、既に lily を使って自分の好みのデザインのブログを作ることが出来ます。しかし、実際に運用するブログを作る場合、ここまでの説明だけでは不十分な要素があります。
例えば過去記事へのリンクを一覧表示したい、カテゴリ別記事へのリンクを一覧表示したいという場合、lily 本体の機能だけでは月別、カテゴリ別の記事表示は出来てもリンクの一覧は作成できないので、ユーザが flavour に手作業で書き込んでいくことになります。これでは間違いも発生しそうですし、なんのためにブログツールを使ってサイト構築するのか分からなくなってきます。
それ以外にも一般的なブログやWeb日記と呼ばれるサイトには
などがありますが、これらにいたっては lily の標準機能では実現できないものばかりです。
しかし、lily 公式サイトの「標準セット」をインストールすると、標準のブログの画面に「コメント入力欄」や「リンク元の表示」が現れます。サイドメニューには検索欄も表示されています。
実は、これらの機能は「標準セット」に含まれている plugin というもので実現されている機能なのです。
アプリケーションソフトに追加機能を提供するプログラム。
特にウェブブラウザに多用されている。
ソフトによって呼び方は変わりますが、上記の説明のようにアプリケーションに機能を追加する (比較的) 小さなプログラムを plugin といいます。lily ではいくつかのメソッドを定義する小さな Ruby スクリプトファイルが plugin として動作します。
plugin は Ruby スクリプト (拡張子 .rb のファイル) として提供されます。利用するときには、ほとんどの場合 lily.cfg で plugin_dir に指定したディレクトリ (デフォルトでは lily インストールディレクトリ直下の plugin ディレクトリ) にファイルをアップロードするだけです。
その他の場合は、plugin ディレクトリ下にデータ保存のためのディレクトリを作る必要がある plugin があります。公式サイトで配布している plugin では comment、trackback、referer プラグインです。これらのプラグインを導入する場合は、プラグイン名と同じディレクトリ (例えば「referer」) を plugin ディレクトリ下に作成してください。
アップロード後、例えば
のように flavour ファイルに記述すると、その位置に月別一覧ページのリンクリストが表示されます。標準添付されている flavour では、サイドメニューが head.flav に記述されているので、その中の
といった記述に続けて
と追記すると、
といった具合に画面に表示されます。
plugin の作り方を説明する前に、lily ではどのようにして plugin 機能を実現しているかを簡単に説明します。
以下は、もっとも簡単な plugin である storytitle plugin について説明します。
3つのメソッドが定義されています。lily ではこれらのメソッドを instance_eval を使って、Lily クラスのレベルで実行します。
plugin ディレクトリ下の拡張子「.rb」のファイルを読み込んで instance_eval を実行しています。self は自分自身、つまりここでは Lily クラスを意味します。
plugin が実行するタイミングは 2 回あります。
まず、画面出力前に lily は plugin のファイル名と同じメソッドを実行しようとします。
上の storytitle plugin では storytitle メソッドが実行されます (空なので何も実行されませんが)。
次に、plugin 中で「$半角文字列::半角文字列」、という書式が記述された時です。lily は記述された位置で「半角文字列_半角文字列」というメソッドを実行し、返却された値を画面出力します。
$storytitle::page_title と記述すると、storytitle_page_title メソッドが実行されるわけです。
plugin を作る場合、この2つの呼び出しタイミングを上手く生かしてプログラミングする必要があります。
それでは、実際に plugin を作ってみましょう。今回は plugin の作り方として典型的なパターンを3つ挙げ、それぞれ plugin を実装します。
いわゆるアクセスカウンターです。単に当日のアクセス数、昨日のアクセス数、総アクセス数を出力する簡単な plugin ですが、先に示した lily の plugin の2種類の呼び出し方法で利用されるため、サンプルとして取り上げました。
まず、ファイル名を「counter.rb」とします。この場合、counter メソッドが lily の実行時 (出力前) に呼び出されることになります。
例では DBM を使っていますが環境依存を減らす場合は SDBM を使ったほうが良いでしょう (ソース中の DBM を SDBM に変えるだけです)。他にも GDBM、QDBM などお好みでどうぞ。
当日のアクセス数 (@count_today) と総アクセス数 (@count_all) は変数名に@をつけて Lily クラスのインスタンス変数として扱っています。インスタンス変数は以降のメソッドでも使用できるため、アクセス数を表示するメソッド内で再度 DBM で値を読み出さずに済みます。
結果、値を出力するメソッドはものすごく単純になりました。サンプルページでこの plugin を動かしています。以下に全ソースのリンクを置いておきます。 counter.rb
LIRS とは、アンテナへの更新時刻通知に使われるフォーマットです。詳しい仕様は以下を参照してください。
大雑把に言えば以下の内容を順にカンマ (,) 区切りで出力 (要 gzip 圧縮) すればいいわけです。
今回は flavour が「lirs」だった時に LIRS 形式データを出力するようにします。
この plugin を導入すると以下のようなURLでLIRS形式のデータを取得できるようになります。
http://www.mikihoshi.com/rubima/d/lily.cgi/index.lirs
さて、このメソッドではいくつかのインスタンス変数が使われています。Lily クラスではブログの設定情報などをインスタンス変数として持っている為、plugin で利用することが出来ます。以下に、plugin でも良く使われるインスタンス変数の例を示します。
変数名 | 説明 |
@blog_title | ブログのタイトル |
@blog_description | ブログの説明 |
@blog_language | ブログで使用する言語(ja=日本語など) |
@datadir | 記事ファイルのあるディレクトリ |
@flavourdir | flavourのあるディレクトリ |
@flavour | 表示に使用するflavour名 |
@plugin dir | plugin のあるディレクトリ |
@encode | 出力データの文字エンコード |
@author | 著者名 |
メールアドレス | |
@storys | 表示する記事ファイルのパスの配列 |
LIRS plugin では
のようにインスタンス変数を利用しています。なお、get_post_time とは Lily クラスのメソッドで、記事ファイルの最終更新時刻を (キャッシュしているので) 高速に取得します。また、@blog_title.to_euc のようにしているのは、LIRS の仕様で文字コードを EUC で出力するようになっているためです。
del.icio.us は最近話題の URL クリッピングサービスです。類似のサービスは色々とありますが、タグによってクリップしたデータを分類したり、同じタグを付けている人がクリップしたURLを横断的に参照できるのが目新しいところです。del.icio.us plugin は、自分が del.icio.us でクリップしたURLの一覧をブログのサイドメニューに表示する plugin です。
幸いにも、del.icio.us から情報を取得する API は公開されていて、rubyで扱うためのライブラリも存在します。ダウンロードしたライブラリ (rublicious) は $:で指定されたライブラリパス (例えば、lily.cgi と同じ階層) にアップロードしてください。なお、del.icio.us の recentAPI は日本語が変な具合に化けるので、こちらの記述を参考に文字コード変換処理を加えてあります。
Rubilicious クラスをnewする際に、引数として del.icio.us に登録しているログインIDとパスワードを渡す必要があります。上のソースでは @env というインスタンス変数を使っていますが、これは lily.cfg に記入されて内容を保持しているハッシュです。従って
のように lily.cfg に記入すれば、例のように plugin 中で値を利用できます1。
flavour 内では以下のようにしてサイドメニューの適当な位置に記述します。
出力結果は以下のURLを参照してください。
http://www.mikihoshi.com/rubima/d/lily.cgi
ここでは、改めて今まで連載してきた内容をまとめてみます。今回から読まれる方は参考に、今までお付き合いくださった方は復習としてご確認下さい。
前半は、lily スクリプトを自分の Web サーバ (或いはレンタルサーバ) にアップロードし、最低限ブログの画面を表示するようになるまでの設定をまとめました。「FTP に余り慣れない」「パーミッションて何?」という人は、この章から見はじめた方が良いと思います。
後半では、記事をファイルに書いて FTP でアップロードするという、lily 独特の記事の投稿方法を説明しています。また、Wiki 記法など HTML のタグを直書きせずに記事を書くための「フィルタ」の使い方についても解説しました。
lily でブログのデザインをカスタマイズするため、flavour と呼ばれる独特の仕組みについて解説しました。同じブログでも flavour を切り替えることで全く違った見た目になったり、RSS として表示したりするサンプルも紹介しています。tDiary のテーマを利用できる flavour も配布しているので、とにかくデザインの変更から始めたい方はこの章からどうぞ。
今号の記事です。コメントや TrackBack など、インタラクティヴな機能を実現する plugin という仕組みについて、若干 lily の内部構造も解説しつつ、いくつかの plugin 作成を通じて説明していきました。自分で plugin を作ろうという方の参考になったでしょうか?
当初 1 回の予定だったのですが、私の遅筆と構成力不足 (後から書きたいことが…) で 3 回の連載になってしまいました。良い意味でマニアックな他の記事に比べるとよく言えばマイルド、悪く言えば歯ごたえのない記事になってしまったかもしれません。
今回はブログとしての使用法に注力して記述してきましたが、本来 lily は軽量の CMS を想定して開発しています。現在開発中の lily2 では、blosxom 互換の仕様のうち、良いところだけを引き継ぎ、パワーユーザから初心者の方まで色々な使い方の出来る多目的なツールに生まれ変わろうとしている最中です。拙作 wema ともども、どこかで皆さんのお役に立てれば幸いです。
なまえ:ふしはらかん。 http://www.mikihoshi.com/d/ にて日記を書いてます。
lily.cfgにパスワードを書くことになるので、見られると困る方、隠したかの分からない方はdelicious.rbに直接書くことをお奨めします ↩