81 lines
1.8 KiB
Python
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)
|