middlemanページの目次を作る

設定

markdown エンジンとして redcarpet を使い、:with_toc_data を true にセットします。

% vi config.rb
set :markdown_engine, :redcarpet
set :markdown, :fenced_code_blocks => true, :autolink => true, :smartypants => true, :tables => true, :with_toc_data => true

ヘルパー関数

ヘルパー関数を加えます。上記設定がされてる必要があります。

% vi config.rb
helpers do
  def render_toc(page)
    if config.markdown_engine == :redcarpet && config.markdown[:with_toc_data]
      toc = Redcarpet::Markdown.new(Redcarpet::Render::HTML_TOC)
      text = File.read(page.source_file)
      toc.render(text)
    end
  end
end

partial template

パーシャルテンプレートを作ります。bootstrap を使ってることを想定してます。 ページのfrontmatter に “show_toc: true” としておくと、最初から目次を表示します。 そうでなければボタンを押したら表示。

後はお好みのテンプレートで partial(“partials/toc”) してください。

% vi source/partials/_toc.html
<% page ||= current_page %>
    <!-- toc -->
    <% toc_class = (page.data.show_toc) ? "collapse in" : "collapse" %>

    <aside class="toc">
      <button type="button" class="btn btn-default collapsed btn-sm" data-toggle="collapse" data-target="#toc_content">ToC</button>

      <div id="toc_content" class="<%= toc_class %>">
      <% if toc = render_toc(current_article) %>
        <%= toc %>
      <% else %>
        <div>
redcarpet :with_toc_data needs to be available. add into config.rb as below
<pre class="highlight syntax ruby"><code>set :markdown_engine, <strong>:redcarpet</strong>
set :markdown, :fenced_code_blocks => true, :autolink => true, :smartypants => true, :tables => true, <strong>:with_toc_data => true</strong>
</code></pre>
         </div>
      <% end %>
    </div>
    </aside>