@@ -0,0 +1,119 @@
|
||||
import docx
|
||||
from docx.document import Document
|
||||
|
||||
from .debugger import Debugger
|
||||
from .parser_ import Parser
|
||||
from .toc_processor import TocProcessor
|
||||
from .renderer import Renderer
|
||||
from .styles import apply_document_styles
|
||||
from .profiles import (
|
||||
preprocess_markdown,
|
||||
find_formula_refs,
|
||||
get_profile,
|
||||
DEFAULT_HEADING_NUMBERING,
|
||||
HEADING_NUMBERING_MODES,
|
||||
DEFAULT_TOC_MODE,
|
||||
TOC_MODES,
|
||||
DEFAULT_TABLE_CONTINUATION,
|
||||
TABLE_CONTINUATION_MODES,
|
||||
)
|
||||
from .label_pass import (
|
||||
assign_numbers,
|
||||
set_active_registry,
|
||||
resolve_reference,
|
||||
resolve_pending_in_renderables,
|
||||
)
|
||||
from .renderable.heading import Heading
|
||||
from .renderable.toc import ToC
|
||||
from .renderable.table import Table
|
||||
|
||||
|
||||
class Converter:
|
||||
"""Converts markdown file to docx file (MIREA TZ)."""
|
||||
|
||||
def __init__(self, input_path: str, output_path: str,
|
||||
template_path: str = None, debug: bool = False,
|
||||
doc_type: str = "coursework",
|
||||
heading_numbering: str = DEFAULT_HEADING_NUMBERING,
|
||||
emdash_to_hyphen: bool = False,
|
||||
toc_mode: str = DEFAULT_TOC_MODE,
|
||||
table_continuation: str = DEFAULT_TABLE_CONTINUATION):
|
||||
if heading_numbering not in HEADING_NUMBERING_MODES:
|
||||
raise ValueError(
|
||||
f"heading_numbering must be one of {HEADING_NUMBERING_MODES}, "
|
||||
f"got {heading_numbering!r}"
|
||||
)
|
||||
if toc_mode not in TOC_MODES:
|
||||
raise ValueError(
|
||||
f"toc_mode must be one of {TOC_MODES}, got {toc_mode!r}"
|
||||
)
|
||||
if table_continuation not in TABLE_CONTINUATION_MODES:
|
||||
raise ValueError(
|
||||
f"table_continuation must be one of {TABLE_CONTINUATION_MODES}, "
|
||||
f"got {table_continuation!r}"
|
||||
)
|
||||
self._output_path = output_path
|
||||
self._doc_type = doc_type
|
||||
self._heading_numbering = heading_numbering
|
||||
self._emdash_to_hyphen = emdash_to_hyphen
|
||||
self._toc_mode = toc_mode
|
||||
self._table_continuation = table_continuation
|
||||
self._profile = get_profile(doc_type)
|
||||
self._document: Document = docx.Document(template_path)
|
||||
self._document._body.clear_content()
|
||||
apply_document_styles(self._document, self._profile.style_preset)
|
||||
self._debugger = Debugger(self._document) if debug else None
|
||||
with open(input_path, encoding="utf-8") as f:
|
||||
raw = f.read()
|
||||
self._raw_markdown = raw
|
||||
self._preprocessed = preprocess_markdown(raw, emdash_to_hyphen=emdash_to_hyphen)
|
||||
self.parser = Parser(self._document, self._preprocessed)
|
||||
|
||||
def convert(self):
|
||||
renderables = list(self.parser.parse())
|
||||
from .biblio_processor import fold_bibliography
|
||||
renderables = fold_bibliography(
|
||||
renderables, self._document._body, raw_markdown=self._preprocessed
|
||||
)
|
||||
|
||||
# Resolve heading numbering mode + TOC mode + table continuation
|
||||
for r in renderables:
|
||||
if isinstance(r, Heading):
|
||||
r.apply_numbering_mode(self._heading_numbering)
|
||||
elif isinstance(r, ToC):
|
||||
r.set_heading_numbering(self._heading_numbering)
|
||||
r.set_toc_mode(self._toc_mode)
|
||||
elif isinstance(r, Table):
|
||||
r.set_continuation_mode(self._table_continuation)
|
||||
|
||||
formula_refs = find_formula_refs(self._raw_markdown)
|
||||
registry = assign_numbers(
|
||||
renderables, formula_refs,
|
||||
numbering_scope=self._profile.numbering_scope,
|
||||
)
|
||||
set_active_registry(registry)
|
||||
resolve_pending_in_renderables(renderables, resolve_reference)
|
||||
|
||||
renderer = Renderer(self._document, self._debugger,
|
||||
numbered_equations=formula_refs,
|
||||
skip_numbering=True,
|
||||
numbering_scope=self._profile.numbering_scope)
|
||||
renderer.process(renderables)
|
||||
TocProcessor().process(renderables)
|
||||
set_active_registry(None)
|
||||
|
||||
@property
|
||||
def document(self) -> Document:
|
||||
return self._document
|
||||
|
||||
@property
|
||||
def raw_markdown(self) -> str:
|
||||
return self._raw_markdown
|
||||
|
||||
@property
|
||||
def doc_type(self) -> str:
|
||||
return self._doc_type
|
||||
|
||||
@property
|
||||
def heading_numbering(self) -> str:
|
||||
return self._heading_numbering
|
||||
Reference in New Issue
Block a user