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. Это работает очень хорошо.