diff --git a/renderer/fifty_ohm_html_renderer.py b/renderer/fifty_ohm_html_renderer.py index 0881c04..be1a7ec 100644 --- a/renderer/fifty_ohm_html_renderer.py +++ b/renderer/fifty_ohm_html_renderer.py @@ -7,6 +7,7 @@ from .dash import Dash from .halfwidth_spaces import HalfwidthSpaces from .morse import Morse from .nonbreaking_spaces import NonbreakingSpaces, NonbreakingSpacesDots +from .question import Question from .quote import Quote from .references import References from .tag import Tag @@ -20,7 +21,7 @@ class FiftyOhmHtmlRenderer(HtmlRenderer): section_url = "section.html" ref_id = 0 - def __init__(self): + def __init__(self, question_renderer=None): super().__init__( Dash, BlockComment, @@ -33,7 +34,9 @@ class FiftyOhmHtmlRenderer(HtmlRenderer): NonbreakingSpaces, NonbreakingSpacesDots, References, + Question, ) + self.question_renderer = question_renderer def render_dash(self, token): return " – " @@ -157,6 +160,9 @@ class FiftyOhmHtmlRenderer(HtmlRenderer): def render_references(self, token): return f'{self.ref_id}' + def render_question(self, token): + return self.question_renderer(token.question_number) + def render_document(self, token: Document) -> str: self.footnotes.update(token.footnotes) # Filter out None values, so block tokens can return None to not be rendered. diff --git a/renderer/fifty_ohm_latex_renderer.py b/renderer/fifty_ohm_latex_renderer.py index 802cd96..16e481b 100644 --- a/renderer/fifty_ohm_latex_renderer.py +++ b/renderer/fifty_ohm_latex_renderer.py @@ -4,13 +4,14 @@ from .comment import BlockComment from .dash import Dash from .halfwidth_spaces import HalfwidthSpaces from .nonbreaking_spaces import NonbreakingSpaces, NonbreakingSpacesDots +from .question import Question from .quote import Quote from .tag import Tag from .underline import Underline class FiftyOhmLaTeXRenderer(LaTeXRenderer): - def __init__(self): + def __init__(self, question_renderer=None): super().__init__( Dash, BlockComment, @@ -20,7 +21,9 @@ class FiftyOhmLaTeXRenderer(LaTeXRenderer): HalfwidthSpaces, NonbreakingSpaces, NonbreakingSpacesDots, + Question, ) + self.question_renderer = question_renderer def render_document(self, token): self.footnotes.update(token.footnotes) @@ -86,3 +89,6 @@ class FiftyOhmLaTeXRenderer(LaTeXRenderer): def render_nonbreaking_spaces_dots(self, token): lookup = {"": "", " ": "~"} return f"{lookup[token.first]}{token.second}{lookup[token.third]}" + + def render_question(self, token): + return self.question_renderer(token.question_number) diff --git a/renderer/question.py b/renderer/question.py new file mode 100644 index 0000000..9fe4c97 --- /dev/null +++ b/renderer/question.py @@ -0,0 +1,24 @@ +import re + +from mistletoe.block_token import BlockToken + + +class Question(BlockToken): + @staticmethod + def start(line): + # Search for: + # [question:123] + return re.match(r"^\s*\[question:\d+\]", line) + + @classmethod + def read(cls, lines): + first_line = next(lines) + question_number = re.match(r"^\s*\[question:(\d+)\]", first_line).group(1) + return question_number + + @classmethod + def check_interrupts_paragraph(cls, lines): + return cls.start(lines.peek()) + + def __init__(self, match): + self.question_number = match diff --git a/test/test_html.py b/test/test_html.py index e7160de..2b053e0 100644 --- a/test/test_html.py +++ b/test/test_html.py @@ -1,12 +1,17 @@ -import mistletoe +from mistletoe import Document from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +def question_stub(input): + return f"{input}" # TODO implement this stub + + def test_html(capsys): with capsys.disabled(): with open("test/acceptanceTest.md") as file: content = file.read() - output = mistletoe.markdown(content, FiftyOhmHtmlRenderer) - with open("test/acceptanceTest.html", "w") as output_file: - output_file.write(output) + with FiftyOhmHtmlRenderer(question_stub) as renderer: + output = renderer.render(Document(content)) + with open("test/acceptanceTest.html", "w") as output_file: + output_file.write(output) diff --git a/test/test_question.py b/test/test_question.py new file mode 100644 index 0000000..027c446 --- /dev/null +++ b/test/test_question.py @@ -0,0 +1,40 @@ +import pytest +from mistletoe import Document + +from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +from renderer.fifty_ohm_latex_renderer import FiftyOhmLaTeXRenderer +from test.util import paragraph + + +@pytest.mark.html +def test_comment_html(): + assertions = { + "[question:123]": "123\n", + "\n[question:123]\n": "123\n", + "\n[question:123]\n[question:123]": "123\n123\n", + "Foo\n[question:123]\nBar": paragraph("Foo") + "123\n" + paragraph("Bar"), + } + + def test_function(input): + return f"{input}" + + with FiftyOhmHtmlRenderer(test_function) as renderer: + for assertion in assertions: + assert renderer.render(Document(assertion)) == assertions[assertion] + + +@pytest.mark.latex +def test_comment_latex(): + assertions = { + "[question:123]": "123", + "\n[question:123]\n": "123", + "\n[question:123]\n[question:123]": "123123", + "Foo\n[question:123]\nBar": "\nFoo\n123\nBar\n", + } + + def test_function(input): + return f"{input}" + + with FiftyOhmLaTeXRenderer(test_function) as renderer: + for assertion in assertions: + assert renderer.render(Document(assertion)) == assertions[assertion]