Jekyll автоматическое оглавление

Я создал сайт на основе кода Jekyll для сайта Apache Buildr. Веб-сайт Buildr автоматически генерирует оглавление для каждой страницы на основе заголовков в textile форматировать файлы.

Например, вы пишете страницу, используя текстильную разметку заголовков следующим образом.,

h2(#why).  Why are we doing this?

BLah blah balh etc ..


h2(#something). Some other header

BLah blah balh etc ..

Затем в HTML-коде по умолчанию у вас есть некоторый код, который передает содержимое в нечто, называемое toc а потом вы кладете содержимое потом. Например...

<div id='content'>
 <h1 id='{{ page.title | downcase | replace(' ', '_') }}'>{{ page.title }}</h1>
  {{ content | toc }}
  {{ content }}
</div>

На сайте Apache они получают желаемые результаты (отображается ток, а затем содержимое). Однако на моем сайте содержимое отображается дважды. Содержание не генерируется.

Более того, если я клонирую проект Apache Buildr прямо из github и запускаю jekyll --server в doc папка этого проекта, то и оглавление не генерируется.

Что мне не хватает?

4 ответа

Решение

Я отправил по электронной почте список рассылки разработчиков Buildr, и кто-то сказал мне искать здесь вдохновение. Оказывается, что соответствующий фрагмент кода...

module TocFilter
  def toc(input)
    output = "<ol class=\"toc\">"
    input.scan(/<(h2)(?:>|\s+(.*?)>)([^<]*)<\/\1\s*>/mi).each do |entry|
      id = (entry[1][/^id=(['"])(.*)\1$/, 2] rescue nil)
      title = entry[2].gsub(/<(\w*).*?>(.*?)<\/\1\s*>/m, '\2').strip
      if id
        output << %{<li><a href="##{id}">#{title}</a></li>}
      else
        output << %{<li>#{title}</li>}
      end
    end
    output << '</ol>'
    output
  end
end
Liquid::Template.register_filter(TocFilter)

Создайте папку в исходной папке вашего сайта с именем _plugins а затем вставьте этот код в файл с именем TocFilter.rb в этой папке.

Оно работает!!

Где определяется ток? Он не указан как один из стандартных жидкостных фильтров или расширений jekyll, так что, скорее всего, вам не хватает плагина.

jekyll-toc плагин делает это для вас из коробки.

Добавьте следующее к вашему GemFile

gem 'jekyll-toc'

Добавьте следующее к вашему _config.yml

plugins:
  - jekyll-toc

Добавьте следующую метку жидкости, где вы хотите, чтобы генерировалось оглавление.

{{ content | toc_only }}

И наконец установить toc: true в вашем посте front-matter,

Я добавил это значение по умолчанию в моем _config.yml так что оглавление применяется ко всем моим сообщениям по умолчанию.

Я использовал JS TOC от ghiculescu в своем блоге на Github, посвященном Jekyll. Это работает очень хорошо.

Пример.

Другие вопросы по тегам