doctree

https://docutils.sourceforge.io/

  • https://docutils.sourceforge.io/docs/index.html#ref-reference-material-for-all-groups

Sphinx の記事 (rst) は、 doctree になって build/.doctrees/*.doctree に pickle 保存される。

sphinx.addnodes.document は、 docutils.nodes.document であり、docutils.nodes.Node。 root Node である。

myst-parser により markdown から doctree 化することができる。

sphinx.addnodes.document

https://www.sphinx-doc.org/en/master/_modules/sphinx/addnodes.html

class document(nodes.document):
    """The document root element patched by Sphinx.

    This fixes that document.set_id() does not support a node having multiple node Ids.
    see https://sourceforge.net/p/docutils/patches/167/

    .. important:: This is only for Sphinx internal use.  Please don't use this
                   in your extensions.  It will be removed without deprecation period.
    """

    def set_id(self, node: Element, msgnode: Element = None,
               suggested_prefix: str = '') -> str:
        from sphinx.util import docutils
        if docutils.__version_info__ >= (0, 16):
            ret = super().set_id(node, msgnode, suggested_prefix)  # type: ignore
        else:
            ret = super().set_id(node, msgnode)

        if docutils.__version_info__ < (0, 17):
            # register other node IDs forcedly
            for node_id in node['ids']:
                if node_id not in self.ids:
                    self.ids[node_id] = node

docutils.nodes.document

https://tristanlatr.github.io/apidocs/docutils/docutils.nodes.document.html

import sys
import pathlib
import pickle
import docutils.nodes


def traverse(node: docutils.nodes.Node, level=0):
    indent = '  ' * level
    print(f'{indent}{type(node)}')
    for child in node.children:
        traverse(child, level+1)


if __name__ == '__main__':
    document = pickle.loads(pathlib.Path(sys.argv[1]).read_bytes())
    traverse(document)

<class 'sphinx.addnodes.document'>
  <class 'docutils.nodes.section'>
    <class 'docutils.nodes.title'>
      <class 'docutils.nodes.Text'>
    <class 'docutils.nodes.compound'>
      <class 'sphinx.addnodes.toctree'>
    <class 'docutils.nodes.section'>
      <class 'docutils.nodes.title'>
        <class 'docutils.nodes.Text'>
      <class 'docutils.nodes.bullet_list'>
        <class 'docutils.nodes.list_item'>
          <class 'docutils.nodes.paragraph'>
            <class 'docutils.nodes.reference'>
              <class 'docutils.nodes.Text'>
    <class 'docutils.nodes.section'>
      <class 'docutils.nodes.title'>
        <class 'docutils.nodes.Text'>
      <class 'docutils.nodes.bullet_list'>
        <class 'docutils.nodes.list_item'>
          <class 'docutils.nodes.paragraph'>
            <class 'sphinx.addnodes.pending_xref'>
              <class 'docutils.nodes.inline'>
                <class 'docutils.nodes.Text'>
        <class 'docutils.nodes.list_item'>
          <class 'docutils.nodes.paragraph'>
            <class 'sphinx.addnodes.pending_xref'>
              <class 'docutils.nodes.inline'>
                <class 'docutils.nodes.Text'>
        <class 'docutils.nodes.list_item'>
          <class 'docutils.nodes.paragraph'>
            <class 'sphinx.addnodes.pending_xref'>
              <class 'docutils.nodes.inline'>
                <class 'docutils.nodes.Text'>