admonitions.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # $Id: admonitions.py 9037 2022-03-05 23:31:10Z milde $
  2. # Author: David Goodger <goodger@python.org>
  3. # Copyright: This module has been placed in the public domain.
  4. """
  5. Admonition directives.
  6. """
  7. __docformat__ = 'reStructuredText'
  8. from docutils.parsers.rst import Directive
  9. from docutils.parsers.rst import directives
  10. from docutils.parsers.rst.roles import set_classes
  11. from docutils import nodes
  12. class BaseAdmonition(Directive):
  13. final_argument_whitespace = True
  14. option_spec = {'class': directives.class_option,
  15. 'name': directives.unchanged}
  16. has_content = True
  17. node_class = None
  18. """Subclasses must set this to the appropriate admonition node class."""
  19. def run(self):
  20. set_classes(self.options)
  21. self.assert_has_content()
  22. text = '\n'.join(self.content)
  23. admonition_node = self.node_class(text, **self.options)
  24. self.add_name(admonition_node)
  25. if self.node_class is nodes.admonition:
  26. title_text = self.arguments[0]
  27. textnodes, messages = self.state.inline_text(title_text,
  28. self.lineno)
  29. title = nodes.title(title_text, '', *textnodes)
  30. title.source, title.line = (
  31. self.state_machine.get_source_and_line(self.lineno))
  32. admonition_node += title
  33. admonition_node += messages
  34. if 'classes' not in self.options:
  35. admonition_node['classes'] += ['admonition-'
  36. + nodes.make_id(title_text)]
  37. self.state.nested_parse(self.content, self.content_offset,
  38. admonition_node)
  39. return [admonition_node]
  40. class Admonition(BaseAdmonition):
  41. required_arguments = 1
  42. node_class = nodes.admonition
  43. class Attention(BaseAdmonition):
  44. node_class = nodes.attention
  45. class Caution(BaseAdmonition):
  46. node_class = nodes.caution
  47. class Danger(BaseAdmonition):
  48. node_class = nodes.danger
  49. class Error(BaseAdmonition):
  50. node_class = nodes.error
  51. class Hint(BaseAdmonition):
  52. node_class = nodes.hint
  53. class Important(BaseAdmonition):
  54. node_class = nodes.important
  55. class Note(BaseAdmonition):
  56. node_class = nodes.note
  57. class Tip(BaseAdmonition):
  58. node_class = nodes.tip
  59. class Warning(BaseAdmonition):
  60. node_class = nodes.warning