| # |
| # This is a Sphinx documentation tool extension which allows to |
| # exclude some Python modules from the generated indexes. Modules |
| # are excluded both from "modindex" and "genindex" index tables |
| # (in the latter case, all members of a module are excluded). |
| # To control exclusion, set "modindex_exclude" variable in Sphinx |
| # conf.py to the list of modules to exclude. Note: these should be |
| # modules (as defined by py:module directive, not just raw filenames). |
| # This extension works by monkey-patching Sphinx core, so potentially |
| # may not work with untested Sphinx versions. It tested to work with |
| # 1.2.2 and 1.4.2 |
| # |
| # Copyright (c) 2016 Paul Sokolovsky |
| # Licensed under the terms of BSD license, see LICENSE file. |
| # |
| import sphinx |
| |
| |
| #org_PythonModuleIndex_generate = None |
| org_PyObject_add_target_and_index = None |
| org_PyModule_run = None |
| |
| EXCLUDES = {} |
| |
| # No longer used, PyModule_run() monkey-patch does all the job |
| def PythonModuleIndex_generate(self, docnames=None): |
| docnames = [] |
| excludes = self.domain.env.config['modindex_exclude'] |
| for modname, (docname, synopsis, platforms, deprecated) in self.domain.data['modules'].items(): |
| #print(docname) |
| if modname not in excludes: |
| docnames.append(docname) |
| |
| return org_PythonModuleIndex_generate(self, docnames) |
| |
| |
| def PyObject_add_target_and_index(self, name_cls, sig, signode): |
| if hasattr(self.env, "ref_context"): |
| # Sphinx 1.4 |
| ref_context = self.env.ref_context |
| else: |
| # Sphinx 1.2 |
| ref_context = self.env.temp_data |
| modname = self.options.get( |
| 'module', ref_context.get('py:module')) |
| #print("*", modname, name_cls) |
| if modname in self.env.config['modindex_exclude']: |
| return None |
| return org_PyObject_add_target_and_index(self, name_cls, sig, signode) |
| |
| |
| def PyModule_run(self): |
| env = self.state.document.settings.env |
| modname = self.arguments[0].strip() |
| excl = env.config['modindex_exclude'] |
| if modname in excl: |
| self.options['noindex'] = True |
| EXCLUDES.setdefault(modname, []).append(env.docname) |
| return org_PyModule_run(self) |
| |
| |
| def setup(app): |
| app.add_config_value('modindex_exclude', [], 'html') |
| |
| # global org_PythonModuleIndex_generate |
| # org_PythonModuleIndex_generate = sphinx.domains.python.PythonModuleIndex.generate |
| # sphinx.domains.python.PythonModuleIndex.generate = PythonModuleIndex_generate |
| |
| global org_PyObject_add_target_and_index |
| org_PyObject_add_target_and_index = sphinx.domains.python.PyObject.add_target_and_index |
| sphinx.domains.python.PyObject.add_target_and_index = PyObject_add_target_and_index |
| |
| global org_PyModule_run |
| org_PyModule_run = sphinx.domains.python.PyModule.run |
| sphinx.domains.python.PyModule.run = PyModule_run |