admonition.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from typing import TYPE_CHECKING, Any, Dict, Match
  2. from ._base import BaseDirective, DirectivePlugin
  3. if TYPE_CHECKING:
  4. from ..block_parser import BlockParser
  5. from ..core import BlockState
  6. from ..markdown import Markdown
  7. class Admonition(DirectivePlugin):
  8. SUPPORTED_NAMES = {
  9. "attention",
  10. "caution",
  11. "danger",
  12. "error",
  13. "hint",
  14. "important",
  15. "note",
  16. "tip",
  17. "warning",
  18. }
  19. def parse(self, block: "BlockParser", m: Match[str], state: "BlockState") -> Dict[str, Any]:
  20. name = self.parse_type(m)
  21. attrs = {"name": name}
  22. options = dict(self.parse_options(m))
  23. if "class" in options:
  24. attrs["class"] = options["class"]
  25. title = self.parse_title(m)
  26. if not title:
  27. title = name.capitalize()
  28. content = self.parse_content(m)
  29. children = [
  30. {
  31. "type": "admonition_title",
  32. "text": title,
  33. },
  34. {
  35. "type": "admonition_content",
  36. "children": self.parse_tokens(block, content, state),
  37. },
  38. ]
  39. return {
  40. "type": "admonition",
  41. "children": children,
  42. "attrs": attrs,
  43. }
  44. def __call__(self, directive: "BaseDirective", md: "Markdown") -> None:
  45. for name in self.SUPPORTED_NAMES:
  46. directive.register(name, self.parse)
  47. assert md.renderer is not None
  48. if md.renderer.NAME == "html":
  49. md.renderer.register("admonition", render_admonition)
  50. md.renderer.register("admonition_title", render_admonition_title)
  51. md.renderer.register("admonition_content", render_admonition_content)
  52. def render_admonition(self: Any, text: str, name: str, **attrs: Any) -> str:
  53. html = '<section class="admonition ' + name
  54. _cls = attrs.get("class")
  55. if _cls:
  56. html += " " + _cls
  57. return html + '">\n' + text + "</section>\n"
  58. def render_admonition_title(self: Any, text: str) -> str:
  59. return '<p class="admonition-title">' + text + "</p>\n"
  60. def render_admonition_content(self: Any, text: str) -> str:
  61. return text