Files
50ohm/renderer/fifty_ohm_latex_renderer.py
T

141 lines
4.2 KiB
Python

from mistletoe.latex_renderer import LaTeXRenderer
from .comment import BlockComment
from .dash import Dash
from .halfwidth_spaces import HalfwidthSpaces
from .nonbreaking_spaces import NonbreakingSpaces, NonbreakingSpacesDots
from .photo import Photo
from .picture import Picture
from .question import Question
from .quote import Quote
from .table import Table
from .tag import Tag
from .underline import Underline
class FiftyOhmLaTeXRenderer(LaTeXRenderer):
def __init__(self, question_renderer=None):
super().__init__(
Dash,
BlockComment,
Quote,
Underline,
Tag,
HalfwidthSpaces,
NonbreakingSpaces,
NonbreakingSpacesDots,
Question,
Picture,
Photo,
Table
)
self.question_renderer = question_renderer
def render_document(self, token):
self.footnotes.update(token.footnotes)
return self.render_inner(token)
def render_dash(self, token):
return " -- "
def render_block_comment(self, token):
return f"% {token.content}\n"
def render_quote(self, token):
return rf"\enquote{{{self.render_inner(token)}}}"
def render_emphasis(self, token):
return rf"\emph{{{self.render_inner(token)}}}"
def render_underline(self, token):
return rf"\underline{{{self.render_inner(token)}}}"
def render_thematic_break(self, token):
return ""
def render_tag(self, token): # noqa: C901
tagtype = None
match token.tagtype:
case "danger":
tagtype = "MarginDanger"
case "warning":
tagtype = "MarginWarning"
case "attention":
tagtype = "MarginAttention"
case "tip":
tagtype = "MarginTip"
case "webtip":
tagtype = "WebTip"
case "unit":
tagtype = "MarginUnit"
case "indepth":
tagtype = "MarginInDepth"
case "webindepth":
tagtype = "MarginWebInDepth"
case "webmargin":
tagtype = "WebMargin"
case "fullwidth":
tagtype = "FullWidth"
case "latexonly":
return self.render_inner(token)
case "webonly":
return ""
case _:
tagtype = "Margin"
return rf"\{tagtype}{{{self.render_inner(token)}}}"
def render_halfwidth_spaces(self, token):
return f"{token.first}.\,{token.second}."
def render_nonbreaking_spaces(self, token):
return f"{token.first}~{token.second}"
def render_nonbreaking_spaces_dots(self, token):
lookup = {"": "", " ": "~"}
return f"{lookup[token.first]}{token.second}{lookup[token.third]}"
def render_question(self, token):
return self.question_renderer(token.question_number)
@staticmethod
def render_picture_helper(id, ref, text, number):
return rf"""\DARCimage{{1.0\linewidth}}{{{id}include}}
\captionof{{figure}}{{{text}}}
\label{{{ref}}}"""
def render_picture(self, token) :
return self.render_picture_helper(token.id, token.ref, token.text, token.number)
@staticmethod
def render_photo_helper(id, ref, text, number):
return rf"""\includegraphics[width=1.0\linewidth]{{photo/{id}}}
\captionof{{figure}}{{{text}}}
\label{{{ref}}}"""
def render_photo(self, token) :
return self.render_photo_helper(token.id, token.ref, token.text, token.number)
def render_table(self, token):
alignments = token.alignment
align = ""
for alignment in alignments :
align += alignment
table = f"\\begin{{DARCtabular}}{{{align}}}\n"
for row in token.children:
for j, cell in enumerate(row.children):
table += self.render_inner(cell)
if j < len(row.children) - 1:
table += " & "
table += r"\\"+ "\n"
table += "\\end{DARCtabular}"
if token.caption != "" :
table += f"\\captionof{{figure}}{{{token.caption}}}\n"
table += f"\\label{{{token.name}}}\n"
return table