Files
md2gost/md2gost/render.py
T

81 lines
1.8 KiB
Python

from __future__ import annotations
from md2gost.handlers import (
bullet_list,
fence,
heading,
hr,
image,
ordered_list,
paragraph,
table,
)
from md2gost.handlers.inline import render_inline
from md2gost.latex import END_DOCUMENT, PREAMBLE, render_titlepage
from markdown_it.token import Token
def _fence(r, tok):
return fence(r, tok)
def _image(r, tok):
return image(r, tok)
def _inline(r, tok):
return render_inline(tok)
_BLOCK = {
"heading_open": heading,
"paragraph_open": paragraph,
"bullet_list_open": bullet_list,
"ordered_list_open": ordered_list,
"table_open": table,
"hr": hr,
}
_INLINE = {
"fence": _fence,
"image": _image,
"inline": _inline,
}
class Renderer:
def __init__(self, tokens: list[Token], front_matter: dict[str, str]) -> None:
self.tokens = tokens
self.fm = front_matter
self.pos = 0
self.section = 1
self.subsection = 0
self.subsubsection = 0
self.current_heading = ""
def render(self) -> str:
parts: list[str] = [PREAMBLE, render_titlepage(self.fm)]
while self.pos < len(self.tokens):
tok = self.tokens[self.pos]
prev_pos = self.pos
tt = tok.type
if tt in _BLOCK:
result = _BLOCK[tt](self)
parts.append(result)
if self.current_heading == "СОДЕРЖАНИЕ":
parts.append("\\newpage\n\\tableofcontents\n\\newpage")
elif tt in _INLINE:
parts.append(_INLINE[tt](self, tok))
else:
self.pos += 1
continue
if self.pos == prev_pos:
self.pos += 1
parts.append(END_DOCUMENT)
return "\n\n".join(parts)