from docutils import nodes from docutils.parsers.rst import roles from sphinx import addnodes from sphinx.environment.adapters import toctree from . import pygments_override, translator def setup(app): app.set_translator('html', translator.BootstrapTranslator) app.connect('html-page-context', set_missing_meta) app.add_js_file('js/utils.js') # Keep in first position app.add_js_file('js/layout.js') app.add_js_file('js/menu.js') app.add_js_file('js/page_toc.js') app.add_js_file('js/switchers.js') roles.register_canonical_role('icon', icon_role) return { 'parallel_read_safe': True, 'parallel_write_safe': True } def set_missing_meta(app, pagename, templatename, context, doctree): if context.get('meta') is None: # Pages without title (used with `include::`) have no meta context['meta'] = {} class Monkey: """ Replace patched method of an object by a new method receiving the old one in argument. """ def __init__(self, obj): self.obj = obj def __call__(self, fn): name = fn.__name__ old = getattr(self.obj, name) setattr(self.obj, name, lambda self_, *args, **kwargs: fn(old, self_, *args, **kwargs)) @Monkey(toctree.TocTree) def resolve(old_resolve, tree, docname, *args, **kwargs): def _update_toctree_nodes(_node) -> None: """ Make necessary changes to Docutils' nodes of the toc. Internal structure of toc nodes: