Подтвердить что ты не робот

Исключение страницы из панели навигации Jekyll

Я создаю базовый веб-сайт Jekyll, размещенный на Github (настолько минимальный, что я даже не потрудился изменить тему по умолчанию). У меня есть вложенный сайт с небольшим количеством страниц первого уровня, которые я хотел бы появиться на панели навигации (т.е. По умолчанию). У меня также есть некоторые страницы второго уровня, которые я бы хотел НЕ развалить панель навигации.

Хотя многоуровневая навигационная система будет приятной, я стараюсь избегать использования плагинов. Поэтому я считаю, что самым простым решением является просто полностью исключить страницы уровня 2 из навигационной системы.

Здесь гипотетическая структура страницы (минус другие файлы Jekyll):

jekyllsite
jekyllsite/bar
jekyllsite/bar/alice
jekyllsite/bar/alice/index.md
jekyllsite/bar/bob
jekyllsite/bar/bob/index.md
jekyllsite/bar/index.md
jekyllsite/baz
jekyllsite/baz/index.md
jekyllsite/foo
jekyllsite/foo/eggs
jekyllsite/foo/eggs/index.md
jekyllsite/foo/index.md
jekyllsite/foo/spam
jekyllsite/foo/spam/index.md
jekyllsite/index.md

В порядке убывания удивительного, вот как я хочу, чтобы это спустилось:

  • Лучший случай, контекстно-зависимая навигация (не думаю, что без плагинов): При посещении jekyllsite/index.md я бы получил панель навигации с одним слоем, предлагающую мне ссылки на foo, bar и baz. При посещении jekyllsite/bar/index.md я бы увидел двухуровневую навигационную панель, содержащую foo, bar и baz на верхнем уровне, а с alice и bob на втором уровне.

  • Следующим лучшим вариантом было бы изменить что-то глобально, чтобы в навигационную панель были добавлены только каталоги верхнего уровня (foo, bar, baz). Подкаталоги, такие как alice, bob, spam и eggs, будут автоматически исключены из панели навигации.

  • Наконец (и я думаю, что это может быть самым простым) было бы для флажка Frontmatter YAML исключать страницу. Что-то вроде nonav: true в фронте страницы, которая будет исключена.

Это похоже на то, что это должен быть довольно распространенный случай использования, хотя я не смог найти ничего похожего на короткий путь к любому из этих трех вариантов. Я надеюсь, что у кого-то, более знакомого с Джекилом, есть ответ "пути наименьшего сопротивления".

4b9b3361

Ответ 1

Это есть, чтобы создать многоуровневую контекстно-зависимую навигацию, как вы описали без плагинов, я это сделал.

Единственное предостережение заключается в том, что вам необходимо поддерживать файл данных YAML с иерархией меню - с моим подходом невозможно создать это автоматически из вашей структуры каталогов.

Я покажу короткую версию здесь, но у меня есть более подробное объяснение в моем блоге:


1. Создайте файл данных YAML (/_data/menu.yml), который содержит вашу иерархию меню:

- text: Home
  url: /
- text: First menu
  url: /first-menu/
  subitems:
    - text: First menu (sub)
      url: /first-menu/first-menu-sub/
      subitems:
        - text: First menu (sub-sub)
          url: /first-menu/first-menu-sub/first-menu-sub-sub/
- text: Second menu
  url: /second-menu/
  subitems:
    - text: Second menu (sub)
      url: /second-menu/second-menu-sub/

2. Создайте включить файл (/_includes/nav.html) со следующим содержимым:

{% assign navurl = page.url | remove: 'index.html' %}
<ul>
{% for item in include.nav %}
    <li>
        <a href="{{ item.url }}">
            {% if item.url == navurl %}
                <b>{{ item.text }}</b>
            {% else %}
                {{ item.text }}
            {% endif %}
        </a>
    </li>
    {% if item.subitems and navurl contains item.url %}
        {% include nav.html nav=item.subitems %}
    {% endif %}
{% endfor %}
</ul>

В этом файле будет отображаться правильная навигация для каждой страницы:

  • показывая следующий уровень подэлементов только для текущей страницы
  • отображение текущей страницы жирным шрифтом

Если вы не понимаете, что именно делает файл include под обложками, прочитайте мой сообщение в блоге - я объяснил это там, в (в разделе "Рекурсивный файл include" ).


3. В главном файле макета вставьте файл include:

{% include nav.html nav=site.data.menu %}

Здесь будет отображаться навигация.
Обратите внимание, что я передаю полный файл данных с шага 1 на include.


Что все!

Как я сказал в начале:

Единственным недостатком этого подхода является то, что каждый раз, когда вы создаете новую страницу, вам также необходимо вставить заголовок страницы и URL-адрес в файл данных.

Но с другой стороны, это делает очень легко исключить некоторые страницы из навигации: вы просто не добавляете их в файл данных.

Ответ 2

Я лично делаю;

Фронт для страницы, отображаемой в главном меню

---
layout: default
title: Home
menu: main
weight: 10
---

Шаблон главного меню (классы из бутстрапа twitter):

<ul class="nav navbar-nav">
  {% comment %}Jekyll can now sort on custom page key{% endcomment %}
  {% assign pages = site.pages | sort: 'weight' %} 
  {% for p in pages %}
    {% if p.menu == 'main' %}
      <li{% if p.url == page.url %} class="active"{% endif %}>
         <a href="{{ site.baseurl }}{{ p.url }}">{{ p.title }}</a>
      </li>
    {% endif %}
  {% endfor %}
</ul>

Затем вы можете реплицировать это на любом уровне, установив пользовательский var в переднем вопросе yaml:

menu : foo

и передачи значения в шаблон меню

{% include navbar.html  menuLevel="foo" %}

И перехватите его так:

{% if p.menu == menuLevel %}

Любая страница, не отображающая меню : toto, не отображается в навигации.

Ответ 3

Если вы исходите из основной темы Jekyll, самым простым способом исключить страницы из навигации на сайте заголовка является добавление исключения unless page.exclude.

(page.exclude - новый атрибут Frontlatter Yaml.)

По умолчанию это находится в _includes/header.html:

{% for page in site.pages %}
    {% unless page.exclude %}
       {% if page.title %}
         <a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>
       {% endif %}
    {% endunless %}
{% endfor %}

и соответствующий тег на фронт Ямля любой страницы:

---
... other attributes ...
exclude: true
---

Кредит Майкл Чадвик.