docutils/sphinx custom directive creating sibling section rather than child

  • Last Update :
  • Techknowledgy :

I don't think it is possible to do this by returning the section from the directive (without doing something along the lines of what Florian suggested), as it will get appended to the 'current' section. You can, however, add the section via self.state.section as I do in the following (handling of options removed for brevity)

class FauxHeading(object):
   ""
"
A heading level that is not defined by a string.We need this to work with
the mechanics of
   : py: meth: `docutils.parsers.rst.states.RSTState.check_subsection`.

The important thing is that the length can vary, but it must be equal to
any other instance of FauxHeading.
""
"

def __init__(self, length):
   self.length = length

def __len__(self):
   return self.length

def __eq__(self, other):
   return isinstance(other, FauxHeading)

class ParmDirective(Directive):

   required_arguments = 1
optional_arguments = 0
has_content = True
option_spec = {
   'type': directives.unchanged,
   'precision': directives.nonnegative_int,
   'scale': directives.nonnegative_int,
   'length': directives.nonnegative_int
}

def run(self):
   variableName = self.arguments[0]
lineno = self.state_machine.abs_line_number()
secBody = None
block_length = 0

# added
for some space
lineBlock = nodes.line('', '', nodes.line_block())

# parse the body of the directive
if self.has_content and len(self.content):
   secBody = nodes.container()
block_length += nested_parse_with_titles(
   self.state, self.content, secBody)

# keeping track of the level seems to be required
if we want to allow
# nested content.Not sure why, but fits with the pattern in
   #: py: meth: `docutils.parsers.rst.states.RSTState.new_subsection`
myLevel = self.state.memo.section_level
self.state.section(
   variableName,
   '',
   FauxHeading(2 + len(self.options) + block_length),
   lineno,
   [lineBlock]
   if secBody is None
   else [lineBlock, secBody])
self.state.memo.section_level = myLevel

return []

Suggestion : 2

As previously discussed, a directive is a generic block of explicit markup. While Docutils provides a number of directives, Sphinx provides many more and uses directives as one of the primary extension mechanisms.,Many sections include a list of references to module documentation or external documents. These lists are created using the seealso directive.,Deprecated since version 1.1: This presentation-only directive is a legacy from older versions. Use a rst-class directive instead and add an appropriate style.,This directive documents the version of the project which added the described feature to the library or C API. When this applies to an entire module, it should be placed at the top of the module section before any prose.

..toctree::
   : maxdepth: 2

intro
strings
datatypes
numeric
   (many more documents listed here)
.. toctree::

intro
All about strings <strings>
   datatypes
..toctree::
   : numbered:

   foo
bar
..toctree::
   : caption: Table of Contents: name: mastertoc

foo
..toctree::
   : titlesonly:

   foo
bar
..toctree::
   : glob:

   intro *
   recipe
/*
 *

Suggestion : 3

This method must process the directive arguments, options and content, and return a list of Docutils/Sphinx nodes that will be inserted into the document tree at the point where the directive was encountered.,You can now create the files you listed in the toctree and add content, and their section titles will be inserted (up to the maxdepth level) at the place where the toctree directive is placed.  Also, Sphinx now knows about the order and hierarchy of your documents.  (They may contain toctree directives themselves, which means you can create deeply nested hierarchies if necessary.),Python code that is treated like it were put in a testsetup directive for every file that is tested, and for every group.  You can use this to e.g. import modules you will always need in your doctests.,The directive content follows after a blank line and is indented relative to the directive start or if options are present, by the same amount as the options.

Sphinx comes with a script called sphinx-quickstart that sets up a source directory and creates a default conf.py with the most useful configuration values from a few questions it asks you. To use this, run:

$ sphinx - quickstart

The toctree directive initially is empty, and looks like so:

..toctree::
   : maxdepth: 2

You add documents listing them in the content of the directive:

..toctree::
   : maxdepth: 2

usage / installation
usage / quickstart
   ...

Now that you have added some files and content, let’s make a first build of the docs.  A build is started with the sphinx-build program:

$ sphinx - build - b html sourcedir builddir

However, sphinx-quickstart script creates a Makefile and a make.bat which make life even easier for you. These can be executed by running make with the name of the builder. For example.

$ make html

The most prominent domain is the Python domain. For example, to document Python’s built-in function enumerate(), you would add this to one of your source files.

..py: function::enumerate(sequence[, start = 0])

Return an iterator that yields tuples of an index and an item of the *
   sequence * .(And so on.)

The Python domain also happens to be the default domain, so you don’t need to prefix the markup with the domain name.

..function::enumerate(sequence[, start = 0])

   ...

There are several more directives for documenting other types of Python objects, for example py:class or py:method.  There is also a cross-referencing role for each of these object types.  This markup will create a link to the documentation of enumerate().

The: py: func: `enumerate`
function can be used
for...

In order to use autodoc, you need to activate it in conf.py by putting the string 'sphinx.ext.autodoc' into the list assigned to the extensions config value:

extensions = ['sphinx.ext.autodoc']

Then, you have a few additional directives at your disposal.  For example, to document the function io.open(), reading its signature and docstring from the source file, you’d write this:

..autofunction::io.open

You can also document whole classes or even modules automatically, using member options for the auto directives, like

..automodule::io: members:

For example, to link to io.open() in the Python library manual, you need to setup your intersphinx_mapping like:

intersphinx_mapping = {
   'python': ('https://docs.python.org/3', None)
}