roundabout,
created on Wednesday, 27 March 2024, 17:44:02 (1711561442),
received on Wednesday, 31 July 2024, 06:54:42 (1722408882)
Author identity: vlad <vlad.muntoiu@gmail.com>
26299766e55f71d32139495f3be908283fa28c20
markdown.py
@@ -61,11 +61,9 @@ class Heading(Container):
class Paragraph(Container): def __init__(self):def __init__(self, content):super().__init__("") def addLine(self, content):self.content.extend([*parse_line(content), " "])self.content = parse_line(content)def __repr__(self): return "Paragraph:\n\t" + repr(self.content)
@@ -75,6 +73,19 @@ class Paragraph(Container):
return "p" class Blockquote(Paragraph): def __init__(self, content): super().__init__("") self.content = tokenise(content) def __repr__(self): return "Blockquote:\n\t" + repr(self.content) @property def tag_name(self): return "blockquote" class Emphasis(Container): def __init__(self, content, value): super().__init__(content)
@@ -140,7 +151,7 @@ class Link(Element):
self.image = image def __repr__(self): return f"{'Image' if self.image else 'Link'}: {self.text} -> {self.destination}"return f"{'Image' if self.image else 'Link'}: {self.content} -> {self.destination}"@property def tag_name(self):
@@ -182,9 +193,10 @@ def parse_line(source):
if i.group("diff"): tokens.append(Diff(i.group("textDiff"), i.group("diff"))) if i.group("urlText"): tokens.append(Link(i.group("urlText"), i.group("urlDestination")))if i.group("imageFlag"):tokens.append(Image(i.group("urlText"), i.group("urlDestination")))if i.group("imageFlag"): tokens.append(Image(i.group("urlText"), i.group("urlDestination"))) else: tokens.append(Link(i.group("urlText"), i.group("urlDestination")))tokens.append(source[lookup:])
@@ -194,27 +206,51 @@ def parse_line(source):
def tokenise(source): tokens = [] current_block = Elementcurrent_block = Element() lines = source.split("\n")for line in source.split("\n"):i = 0 while i < len(lines): line = lines[i]if not line.strip(): # Void block tokens.append(current_block) current_block = Element() i += 1elif line.startswith("#") and leading(line.lstrip("#"), " "): tokens.append(current_block) content = line.lstrip("#").strip() current_block = Heading(content, leading(line, "#")) i += 1 elif line.startswith(">"): if not isinstance(current_block, Blockquote): tokens.append(current_block) content = "" while i < len(lines) and lines[i].startswith(">"): content += lines[i].lstrip(">").strip() + "\n" i += 1 current_block = Blockquote(content)else: if not isinstance(current_block, Paragraph): # Paragraph is default tokens.append(current_block) current_block = Paragraph()current_block.addLine(line.strip())content = "" while i < len(lines) and not lines[i].startswith("#") and not lines[i].startswith(">") and lines[i].strip(): content += lines[i].strip() + "\n" i += 1 current_block = Paragraph(content)tokens.append(current_block)
@@ -229,6 +265,10 @@ def make_html(ast):
soup.append(i) elif hasattr(i, "content") and i.tag_name != "m-void": tag = soup.new_tag(str(i.tag_name)) if i.tag_name == "a": tag["href"] = i.destination if i.tag_name == "img": tag["src"] = i.destinationtry: if isinstance(i.content, list): tag.append(make_html(i.content))
@@ -255,11 +295,14 @@ if __name__ == '__main__':
Lorem **i`p`sum** dolor `sit` amet > Make it as simple as possible, [but not simpler](https://wikipedia.org). > > If you can't explain it simply, you don't understand it well enough. ... """ ) # for i in ast:# print(repr(i))for i in ast: print(repr(i))# Now convert the AST to HTML print(make_html(ast).prettify(formatter=beautifulsoup.formatter.HTMLFormatter(indent=4)))