Pull request #32: feature: add qso rendering

Merge in FRAG/50ohm.de from qso to main

* commit 'f9aeed4aca44d852fc3821ec7b1265028c25f027':
  Angewendeter Vorschlag
  feature: add qso rendering
This commit is contained in:
Prof.Dr. Matthias Jung DL9MJ
2025-05-24 23:57:39 +00:00
3 changed files with 65 additions and 0 deletions
+10
View File
@@ -9,6 +9,7 @@ from .morse import Morse
from .nonbreaking_spaces import NonbreakingSpaces, NonbreakingSpacesDots from .nonbreaking_spaces import NonbreakingSpaces, NonbreakingSpacesDots
from .photo import Photo from .photo import Photo
from .picture import Picture from .picture import Picture
from .qso import Qso
from .question import Question from .question import Question
from .quote import Quote from .quote import Quote
from .references import References from .references import References
@@ -43,6 +44,7 @@ class FiftyOhmHtmlRenderer(HtmlRenderer):
Picture, Picture,
Photo, Photo,
Table, Table,
Qso,
) )
self.question_renderer = question_renderer self.question_renderer = question_renderer
@@ -155,6 +157,14 @@ class FiftyOhmHtmlRenderer(HtmlRenderer):
return self.render_tag_helper(type, self.render_inner(token), self.margin_id, self.margin_anchor_id) return self.render_tag_helper(type, self.render_inner(token), self.margin_id, self.margin_anchor_id)
def render_qso(self, token):
self.margin_id += 1
qso = ""
for child in token.children:
direction = "other" if child.received else "own"
qso += f'<div class="qso_{direction}">{self.render_inner(child)}</div>\n'
return self.render_tag_helper("qso", qso, self.margin_id, self.margin_anchor_id)
def render_halfwidth_spaces(self, token): def render_halfwidth_spaces(self, token):
return f"{token.first}.&#8239;{token.second}." return f"{token.first}.&#8239;{token.second}."
+38
View File
@@ -0,0 +1,38 @@
import re
from mistletoe import span_token
from mistletoe.block_token import BlockToken
class Qso(BlockToken):
@staticmethod
def start(line):
return re.match(r"^\s*<qso>", line)
@classmethod
def read(cls, lines):
child_lines = []
for line in lines:
if line.startswith("<qso>"):
continue
if line.startswith("</qso>"):
break
else:
child_lines.append(QsoLine(line))
return child_lines
def __init__(self, match):
self.children = match
class QsoLine(BlockToken):
@classmethod
def parse_line(cls, line):
if line.startswith(">"):
return True, line[1:].strip()
else:
return False, line.strip()
def __init__(self, match):
self.received, self.text = self.parse_line(match)
super().__init__(self.text, span_token.tokenize_inner)
+17
View File
@@ -0,0 +1,17 @@
import mistletoe
import pytest
from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer
@pytest.mark.html
def test_table_html():
assertions = {
"<qso>\nfoo\n</qso>": FiftyOhmHtmlRenderer.render_tag_helper("qso", '<div class="qso_own">foo</div>', 1, 0) +"\n",
"<qso>\nfoo\n> bar\n</qso>": FiftyOhmHtmlRenderer.render_tag_helper("qso", '<div class="qso_own">foo</div><div class="qso_other">bar</div>', 1, 0) +"\n",
"<qso>\n*foo*\n> bar\n</qso>": FiftyOhmHtmlRenderer.render_tag_helper("qso", '<div class="qso_own"><em>foo</em></div><div class="qso_other">bar</div>', 1, 0) +"\n",
}
for assertion in assertions:
assert mistletoe.markdown(assertion, FiftyOhmHtmlRenderer) == assertions[assertion]