HikiDoc plugin

投稿者 okkez 2010-05-25 13:53:00 GMT

HikiDoc - FrontPage.ja でプラグインを使いたかったので、プラグインを作る方法を調べてみた。

ソースを読めばプラグインを作る方法はわかる。 しかし、HikiDoc を使った上でプラグインも使っている例はあまりないようだった。

class CustomOutput < HikiDoc::HTMLOutput
  def initialize(suffix = " />", options = {})
    super suffix
    @options = options
  end

  def inline_plugin(src)
    # あんまり使わないので未実装
  end

  def block_plugin(src)
    name, *args = parse_plugin(src)
    klass = Plugins.const_get(name.classify)
    @f.puts klass.new(@options).call(args)
  rescue NameError => ex
    @f.puts ex.message
  end

  private
  def parse_plugin(src)
    result = []
    if /([a-z0-9_]+)\((.+)\)/m =~ src
      result.push $1
      result.push *$2.split(',').map(&:strip) if $2
    end
    result
  end
end

こんな感じで HikiDoc::HTMLOutput を継承して inline_plugin と block_plugin を定義すれば良い。 今回の実装方法でプラグインを定義するには以下のようにする。 Rails で使用するのでヘルパーを使えるようにしておく。

module Plugins
end
class Plugins::Base
  include ActionView::Helpers, ::ERB::Util

  def initialize(options = {})
    @options = options
  end

  def call(args)
    raise 'must implement in subclass'
  end
end
class Plugins::Echo < Plugin::Base
  def call(args)
    %Q!<pre>#{args.inspect}</pre>!
  end
end

クラスを使わずに実装する方法もあるが、今回は Rails なので Rails っぽくなるようにクラスを使ってみた。 クラスを使わない場合は、プラグインの名前をキーにしたハッシュに処理を登録する方法が使えると思う。

Hiki では HikiDoc のプラグイン機構は使っていないように見えたけど気のせい?また今度調べてみる。

カテゴリ  | タグ ,  | コメントなし | トラックバックなし

コメント

トラックバック

トラックバックリンク:
http://typo.okkez.net/trackbacks?article_id=279

コメントは許可されていません