markdown.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. HTML_REPLACEMENTS = [
  2. (r'&', r'&'),
  3. (r'"', r'"'),
  4. ]
  5. def parse_markdown(text: str, tab_length: int = 2) -> str:
  6. lines = text.split("\n")
  7. output: list[str] = []
  8. list_level = 0
  9. def end_outstanding_lists(level: int, end_level: int) -> int:
  10. while level > end_level:
  11. level -= 1
  12. output.append("</ul>")
  13. if level > 0:
  14. output.append("</li>")
  15. return end_level
  16. for i, line in enumerate(lines):
  17. if i + 1 < len(lines) and lines[i + 1].startswith("==="): # heading
  18. output.append(f"<h1>{line}</h1>")
  19. elif line.startswith("==="):
  20. pass
  21. elif line.lstrip().startswith("* "): # list
  22. line_level = 1 + line.count(" " * tab_length, 0, line.index("*"))
  23. if list_level >= line_level:
  24. list_level = end_outstanding_lists(list_level, line_level)
  25. else:
  26. list_level += 1
  27. if list_level > 1:
  28. output[-1] = output[-1].replace("</li>", "")
  29. output.append("<ul>")
  30. output.append(f"<li>{line.replace('*', '', 1).lstrip()}</li>")
  31. else:
  32. list_level = end_outstanding_lists(list_level, 0)
  33. if len(line) > 0:
  34. output.append(line)
  35. end_outstanding_lists(list_level, 0)
  36. output_str = "\n".join(output) + "\n"
  37. for (fr, to) in HTML_REPLACEMENTS:
  38. output_str = output_str.replace(fr, to)
  39. return output_str