2008-03-05
[開発ログ]プラグインのフック
複雑なので修正。
before
@@hook_plugins = Hash[ *%w( before_content after_content before_entry after_entry before_entries after_entries ).inject([]) {|t, e| t << e.to_sym; t << []; t } ] def self.add_hook(key, priority = 128, &block) @@hook_plugins[key] << block end def self.render_hook(key, *args) %Q!<div class="#{key}">#{ @@hook_plugins[key.to_sym].map {|e| e.call(*args) }.join("\n") }</div>! end
after
@@hook_procs = {} def self.add_hook(key, priority = 128, &block) @@hook_procs[key] ||= [] @@hook_procs[key] << block end def self.render_hook(key, *args) @@hook_procs[key] or return '' @@hook_procs[key].map {|e| e.call(*args) }.join("\n") end
存在しないエントリーポイントに対して、render_hookしたときにエラーにしたかったんだけど、その機能はカット。
divタグで囲むのをやめた。 divタグなしのフックエントリを挿入できなくて悩んでたけど、 その辺はビューで解決すべきと判断した。
priorityは未実装。 プラグインの実行順序は、ファイル名で操作できるからいらない気もする。
after2
@@hook_procs[key] or return '' @@hook_procs[key].map {|e| e.call(*args) }.join("\n")
上の部分はもうちょっとなんとかならないか。
@@hook_procs[key] ? @@hook_procs[key].map {|e| e.call(*args) }.join("\n") : ''
1行になった。
(a = @@hook_procs[key]) ? a.map {|e| e.call(*args) }.join("\n") : ''
ちょっと短くなった。
(@@hook_procs[key] or []).map {|e| e.call(*args) }.join("\n")
さらに短くできた!
(@@hook_procs[key] or []).map(&:call, *args).join("\n")
こうは書けないんだよなあ。 Symbol#to_procに引数を渡すのできないよね?