2016-12-20 18 views
5

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 

Gist of layout and config.rb

đ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_htmlconcat_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.

Trả lời

0

Để ghép nối dữ liệu trang hiện tại với partials với page_content, hãy sử dụng mã bên dưới. Điều này cũng thay đổi tất cả những gì cần thiết để mang lại một trang hoàn chỉnh.

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

Không quen thuộc với khung đó nhưng có vẻ như toc_data(page_content) chỉ xem nội dung chính chứ không phải ở partials current_page.data.includes.

Vì vậy, hãy đoán bạn cũng cần chuyển một phần sang hàm toc_data của bạn.

Có thể tính năng này hoạt động?

<% 
    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 %> 

Hy vọng điều đó sẽ hữu ích.

+0

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

+0

Đ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

Các vấn đề liên quan