Шаблоны: запросы к заметкам
Выборка заметок по паттерну, сортировка, пагинация — всё через nvs.ByGlob().
Быстрый старт
Вывести последние 5 постов блога:
{{ range i, post := nvs.ByGlob("blog/*.md").SortBy("CreatedAt").Desc().Limit(5).All() }}
<article>
<h2>{{ post.Title() }}</h2>
</article>
{{ end }}
ByGlob — фильтрация по паттерну
Выбирает заметки по glob-паттерну пути файла:
{* Все .md в папке blog *}
{{ nvs.ByGlob("blog/*.md") }}
{* Все README.md в любой вложенности *}
{{ nvs.ByGlob("projects/**/README.md") }}
{* Все .md в корне *}
{{ nvs.ByGlob("*.md") }}
Поддерживаемые паттерны:
*— любые символы кроме/**— любая вложенность папок?— один любой символ
SortBy — сортировка по полям заметки
Сортировка по встроенным полям:
.SortBy("Title") — по заголовку
.SortBy("CreatedAt") — по дате создания
.SortBy("Permalink") — по URL
Поддерживается snake_case:
.SortBy("created_at") — то же что CreatedAt
По умолчанию — по возрастанию (A→Z, старые→новые).
SortByMeta — сортировка по frontmatter
Сортировка по произвольному полю из frontmatter:
{* Если в заметках есть order: 1, order: 2... *}
{{ range i, post := nvs.ByGlob("docs/*.md").SortByMeta("order").All() }}
{{ post.Title() }}
{{ end }}
Работает с числами и строками.
Desc и Asc — направление сортировки
.SortBy("CreatedAt").Desc() — новые первыми
.SortBy("Title").Asc() — A→Z (по умолчанию)
Desc() и Asc() действуют на последний критерий.
Множественная сортировка
Сначала по одному полю, потом по другому:
{* Сначала по категории, внутри категории — по заголовку *}
{{ nvs.ByGlob("blog/*.md").SortByMeta("category").SortBy("Title").All() }}
Порядок важен: первый критерий главный, второй — для одинаковых значений первого.
Limit и Offset — пагинация
.Limit(10) — первые 10 результатов
.Offset(5) — пропустить первые 5
.Offset(10).Limit(10) — вторая страница по 10
All, First, Last — получение результатов
.All() — список всех заметок []*Note
.First() — первая заметка или nil
.Last() — последняя заметка или nil
Важно: range требует All():
{{ range i, post := nvs.ByGlob("...").All() }}
Query — запрос без фильтра
Для работы со всеми заметками без glob-фильтра:
{* Все заметки, отсортированные по заголовку *}
{{ range i, note := nvs.Query().SortBy("Title").All() }}
{{ note.Title() }}
{{ end }}
Примеры
Список постов блога
<div class="posts">
{{ range i, post := nvs.ByGlob("blog/*.md").SortBy("Title").All() }}
<article>
<h2><a href="{{ post.Permalink() }}">{{ post.Title() }}</a></h2>
</article>
{{ end }}
</div>
Документация с ручным порядком
Frontmatter:
---
title: Установка
order: 1
---
Шаблон:
<nav class="docs-nav">
{{ range i, doc := nvs.ByGlob("docs/*.md").SortByMeta("order").All() }}
<a href="{{ doc.Permalink() }}">{{ doc.Title() }}</a>
{{ end }}
</nav>
Последний пост на главной
{{ latest := nvs.ByGlob("blog/*.md").SortBy("CreatedAt").Desc().First() }}
{{ if latest }}
<section class="latest-post">
<h2>Последнее в блоге</h2>
<a href="{{ latest.Permalink() }}">{{ latest.Title() }}</a>
</section>
{{ end }}
Синтаксис range в Jet
Внимание: в Jet range возвращает индекс и значение:
{* Правильно *}
{{ range i, post := list }}
{* Неправильно — post будет индексом! *}
{{ range post := list }}
Если индекс не нужен, просто игнорируйте его:
{{ range i, post := nvs.ByGlob("blog/*.md").All() }}
{{ post.Title() }}
{{ end }}