63 lines
1.5 KiB
Python
63 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
|
|
|
|
UNNUMBERED = {
|
|
"АННОТАЦИЯ",
|
|
"ПЕРЕЧЕНЬ ПРИНЯТЫХ СОКРАЩЕНИЙ",
|
|
"ВВЕДЕНИЕ",
|
|
"ЗАКЛЮЧЕНИЕ",
|
|
"СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ",
|
|
}
|
|
|
|
TOC_HEADING = "СОДЕРЖАНИЕ"
|
|
|
|
NEWPAGE_BEFORE = {
|
|
"ВВЕДЕНИЕ",
|
|
"ЗАКЛЮЧЕНИЕ",
|
|
"СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ",
|
|
}
|
|
|
|
|
|
@block("heading_open")
|
|
def heading(r, tok: Token) -> str:
|
|
level = int(tok.tag[1])
|
|
inline_tok = r.tokens[r.pos + 1]
|
|
text = render_inline(inline_tok)
|
|
r.pos += 2
|
|
|
|
upper = text.upper()
|
|
|
|
if upper == TOC_HEADING:
|
|
r.pending_toc = True
|
|
return ""
|
|
|
|
r.current_heading = upper
|
|
|
|
if upper in UNNUMBERED:
|
|
prefix = ""
|
|
if upper in NEWPAGE_BEFORE:
|
|
prefix = "\\clearpage\n"
|
|
toc_entry = ""
|
|
if upper in NEWPAGE_BEFORE:
|
|
toc_entry = (
|
|
f"\n\\phantomsection\\addcontentsline{{toc}}{{section}}{{{text}}}"
|
|
)
|
|
return (
|
|
f"{prefix}"
|
|
f"{{\\fontsize{{14pt}}{{18pt}}\\selectfont \\bfseries \\centering {text}\\par}}"
|
|
f"{toc_entry}"
|
|
)
|
|
|
|
if level == 1:
|
|
return f"\\section{{{text}}}"
|
|
elif level == 2:
|
|
return f"\\subsection{{{text}}}"
|
|
elif level == 3:
|
|
return f"\\subsubsection{{{text}}}"
|
|
else:
|
|
return f"\\textbf{{{text}}}"
|