djangodocs.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. """
  2. Sphinx plugins for Django documentation.
  3. """
  4. import docutils.nodes
  5. import docutils.transforms
  6. import sphinx
  7. import sphinx.addnodes
  8. import sphinx.directives
  9. import sphinx.environment
  10. import sphinx.roles
  11. from docutils import nodes
  12. def setup(app):
  13. app.add_crossref_type(
  14. directivename = "setting",
  15. rolename = "setting",
  16. indextemplate = "pair: %s; setting",
  17. )
  18. app.add_crossref_type(
  19. directivename = "templatetag",
  20. rolename = "ttag",
  21. indextemplate = "pair: %s; template tag",
  22. )
  23. app.add_crossref_type(
  24. directivename = "templatefilter",
  25. rolename = "tfilter",
  26. indextemplate = "pair: %s; template filter",
  27. )
  28. app.add_crossref_type(
  29. directivename = "fieldlookup",
  30. rolename = "lookup",
  31. indextemplate = "pair: %s, field lookup type",
  32. )
  33. app.add_description_unit(
  34. directivename = "django-admin",
  35. rolename = "djadmin",
  36. indextemplate = "pair: %s; django-admin command",
  37. parse_node = parse_django_admin_node,
  38. )
  39. app.add_description_unit(
  40. directivename = "django-admin-option",
  41. rolename = "djadminopt",
  42. indextemplate = "pair: %s; django-admin command-line option",
  43. parse_node = lambda env, sig, signode: \
  44. sphinx.directives.parse_option_desc(signode, sig),
  45. )
  46. app.add_config_value('django_next_version', '0.0', True)
  47. app.add_directive('versionadded', parse_version_directive, 1, (1, 1, 1))
  48. app.add_directive('versionchanged', parse_version_directive, 1, (1, 1, 1))
  49. app.add_transform(SuppressBlockquotes)
  50. def parse_version_directive(name, arguments, options, content, lineno,
  51. content_offset, block_text, state, state_machine):
  52. env = state.document.settings.env
  53. is_nextversion = env.config.django_next_version == arguments[0]
  54. ret = []
  55. node = sphinx.addnodes.versionmodified()
  56. ret.append(node)
  57. if not is_nextversion:
  58. if len(arguments) == 1:
  59. linktext = 'Please, see the release notes <releases-%s>' % (
  60. arguments[0])
  61. xrefs = sphinx.roles.xfileref_role('ref', linktext, linktext,
  62. lineno, state)
  63. node.extend(xrefs[0])
  64. node['version'] = arguments[0]
  65. else:
  66. node['version'] = "Development version"
  67. node['type'] = name
  68. if len(arguments) == 2:
  69. inodes, messages = state.inline_text(arguments[1], lineno+1)
  70. node.extend(inodes)
  71. if content:
  72. state.nested_parse(content, content_offset, node)
  73. ret = ret + messages
  74. env.note_versionchange(node['type'], node['version'], node, lineno)
  75. return ret
  76. class SuppressBlockquotes(docutils.transforms.Transform):
  77. """
  78. Remove the default blockquotes that encase indented list, tables, etc.
  79. """
  80. default_priority = 300
  81. suppress_blockquote_child_nodes = (
  82. docutils.nodes.bullet_list,
  83. docutils.nodes.enumerated_list,
  84. docutils.nodes.definition_list,
  85. docutils.nodes.literal_block,
  86. docutils.nodes.doctest_block,
  87. docutils.nodes.line_block,
  88. docutils.nodes.table,
  89. )
  90. def apply(self):
  91. for node in self.document.traverse(docutils.nodes.block_quote):
  92. if len(node.children) == 1 and \
  93. isinstance(node.children[0],
  94. self.suppress_blockquote_child_nodes):
  95. node.replace_self(node.children[0])
  96. def parse_django_admin_node(env, sig, signode):
  97. command = sig.split(' ')[0]
  98. env._django_curr_admin_command = command
  99. title = "django-admin.py %s" % sig
  100. signode += sphinx.addnodes.desc_name(title, title)
  101. return sig