Hikiプラグインの作り方 第四回その一 ヘッダーとフッター

ちょっとツインテイルズを見てください。
どのページでも、上下に目次が表示されています。
ソースを見られない設定にしてあるんで分かりませんが、全部のページで目次を打ち込んではいません。
昔、直接HTMLファイルを作っていた頃は全ページに目次を作っていたんです。でも嫌になって。
まさにこういう、「全ページに表示する物」で手を抜きたいからこそ、ウィキを使ってサイトリニューアルしたので、それをやってしまっては意味が無いわけです。


こういうことをするプラグインを作りましょう。
まずは何も訊かずに下のファイルを作ってください。

# global-nav.rb
add_body_enter_proc do
  global_nav()
end

add_body_leave_proc do
  global_nav()
end
# ja/global-nav.rb
def global_nav
  [
   '<span class="global-nav">',
   '<a href="./">FrontPage</a>',
   '<a href="./?TextFormattingRules">Hikiの書き方</a>',
   '<a href="http://d.hatena.ne.jp/s2_it/">えすにズムの坩堝</a>',
   '<a href="https://twintails.chat/">ツインテイルズ</a>',
   '</span>'
  ].join(' | ')
end

有効化すると、どうですか、見てくれはともかく上下に目次が表示された筈です(日本語のファイルはEUC-JPにするのを忘れずに)。
Array#joinを使うと、配列の中身を連結して文字列を作れます。後でCSSを適用しやすいようにspan要素の中に入れてみました。
同じようにen/global-nav.rbも作ってみてください。


さて、説明ですが。
結論だけ言うと、プラグインファイルの中でadd_body_enter_procメソッドを呼び出してブロックを渡すと、そのブロックの戻り値がページの上のほうに表示されます。add_body_leave_procは下の方です。
この中に直接文字列を作ってもいいし、例のように言語のファイルで作ってもかまいません。メソッド呼び出しであることをはっきりさせるため、括弧を付けてみました。
これらのメソッドは、(例えば)global_navメソッドの定義の中ではなく、外で呼び出すようにしてください。


正確ではありませんが、イメージとしてはこんなことが起こっています。
Hikiは画面(HTML)を幾つかのブロックに分けています。サイドバーなんかは分かりやすいブロックですが、それ以外にもhead要素や「新規作成、編集……」といったコマンド、ページタイトル、本文、更新日時なんかが表示されている所、その下の「Generated by Hiki〜」って書かれている所、などです。
そういう所を順々に生成していって、一つのページとしているわけです。


んで、上のadd_body_enter_procは、そのうちページ本文(ボディ)を作ろうという直前に割り込んで、文字列を挿入するメソッドなわけです。
他にもHTMLのhead要素に割り込むadd_header_procや、「新規作成、編集……」といった所に割り込むadd_menu_procなどがあります。
RSSプラグインの管理画面から「RSSメニューの表示」を「する」に設定すると、それらのメニューに並んで「RSS」というのが表示されるのも、この仕組みを使っています(add_plugin_commandメソッド。これは特殊です)。

参考資料

各種の「割り込み」メソッドについてはHikaruのページにまとまっています。
ツインテイルズでのプラグインは、上のよりもうちょっとだけ高機能です。ソースを公開しているので、参考にしてみてください。
上でも言いましたが、このグローバルナビゲーションと、リプレイサイトでの右肩の目次を一箇所で管理したいために、ウィキを使っているのです。