Русский
Отладка Jet-шаблонов
Когда условие в шаблоне не срабатывает или поле frontmatter приходит пустым, проверять логику наугад — долго. Две встроенные функции показывают именно то, что видит движок шаблонов: debug() и note.M().Debug().
Эта страница нужна тем, кто пишет собственные Jet-шаблоны в _layouts/. Если вы используете дефолтный шаблон без кастомного HTML — она вам не понадобится.
note.M().Debug() — все ключи frontmatter
note.M() возвращает объект метаданных заметки. Метод .Debug() выводит все ключи frontmatter в виде JSON-строки прямо на странице:
{{ note.M().Debug() }}
Результат:
{"extra_content":["channels","prices"],"layout":"my-page","title":"My Page"}
Это ответ на вопрос «что именно передаётся в шаблон?». Удобно, когда блок {{ if note.M().Has("featured") }} никогда не отрабатывает: проверьте, есть ли ключ в реальном frontmatter.
debug() — инспекция любого выражения
Глобальная функция debug() принимает любое выражение и выводит его Go-тип, текущее значение и полный список доступных методов:
{{ debug(note.M()) }}
Результат (выводится текстом прямо на странице):
*templateviews.Meta: &{raw:map[title:My Page extra_content:[a b]]}
methods: [Debug Get GetBool GetInt GetString GetStrings Has Raw]
Передавайте любое выражение — строку, число, результат вызова метода:
{{ debug(note.Title()) }}
{* → string: My Page *}
{{ debug(note.M().GetStrings("tags", nil)) }}
{* → []string: [go obsidian] *}
Всегда вызывайте методы со скобками. debug(note.Title()) инспектирует строку "My Page". debug(note.Title) — ссылку на функцию. Это не то, что нужно.
До и после: почему условие не срабатывает
Допустим, шаблон должен показывать бейдж «Важное» для отдельных заметок:
{{ if note.M().Has("featured") }}
<span class="badge">Важное</span>
{{ end }}
Бейдж не появляется. Добавьте вызов debug, чтобы увидеть реальные данные:
{{ note.M().Debug() }}
{{ if note.M().Has("featured") }}
<span class="badge">Важное</span>
{{ end }}
Вывод:
{"layout":"article","title":"Главный пост"}
Ключа featured нет. Заходите в Obsidian — в заметке стоит Featured: true с большой буквы. Ключи frontmatter чувствительны к регистру. Переименуйте свойство в featured: true, синхронизируйте — бейдж появится.
Без debug() вы бы проверяли статус синхронизации, кеш, логику шаблона. С ним — видите реальные данные за один рендер.
Отладка без загрузки файлов
Не нужно синхронизировать файл при каждом добавлении отладочного вызова. Эндпоинт /_system/renderlayout рендерит любой шаблон против любого контента прямо из терминала — полная документация в renderlayout.
Пример — посмотреть frontmatter заметки:
node scripts/trip2g-preview.mjs \
--layout-src '{{ note.M().Debug() }}' \
--layout-path '/_debug.html' \
--note-path /my-post \
--fetch
Флаг --fetch выводит готовый HTML в stdout. Без браузера, без синхронизации.
Удалите отладочные вызовы перед публикацией
debug() и .Debug() выводят данные Go напрямую в HTML. Читатели увидят этот текст на странице. Удалите все отладочные вызовы перед финальной синхронизацией.
Удобный паттерн при разработке: временно оборачивайте отладочные вызовы в Jet-комментарии, чтобы потом быстро их найти и удалить:
{* ОТЛАДКА: {{ note.M().Debug() }} *}
Важно: Jet-комментарии не попадают в HTML-вывод, поэтому результат debug() внутри них вы не увидите. Для активной отладки используйте обычный {{ }}, а когда закончите проверку — удалите строку перед публикацией.
Подробнее
- Шаблоны — как работают Jet-шаблоны, доступные переменные и синтаксис
- Превью лейаута — рендеринг шаблона без загрузки файлов