[REFACTOR] реестр титульных листов вместо одного макета

This commit is contained in:
Arseny
2026-09-02 03:17:53 +03:00
parent cd1b8d98c3
commit 10528c6688
7 changed files with 114 additions and 3 deletions
+2 -2
View File
@@ -1,4 +1,4 @@
from md2gost.latex.preamble import END_DOCUMENT, PREAMBLE
from md2gost.latex.titlepage import render_titlepage
from md2gost.latex.titlepages import TITLEPAGES, render_titlepage
__all__ = ["END_DOCUMENT", "PREAMBLE", "render_titlepage"]
__all__ = ["END_DOCUMENT", "PREAMBLE", "TITLEPAGES", "render_titlepage"]
+32
View File
@@ -0,0 +1,32 @@
"""Реестр макетов титульного листа.
Макет выбирается полем front matter ``титульник``; по умолчанию ``default`` —
исторический макет, поэтому существующие документы продолжают собираться
без изменений.
"""
from __future__ import annotations
from typing import Callable
from md2gost.latex.titlepages import default, ptp_report, ptp_task
TITLEPAGES: dict[str, Callable[[dict[str, str]], str]] = {
"default": default.render,
"ptp-report": ptp_report.render,
"ptp-task": ptp_task.render,
}
__all__ = ["TITLEPAGES", "render_titlepage"]
def render_titlepage(fm: dict[str, str]) -> str:
name = fm.get("титульник", "default")
try:
layout = TITLEPAGES[name]
except KeyError:
available = ", ".join(sorted(TITLEPAGES))
raise ValueError(
f"front matter: неизвестный титульник '{name}'; доступны: {available}"
) from None
return layout(fm)
+39
View File
@@ -0,0 +1,39 @@
"""Общие части титульных листов: доступ к полям и шапка по бланку кафедры."""
from __future__ import annotations
from md2gost.handlers.inline import escape_latex
MINISTRY_DEFAULTS = {
"министерство": "Министерство науки и высшего образования Российской Федерации",
"вуз_тип": "Федеральное государственное автономное образовательное учреждение",
"вуз_тип2": "высшего образования",
"вуз": "Московский государственный технический университет",
"вуз_имени": "имени Н.Э. Баумана",
"вуз_статус": "национальный исследовательский университет",
"вуз_аббревиатура": "МГТУ им. Н.Э. Баумана",
}
def field(fm: dict[str, str], key: str, default: str = "") -> str:
"""Значение поля front matter, экранированное для LaTeX."""
return escape_latex(fm.get(key, default))
def ministry_lines(fm: dict[str, str]) -> str:
"""Семь центрированных строк шапки в точности по бланку кафедры.
Отличается от макета ``default`` разбивкой строк: закрывающая кавычка стоит
после статуса вуза, а скобки закрыты.
"""
get = lambda key: fm.get(key, MINISTRY_DEFAULTS[key]) # noqa: E731
lines = [
get("министерство"),
get("вуз_тип"),
get("вуз_тип2"),
f"<<{get('вуз')}",
get("вуз_имени"),
f"({get('вуз_статус')})>>",
f"({get('вуз_аббревиатура')})",
]
return "\n".join(f"\\vspace*{{-0.7ex}}\n\\centerline{{{line}}}" for line in lines)
@@ -1,9 +1,15 @@
"""Исторический макет титульного листа.
Перенесён без изменений: вывод обязан совпадать байт в байт с прежним,
иначе сломаются уже сданные документы.
"""
from __future__ import annotations
from md2gost.handlers.inline import escape_latex
def render_titlepage(fm: dict[str, str]) -> str:
def render(fm: dict[str, str]) -> str:
required = {"название": "заголовок работы", "тип": "тип работы"}
for key, desc in required.items():
if key not in fm:
+5
View File
@@ -0,0 +1,5 @@
from __future__ import annotations
def render(fm: dict[str, str]) -> str:
raise NotImplementedError
+5
View File
@@ -0,0 +1,5 @@
from __future__ import annotations
def render(fm: dict[str, str]) -> str:
raise NotImplementedError