🗂️ Реестры проекта: руководство для редакторов и разработчиков
Для кого эта документация: для контент-менеджеров (гуманитариев) и разработчиков, помогающих вести мемориальный проект. Экспертиза не требуется — сложные вещи объясняем простым языком.Последняя сверка с кодом:src/data/authors.yaml,src/content.config.ts(Astro 6.x), веткаmain-qwen3.
1. Введение: Философия реестров
1.1. Единый источник правды (Single Source of Truth)
Представьте: один и тот же автор — скажем, поисковый отряд «Ак-Монай» — упомянут в 30 статьях.
Если данные об отряде хранятся внутри каждой статьи (во frontmatter), то при опечатке в названии
или смене ссылки вам придется править 30 файлов. Забыли один — и на одном сайте висит устаревшая ссылка.
Мы поступаем иначе. Все «справочные» сущности — авторы, источники, войсковые соединения, кладбища —
живут в одном YAML-файле-реестре. Статья же только ссылается на запись реестра по её короткому
id. Исправили запись в одном месте — обновился весь сайт.1.2. Три главных реестра проекта
Все три реестра пересекаются: карточка персоны сможет ссылаться на
id из units.yaml
(где служил) и cemeteries.yaml (где захоронен). Об этом — в разделе 5.1.3. ⚠️ Главный принцип: неинвазивность (Non-destructive approach)
Проект построен на базе коммерческого шаблона. Мы не имеем права разрушать или глубоко
переписывать его оригинальную архитектуру — иначе мы потеряем возможность получать обновления
шаблона, а любая правка станет минным полем для будущих мержей.
Наши расширения — это «аддоны» (надстройки), которые работают параллельно с оригинальным кодом:
Правило большого пальца: если изменение требует переписать логику шаблона — остановитесь и спросите, нельзя ли сделать обёртку рядом. Почти всегда можно.
2. Подробный гайд по authors.yaml
2.1. Структура файла
Файл — это один YAML-список (массив) объектов. Каждая запись начинается с дефиса
-
на нулевом отступе:yaml
Между записями принято ставить разделительный комментарий — это помогает глазу и поиску:
yaml
2.2. Поле type и зависимость набора полей
Каждая запись обязана иметь
type — строго одно из шести значений:Тип определяет, какие поля осмысленно заполнять (технически все поля кроме
id, name, type
необязательны, но логика такая):schema_type— техническое имя схемы Schema.org (Person/Organization). Он должен согласовываться сtype:персона→Person, все остальные → обычноOrganization.
2.3. Строгая уникальность id
id — это адрес записи. На него ссылаются статьи (authorIds), на нем строится JSON-LD,
по нему люди ищут запись в файле. Поэтому:idне повторяется внутри файла. Две записи с одинаковымid= ошибка сборки (Duplicate entry id) — Astro не соберёт контент.idне повторяется между всеми файлами реестров. Когда появятсяunits.yamlиcemeteries.yaml, идентификаторы должны быть уникальны и между ними тоже. Если редакция совпадает с одноимённым сообществом — придумайте разные ключи:redaktsiya-leninovssoobshchestvo-lenino.- Формат
id: строчные латинские буквы, цифры и дефисы (транслит):ak-monay,nevzorov-b-i,redaktsiya. Без пробелов, точек, кавычек и кириллицы. idнеизменяем после публикации. Переименовали — порвали все ссылки. Если запись ошибочна — лучше создать новую с новымid, а старую пометить вnote.
Поле
name при этом может быть каким угодно (полное ФИО, название с кавычками) — оно для людей,
id — для машины.3. Технический нюанс: даты и «умный» парсинг YAML
3.1. Феномен smart parsing
YAML — язык слишком заботливый. Если написать дату без кавычек:
yaml
парсер YAML решит: «это же дата!» — и превратит её в объект JavaScript
Date, а не в строку.
Наша Zod-схема ожидает строку и на объект заругается:(Да, объект. Для компьютера
Date — объект, хотя человеку видно «просто дату».)3.2. Наше решение: z.preprocess
Чтобы не заставлять редакторов помнить про тонкости парсеров, в
src/content.config.ts
для полей дат стоит автоматический «переводчик»:ts
То есть: что бы YAML ни сконвертировал в
Date, Zod сам вернёт его к каноничной строке
YYYY-MM-DD. Данные не портятся, сборка не падает.3.3. ✅ Правило: даты пишем строго БЕЗ кавычек
yaml
Почему так: наш линтер ESLint с плагином для YAML правилом
yaml/plain-scalar подсказывает,
что скаляр, который YAML может прочитать сам (число, дата, true), не нужно оборачивать
в кавычки без необходимости. Даты без кавычек + preprocess в схеме = чистый линтер и
чистая сборка. Два механизма страховки работают вместе.Формат даты — только ISO:
ГГГГ-ММ-ДД. Если известен только год — пишите строкой 1862
(Zod примет любую непустую строку; partial-дату вида 1862-07 тоже можно, но полный ISO предпочтительнее).4. Правила заполнения пустых значений
Запись заполняет все поля из канона — даже те, что не нужны. Пустое — не значит «отсутствует»,
пустое значит «проверено, информации нет». Это делает записи однотипными и удобными для поиска.
Категорически запрещено:
yaml
Лайфхак: скопируйте последнюю запись того жеtype, вставьте ниже, замените значения. Канон не сломается, опечаток в именах полей не будет.
5. Реестры units.yaml и cemeteries.yaml — зарегистрированы и работают
(раздел для разработчиков и продвинутых редакторов)
Архитектура скопирована с паттерна
authors.yaml один в один, как и планировалось:- YAML-файлы в
src/data/— тот же формат «массив записей сid». - В
content.config.ts— отдельныеdefineCollection(unitSchema,cemeterySchema) с изолированными loader'ами (glob({ pattern: 'units.yaml', base: './src/data' })). Оригинальные коллекции шаблона (posts/about) не тронуты — принцип неинвазивности соблюдён. - Уникальность
id— глобальная, через все три реестра (см. п. 2.3). - Даты — общий helper
isoDate()(z.preprocess: Date → строкаYYYY-MM-DD). - Документальные позиции не меняем. Поля, где источник даёт «строку, похожую на число»
(
passport_numberс слэшем82-289/2023,obd_document_id,buried_known/unknown), защищеныz.preprocessот number→string; значения из CSV переносятся символ в символ. - Внешние ссылки на сервисы МО РФ (obd-memorial.ru, memmo.ru): официальное предупреждение
Минобороны требует российских сертификатов / корневого сертификата Минцифры. Поэтому:
ссылка хранится как есть + метка
[Минцифры]вnote; автоматическая проверка доступности при сборке НЕ делается; карточка самодостаточна (данные CSV дублируются в полях).
5.1. Фактические поля units.yaml (схема unitSchema)
5.2. Фактические поля cemeteries.yaml (схема cemeterySchema)
5.3. Как контент-менеджер связывает сущности
Точно так же, как сейчас связывает статью с авторами — массивами ID:
yaml
Плюс внутри самих реестров перекрёстные ссылки уже предусмотрены: запись кладбища содержит
поля
units (кто здесь захоронен) и sources_authors (ид источников). ID во всех
массивах — строки в кавычках (массив ID не является датой/числом, кавычки здесь обязательны
и линтеру не мешают).⚠️ Ссылки «мягкие» (soft resolve): несуществующий ID не должен ронять сборку — компонент просто проигнорирует его и выведет предупреждение. Так защищает нас от опечаток редактора.
6. Словарь типичных ошибок (перевод на человеческий)
Универсальный порядок действий при любой ошибке:
- Прочитайте сообщение целиком — там указаны файл, запись и поле.
- Откройте указанный файл и найдите запись по
idиз сообщения. - Сравните с соседней «рабочей» записью того же типа.
- После правки:
npm run build(илиnpx astro check) — сборка должна пройти молча.
Приложение А. Готовая шапка-шпаргалка для authors.yaml
Скопируйте этот блок в самое начало файла (заменив текущую шапку) — он вечная инструкция
прямо на рабочем месте:
Leave a Comment