2016-12-20 16 views
5

Я неопытный с посредником и рубином, но я пытался получить Slate, работая таким образом, чтобы он генерировал боковую навигацию/список заголовков во время сборки, а не на стороне клиента используя javascript. Проблема, с которой я сталкиваюсь, заключается в том, чтобы код включал заголовки из частичных.Использование Nokogiri для генерации статического списка заголовков в Slate/Middleman

Пример структуры каталогов:

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 и ничего из включенных в него частичек. Я считаю, что мне может понадобиться существующий помощник для создания пост-сборки similar to what is described in the Middleman docs for sitemaps с помощью вспомогательного помощника ready. Я считаю, что мне нужно внести еще одно изменение в код конфигурации, чтобы он захватывал дополнительный контент за пределами page_content, но я не уверен, что это из-за незнания. Любые указатели будут оценены.

Редактировать: После изучения документов по основам посредника, похоже, есть два помощника из структуры Padrino, которые я мог бы использовать: и concat_content. Я пытаюсь найти, где хелпер page_content определен для получения дополнительного контекста для конкретных изменений, которые я делаю.

ответ

0

Чтобы связать текущие данные страницы с частицами с помощью page_content, используйте следующий код. Это также изменяет все, что необходимо для получения полной страницы.

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

Не знаком с этой структурой, но выглядит как 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 %> 

Надеюсь, что это поможет.

+0

Похоже, мне, возможно, придется поиграть с этим, чтобы определить его для посредника на основе ошибки, которую я получаю. Спасибо, что дал мне что-то попробовать! Я буду играть с этим '' '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

+0

Это было действительно очень близкое конечное решение! Хотелось бы, чтобы я работал над кодом немного дольше. – Alyss

 Смежные вопросы

  • Нет связанных вопросов^_^