Разделить URL до 1 слова в Jekyll

Я создаю блог Jekyll и столкнулся с проблемой постоянных ссылок.

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

permalink: /:page/:categories/:title

Это выводится при переходе к сообщению в блоге:

http://localhost:4000/blog/travel/netherlands-trip-prequesites/

У меня есть несколько статических страниц на сайте: Блог, Путешествия

Переменная page.url выводит этот URL: /blog/travel/netherlands-trip-prequesites

Код, который моя панель навигации использует для выделения текущей страницы (предоставляя ей «активный» класс):

          {% assign url = page.url|remove:'index.html' %}
          {% for nav in site.navigation %}
            {% if nav.href == url %}
              <li class="active"><a href="{{nav.href}}">{{nav.name}}</a></li>
            {% else %}
              <li><a href="{{nav.href}}">{{nav.name}}</a></li>
            {% endif %}
          {%endfor%}

Он отлично работает при переходе к статическим страницам, однако, когда я нажимаю на сообщение в блоге, он не выделяет правильную статическую страницу. (например: если я перейду к сообщению в блоге с URL-адресом /blog/smth/title, он должен автоматически выделить «Блог» в моей навигации. Когда я перейду к /travel/smth/title, он должен выделить «Путешествие»)

Что я хотел бы сделать, так это разделить вывод page.url до его первой части. Например, я хотел бы вывести следующий вывод

/blog/travel/netherlands-trip-prequesites

вплоть до

/blog/

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


person PeterInvincible    schedule 10.07.2013    source источник


Ответы (4)


Самый простой способ - использовать split:

{{ page.url | split:'/' | first }}

Это даст вам содержимое URL до первого символа /.

person Daniel Baird    schedule 23.07.2013

Мне удалось решить это с тремя фильтрами:

{{ page.url | replace:'/',' ' | truncatewords: 1 | remove:'...' }}

page.url выводит: /page/cat/title, затем replace удаляет косую черту, создавая: page cat title. truncatewords усекает строку до одного слова, получая: page... (по какой-то причине после оставшегося слова вставляются три точки). После всего этого мне нужно было только удалить эти точки с remove и вуаля, моя последняя строка: page.

Надеюсь, это поможет кому-то.

person PeterInvincible    schedule 10.07.2013

Ответ, предоставленный PeterInvincible, был почти идеальным, однако нет необходимости подключать трубопровод к remove...

Следующее также даст желаемый результат

{{ page.url | replace:'/',' ' | truncatewords: 1,"" }}

И чтобы сохранить его в переменную, используйте перенаправление capture

 {{ capture url_base }}{{ page.url | replace:'/',' ' | truncatewords: 1,"" }}{{ endcapture }}

Который можно вызывать через {{url_base}} или смешивать с другими вызовами обработки.

Также для путей к файлам вместо URL-адресов page.dir хорошо работает, если вы не используете настройки постоянной ссылки для макета, проверьте gh-pages ветка (в частности, _includes/nav_gen.html для функционального, хотя и грубого по краям примера) для размещенных примеров подобных примеров кода, связанных с жидким синтаксисом и прочей магией.

Правки и обновления

Приведенный выше связанный скрипт теперь активен/в основном работает/модулен и автоматически обслуживает проанализированные подкаталоги, просматриваемые в настоящее время на соответствующем сайте проекта https://s0ands0.github.io/Perinoid_Pipes/, где представлены примеры рекурсивного анализа каталогов. Включение и модификация почти для любой темы должны быть возможны, просто проверьте раздел комментариев вверху для в настоящее время распознаваемых команд, которые могут быть переданы при вызове включения... в этой заметке о включении и модульности вот как превратить приведенный выше пример кода для разбора каталога в функция

{% comment %}
    # Save this to _include/dir_path_by_numbers.html
    # import with the following assigning arguments if needed
    # {% include dir_path_by_numbers.html directory_argument_path="blog" directory_argument_depth=1 %}
{% endcomment %}
{% assign default_arg_directory_path = page.url %}
{% assign default_arg_directory_depth = 1 %}
{% if directory_argument_path %}
    {% assign directory_to_inspect = directory_argument_path %}
{% else %}
    {% assign directory_to_inspect = default_arg_directory_path %}
{% endif %}
{% if directory_argument_depth %}
    {% assign directory_to_inspect_depth = directory_argument_path %}
{% else %}
    {% assign directory_to_inspect_depth = default_arg_directory_depth %}
{% endif %}
{% comment %}
    # Defaults read and assigned now to output results
{% endcomment %}
{{ directory_to_inspect_depth | replace:'/',' ' | truncatewords: directory_to_inspect_depth,"" | remove_first: '/' | replace:' ','/' }}

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

{% capture dir_sub_path %}{{include dir_path_by_numbers.html directory_argument_path="blog" directory_argument_depth=1}}{% endcapture %}

Примечание выше — это всего лишь предположения, непроверенные и, возможно, более глючные, чем скрипты, протестированные и размещенные публично... другими словами, вдохновение.

person S0AndS0    schedule 02.01.2017

Самый простой способ - использовать

if page.url contains

пример:

<li class="{% if page.url contains '/docs/' %}current{% endif %}">
<a href="/docs/home/">Docs</a>
person curious    schedule 20.05.2017