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代码段:
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_html和concat_content.我正在尝试找到帮助page_content器的定义位置,以便为我正在进行的特定更改获取额外的上下文.
为了将当前页面数据与部分内容与 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)
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |