使用Nokogiri在Slate/Middleman中生成静态标题列表

Aly*_*yss 5 ruby nokogiri padrino middleman github-pages

我对中间人和红宝石缺乏经验,但我一直在努力让Slate工作,所以它在构建时生成一个侧面导航/标题列表而不是客户端使用javascript.我遇到的问题是让代码包含来自partials的头文件.

目录结构的一个示例:

Source
+--config.rb
+--includes
  +--file.md
  +--otherfile.md
+--index.html
+--layouts
  +--layout.erb
Run Code Online (Sandbox Code Playgroud)

布局和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
Run Code Online (Sandbox Code Playgroud)

这个布局代码段:

<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>
Run Code Online (Sandbox Code Playgroud)

目前,只有来自index.html文件的标题才会被填充,并且所包含的部分中没有任何标题.我相信我可能需要现有的帮助程序在构建后发生,类似于Middleman文档中使用ready帮助程序的站点地图所描述的内容.我相信我必须对配置代码进行另一次更改,以便它捕获除了之外的其他内容page_content,但我不确定这是由于缺乏熟悉程度.任何指针将不胜感激.

编辑:在查看中间人基础文档之后,似乎有两个来自Padrino框架的帮助器,我可以使用:capture_htmlconcat_content.我正在尝试找到帮助page_content器的定义位置,以便为我正在进行的特定更改获取额外的上下文.

Aly*_*yss 0

为了将当前页面数据与部分内容与 page_content 连接起来,请使用以下代码。这也改变了生成完整页面所需的一切。

<%
  if current_page.data.includes
    current_page.data.includes.each do |include|
      page_content += partial("includes/#{include}")
    end
  end
%>
...
<%= page_content %>
Run Code Online (Sandbox Code Playgroud)