Tôi không có kinh nghiệm với người trung gian và ruby, nhưng tôi đã cố gắng để có được Slate làm việc để nó tạo điều hướng bên/danh sách tiêu đề trong thời gian xây dựng thay vì phía máy khách sử dụng javascript. Vấn đề tôi đang gặp phải là lấy mã để bao gồm các tiêu đề từ partials.Sử dụng Nokogiri để tạo danh sách tiêu đề tĩnh trong Slate/Middleman
Một ví dụ về cấu trúc thư mục:
Source
+--config.rb
+--includes
+--file.md
+--otherfile.md
+--index.html
+--layouts
+--layout.erb
đoạn Config.rb cho việc này:
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
đoạn Layout cho việc này:
<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>
Hiện tại, chỉ các tiêu đề từ tệp index.html mới được điền và không có gì từ partials được bao gồm. Tôi tin rằng tôi có thể cần người trợ giúp hiện tại để xuất hiện bài đăng similar to what is described in the Middleman docs for sitemaps bằng cách sử dụng trình trợ giúp ready
. Tôi tin rằng tôi phải thực hiện một thay đổi khác đối với mã cấu hình để nó nắm bắt nội dung bổ sung bên ngoài số page_content
, nhưng tôi không chắc điều gì là do thiếu sự quen thuộc. Bất kỳ con trỏ sẽ được đánh giá cao.
Chỉnh sửa: Sau khi xem xét tài liệu cơ bản về người trung gian, có vẻ như có hai người trợ giúp từ khung công tác Padrino mà tôi có thể sử dụng: capture_html
và concat_content
. Tôi đang cố gắng tìm nơi mà người trợ giúp page_content
được xác định để có thêm ngữ cảnh cho những thay đổi cụ thể mà tôi đang thực hiện.
Dường như tôi có thể phải chơi với điều đó để xác định nó cho người trung gian dựa trên lỗi tôi đang nhận được. Cảm ơn đã cho tôi một cái gì đó để thử! Tôi sẽ tiếp tục chơi với điều này '' 'NameError: không xác định biến cục bộ hoặc phương thức' full_content 'cho # <#: 0x007fdd61e97190> \t layout/apitwocolumn.erb: 92: in 'block in singleton class ' \t layouts/apitwocolumn.erb: -7: trong 'instance_eval' \t layouts/apitwocolumn.erb: -7: trong' singleton lớp \t layouts/apitwocolumn.erb: -9: trong '__tilt_70294461913540'''' –
Alyss
Điều này thực sự thực sự gần với giải pháp cuối cùng! Tôi ước tôi đã làm việc trên đoạn mã lâu hơn một chút. – Alyss