Я неопытный с посредником и рубином, но я пытался получить Slate, работая таким образом, чтобы он генерировал боковую навигацию/список заголовков во время сборки, а не на стороне клиента используя javascript. Проблема, с которой я сталкиваюсь, заключается в том, чтобы код включал заголовки из частичных.Использование Nokogiri для генерации статического списка заголовков в Slate/Middleman
Пример структуры каталогов:
Source
+--config.rb
+--includes
+--file.md
+--otherfile.md
+--index.html
+--layouts
+--layout.erb
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 и ничего из включенных в него частичек. Я считаю, что мне может понадобиться существующий помощник для создания пост-сборки similar to what is described in the Middleman docs for sitemaps с помощью вспомогательного помощника ready
. Я считаю, что мне нужно внести еще одно изменение в код конфигурации, чтобы он захватывал дополнительный контент за пределами page_content
, но я не уверен, что это из-за незнания. Любые указатели будут оценены.
Редактировать: После изучения документов по основам посредника, похоже, есть два помощника из структуры Padrino, которые я мог бы использовать: и concat_content
. Я пытаюсь найти, где хелпер page_content
определен для получения дополнительного контекста для конкретных изменений, которые я делаю.
Похоже, мне, возможно, придется поиграть с этим, чтобы определить его для посредника на основе ошибки, которую я получаю. Спасибо, что дал мне что-то попробовать! Я буду играть с этим '' 'NameError определено локальные переменным или метод' full_content»для # <# <Класс: 0x007fdd621f2650>: 0x007fdd61e97190> \t макетов/apitwocolumn.erb: 92: в' блока в одноплодном классе ' \t макетов/apitwocolumn.erb: -7: в 'instance_eval' \t раскладок/apitwocolumn.erb: -7: в' одноплодного класса \t раскладок/apitwocolumn.erb: -9: в '__tilt_70294461913540'''' – Alyss
Это было действительно очень близкое конечное решение! Хотелось бы, чтобы я работал над кодом немного дольше. – Alyss