Я решил это с помощью генератора.Генератор перебирает страницы, получает навигационные данные, сортирует их и возвращает обратно в конфигурацию сайта.Оттуда Liquid может получить данные и отобразить их.Он также заботится о сокрытии и показе элементов.
Рассмотрите этот фрагмент страницы:
---
navigation:
title: Page name
weight: 100
show: true
---
content.
Навигация отображается с этим фрагментом Liquid:
{% for p in site.navigation %}
<li>
<a {% if p.url == page.url %}class="active"{% endif %} href="{{ p.url }}">{{ p.navigation.title }}</a>
</li>
{% endfor %}
Поместитеследующий код в файле в вашей папке _plugins:
module Jekyll
class SiteNavigation < Jekyll::Generator
safe true
priority :lowest
def generate(site)
# First remove all invisible items (default: nil = show in nav)
sorted = []
site.pages.each do |page|
sorted << page if page.data["navigation"]["show"] != false
end
# Then sort em according to weight
sorted = sorted.sort{ |a,b| a.data["navigation"]["weight"] <=> b.data["navigation"]["weight"] }
# Debug info.
puts "Sorted resulting navigation: (use site.config['sorted_navigation']) "
sorted.each do |p|
puts p.inspect
end
# Access this in Liquid using: site.navigation
site.config["navigation"] = sorted
end
end
end
Я потратил немало времени, чтобы понять это, так как я довольно новичок в Jekyll и Ruby, так что было бы здорово, если бы кто-нибудь смог улучшитьэтот.