import textwrap from mistletoe import HtmlRenderer from renderer.comment import BlockComment, SpanComment from renderer.dash import Dash from renderer.halfwidth_spaces import HalfwidthSpaces from renderer.morse import Morse from renderer.nonbreaking_spaces import NonbreakingSpaces, NonbreakingSpacesDots from renderer.quote import Quote from renderer.tag import Tag from renderer.underline import Underline class FiftyOhmHtmlRenderer(HtmlRenderer): margin_anchor_id = 0 margin_id = 0 def __init__(self): super().__init__( Dash, BlockComment, SpanComment, Quote, Underline, Morse, Tag, HalfwidthSpaces, NonbreakingSpaces, NonbreakingSpacesDots, ) def render_dash(self, token): return " – " def render_block_comment(self, token): return "" def render_span_comment(self, token): return "" def render_quote(self, token): return f"„{self.render_inner(token)}“" def render_underline(self, token): return f"{self.render_inner(token)}" def render_thematic_break(self, token): self.margin_anchor_id += 1 return f'' @staticmethod def render_morse_helper(morse_code): result = '' for char in morse_code: result += '\n' for symbol in char: result += '\n' if symbol == 1: result += '▄' elif symbol == 2: result += '▄▄▄' elif symbol == 3: result += ' ' result += '\n' result += '\n' result += '' return result def render_morse(self, token): morse_code = Morse.convert_to_morse_code(token.content) return self.render_morse_helper(morse_code) @staticmethod def render_tag_helper(type, content, margin_id, margin_anchor_id): """ This function is used to render the different types of tags. It is used in the HtmlRenderer class and also in the test class """ return textwrap.dedent(f'''\
{content}
''') def render_tag(self, token): if(token.tagtype == "latexonly"): return "" elif(token.tagtype == "webonly"): return self.render_inner(token) self.margin_id += 1 if(token.tagtype == "webmargin"): type = "margin" elif(token.tagtype == "webtipp"): type = "tipp" elif(token.tagtype == "webindepth"): type = "indepth" else : type = token.tagtype return self.render_tag_helper( type, self.render_inner(token), self.margin_id, self.margin_anchor_id ) 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]}"