Оформляем третью заметку: программируем с nunjucks
Настраивая Трирему под себя, вы уже мельком познакомились с Nunjucks-файлами и шаблонами. Давайте познакомимся с ним поближе и узнаем, чем он может быть нам полезен во время написания заметок
Рассмотрим Nunjucks-синтаксис на примере навигации в шапке.
В метаданных сайта (файл /data/metadata.js
) есть такое поле:
/data/metadata.js
navigation_pages: [
{ title: "Мануал", url: "/notes/", class: "" },
{ title: "#11ty", url: "/tags/11ty/" },
{ title: "#Обсидиан", url: "/tags/obsidian/" },
{ title: "Все посты", url: "/notes/all/" },
],
В базовом шаблоне для всех страниц, внутри тега header есть следующая инструкция. Поскольку 11ty исполняет nunjucks-инструкции даже внутри Маркдаун-файлов, я заменил все % на ×, а сдвоенные фигурные скобки разредил пробелами.
/_includes/layouts/base.njk
<ul class="linklist">
{×- for entry in metadata.navigation_pages ×}
<li class="linklist-item unvisitable underline">
<a href="{ { entry.url } }">{ { entry.title } }</a>
</li>
{×- endfor ×}
</ul
Если вставить эту же инструкцию прямиком в заметку, у вас получится воспроизвести шапку сайта. Стили тут чутка полетели, но это не важно — это proof-of-concept того, что вы можете писать скрипты для генерации сложных ХТМЛ-конструкций прямиком в заметке.
Строго говоря, пользы именно от возможности писать код с условиями и циклами внутри Маркдауна — никакой. У исполняемого в заметках Nunjucks нет доступа к важным вещам вроде коллекции всех постов, фильтрам и кто знает, чему ещё. Максимум сложного, что вы сделаете — ХТМЛ-таблицу, которая подтягивает свежие данные из какой-нибудь джейсоновой БД.
Ну и зачем оно нужно?
Если после прочтения предыдущего поста в серии вы заметили за собой активное использование контейнеров и кастомных классов через {.class}
, ваш custom.css
разросся до неприличных размеров, а сайт перестал молниеносно загружаться, попробуйте выделить суперстилизованным элементам отдельные ЦСС-файлы и подгружать их только там, где необходимо через строку {×- css ×}{× include "file.css"×}{× endcss ×}
в любом месте заметки.
Или вам хочется раскрасить синтаксис внутри блоков кода, как на этой странице — просто напишите в заметке строку ниже с заменой × на %
{×- css ×}{× include "node_modules/prismjs/themes/prism-okaidia.css" ×}{× endcss ×}
В теории в шаблоне может быть просто текст или какой-нибудь жутко обвешанный классами ::: container
— по идее Nunjucks-инструкция должна исполняться перед рендерингом Маркдауна в ХТМЛ. Но я не проверял.
А может вы придумали какой-нибудь сложный njk-шаблон вроде «карточка упомянутого поста» — положите его в _includes/
и сошлитесь в заметке через что-то вроде
{× set post = 'post.md' ×}
{× include "_includes/postcard.njk" ×}
Ну или можете { { page.url } }
и { { title } }
вписать в текст как переменную, а не захардкодить.
Кстати, эта заметка называется «Оформляем третью заметку: программируем с nunjucks». Вдруг вы забыли.