Read in:
Русский

Отладка 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-шаблоны, доступные переменные и синтаксис
  • Превью лейаута — рендеринг шаблона без загрузки файлов