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)
+
+