From 8f4778b8b4d6de510e38a14ea9483f7149f914c5 Mon Sep 17 00:00:00 2001 From: "Prof. Dr. Matthias Jung DL9MJ" Date: Sun, 8 Dec 2024 16:56:35 +0100 Subject: [PATCH 1/8] bugfix: add missing tag names --- renderer/tag.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/renderer/tag.py b/renderer/tag.py index 6bdc187..9092266 100644 --- a/renderer/tag.py +++ b/renderer/tag.py @@ -6,9 +6,12 @@ captures = [ "margin", "indepth", "webmargin", - "tipp", - "webtipp", + "warning", + "attention", + "tip", + "webtip", "webindepth", + "fullwidth", "unit", "danger", "webonly", From 4a320cfaeb6777f0e1db8a7da872bbd4a6ea65de Mon Sep 17 00:00:00 2001 From: "Prof. Dr. Matthias Jung DL9MJ" Date: Sun, 8 Dec 2024 16:57:01 +0100 Subject: [PATCH 2/8] feature: add latex comment --- test/test_comment.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/test/test_comment.py b/test/test_comment.py index 9abf3ce..c8ee2db 100644 --- a/test/test_comment.py +++ b/test/test_comment.py @@ -1,13 +1,10 @@ import mistletoe -import pytest -from mistletoe.ast_renderer import AstRenderer -from renderer.comment import BlockComment, SpanComment from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer -from test.util import paragraph +from renderer.fifty_ohm_latex_renderer import FiftyOhmLaTeXRenderer -def test_comment_html(capsys) : +def test_comment_html() : assertions = { "%Comment\nBar" : "

Bar

\n", @@ -18,3 +15,15 @@ def test_comment_html(capsys) : for assertion in assertions: assert mistletoe.markdown(assertion, FiftyOhmHtmlRenderer) == assertions[assertion] + +def test_comment_latex() : + + assertions = { + "%Comment\nBar" : "\nBar\n", + # TODO: This test is not working as expected. The comment should be removed + #"%Comment\n" : "a", + "Foo\n%Comment\nBar" : "\nFoo\nBar\n", + } + + for assertion in assertions: + assert mistletoe.markdown(assertion, FiftyOhmLaTeXRenderer) == assertions[assertion] From b4c0f1f8564a7964bee95463e52cd14fe20bb39b Mon Sep 17 00:00:00 2001 From: "Prof. Dr. Matthias Jung DL9MJ" Date: Sun, 8 Dec 2024 16:57:24 +0100 Subject: [PATCH 3/8] feature: add latex dash --- test/test_dash.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/test_dash.py b/test/test_dash.py index 2289b0c..7fa363e 100644 --- a/test/test_dash.py +++ b/test/test_dash.py @@ -1,6 +1,7 @@ import mistletoe from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +from renderer.fifty_ohm_latex_renderer import FiftyOhmLaTeXRenderer from test.util import paragraph @@ -12,3 +13,12 @@ def test_dash_html() : for assertion in assertions: assert mistletoe.markdown(assertion, FiftyOhmHtmlRenderer) == paragraph(assertions[assertion]) + +def test_dash_latex() : + + assertions = { + "Foo - Bar" : "\nFoo -- Bar\n", + } + + for assertion in assertions: + assert mistletoe.markdown(assertion, FiftyOhmLaTeXRenderer) == assertions[assertion] From 39bce3252a66dfe8f253f378a285299758f72fca Mon Sep 17 00:00:00 2001 From: "Prof. Dr. Matthias Jung DL9MJ" Date: Sun, 8 Dec 2024 16:57:48 +0100 Subject: [PATCH 4/8] feature: add latex spaces --- test/test_halfwidth_spaces.py | 8 ++++++++ test/test_nonbreaking_spaces.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/test/test_halfwidth_spaces.py b/test/test_halfwidth_spaces.py index 0438674..1dd1cbe 100644 --- a/test/test_halfwidth_spaces.py +++ b/test/test_halfwidth_spaces.py @@ -1,10 +1,18 @@ import mistletoe from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +from renderer.fifty_ohm_latex_renderer import FiftyOhmLaTeXRenderer from test.util import paragraph + def test_halfwidth_space_html(): input = "Dies ist z.B. ein Test. D.h. hier sollten d.h. Spaces ersetzt worden sein." target = "Dies ist z. B. ein Test. D. h. hier sollten d. h. Spaces ersetzt worden sein." assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target) + +def test_halfwidth_space_latex(): + input = "Dies ist z.B. ein Test. D.h. hier sollten d.h. Spaces ersetzt worden sein." + target = "\nDies ist z.\,B. ein Test. D.\,h. hier sollten d.\,h. Spaces ersetzt worden sein.\n" + + assert mistletoe.markdown(input, FiftyOhmLaTeXRenderer) == target diff --git a/test/test_nonbreaking_spaces.py b/test/test_nonbreaking_spaces.py index 88fb8cb..814662e 100644 --- a/test/test_nonbreaking_spaces.py +++ b/test/test_nonbreaking_spaces.py @@ -1,8 +1,10 @@ import mistletoe from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +from renderer.fifty_ohm_latex_renderer import FiftyOhmLaTeXRenderer from test.util import paragraph + def test_paragraph_html(): input = "Der Test befindet sich unter §2 vielleicht aber auch § 3." target = "Der Test befindet sich unter § 2 vielleicht aber auch § 3." @@ -33,4 +35,33 @@ def test_class_html(): assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target) +def test_paragraph_latex(): + input = "Der Test befindet sich unter §2 vielleicht aber auch § 3." + target = "\nDer Test befindet sich unter §~2 vielleicht aber auch §~3.\n" + + assert mistletoe.markdown(input, FiftyOhmLaTeXRenderer) == target + +def test_three_points_latex(): + assertions = { + "Heute hatte ich ... zum Mittagessen." : "\nHeute hatte ich~...~zum Mittagessen.\n", + "Niemals hätte ich gedacht, dass...ich ...nicht kann." : "\nNiemals hätte ich gedacht, dass...ich~...nicht kann.\n", + "Oh nein ...ein Pinguin." : "\nOh nein~...ein Pinguin.\n", + "Haha .. . Hahaha" : "\nHaha .. . Hahaha\n" + } + + for key, value in assertions.items(): + assert mistletoe.markdown(key, FiftyOhmLaTeXRenderer) == value + +def test_absatz_latex(): + input = "Der Test befindet sich unter Abs.2 vielleicht aber auch Abs. 3." + target = "\nDer Test befindet sich unter Abs.~2 vielleicht aber auch Abs.~3.\n" + + assert mistletoe.markdown(input, FiftyOhmLaTeXRenderer) == target + +def test_class_latex(): + input = "Ich lerne für Klasse A, Klasse E und Klasse N." + target = "\nIch lerne für Klasse~A, Klasse~E und Klasse~N.\n" + + assert mistletoe.markdown(input, FiftyOhmLaTeXRenderer) == target + From 2acf620bd5c2e7722730121bcea091ac88243fd4 Mon Sep 17 00:00:00 2001 From: "Prof. Dr. Matthias Jung DL9MJ" Date: Sun, 8 Dec 2024 16:58:04 +0100 Subject: [PATCH 5/8] feature: add latex quote --- test/test_quote.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/test_quote.py b/test/test_quote.py index e660c7b..deb119a 100644 --- a/test/test_quote.py +++ b/test/test_quote.py @@ -1,6 +1,7 @@ import mistletoe from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +from renderer.fifty_ohm_latex_renderer import FiftyOhmLaTeXRenderer from test.util import paragraph @@ -17,3 +18,17 @@ def test_quote_html() : for assertion in assertions: assert mistletoe.markdown(assertion, FiftyOhmHtmlRenderer) == paragraph(assertions[assertion]) + +def test_quote_latex() : + + assertions = { + '"quote"' : '\n\enquote{quote}\n', + '" quote "' : '\n\enquote{ quote }\n', + '"quote" "' : '\n\enquote{quote} "\n', + '"quo te1" filltext "qu ot e2"' : '\n\enquote{quo te1} filltext \enquote{qu ot e2}\n', + '"quo *te1*" filltext "qu ot e2"' : '\n\enquote{quo \emph{te1}} filltext \enquote{qu ot e2}\n', + '""' : '\n""\n', + } + + for assertion in assertions: + assert mistletoe.markdown(assertion, FiftyOhmLaTeXRenderer) == assertions[assertion] From e7b81e9d5b8c2cad2943cc0c31158d9a5b7b0b0a Mon Sep 17 00:00:00 2001 From: "Prof. Dr. Matthias Jung DL9MJ" Date: Sun, 8 Dec 2024 16:58:20 +0100 Subject: [PATCH 6/8] feature: add latex tag --- test/test_tag.py | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/test/test_tag.py b/test/test_tag.py index 967e8f3..40352cf 100644 --- a/test/test_tag.py +++ b/test/test_tag.py @@ -1,6 +1,8 @@ import mistletoe from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +from renderer.fifty_ohm_latex_renderer import FiftyOhmLaTeXRenderer + def test_thematic_break_html() : assertions = { @@ -38,4 +40,45 @@ def test_thematic_break_and_tag_html() : } for assertion in assertions: - assert mistletoe.markdown(assertion, FiftyOhmHtmlRenderer) == assertions[assertion] \ No newline at end of file + assert mistletoe.markdown(assertion, FiftyOhmHtmlRenderer) == assertions[assertion] + +def test_thematic_break_latex() : + assertions = { + "---" : '', + "---\n---" : '', + } + + for assertion in assertions: + assert mistletoe.markdown(assertion, FiftyOhmLaTeXRenderer) == assertions[assertion] + +def test_tag_latex() : + + assertions = { + "\nFoo\n" : "\Margin{\nFoo\n}", + "\nFoo\n" : "\MarginDanger{\nFoo\n}", + "\nFoo\n" : "\MarginWarning{\nFoo\n}", + "\nFoo\n" : "\MarginAttention{\nFoo\n}", + "\nFoo\n" : "\MarginTip{\nFoo\n}", + "\nFoo\n" : "\WebTip{\nFoo\n}", + "\nFoo\n" : "\MarginUnit{\nFoo\n}", + "\nFoo\n" : "\MarginInDepth{\nFoo\n}", + "\nFoo\n" : "\MarginWebInDepth{\nFoo\n}", + "\nFoo\n" : "\WebMargin{\nFoo\n}", + "\nFoo\n" : "\FullWidth{\nFoo\n}", + "\nFoo\n" : "\nFoo\n", + "\nFoo\n" : "", + } + + for assertion in assertions: + assert mistletoe.markdown(assertion, FiftyOhmLaTeXRenderer) == assertions[assertion] + +def test_thematic_break_and_tag_latex() : + + assertions = { + "---\n\nFoo\n" : "\Margin{\nFoo\n}", + "---\n\nFoo\n\n\nFoo\n" : "\Margin{\nFoo\n}\Margin{\nFoo\n}", + "---\n\nFoo\n\n---\n\nFoo\n" : "\Margin{\nFoo\n}\Margin{\nFoo\n}", + } + + for assertion in assertions: + assert mistletoe.markdown(assertion, FiftyOhmLaTeXRenderer) == assertions[assertion] \ No newline at end of file From af6c18c47a144b3567b645f2a46c6a78787bbc9a Mon Sep 17 00:00:00 2001 From: "Prof. Dr. Matthias Jung DL9MJ" Date: Sun, 8 Dec 2024 16:58:34 +0100 Subject: [PATCH 7/8] feature: add latex underline --- test/test_underline.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/test_underline.py b/test/test_underline.py index 6f63da8..3de4ade 100644 --- a/test/test_underline.py +++ b/test/test_underline.py @@ -1,6 +1,7 @@ import mistletoe from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +from renderer.fifty_ohm_latex_renderer import FiftyOhmLaTeXRenderer from test.util import paragraph @@ -14,3 +15,14 @@ def test_underline_html() : for assertion in assertions: assert mistletoe.markdown(assertion, FiftyOhmHtmlRenderer) == paragraph(assertions[assertion]) + +def test_underline_latex() : + + assertions = { + "Text" : "\n\\underline{Text}\n", + " Text Text " : "\n\\underline{ Text Text }\n", + " Text *Text* " : "\n\\underline{ Text \emph{Text} }\n", + } + + for assertion in assertions: + assert mistletoe.markdown(assertion, FiftyOhmLaTeXRenderer) == assertions[assertion] From 13763f6c7fd5e8d84dd3c5d968ba803e96fdf6e4 Mon Sep 17 00:00:00 2001 From: "Prof. Dr. Matthias Jung DL9MJ" Date: Sun, 8 Dec 2024 16:58:47 +0100 Subject: [PATCH 8/8] feature: add latex renderer --- renderer/fifty_ohm_html_renderer.py | 4 +- renderer/fifty_ohm_latex_renderer.py | 97 ++++++++++++++++++++++++++++ test/test_tag.py | 4 +- 3 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 renderer/fifty_ohm_latex_renderer.py diff --git a/renderer/fifty_ohm_html_renderer.py b/renderer/fifty_ohm_html_renderer.py index 7e8b1e7..de7bbe2 100644 --- a/renderer/fifty_ohm_html_renderer.py +++ b/renderer/fifty_ohm_html_renderer.py @@ -74,8 +74,8 @@ class FiftyOhmHtmlRenderer(HtmlRenderer): if(token.tagtype == "webmargin"): type = "margin" - elif(token.tagtype == "webtipp"): - type = "tipp" + elif(token.tagtype == "webtip"): + type = "tip" elif(token.tagtype == "webindepth"): type = "indepth" else : diff --git a/renderer/fifty_ohm_latex_renderer.py b/renderer/fifty_ohm_latex_renderer.py new file mode 100644 index 0000000..5e55998 --- /dev/null +++ b/renderer/fifty_ohm_latex_renderer.py @@ -0,0 +1,97 @@ +from mistletoe.latex_renderer import LaTeXRenderer + +from renderer.comment import BlockComment, SpanComment +from renderer.dash import Dash +from renderer.halfwidth_spaces import HalfwidthSpaces +from renderer.nonbreaking_spaces import NonbreakingSpaces, NonbreakingSpacesDots +from renderer.quote import Quote +from renderer.tag import Tag +from renderer.underline import Underline + + +class FiftyOhmLaTeXRenderer(LaTeXRenderer): + + def __init__(self): + super().__init__( + Dash, + BlockComment, + SpanComment, + Quote, + Underline, + Tag, + HalfwidthSpaces, + NonbreakingSpaces, + NonbreakingSpacesDots, + ) + + 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 "" # TODO propagate comments to the LaTeX document + + def render_span_comment(self, token): + return "" # TODO propagate comments to the LaTeX document + + def render_quote(self, token): + return fr"\enquote{{{self.render_inner(token)}}}" + + def render_emphasis(self, token): + return fr"\emph{{{self.render_inner(token)}}}" + + def render_underline(self, token): + return fr"\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 fr"\{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]}" \ No newline at end of file diff --git a/test/test_tag.py b/test/test_tag.py index 40352cf..09e6193 100644 --- a/test/test_tag.py +++ b/test/test_tag.py @@ -19,8 +19,8 @@ def test_tag_html() : "\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("tipp","

Foo

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

Foo

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

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',