何故同じrouteを2回定義したときの動作が気になったかというと、@miminashiさんのtweetが気になったからです。

Twitter / @miminashi: @komagata プラグインに書いたdoブロックの ...

Lokkaではまずプラグインが読み込まれるのでこの動きは好都合。

# public/plugin/lokka-unk/lib/lokka/unk.rb:
module Lokka
  module Unk
    def self.registered(app)
      app.get '/' do
        'unk'
      end
    end
  end
end
% curl http://localhost:9646
unk

プラグインから簡単にトップページを横取りできた。これはいいフリーダム。

# public/plugin/lokka-unk/lib/lokka/shit.rb:
module Lokka
  module Shit
    def self.registered(app)
      app.get %r{^/([0-9a-zA-Z-]+)$} do |slug|
        slug
      end
    end
  end
end
% curl http://localhost:9646/1
1
% curl http://localhost:9646/hoge
hoge

個別ページはこんな感じ。選ばれない方のメソッドは単に実行されないので副作用はありません。

LokkaにAkismetプラグイン来た!これで勝つる!@yagi_さんありがとうございます。

プラグインはみんなlokka-xxxxというgithubリポジトリになってるのでsubmoduleとして本体に取り込んでみました。

$ cd $LOKKA_ROOT
$ git submodule add git://github.com/yagitoshiro/lokka-akisment.git public/plugin/lokka-akismet

lokka本体をcloneした時は

$ git submodule init
$ git submodule update

git submodule initすると.git/configに下記みたいな設定が増える。

[submodule "public/plugin/lokka-akismet"]
        url = git://github.com/yagitoshiro/lokka-akismet.git

submoduleの中がmasterブランチになってないのでmasterにする。

$ cd public/plugin/lokka-akismet
$ git checkout master

しないといけないのは若干敷居が高いけど、リリースするzipには含めるからまあいいかなあ。

Lokkaの標準でないプラグインを別リポジトリにして、lokka.orgにプラグインのページを作りました。

Plugins - Lokka

githubを"lokka"で検索して出てくるものを書いてみました。数が増えたらWordPressのPlugin Direcotryみたいにアップ出来るようにしたい。

プラグインの管理画面へのリンク

Lokkaでプラグインで管理画面を持った時にプラグイン一覧からリンクしてくれるようにしました。

Test Site - Lokka

最初はプラグイン内でhave_admin_page(acts_as_fooみたいなの)を宣言するようにしてたんですが、頑張って、

Lokka側から "/admin/plugins/#{プラグイン名}"のページがプラグインに存在したらリンクを貼る。

というようにしました。

管理画面左メニューへの追加

また、管理画面の左メニューの一番下にyield_content :admin_menuというプラグインから挿入できるポイントを入れときました。複数回呼べるみたいなので、色んなプラグインから挿入されても大丈夫ですね。(順番はプラグインの読み込まれる順)

まだ、プラグイン内で管理画面作った場合の認証入れてないんですが、sinatra1.1のパス指定beforeを使えるようにしてからの方がいいかなと・・・。

テーマの方にもheader, footerという挿入できるポイントを入れようと思ってます。(全テーマ修正がだるい・・・)

@nkmrshnさんの素晴らしいまとめ。Optionを使ってるコードとかまだ他で見たことないので素敵ですw

作成したLokkaプラグインのまとめ - nkmrshnの日記

  1. プラグインで使用するgemを、Gemfileと別にプラグイン側で管理する方法。(現状:Lokka本体のGemfileに書くしかない。)
  2. プラグインで使用するi18nのen/ja.yml。(現状:Lokka保体のen/ja.ymlに追記するしかない。)
  3. プラグインの読み込む順番。(現状:読み込む順番を設定できない。)
  4. プラグインの有効・無効。(現状:public/plugin/lokka-<プラグイン名>は全部有効。)
  5. プラグインのアップロード・削除機能。(現状:ターミナルのコマンドなどでプラグインファイルを追加・削除する必要がある。)
  6. public/admin/layout.hamlのdiv#aside(左側サイドメニュー)にプラグインのメニュー項目を追加。(現状:layout.hamlに追記するしかない。)

コメント欄に書いたらエラー?が出たのでココに書きます。(以下俺)

おおお、すばらしいまとめありがとうございます!

最後の6点は僕もどう本体を実装すべきか悩んでおります。

  1. C拡張を含むメジャーなgemは本体に同伴し、pluginで必要な(Pure Rubyの)gemはpluginに同伴してもらう?
  2. 頑張ればplugin毎のi18nを読み込める?拙作のdm-validations-i18nとあわせて対応できるか?r18nの利用を継続するか?
  3. railsのようにルールさえ明確ならば指定出来る必要は無い?
  4. DBで管理すれば可能だがWordPressであんまり必要性を感じてないので検討中。
  5. 実装方法が思いつかない・・・(基本WRITE出来ない環境を想定してるので現状でいいかも?)
  6. やり方を決めればいいだけなんですが、選択肢が有り過ぎてしっくりくる方法を思いついていない。文字列とリンクURLの構造体を持つ?xxxxx.{erb,haml,erubis}があったらそれを表示する?

という感じです。

やっぱりプラグインを書いてみた人本人でないとわからない点が沢山あるとおもいますので、「こうしたほうがいい」というところがあればお教えいただけると嬉しいです!