feat: Renderer add nonbreakable spaces and halfwidth spaces

This commit is contained in:
Johanna Riedel
2024-12-07 17:26:14 +01:00
parent 6ffec75332
commit 5a4e6554c0
5 changed files with 97 additions and 2 deletions
+13 -2
View File
@@ -2,11 +2,13 @@ from mistletoe import HtmlRenderer
from renderer.comment import Comment from renderer.comment import Comment
from renderer.quote import Quote from renderer.quote import Quote
from renderer.halfwidth_spaces import HalfwidthSpaces
from renderer.nonbreaking_spaces import NonbreakingSpaces, NonbreakingSpacesDots
class FiftyOhmHtmlRenderer(HtmlRenderer): class FiftyOhmHtmlRenderer(HtmlRenderer):
def __init__(self): def __init__(self):
super().__init__(Comment, Quote) super().__init__(Comment, Quote, HalfwidthSpaces, NonbreakingSpaces, NonbreakingSpacesDots)
def render_comment(): def render_comment():
return None return None
@@ -15,4 +17,13 @@ class FiftyOhmHtmlRenderer(HtmlRenderer):
return f"„{self.render_inner(token)}“" return f"„{self.render_inner(token)}“"
def render_underline(self, token): def render_underline(self, token):
return f"<u>{self.render_inner(token)}</u>" return f"<u>{self.render_inner(token)}</u>"
def render_halfwidth_spaces(self, token):
return f"{token.first}.&#8239;{token.second}."
def render_nonbreaking_spaces(self, token):
return f"{token.first}&#160;{token.second}"
def render_nonbreaking_spaces_dots(self, token):
return f"&#160;{token.first}&#160;"
+18
View File
@@ -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)
+25
View File
@@ -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)
+10
View File
@@ -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.&#8239;B. ein Test. D.&#8239;h. hier sollten d.&#8239;h. Spaces ersetzt worden sein."
assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target)
+31
View File
@@ -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 §&#160;2 vielleicht aber auch §&#160;3."
assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target)
def test_three_points_html():
input = "Heute hatte ich ... zum Mittagessen."
target = "Heute hatte ich&#160;...&#160;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.&#160;2 vielleicht aber auch Abs.&#160;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&#160;A, Klasse&#160;E und Klasse&#160;N."
assert mistletoe.markdown(input, FiftyOhmHtmlRenderer) == paragraph(target)