138 lines
4.1 KiB
Python
138 lines
4.1 KiB
Python
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"<u>{self.render_inner(token)}</u>"
|
|
|
|
def render_thematic_break(self, token):
|
|
self.margin_anchor_id += 1
|
|
return f'<a id="margin_{self.margin_anchor_id}"></a>'
|
|
|
|
@staticmethod
|
|
def render_morse_helper(morse_code):
|
|
result = '<span class="morse">'
|
|
for char in morse_code:
|
|
result += '<span class="morse_char">\n'
|
|
for symbol in char:
|
|
result += '<span class="morse_char">\n'
|
|
if symbol == 1:
|
|
result += '▄'
|
|
elif symbol == 2:
|
|
result += '▄▄▄'
|
|
elif symbol == 3:
|
|
result += ' '
|
|
result += '</span>\n'
|
|
result += '</span>\n'
|
|
result += '</span>'
|
|
|
|
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'''\
|
|
<div class="margin {type}" id="margin_for_{margin_id}">
|
|
{content}
|
|
</div>
|
|
<a id="margin_orig_{margin_id}"></a>
|
|
<script>
|
|
(() => {{
|
|
function moveFunc() {{
|
|
const targetEl = document.getElementById(
|
|
window.innerWidth > 800 ? "margin_{margin_anchor_id}" : "margin_orig_{margin_id}"
|
|
);
|
|
targetEl.parentNode.insertBefore(
|
|
document.getElementById("margin_for_{margin_id}"),
|
|
targetEl
|
|
);
|
|
}}
|
|
addEventListener("resize", moveFunc);
|
|
moveFunc();
|
|
}})();
|
|
</script>
|
|
''')
|
|
|
|
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]}" |