我对Middleman和ruby经验不足,但是我一直在尝试让Slate工作,因此它在构建时会生成侧面导航/ header 列表,而不是使用javascript来生成客户端。我遇到的问题是使代码包含来自局部的标题。

目录结构的示例:

Source
+--config.rb
+--includes
  +--file.md
  +--otherfile.md
+--index.html
+--layouts
  +--layout.erb

Gist of layout and config.rb

Config.rb代码段:
require 'nokogiri'

helpers do
def toc_data(page_content)
    html_doc = Nokogiri::HTML::DocumentFragment.parse(page_content)

    # get a flat list of headers
    headers = []
    html_doc.css('h1, h2, h3').each do |header|
      headers.push({
        id: header.attribute('id').to_s,
        content: header.content,
        level: header.name[1].to_i,
        children: []
      })
    end

    [3,2].each do |header_level|
      header_to_nest = nil
      headers = headers.reject do |header|
        if header[:level] == header_level
          header_to_nest[:children].push header if header_to_nest
          true
        else
          header_to_nest = header if header[:level] == (header_level - 1)
          false
        end
      end
    end
    headers
  end
end

布局摘要:
<ul id="toc" class="toc">
    <% toc_data(page_content).each do |h1| %>
      <li>
        <a href="#<%= h1[:id] %>" class="toc-h1"><%= h1[:content] %></a>
          <ul class="toc-section">
            <% h1[:children].each do |h2| %>
              <li>
                <a href="#<%= h2[:id] %>" class="toc-h2"><%= h2[:content] %></a>
                <ul class="toc-submenu">
                  <% h2[:children].each do |h3| %>
                    <li>
                      <a href="#<%= h3[:id] %>" class="toc-h3"><%= h3[:content] %></a>
                    </li>
                  <% end %>
                </ul>
              </li>
            <% end %>
          </ul>
      </li>
    <% end %>
  </ul>
...
    <div class="page-wrapper">
  <div class="content">
    <%= page_content %>
    <% current_page.data.includes && current_page.data.includes.each do |include| %>
      <%= partial "includes/#{include}" %>
    <% end %>
  </div>
</div>

当前,只有index.html文件中的 header 会被填充,而包含的partials中没有任何 header 。我相信我可能需要现有的帮助程序才能使用ready帮助程序在构建similar to what is described in the Middleman docs for sitemaps之后发生。我相信我必须对配置代码进行另一处更改,以便它可以捕获page_content之外的其他内容,但是由于不确定,我不确定那是什么。任何指针,将不胜感激。

编辑:在研究了Middleman Basics文档之后,似乎可以使用Padrino框架中的两个帮助程序:capture_htmlconcat_content。我正在尝试查找在其中定义的辅助page_content的位置,以获取我正在进行的特定更改的更多上下文。

最佳答案

不熟悉该框架,但是toc_data(page_content)看起来只关注主要内容,而不关注current_page.data.includes部分。

因此,您还需要将局部变量传递给toc_data函数。

也许这行得通吗?

<%
  full_content = page_content
  current_page.data.includes && current_page.data.includes.each do |include|
    full_content += partial("includes/#{include}")
  end
  toc_data(full_content).each do |h1|
%>
  ...
<% end %>

希望能有所帮助。

10-04 09:55