経緯

redmineのwikiで、ページ内のh1.h2.等見出しをまとめたページ内リンクを作ってくれる{{toc}}マクロがある。
※大体、右肩に表示したいことが多く{{>toc}}を用いている

しかし、長いページをスクロールさせると目次がスクロールアウトして見えなくなり、ページ内リンクをクリックできなくて不便だと思っていた。 例えば何かの手順を流れに沿って並べてあるような場合に説明(セクション)を行ったり来たりしたい。
見出しでセクション分けしていた内容を独立した別ページにするなどしてみたものの、数が多いと面倒だしリンク集部分を自前でメンテするのも大変。

ということで、tocマクロによる目次をページがスクロールしても画面内に留めるredmine_wiki_fix_tocプラグイン。 https://github.com/tckz/redmine_wiki_fix_toc

Feature

  • ページ内に右寄せのTOC{{>toc}}がある場合に、同TOCが元々表示されていた位置よりも下にスクロールしたとき、表示位置を固定(position: fixed)する。
    • 左寄せのTOCを画面内にfixすると文章にかぶってしまうので右寄せ限定
スクロール前
↓↓↓ スクロールさせる ↓↓↓
スクロール後

補足

  • すべてのページにプラグイン独自のhtmlを差し込むためにview_layouts_base_body_bottomフックを用いる

    class ViewListener < Redmine::Hook::ViewListener
      def view_layouts_base_body_bottom(context)
        context[:controller].send(:render_to_string,
          :template => 'wiki_fix_toc/body_bottom',
          :layout => false,
          :locals => {:context => context})
      end
    end
    
  • 後はplugins/redmine_wiki_fix_toc/app/views/wiki_fix_toc/body_bottom.html.erbでTOCを見つけてイベントを貼り付けるコードを書く。

環境

  • CentOS 7.1 x64
    • ruby 2.2.0p0 x64
      • redmine 3.1.1
  • Windows 10 Enterprise x64
    • Firefox Developer Edition 43.0a2 x64