8a921e2337
- 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: препроцессинг ![[...]] → , 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 обновлены
54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
from markdown_it.token import Token
|
|
|
|
from md2gost.handlers.inline import render_inline
|
|
from md2gost.registry import block
|
|
|
|
|
|
@block("table_open")
|
|
def table(r, tok: Token) -> str:
|
|
rows: list[list[str]] = []
|
|
r.pos += 1
|
|
while r.pos < len(r.tokens):
|
|
tok = r.tokens[r.pos]
|
|
if tok.type == "table_close":
|
|
r.pos += 1
|
|
break
|
|
if tok.type in ("thead_open", "tbody_open"):
|
|
r.pos += 1
|
|
continue
|
|
if tok.type == "tr_open":
|
|
row: list[str] = []
|
|
r.pos += 1
|
|
while r.pos < len(r.tokens):
|
|
ctok = r.tokens[r.pos]
|
|
if ctok.type == "tr_close":
|
|
r.pos += 1
|
|
break
|
|
if ctok.type in ("th_open", "td_open"):
|
|
inline = r.tokens[r.pos + 1]
|
|
row.append(render_inline(inline))
|
|
r.pos += 3
|
|
else:
|
|
r.pos += 1
|
|
rows.append(row)
|
|
else:
|
|
r.pos += 1
|
|
|
|
if not rows:
|
|
return ""
|
|
|
|
cols = max(len(row) for row in rows)
|
|
for row in rows:
|
|
row.extend([""] * (cols - len(row)))
|
|
|
|
col_spec = "|".join(["l"] * cols)
|
|
lines = [f"\\begin{{tabular}}{{|{col_spec}|}}", "\\hline"]
|
|
for row in rows:
|
|
line = " & ".join(row) + " \\\\"
|
|
lines.append(line)
|
|
lines.append("\\hline")
|
|
lines.append("\\end{tabular}")
|
|
return "\n".join(lines)
|