diff --git a/.vscode/settings.json b/.vscode/settings.json index 3e99ede..1bb72f5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,14 @@ { "python.testing.pytestArgs": [ - "." + ".", + "-vv" ], "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true + "python.testing.pytestEnabled": true, + "[python]": { + "editor.codeActionsOnSave": { + "source.fixAll.ruff": "explicit", + "source.organizeImports.ruff": "explicit" + } + } } \ No newline at end of file diff --git a/renderer/fifty_ohm_html_renderer.py b/renderer/fifty_ohm_html_renderer.py index ed2f077..24fd496 100644 --- a/renderer/fifty_ohm_html_renderer.py +++ b/renderer/fifty_ohm_html_renderer.py @@ -1,9 +1,12 @@ +import textwrap + from mistletoe import HtmlRenderer from .comment import Comment -from .unit import Unit from .quote import Quote - +from .tag import Tag +from .underline import Underline +from .unit import Unit units = { "A": "A", @@ -38,8 +41,11 @@ no_space_units = ["°", "%"] class FiftyOhmHtmlRenderer(HtmlRenderer): + margin_anchor_id = 0 + margin_id = 0 + def __init__(self): - super().__init__(Comment, Unit, Quote) + super().__init__(Comment, Unit, Quote, Underline, Tag) def render_comment(): return None @@ -57,3 +63,54 @@ class FiftyOhmHtmlRenderer(HtmlRenderer): return f"{token.value}{unit}" else: return f"{token.value} {unit}" + + def render_thematic_break(self, token): + self.margin_anchor_id += 1 + return f'' + + @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 == "webtip": + 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 + ) diff --git a/renderer/tag.py b/renderer/tag.py new file mode 100644 index 0000000..05d089b --- /dev/null +++ b/renderer/tag.py @@ -0,0 +1,27 @@ +import re + +from mistletoe.block_token import BlockToken, tokenize + + +class Tag(BlockToken): + + @staticmethod + def start(line): + return re.match(r"^\s*<[^>]+>", line) + + @classmethod + def read(cls, lines): + child_lines = [] + first_line = next(lines) + + tagtype = re.match(r"^\s*<([^>]+)>", first_line).group(1) + + for line in lines: + if line.startswith(f""): + break + else : + child_lines.append(line) + return tagtype, tokenize(child_lines) + + def __init__(self, match): + self.tagtype, self.children = match \ No newline at end of file diff --git a/test/test_tag.py b/test/test_tag.py new file mode 100644 index 0000000..ba6ab95 --- /dev/null +++ b/test/test_tag.py @@ -0,0 +1,41 @@ +import mistletoe + +from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer + +def test_thematic_break_html() : + assertions = { + "---" : '\n', + "---\n---" : '\n\n', + } + + for assertion in assertions: + assert mistletoe.markdown(assertion, FiftyOhmHtmlRenderer) == assertions[assertion] + +def test_tag_html() : + + assertions = { + "\nFoo\n" : FiftyOhmHtmlRenderer.render_tag_helper("margin","

Foo

",1,0)+'\n', + "\nFoo\n" : FiftyOhmHtmlRenderer.render_tag_helper("indepth","

Foo

",1,0)+'\n', + "\nFoo\n" : FiftyOhmHtmlRenderer.render_tag_helper("margin","

Foo

",1,0)+'\n', + "\nFoo\n" : FiftyOhmHtmlRenderer.render_tag_helper("tipp","

Foo

",1,0)+'\n', + "\nFoo\n" : FiftyOhmHtmlRenderer.render_tag_helper("webtipp","

Foo

",1,0)+'\n', + "\nFoo\n" : FiftyOhmHtmlRenderer.render_tag_helper("indepth","

Foo

",1,0)+'\n', + "\nFoo\n" : FiftyOhmHtmlRenderer.render_tag_helper("unit","

Foo

",1,0)+'\n', + "\nFoo\n" : FiftyOhmHtmlRenderer.render_tag_helper("danger","

Foo

",1,0)+'\n', + "\nFoo\n" : '

Foo

\n', + "\nFoo\n" : "", + } + + for assertion in assertions: + assert mistletoe.markdown(assertion, FiftyOhmHtmlRenderer) == assertions[assertion] + +def test_thematic_break_and_tag_html() : + + assertions = { + "---\n\nFoo\n" : '\n'+FiftyOhmHtmlRenderer.render_tag_helper("margin","

Foo

",1,1)+'\n', + "---\n\nFoo\n\n\nFoo\n" : '\n'+FiftyOhmHtmlRenderer.render_tag_helper("margin","

Foo

",1,1)+'\n'+FiftyOhmHtmlRenderer.render_tag_helper("margin","

Foo

",2,1)+'\n', + "---\n\nFoo\n\n---\n\nFoo\n" : '\n'+FiftyOhmHtmlRenderer.render_tag_helper("margin","

Foo

",1,1)+'\n\n'+FiftyOhmHtmlRenderer.render_tag_helper("margin","

Foo

",2,2)+'\n', + } + + for assertion in assertions: + assert mistletoe.markdown(assertion, FiftyOhmHtmlRenderer) == assertions[assertion] \ No newline at end of file