diff --git a/renderer/fifty_ohm_html_renderer.py b/renderer/fifty_ohm_html_renderer.py index fcc1329..9e34035 100644 --- a/renderer/fifty_ohm_html_renderer.py +++ b/renderer/fifty_ohm_html_renderer.py @@ -6,6 +6,7 @@ from mistletoe import Document, HtmlRenderer from .comment import BlockComment from .dash import Dash from .halfwidth_spaces import HalfwidthSpaces +from .include import Include from .morse import Morse from .nonbreaking_spaces import NonbreakingSpaces, NonbreakingSpacesDots from .photo import Photo @@ -28,7 +29,13 @@ class FiftyOhmHtmlRenderer(HtmlRenderer): section_url = "section.html" ref_id = 0 - def __init__(self, question_renderer=None, picture_handler=None, photo_handler=None): + def __init__( + self, + question_renderer=None, + picture_handler=None, + photo_handler=None, + include_handler=None + ) : super().__init__( Dash, BlockComment, @@ -46,10 +53,12 @@ class FiftyOhmHtmlRenderer(HtmlRenderer): Photo, Table, Qso, + Include ) self.question_renderer = question_renderer self.picture_handler = picture_handler self.photo_handler = photo_handler + self.include_handler = include_handler def render_dash(self, token): return " – " @@ -227,3 +236,6 @@ class FiftyOhmHtmlRenderer(HtmlRenderer): table += "" return table + + def render_include(self, token): + return self.include_handler(token.content) diff --git a/renderer/include.py b/renderer/include.py new file mode 100644 index 0000000..5b96f02 --- /dev/null +++ b/renderer/include.py @@ -0,0 +1,13 @@ +import re + +from mistletoe.span_token import SpanToken + + +class Include(SpanToken): + """ + Span token ("[include:ident]"). + Includes raw html or javascript code from a file with the given identifier. + """ + + parse_inner = False + pattern = re.compile(r'\[include:\s*([^\]]+)\]') diff --git a/test/test_include.py b/test/test_include.py new file mode 100644 index 0000000..e8a9dfb --- /dev/null +++ b/test/test_include.py @@ -0,0 +1,18 @@ +import pytest +from mistletoe import Document + +from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer + + +@pytest.mark.html +def test_include_html(): + assertions = { + '[include:ident]': "
ident
\n", + } + + def test_function(input): + return f"{input}" + + with FiftyOhmHtmlRenderer(include_handler=test_function) as renderer: + for assertion in assertions: + assert renderer.render(Document(assertion)) == assertions[assertion] \ No newline at end of file