Lamawiki-0.01

機能面では WiLiKi からコメントをとりのぞいたサブセットで、 Markdown に近い書式の Wiki エンジンを欲しくなって、 自分が使うために、 夏から作っていました。 ここにきて、 コミット頻度がようやく落ちついてきたこと、 目標の一つであった「さくらインターネット スタンダード・プランのデフォルト Perl-5.8.9 環境へアップロードしてファイル属性を設定するだけで動作すること」をクリアできたところで、 一息ついておこうと、 新しくリポジトリへ切り出して github に置いておくことにします。

https://github.com/tociyuki/lamawiki-perl

シンプルどころか、プリミティブな Wiki 機能しか実装してないので、 使えない機能をリストアップした方が賑やかになりそうです。 といっても、 ワード・カニンガムによる元祖 Wiki から検索を除けば同じことが大抵できます。 Wiki ページを、 タイトルをキーとし、 編集履歴である原稿シーケンスを値とするマッピングとし、 さらに Wiki ページが有向グラフになっているとする Wiki としてはありきたりのデータモデルを採用しています。 タイトルは単一でフラットな名前空間になっています。 現代の Wiki エンジンが当たり前に備えている便利機能やら、 見てくれを素敵にするあれやこれやの機能のことごとくを自分は使ったことがないので、 ばっさりと削り落としてあります。 そんな低機能のエンジンを自分以外に使う人はいないと思いますが、 動かすのに最低限必要な項目を README.md に書き込んであります。

コーディングの特色は、

  1. 反モダン Perl (反 Moose かつ反 WAF かつ反 R/O マッピング) で、
  2. テストの書きやすさを重視し、
  3. インスタンス・ベース の has-a 継承を多用しつつ、
  4. インスタンスは可能な限り非破壊操作で扱い、
  5. 依存性の注入の徹底、
  6. 差分と衝突時マージはクライアント・サイド javascript まかせにしてサーバの負荷低減、

といったところです。 テストに Test::Base すら使わず、 Test::More さえあればテストできるようにしています。 CGI スクリプトPSGI アプリケーションで働き、 plackup 時の Plackミドルウェア Static を使うことを除くと、 Plack への依存も最低限に抑えてあります。 CGI でもそこそこの速度で動くため、 試してませんが、 mod_perlFastCGI で動かすときは Static ミドルウェアを使う必要はなく、 Plack のハンドラを間にかませるだけで動作するはずです。

モジュール構成は次のようになっています。

  • モデル
    1. Lamawiki -- モデル・インスタンス間をつなぐ Mediator
    2. Lamawiki::Htpasswd -- htpasswd MD5 パスワード形式のファイルを使った認証
    3. Lamawiki::Cookie -- HTTP_COOKIE による認証セッションの維持
    4. Lamawiki::Capability -- ページ書き込み認可
    5. Lamawiki::Tokenbucket -- トークン・バケット・フィルタのデータベース・モデル
    6. Lamawiki::Page -- Wiki ページと原稿データベース・モデル
    7. Lamawiki::Interwiki -- InterWikiName データベース・モデル
    8. Lamawiki::Converter -- 書式変換エンジン。Wiki ページの有向グラフのノード情報を扱う
    9. Lamawiki::Sqlite -- SQLite3 の SQL 手続き
    10. Lamawiki::Database -- SQL 手続きのベース・クラス
  • ビュー
    1. Lamawiki::Layout -- ページ中に他のページ内容を展開するエンジン
    2. Lamawiki::Liq -- テンプレート・エンジン
    3. Lamawiki::Strftime -- ジェネリックな strftime 変換手続き
  • コントローラ
    1. Lamawiki::Controller -- HTTP リクエスト受け入れと HTTP レスポンスの送出

書式変換エンジンはモデルなのかビューなのか作りながら何度か揺れ動いたものですが、Wiki ページの有向グラフを扱う役割に気づいてからはモデルに含めています。