HikiDoc plugin
投稿者 okkez
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 のプラグイン機構は使っていないように見えたけど気のせい?また今度調べてみる。


