[ADD] поддержка изображений и рефакторинг диспетчера токенов

- registry.py: реестры BLOCK/PATTERNS/INLINE с декораторами @block/@pattern/@inline
- render.py: единый диспетчер, слой паттернов, проверка контракта pos (RuntimeError),
  pending_toc вместо current_heading для единственной вставки СОДЕРЖАНИЯ
- handlers/image.py: вики-ссылки ![[путь|ширина]], подпись Рисунок N —— ... ,
  figure-окружение, авто-нумерация, копирование файлов в tmpdir
- handlers/inline.py: табличная диспетчеризация вместо if/elif
- Все block-обработчики подписаны @block, корректно продвигают pos
- parser.py: препроцессинг ![[...]] → ![](path), iter_image_sources()
- main.py: _copy_assets (emblem+картинки в tmpdir), фикс лога (имя .tex),
  cwd=tmpdir для xelatex, цикл вместо дублирования, force-include emblem
- tests/test_render.py: pytest (10 тестов), pyproject dev-dep, make test
- preamble.py: name=Рисунок для figure-caption (было Рис. от babel)
- Исправлены баги: мёртвый обработчик, emblem не копировалась,
  множественный TOC, захардкожен report.log, маскировка pos
- README/AGENTS.md обновлены
This commit is contained in:
Arseny
2026-08-25 13:58:01 +03:00
parent 3e67937b8b
commit 8a921e2337
20 changed files with 592 additions and 138 deletions
+4 -5
View File
@@ -1,14 +1,13 @@
from __future__ import annotations
from typing import TYPE_CHECKING
from markdown_it.token import Token
if TYPE_CHECKING:
from md2gost.render import Renderer
from md2gost.registry import block
def fence(r: Renderer, tok: Token) -> str:
@block("fence")
def fence(r, tok: Token) -> str:
r.pos += 1
lang = tok.info.strip()
code = tok.content.rstrip()
opts = f"[language={lang}]" if lang else ""