__init__.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from importlib import import_module
  2. from typing import TYPE_CHECKING, Dict, Protocol, Union, cast
  3. if TYPE_CHECKING:
  4. from ..markdown import Markdown
  5. _plugins = {
  6. "speedup": "mistune.plugins.speedup.speedup",
  7. "strikethrough": "mistune.plugins.formatting.strikethrough",
  8. "mark": "mistune.plugins.formatting.mark",
  9. "insert": "mistune.plugins.formatting.insert",
  10. "superscript": "mistune.plugins.formatting.superscript",
  11. "subscript": "mistune.plugins.formatting.subscript",
  12. "footnotes": "mistune.plugins.footnotes.footnotes",
  13. "table": "mistune.plugins.table.table",
  14. "url": "mistune.plugins.url.url",
  15. "abbr": "mistune.plugins.abbr.abbr",
  16. "def_list": "mistune.plugins.def_list.def_list",
  17. "math": "mistune.plugins.math.math",
  18. "ruby": "mistune.plugins.ruby.ruby",
  19. "task_lists": "mistune.plugins.task_lists.task_lists",
  20. "spoiler": "mistune.plugins.spoiler.spoiler",
  21. }
  22. class Plugin(Protocol):
  23. def __call__(self, md: "Markdown") -> None: ...
  24. _cached_modules: Dict[str, Plugin] = {}
  25. PluginRef = Union[str, Plugin] # reference to register a plugin
  26. def import_plugin(name: PluginRef) -> Plugin:
  27. if callable(name):
  28. return name
  29. if name in _cached_modules:
  30. return _cached_modules[name]
  31. if name in _plugins:
  32. module_path, func_name = _plugins[name].rsplit(".", 1)
  33. else:
  34. module_path, func_name = name.rsplit(".", 1)
  35. module = import_module(module_path)
  36. plugin = cast(Plugin, getattr(module, func_name))
  37. _cached_modules[name] = plugin
  38. return plugin