Files
catarrh f534fe6006 docs: language model + liturgical content policies, fix ru/services drift
- .ai-specs/PROJECT_CONTEXT.md: new 'Language Model (UI vs. Content)' section
  (serviceLang ru->cu, fallback chain, scripture, Bible tab independence,
  fonts, calendar authority) + content-policy pointer in Critical Invariants.
- .ai-specs/WORKING_POLICIES.md: new 'Liturgical Content Policies' —
  never translate service/Bible texts (sourced only), cu texts verbatim
  (no normalisation/latinisation), service assembly follows the Typicon.
- DATA_EN.md/DATA_RUS.md: ru/ holds enriched lives only; services fall back
  to cu; cu is the authoritative calendar + service texts.
2026-10-04 17:47:33 +03:00

40 KiB
Raw Permalink Blame History

Документация по формату статических данных

Оглавление

  1. Обзор формата статических данных
  2. Структура директорий и организация
  3. Модели данных и схемы
  4. Правила маршрутизации файлов
  5. Разбор компонентов данных
  6. Инструменты управления данными
  7. Процесс обогащения
  8. Рабочий процесс контроля качества
  9. Распространённые проблемы и решения
  10. Краткий справочник

Обзор формата статических данных

Ponomar PWA использует систему статических данных на основе JSON, организованную по языкам. Все литургические данные предварительно конвертированы из XML-источников и структурированы для эффективной отдачи и рендеринга на стороне клиента.

Основные принципы

  • Организация по языкам: Каждый язык имеет свою директорию в static/data/
  • Хранение в JSON: Все данные хранятся в виде JSON-файлов для простого парсинга
  • Маршрутизация по датам: Календарные данные организованы по датам юлианского календаря (формата ММ-ДД)
  • Идентификация по CId: Канонические идентификаторы (CId) уникально идентифицируют святых и праздники
  • Маршрутизация по префиксу файлов: Файлы житий маршрутизируются по префиксу CId (01-12 → файлы месяцев)

Поддерживаемые языки

  • en — английский
  • cu — церковнославянский
  • ru — русский
  • el — греческий (включает el/mono для монохорда)
  • fr — французский
  • zh — китайский (включает zh/Hans и zh/Hant для упрощённого и традиционного)
  • shared — межязыковые ресурсы

Структура директорий и организация

static/data/
├── en/
│   ├── menaion-bundle.json          # Отображение дата → CId (авторитетно)
│   ├── en-menaion-bundle.json       # Переопределения для конкретного языка
│   ├── lives/                       # Жития святых по месяцам
│   │   ├── 01.json through 12.json  # Файлы месяцев с CId по префиксу (01XX-12XX)
│   │   ├── misc/                    # CId без месячного префикса
│   │   │   ├── 1.json               # CId, начинающиеся с цифры 1
│   │   │   ├── 2.json
│   ├── menaion/                     # Ежедневные записи минеи (366 дней)
│   ├── calendar/                    # Метаданные календаря
│   └── services/                    # Шаблоны богослужений
├── cu/                              # Церковнославянский (авторитетный календарь и богослужебные тексты)
├── ru/                              # Русский (обогащённые жития; богослужения берутся из cu)
├── el/                              # Греческий (включает mono/)
├── fr/                              # Французский
├── zh/                              # Китайский (включает Hans/, Hant/)
└── shared/                          # Межязыковые ресурсы
    ├── calendar/                    # Календарь подвижных праздников
    ├── services/                    # Общие шаблоны богослужений
    └── lives-index.json            # Индекс поиска CId → чтения Писания

Типы файлов

  • *-bundle.json — файлы отображения календаря
  • lives/*.json — пачки (bundles) житий святых
  • menaion/*.json — ежедневные записи минеи
  • services/*.json — шаблоны и логика богослужений
  • calendar/*.json — вычисления календаря и метаданные

Модели данных и схемы

Запись пачки (bundle entry) (menaion-bundle.json)

{
  "01-01": [
    { "id": "010101" },
    { "id": "772426" },
    { "id": "010102" }
  ]
}

Структура: Объект с ключами по дате ММ-ДД, содержащий массив записей, каждая из которых содержит только поле "id" со значением CId.

Запись жития (life entry) (lives/*.json)

{
  "772426": {
    "name": {
      "nominative": "Прп. Сильвестра Печерского (XII)",
      "short": "Прп. Сильвестра Печерского"
    },
    "life": {
      "id": "minei-0101-772426",
      "copyright": "Четьи-Минеи свт. Димитрия Ростовского",
      "text": "<p>Преподобный отец наш Сильвестр...</p>"
    }
  }
}

Структура: Объект с ключами по CId (строка), каждый содержит:

  • name (объект) с падежными вариантами (nominative, short, genitive и т.д.)
  • life (объект, необязательный) с полями id, copyright и text

Запись календаря

{
  "pascha": { "year": 2025, "date": "04-20" },
  "fixed": [
    { "date": "01-01", "rank": 5, "celebration": "Circumcision" }
  ]
}

Структура: Содержит вычисления подвижных праздников и данные неподвижного календаря.

Запись шаблона богослужения

{
  "ROYALHOURS": {
    "0": {
      "text": "Во имя Отца...",
      "type": "0"
    }
  }
}

Структура: Иерархическая структура богослужения с текстовыми узлами и условной логикой.


Правила маршрутизации файлов

Маршрутизация файлов житий

Пачки (bundles) житий маршрутизируются на основе префикса CId:

Шаблон CId Целевой файл Примеры
01XX-01ZZ 01.json 010101, 014567
02XX-02ZZ 02.json 023456, 027890
... ... ...
12XX-12ZZ 12.json 123456, 127890
Прочие CId misc/{n}.json 772426→misc/7.json, 373→misc/3.json

Примеры:

  • 010101 → 01.json
  • 1253 → 12.json
  • 772426 → misc/7.json
  • 373 → misc/3.json

Нейминг файлов пачек

  • Основная пачка: menaion-bundle.json (для каждого языка)
  • Переопределения языка: {lang}-menaion-bundle.json
  • Маршрутизация по префиксу для пачек отсутствует (один файл на язык)

Разбор компонентов данных

Пачки минеи (Menaion Bundles)

Назначение: Авторитетное отображение дата → CId для рендеринга календаря

Структура: JSON с ключами по дате и массивами CId

{
  "01-01": [{ "id": "010101" }, { "id": "772426" }],
  "01-02": [{ "id": "010201" }, { "id": "772455" }]
}

Покрытие: 366 дней юлианского календаря × несколько записей на день Размер файла: ~50-100KB на язык Использование: Представление календаря определяет, каких святых отображать в каждый день

Пачки житий (Lives Bundles)

Назначение: Биографии и жития святых для обогащения

Структура: JSON с ключами по CId, вариантами имён и необязательным текстом жития

{
  "772426": {
    "name": {
      "nominative": "Прп. Сильвестра Печерского (XII)",
      "short": "Прп. Сильвестра Печерского"
    },
    "life": {
      "id": "minei-0101-772426",
      "copyright": "Четьи-Минеи свт. Димитрия Ростовского",
      "text": "<p>Полный текст жития в HTML...</p>"
    }
  }
}

Покрытие: 3046 CId всего, 1203 с обогащённым life.text Маршрутизация: по префиксу (01.json-12.json + misc/{digit}.json) Использование: Отображение житий на страницах подробностей о святых

Данные календаря

Назначение: Вычисления подвижных праздников и метаданные календаря

Компоненты:

  • shared/calendar/triodion.json — Масленица до Великой седмицы
  • shared/calendar/pentecostarion.json — Пасха до всех святых
  • {lang}/calendar/ — данные календаря для конкретного языка

Ключевые особенности:

  • Вычисления Пасхалии
  • Определение дат подвижных праздников
  • Определения постных периодов
  • Метаданные праздников и commemorations

Шаблоны богослужений

Назначение: Структурированные литургические данные с условной логикой

Организация:

services/
├── octoecheos/          # Восемь гласов × дни
├── triodion/            # 37 постных разделов
├── pentecostarion/      # 50 дней Пасхи
├── menaion/             # 366 ежедневных записей + 34 праздника
├── canons/              # Пареклит, Осмогласник, Великий канон
└── shared/templates/    # Переиспользуемые компоненты богослужений

Структура: Иерархический JSON с текстовыми узлами и условными префиксами

  • P-узлы: Необязательный контент, который может быть включён
  • Var/I-узлы: Логика условного выбора
  • Обычные узлы: Обязательный контент, всегда включён

Метаданные Библии

Назначение: Отображения версий Библии и перикоп чтений

Структура: Идентификаторы версий и отображения перикоп для 13 версий Библии

  • Церковнославянский
  • Русский синодальный
  • KJV
  • Брентон (Септуагинта)
  • Вульгата
  • Другие версии

Правила молитв и команды (Prayer Rules & Commands)

Назначение: Структуры суточного круга и определения правила молитвы

Компоненты:

  • Правила молитвы: Расписания ежедневных чтений
  • Команды: Структуры команд богослужений
  • Часослов: Часы, кафисмы, повечерие и т.д.

Правила поста

Назначение: Определения периодов и исключений поста

Структура: JSON с правилами поста, периодами и детальными правилами

  • Предпостные периоды
  • Великий пост
  • Безпостные периоды
  • Рыбные и строгие постные дни

Инструменты управления данными

Конвейер конвертации (scripts/convert-*.ts)

Главный скрипт

convert-all.ts — Оркестрирует все этапы конвертации

npm run convert

Конвертирует данные XML из источников Java Ponomar в формат JSON.

Индивидуальные конвертеры

convert-lives.ts — Конвертация житий святых из XML в JSON

  • Вход: ponomar/Ponomar/languages/{lang}/xml/lives/*.xml
  • Выход: {lang}/lives/{01.json|misc/{digit}.json} пачки
  • Особенности:
    • Парсинг XML с извлечением атрибутов
    • Нормализация падежей имён
    • Извлечение грамматических данных
    • Извлечение данных богослужений
    • Извлечение ссылок на Писание
    • Генерация пачек по месячному префиксу

convert-calendar.ts — Конвертация метаданных календаря

  • Вход: данные календаря XML
  • Выход: структуры календаря JSON
  • Особенности:
    • Вычисления подвижных праздников
    • Отображения неподвижных праздников
    • Определения периодов

convert-services.ts — Конвертация шаблонов богослужений

  • Вход: определения богослужений XML
  • Выход: шаблоны богослужений JSON
  • Особенности:
    • Сохранение иерархической структуры
    • Извлечение условной логики
    • Нормализация текстовых узлов

convert-bible-meta.ts — Извлечение метаданных Библии

  • Вход: метаданные Библии XML
  • Выход: отображения версий и перикоп JSON

convert-fasting.ts — Конвертация правил поста

  • Вход: определения поста XML
  • Выход: правила и периоды поста JSON

convert-commands.ts — Конвертация структур команд

  • Вход: определения команд XML
  • Выход: структуры команд JSON

convert-service-rules.ts — Извлечение правил богослужений

  • Вход: определения правил богослужений XML
  • Выход: правила богослужений JSON

Инструменты миграции (scripts/migrate-data.ts)

Назначение: Нормализация формата данных между версиями и языками

Операции:

  1. Удаление префиксов @_ из ключей имён житий (все языки)
  2. Удаление SId из записей минеи (сохранение id = CId) (все языки)
  3. Переименование директорий богослужений в нижний регистр (cu, el, fr, zh/Hans, zh/Hant, ru)
  4. Выравнивание структуры Осмогласника (cu, fr, zh/Hans, zh/Hant)
  5. Преобразование TEXT → text в файлах команд
  6. Перемещение общих богослужений в подкаталог templates/
  7. Нормализация регистра ключей имён (Nominative → nominative, Short → short)
  8. Миграция объединённых файлов календаря (triodion.json, pentecostarion.json)

Использование:

npm run migrate              # Применение миграций
npm run migrate:dry          # Предпросмотр изменений

Набор валидации (scripts/validate-*.ts)

Главный валидатор

validate-data.ts — Комплексная валидация данных

npx tsx scripts/validate-data.ts

Валидирует:

  • Структуру записей житий (обязательные поля)
  • Формат пачек житий (ключи CId, объекты name)
  • Целостность данных календаря
  • Структуру шаблонов богослужений
  • Соответствие формату молитв
  • Структуру узлов команд
  • Записи commemorations
  • Определения правил поста

Вывод: Количество файлов, ошибки, предупреждения

Специализированные валидаторы

validate-i18n.ts — Полнота международной локализации

npx tsx scripts/validate-i18n.ts

Проверяет покрытие по языкам (en/ru/cu).

validate-tabs.ts — Согласованность вкладок/шаблонов богослужений

npx tsx scripts/validate-tabs.ts

Валидирует, что вкладки богослужений соответствуют структурам шаблонов.

validate-menaion.ts — Валидация данных минеи

npx tsx scripts/validate-menaion.ts

Валидирует записи минеи против правил календаря.

validate-prayer-rule.ts — Валидация структуры правила молитвы

npx tsx scripts/validate-prayer-rule.ts

Валидирует формат и полноту правила молитвы.

Периодические валидаторы:

  • validate-triodion.ts — Валидация периода Триоди
  • validate-pentecostarion.ts — Валидация Пятидесятницы
  • validate-holy-week.ts — Валидация Страстной седмицы
  • validate-great-canon.ts — Валидация Великого канона
  • validate-great-compline.ts — Валидация великого повечерия
  • validate-libcs.ts — Валидация содержания библиотеки

Утилиты (scripts/tools/)

search-texts.ts — Полно-текстовый поиск по файлам данных

npx tsx scripts/tools/search-texts.ts <query> [--lang en] [--type prayers]

stats.ts — Статистика данных и анализ размеров

npx tsx scripts/tools/stats.ts [--lang en]

Предоставляет количество файлов, размеры и разбивку по категориям.


Процесс обогащения

Обзор

Процесс обогащения заполняет пустые поля life.text в пачках ru/lives, используя агиографические тексты Четьи-Миней (свт. Димитрия Ростовского).

Подготовка источника: Импорт Четьи-Миней

convert-minei.ts — Конвертирует EPUB Четьи-Миней в JSON с ключами по датам

Структура входа (извлечённый EPUB):

extracted-epub/
├── index_split_000.xhtml through index_split_9999.xhtml
├── toc.ncx
└── content.opf

Процесс:

  1. Последовательный парсинг дневных файлов
  2. Извлечение заголовков: h2 для дат ("Память 1 января"), h3 для заголовков глав
  3. Извлечение абзацев: <p class="paragraph1"> для содержания
  4. Сбор сносок из якорей <a title="...">
  5. Добавление сносок в виде блока "Примечания:"
  6. Применение исправлений дат заголовков (например, calibre_toc_10023 → 01-27)
  7. Построение выходной структуры: { "ММ-ДД": [{ title, html }] }

Использование:

npx tsx scripts/convert-minei.ts <extracted-epub-dir> [output.json]

Вывод: scripts/output/minei.json (игнорируется в git, ~33МБ)

Конвейер обогащения

enrich-lives.ts — Нечёткое сопоставление названий minei с именами CId и заполнение пустых житий

Входные данные:

  • scripts/output/minei.json — источники житий по дате (ММ-ДД)
  • static/data/cu/menaion-bundle.json — Авторитетное отображение дата→CId
  • static/data/ru/lives/*.json — целевые пачки для обогащения

Стратегия сопоставления:

  1. Токенизация: Разбиение названий на токены, фильтрация ROLE_WORDS
  2. Коэффициент Dice: Вычисление сходства по наборам токенов
  3. Классификация статусов:
    • already-filled — Целевой объект уже имеет life.text → пропускается
    • auto — Оценка ≥ 0.6, пустой целевой объект → записывается
    • review — Оценка 0.35–0.6 → требуется ручной обзор
    • unmatched — Оценка < 0.35 или нет кандидатов → без совпадения

Ручные переопределения:

const MANUAL_FIXES: Record<string, string> = {
  '02-02|сказание о сретении': '373',
  '03-24|воспоминание о чуде': '822',
  // 214 записей всего
}

Формат ключа: {дата}|{характерная подстрока} → CId

Обработка коллизий: Несколько источников отображаются на один CId

  • Первый источник: записывает life.html напрямую (без заголовка)
  • Последующие источники: добавляют <p><b>{title}</b></p>{html}

Маршрутизация файлов:

function bundleFileForCid(cid: string): string {
  return /^(0[1-9]|1[0-2])\d+/.test(cid) 
    ? `${cid.substring(0, 2)}.json` 
    : 'misc.json';
}

Использование:

# Тестовый прогон: только отчёт
npx tsx scripts/enrich-lives.ts

# Ограничение одним месяцем
npx tsx scripts/enrich-lives.ts --month 01

# Применение изменений
npx tsx scripts/enrich-lives.ts --write

# Применение изменений для конкретного месяца
npx tsx scripts/enrich-lives.ts --write --month 01

Вывод: scripts/output/lives-match-report.json со статусом совпадения для каждого источника

Пример рабочего процесса

Этап 1: Подготовка источника

npx tsx scripts/convert-minei.ts ~/Downloads/chetyi-minei-epub/
# Вывод: scripts/output/minei.json

Этап 2: Тестовый анализ

npx tsx scripts/enrich-lives.ts
# Показывает: Auto-applied: 184, needs review: 127, unmatched: 94
# Обзор: scripts/output/lives-match-report.json

Этап 3: Ручной обзор и исправления

  • Анализ записей review в отчёте
  • Добавление MANUAL_FIXES для проблемных совпадений
  • Повторный запуск, пока количество review не станет приемлемым

Этап 4: Запись и валидация

npx tsx scripts/enrich-lives.ts --write
# Показывает: Wrote 7 updated bundle(s)
npx tsx scripts/validate-data.ts
npx tsc --noEmit
npm run build

Этап 5: Коммит

git add scripts/enrich-lives.ts scripts/output/lives-match-report.json static/data/ru/lives/
git commit -m "enrich 121 more ru lives with Chetyi-Minei texts"

Контроль качества

Проверка коллизий: Проверка много-главных записей на правильность заголовков

python3 -c "
import json, re
misc = json.load(open('static/data/ru/lives/misc.json'))
for cid in ['493', '1674', '257401']:  # Известные цели коллизий
    text = misc[cid]['life']['text']
    headings = re.findall(r'<b>([^<]+)</b>', text)
    print(f'{cid}: {len(headings)} глав - {headings}')
"

Отслеживание покрытия: Мониторинг прогресса обогащения

python3 -c "
import json, glob, os
total = has = 0
for fp in glob.glob('static/data/ru/lives/*.json'):
    data = json.load(open(fp))
    for cid, entry in data.items():
        total += 1
        if isinstance(entry.get('life'), dict) and entry.get('life', {}).get('text'):
            has += 1
print(f'Покрытие: {has}/{total} ({has*100//total}%) житий с текстом')
"

Рабочий процесс контроля качества

Чек-лист перед коммитом

  1. Валидация данных
npx tsx scripts/validate-data.ts
# Ожидается: "All files valid!" или конкретное количество ошибок
  1. Безопасность типов
npm run check  # или npx tsc --noEmit
# Ожидается: Нет ошибок TypeScript
  1. Проверка сборки
npm run build
# Ожидается: Успешная сборка с размерами пакетов
  1. Функциональное тестирование
npm run dev
# Ручной тест: Представление календаря, страницы подробностей святых, отображение житий

Непрерывный мониторинг

Автоматические проверки:

  • Проверка количества файлов (должно быть 274 файла)
  • Возможность парсинга JSON (все файлы данных)
  • Наличие обязательных полей (nominative, life.text для обогащённых записей)
  • Согласованность CId (один и тот же CId должен иметь одинаковое имя на разных языках)

Обнаружение проблем:

  • Повреждённые JSON-файлы → ошибки парсинга в validate-data.ts
  • Отсутствие обязательных полей → предупреждения валидации
  • Несоответствие типов → ошибки TypeScript
  • Ошибки сборки → недопустимые структуры данных

Решение проблем

Распространённые ошибки валидации:

  1. "Missing nominative" — Объект name отсутствует именительный падеж

    • Решение: Добавить поле name.nominative к затронутым записям
  2. "Failed to parse" — Повреждённый JSON-файл

    • Решение: Повторно запустить конвертацию или исправить синтаксис JSON
  3. "Rank should be 0-8" — Недопустимое значение rank

    • Решение: Нормализовать rank в диапазон 0-8
  4. Изменения размеров пакетов сборки — Неожиданное увеличение размера файла

    • Решение: Проверить на наличие дубликатов или искажённого содержимого

Распространённые проблемы и решения

Артефакты OCR в текстах Четьи-Миней

Проблема: Конвертация Четьи-Миней создаёт проблемы OCR, такие как:

  • Латинские символы в русском тексте (Taиcии вместо Таисии)
  • Маркеры сносок [1] в тексте тела
  • Нестабильная пунктуация [1] в названиях

Решение:

  • Оставлять артефакты OCR как есть (часть исходного текста)
  • Ручные исправления используют точные подстроки OCR для сопоставления
  • Примеры: '02-15|onissima, odnogo iz lika' → '450'

Разрешение омонимов в одну дату

Проблема: Несколько святых имеют схожие имена в одну дату

Примеры:

  • 03-24: Иаков исповедник (68501) против других записей Иаков
  • 02-22: Варадат против Фалассия (оба отображаются на 493)
  • 09-03: Анфим, Аристион, Василиса в одну дату

Решение:

  • Использовать характерные подстроки в MANUAL_FIXES
  • Обеспечить уникальность по дате (проверить с помощью скрипта верификации)
  • Для коллизий: оба источника отображаются на один CId (поведение добавления)

Нарративы на пересекающихся датах

Проблема: Некоторые главы minei являются повествованиями, не привязанными к конкретному празднику

Примеры:

  • 02-02: "Сказание о Сретении Господнем" (повествование о сретении)
  • 03-24: "Воспоминание о чуде в Печерском монастыре" (история чуда)
  • 08-28: "Память святой праведной Анны" (пророчица Анна)

Решение:

  • Определить соответствующий CId для святого/события
  • Отобразить с MANUAL_FIXES, даже если не в ту же дату (хотя текущий конвейер основан на дате)
  • Для записей без подходящего CId: остаться без совпадения

Неверные отображения в пачке (bundle)

Проблема: Некоторые CId указаны в неправильных календарных датах

Пример:

  • 868 Иаков Боровицкий указан под 05-22, фактический праздник 10-23

Решение:

  • Вручную исправить menaion-bundle.json
  • Переместить CId с неверной даты на правильную дату
  • Проверить по источникам календаря и традиции

Пограничные случаи маршрутизации файлов

Проблема: Неоднозначная маршрутизация для CId на границах

Пограничные случаи:

  • Префиксы 00 → misc.json (не 00.json)
  • Префиксы 99 → misc.json (не 09.json)
  • Нецифровые CId → misc.json

Решение:

/^(0[1-9]|1[0-2])\d+/.test(cid) // Совпадает только с 01-12, за которыми следуют цифры

Отображение много-главных коллизий

Проблема: Когда несколько источников добавляются к одному CId, первая глава не имеет заголовка

Поведение:

  • Первый источник: записывает life.html напрямую (без заголовка)
  • Последующие источники: добавляют <p><b>{title}</b></p>{html}
  • Результат: Первая глава без заголовка, другие чётко отмечены

Приемлемый компромисс: Соответствует всем одно-главным житиям (которые не имеют заголовка)


Краткий справочник

Сводка npm-скриптов

# Разработка
npm run dev              # Запуск сервера разработки
npm run build            # Продуктивная сборка
npm run preview          # Предпросмотр продуктивной сборки

# Конвертация данных
npm run convert          # Конвертация всех источников XML в JSON
npm run migrate          # Нормализация к текущему формату
npm run migrate:dry      # Предпросмотр изменений миграции

# Валидация
npm run check            # Проверка типов (tsc --noEmit)
npx tsx scripts/validate-data.ts       # Главный валидатор
npx tsx scripts/validate-i18n.ts        # Полнота i18n
npx tsx scripts/validate-tabs.ts        # Согласованность богослужений

# Инструменты
npx tsx scripts/tools/search-texts.ts <query>    # Поиск по файлам данных
npx tsx scripts/tools/stats.ts                 # Статистика данных

# Обогащение
npx tsx scripts/convert-minei.ts <epub-dir>     # Импорт Четьи-Миней
npx tsx scripts/enrich-lives.ts                # Тестовый прогон обогащения
npx tsx scripts/enrich-lives.ts --write         # Применение обогащения

Расширения файлов

Расширение Назначение Формат
.json Все файлы статических данных JSON
.text Ресурсы простого текста Простой текст
.xml Исходные данные (не в репо) XML

Стратегия Git

Отслеживается: static/data/ (за исключением выходных файлов) Игнорируется:

  • scripts/output/minei.json (33МБ, генерируемый)
  • node_modules/
  • dist/

Важные пути к файлам

# Директории данных
static/data/cu/menaion-bundle.json          # Авторитет календаря
static/data/ru/lives/                        # Цель для обогащения
static/data/shared/services/                 # Общие шаблоны богослужений

# Скрипты
scripts/enrich-lives.ts                     # Конвейер обогащения
scripts/convert-minei.ts                    # Импорт minei
scripts/validate-data.ts                    # Главный валидатор

# Выходные файлы
scripts/output/minei.json                   # Источник minei (игнорируется в git)
scripts/output/lives-match-report.json      # Отчёт о совпадениях

Статистика покрытия

Текущий статус:

  • Всего CId: 3046
  • Жития с текстом: 1190 (39%)
  • Пустые жития: 1856 (61%)

Прогресс обогащения:

  • Главы Четьи-Миней: 1154 всего
  • Совпавшие: 1127 (auto 64 + already-filled 1063)
  • Без совпадений: 27 (минимум: повествования, нет цели, уже заполнено)

Классификация статусов

Статус Значение Действие
auto Оценка ≥ 0.6, пустая цель Автоматически записывается
already-filled Цель уже имеет life.text Пропускается (избыточно)
review Оценка 0.35–0.6 Требуется ручной обзор
unmatched Оценка < 0.35 или нет кандидатов Нет подходящей цели

Ключевые константы

Пути к файлам:

const MINEI_PATH = 'scripts/output/minei.json';
const MENAION_BUNDLE_PATH = 'static/data/cu/menaion-bundle.json';
const LIVES_DIR = 'static/data/ru/lives';
const REPORT_PATH = 'scripts/output/lives-match-report.json';

Пороги сопоставления:

const AUTO_THRESHOLD = 0.6;      // Автоматическая запись
const REVIEW_THRESHOLD = 0.35;   // Ручной обзор

Строка авторских прав:

const COPYRIGHT = 'Четьи-Минеи свт. Димитрия Ростовского';

История версий

  • Первоначальный выпуск — Полная документация формата данных и процесса обогащения
  • Обновлено — Добавлен раздел о неверных отображениях пачки, обработка повествований на пересекающихся датах, рабочий процесс QA

Вклад

При вкладе в формат данных или конвейер обогащения:

  1. Тщательно тестируйте: Запускайте валидацию, проверку типов и сборку перед коммитом
  2. Документируйте изменения: Обновляйте эту документацию при любых изменениях схемы
  3. Сохраняйте совместимость: Поддерживайте существующие правила маршрутизации файлов и соглашения об именовании
  4. Валидируйте данные: Запускайте validate-data.ts и исправляйте любые ошибки

Поддержка

По вопросам или проблемам с форматом статических данных:

  • Ознакомьтесь с этой документацией
  • Проверьте существующие проблемы в репозитории
  • Запустите инструменты валидации для диагностики ошибок
  • Изучите конвейер обогащения для проблем сопоставления