Source code for docfly.directives.autotoctree

# -*- coding: utf-8 -*-

"""

"""

from __future__ import unicode_literals
import sphinx.util
from docutils import nodes
from docutils.parsers.rst import Directive, directives
from docutils.statemachine import StringList
from sphinx.directives.other import TocTree
from pathlib_mate import Path

from ..doctree import ArticleFolder


[docs]class AutoTocTree(Directive): """ Automatically includes ``index.rst`` in toctree from:: <current_dir>/<any-folder>/index.rst Any toctree directive arguments are supported. Example, the content of ``<current_dir>/index.rst``:: .. autodoctree:: Will be converted to:: .. toctree:: ./section1/index.rst ./section2/index.rst ... """ _opt_append_ahead = "append_ahead" _opt_index_file = "index_file" _opt_index_file_default = "index" has_content = True option_spec = TocTree.option_spec.copy() option_spec[_opt_append_ahead] = directives.flag option_spec[_opt_index_file] = str def run(self): node = nodes.Element() node.document = self.state.document current_file = self.state.document.current_source output_rst = self.derive_toctree_rst(current_file) view_list = StringList(output_rst.splitlines(), source="") sphinx.util.nested_parse_with_titles(self.state, view_list, node) return node.children
[docs] def derive_toctree_rst(self, current_file): """ Generate the rst content:: .. toctree:: args ... example.rst ... :param current_file: :return: """ TAB = " " * 4 lines = list() # create the .. toctree:: and its options lines.append(".. toctree::") for opt in TocTree.option_spec: value = self.options.get(opt) if value is not None: line = "{indent}:{option}: {value}".format( indent=TAB, option=opt, value=value, ).rstrip() lines.append(line) lines.append("") if self._opt_append_ahead in self.options: for line in list(self.content): lines.append(TAB + line) index_file = self.options.get(self._opt_index_file, self._opt_index_file_default) article_folder = ArticleFolder( index_file=index_file, dir_path=Path(current_file).parent.abspath, ) for af in article_folder.sub_article_folders: line = "{indent}{title} <{relpath}>".format( indent=TAB, title=af.title, relpath=af.rel_path, ) lines.append(line) if self._opt_append_ahead not in self.options: for line in list(self.content): lines.append(TAB + line) lines.append("") toctree = "\n".join(lines) return toctree