From 5a4e6554c0c9f79477a430ae565805db9b273da0 Mon Sep 17 00:00:00 2001 From: Johanna Riedel Date: Sat, 7 Dec 2024 17:26:14 +0100 Subject: [PATCH 1/2] feat: Renderer add nonbreakable spaces and halfwidth spaces --- renderer/fifty_ohm_html_renderer.py | 15 ++++++++++++-- renderer/halfwidth_spaces.py | 18 +++++++++++++++++ renderer/nonbreaking_spaces.py | 25 +++++++++++++++++++++++ test/test_halfwidth_spaces.py | 10 ++++++++++ test/test_nonbreaking_spaces.py | 31 +++++++++++++++++++++++++++++ 5 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 renderer/halfwidth_spaces.py create mode 100644 renderer/nonbreaking_spaces.py create mode 100644 test/test_halfwidth_spaces.py create mode 100644 test/test_nonbreaking_spaces.py diff --git a/renderer/fifty_ohm_html_renderer.py b/renderer/fifty_ohm_html_renderer.py index fa6a6ab..fdcf7a9 100644 --- a/renderer/fifty_ohm_html_renderer.py +++ b/renderer/fifty_ohm_html_renderer.py @@ -2,11 +2,13 @@ from mistletoe import HtmlRenderer from renderer.comment import Comment from renderer.quote import Quote +from renderer.halfwidth_spaces import HalfwidthSpaces +from renderer.nonbreaking_spaces import NonbreakingSpaces, NonbreakingSpacesDots class FiftyOhmHtmlRenderer(HtmlRenderer): def __init__(self): - super().__init__(Comment, Quote) + super().__init__(Comment, Quote, HalfwidthSpaces, NonbreakingSpaces, NonbreakingSpacesDots) def render_comment(): return None @@ -15,4 +17,13 @@ class FiftyOhmHtmlRenderer(HtmlRenderer): return f"„{self.render_inner(token)}“" def render_underline(self, token): - return f"{self.render_inner(token)}" \ No newline at end of file + return f"{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): + return f" {token.first} " \ No newline at end of file diff --git a/renderer/halfwidth_spaces.py b/renderer/halfwidth_spaces.py new file mode 100644 index 0000000..f9daf9b --- /dev/null +++ b/renderer/halfwidth_spaces.py @@ -0,0 +1,18 @@ +import re + +from mistletoe.span_token import SpanToken + + +class HalfwidthSpaces(SpanToken): + """ + Insert halfwidth space into span token (Z. B.) + Identifies "z.B.", "d.h." and "D.h." with and without space in between. + """ + pattern = re.compile(r"\b(z|d|D)\.(B|h)\.") + + def __init__(self, match_object): + self.first = match_object.group(1) + self.second = match_object.group(2) + + + diff --git a/renderer/nonbreaking_spaces.py b/renderer/nonbreaking_spaces.py new file mode 100644 index 0000000..d800b10 --- /dev/null +++ b/renderer/nonbreaking_spaces.py @@ -0,0 +1,25 @@ +import re + +from mistletoe.span_token import SpanToken + + +class NonbreakingSpaces(SpanToken): + """ + Insert unbreakable space into span token (§ 3) + Identifies "§$number", "Abs.$number", "Klasse [A,E,N]" w/ and w\ space between. + Identifies "..." with and without leading and trailing space + """ + pattern = re.compile(r"(§|Abs\.|Klasse)\s?(\d|[NEA])") + + def __init__(self, match_object): + self.first = match_object.group(1) + self.second = match_object.group(2) + +class NonbreakingSpacesDots(SpanToken): + pattern = re.compile(r"\s?(\.\.\.)\s?") + + def __init__(self, match_object): + self.first = match_object.group(1) + + + diff --git a/test/test_halfwidth_spaces.py b/test/test_halfwidth_spaces.py new file mode 100644 index 0000000..0438674 --- /dev/null +++ b/test/test_halfwidth_spaces.py @@ -0,0 +1,10 @@ +import mistletoe + +from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +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) diff --git a/test/test_nonbreaking_spaces.py b/test/test_nonbreaking_spaces.py new file mode 100644 index 0000000..0d6c3cc --- /dev/null +++ b/test/test_nonbreaking_spaces.py @@ -0,0 +1,31 @@ +import mistletoe + +from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +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." + + assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target) + +def test_three_points_html(): + input = "Heute hatte ich ... zum Mittagessen." + target = "Heute hatte ich ... zum Mittagessen." + + assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target) + + +def test_absatz_html(): + input = "Der Test befindet sich unter Abs.2 vielleicht aber auch Abs. 3." + target = "Der Test befindet sich unter Abs. 2 vielleicht aber auch Abs. 3." + + assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target) + +def test_class_html(): + input = "Ich lerne für Klasse A, Klasse E und Klasse N." + target = "Ich lerne für Klasse A, Klasse E und Klasse N." + + assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target) + + From f908a75c2e7f4de2ccfe8530e8bb7cc33820e7cc Mon Sep 17 00:00:00 2001 From: Johanna Riedel Date: Sun, 8 Dec 2024 00:13:02 +0100 Subject: [PATCH 2/2] refactor: Fixed desired ... handling and more tests --- renderer/fifty_ohm_html_renderer.py | 6 +++++- renderer/nonbreaking_spaces.py | 9 +++++++-- test/test_nonbreaking_spaces.py | 11 ++++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/renderer/fifty_ohm_html_renderer.py b/renderer/fifty_ohm_html_renderer.py index fdcf7a9..9a3136d 100644 --- a/renderer/fifty_ohm_html_renderer.py +++ b/renderer/fifty_ohm_html_renderer.py @@ -26,4 +26,8 @@ class FiftyOhmHtmlRenderer(HtmlRenderer): return f"{token.first} {token.second}" def render_nonbreaking_spaces_dots(self, token): - return f" {token.first} " \ No newline at end of file + lookup = { + "" : "", + " " : " " + } + return f"{lookup[token.first]}{token.second}{lookup[token.third]}" \ No newline at end of file diff --git a/renderer/nonbreaking_spaces.py b/renderer/nonbreaking_spaces.py index d800b10..932653f 100644 --- a/renderer/nonbreaking_spaces.py +++ b/renderer/nonbreaking_spaces.py @@ -7,7 +7,6 @@ class NonbreakingSpaces(SpanToken): """ Insert unbreakable space into span token (§ 3) Identifies "§$number", "Abs.$number", "Klasse [A,E,N]" w/ and w\ space between. - Identifies "..." with and without leading and trailing space """ pattern = re.compile(r"(§|Abs\.|Klasse)\s?(\d|[NEA])") @@ -16,10 +15,16 @@ class NonbreakingSpaces(SpanToken): self.second = match_object.group(2) class NonbreakingSpacesDots(SpanToken): - pattern = re.compile(r"\s?(\.\.\.)\s?") + """ + Insert unbreakable space before and after "..." if there is a space + Identifies "..." with leading and/or trailing space + """ + pattern = re.compile(r"(\s?)(\.\.\.)(\s?)") def __init__(self, match_object): self.first = match_object.group(1) + self.second = match_object.group(2) + self.third = match_object.group(3) diff --git a/test/test_nonbreaking_spaces.py b/test/test_nonbreaking_spaces.py index 0d6c3cc..88fb8cb 100644 --- a/test/test_nonbreaking_spaces.py +++ b/test/test_nonbreaking_spaces.py @@ -10,10 +10,15 @@ def test_paragraph_html(): assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target) def test_three_points_html(): - input = "Heute hatte ich ... zum Mittagessen." - target = "Heute hatte ich ... zum Mittagessen." + assertions = { + "Heute hatte ich ... zum Mittagessen." : "Heute hatte ich ... zum Mittagessen.", + "Niemals hätte ich gedacht, dass...ich ...nicht kann." : "Niemals hätte ich gedacht, dass...ich ...nicht kann.", + "Oh nein ...ein Pinguin." : "Oh nein ...ein Pinguin.", + "Haha .. . Hahaha" : "Haha .. . Hahaha" + } - assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target) + for key, value in assertions.items(): + assert mistletoe.markdown(key, FiftyOhmHtmlRenderer) == paragraph(value) def test_absatz_html():