import os
from io import StringIO
+_registered_tags = []
-class MDTag:
- registered_tags = []
+
+class MDInlineTag:
char: str
tag_name: str
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
- MDTag.registered_tags.append(cls)
+ _registered_tags.append(cls)
def __init__(self, states, sio):
self.states = states
return value
-class Bold(MDTag):
+class Bold(MDInlineTag):
char = "*"
tag_name = "b"
-class Italic(MDTag):
+class Italic(MDInlineTag):
char = "/"
tag_name = "i"
-class Underline(MDTag):
+class Underline(MDInlineTag):
char = "_"
tag_name = "u"
-class Code(MDTag):
+class Code(MDInlineTag):
char = "`"
tag_name = "code"
-class Link(MDTag):
+class Link(MDInlineTag):
char = "["
tag_name = "a"
start: int | None
self.states.pop()
-class Paragraph:
- name = "p"
+class MDLineTag:
+ name: str
def __init__(self):
self.lines = []
return True
def handle_tag(self, c):
- for tag_class in MDTag.registered_tags:
+ for tag_class in _registered_tags:
if c == tag_class.char and self.check_states(tag_class):
return tag_class(self.states, self.sio)
return None
- def join_lines(self):
+ def render_inner(self):
if self.sio.getvalue():
assert not self.lines
return self.sio.getvalue()
self.lines.clear()
return self.sio.getvalue()
- def join(self):
- return f"<{self.name}>{self.join_lines()}</{self.name}>"
+ def render_outer(self):
+ return f"<{self.name}>{self.render_inner()}</{self.name}>"
+
+
+class Paragraph(MDLineTag):
+ name = "p"
-class Heading2(Paragraph):
+class Heading2(MDLineTag):
name = "h2"
-class BulletList(Paragraph):
+class BulletList(MDLineTag):
name = "ul"
- class ListItem(Paragraph):
+ class ListItem(MDLineTag):
name = "li"
def __init__(self):
def lines(self, _):
self.list_items.append(self.ListItem())
- def join_lines(self):
- return os.linesep.join(li.join() for li in self.list_items)
+ def render_inner(self):
+ return os.linesep.join(li.render_outer() for li in self.list_items)
class MDRenderer:
self.set_tag(Paragraph)
self.tag.lines.append(line)
return (
- title.join_lines() if title else None,
- os.linesep.join(t.join() for t in self.tags),
+ title.render_inner() if title else None,
+ os.linesep.join(t.render_outer() for t in self.tags),
)