diff options
| author | Georg Brandl <georg@python.org> | 2010-02-20 01:13:23 +0100 |
|---|---|---|
| committer | Georg Brandl <georg@python.org> | 2010-02-20 01:13:23 +0100 |
| commit | 69af046cfcbadba827d8301a7bfaa2c4f1e5d3a8 (patch) | |
| tree | 4cb0f9cd3897bf61524e76eb51f3d313f0157f0e /sphinx/domains/python.py | |
| parent | 71a29487ac88b6b48ae62cbad1c97de561cabe06 (diff) | |
| download | sphinx-69af046cfcbadba827d8301a7bfaa2c4f1e5d3a8.tar.gz | |
Make the concept of "module index" generalized to domains. As a side-effect, the latex modindex is no longer generated by LaTeX.
Diffstat (limited to 'sphinx/domains/python.py')
| -rw-r--r-- | sphinx/domains/python.py | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py index c1619200..995914c1 100644 --- a/sphinx/domains/python.py +++ b/sphinx/domains/python.py @@ -462,6 +462,9 @@ class PythonDomain(Domain): 'objects': {}, # fullname -> docname, objtype 'modules': {}, # modname -> docname, synopsis, platform, deprecated } + indices = [ + ('modindex', l_('Global Module Index'), l_('modules')), + ] def clear_doc(self, docname): for fullname, (fn, _) in self.data['objects'].items(): @@ -545,3 +548,80 @@ class PythonDomain(Domain): yield (modname, 'module', info[0], 'module-' + modname, 0) for refname, (docname, type) in self.data['objects'].iteritems(): yield (refname, type, docname, refname, 1) + + def has_index_entries(self, name, docnames=None): + if name != 'modindex': + return False + if not docnames: + return bool(self.data['modules']) + else: + for modname, info in self.data['modules'].iteritems(): + if info[0] in docnames: + return True + return False + + def get_index(self, name, docnames=None): + if name != 'modindex': + return None, None + + content = {} + # list of prefixes to ignore + ignores = self.env.config['modindex_common_prefix'] + ignores = sorted(ignores, key=len, reverse=True) + # list of all modules, sorted by module name + modules = sorted(self.data['modules'].iteritems(), + key=lambda x: x[0].lower()) + # sort out collapsable modules + prev_modname = '' + num_toplevels = 0 + current_group = 0 # collapse group + for modname, (docname, synopsis, platforms, deprecated) in modules: + if docnames and docname not in docnames: + continue + + for ignore in ignores: + if modname.startswith(ignore): + modname = modname[len(ignore):] + stripped = ignore + break + else: + stripped = '' + + # we stripped the whole module name? + if not modname: + modname, stripped = stripped, '' + + entries = content.setdefault(modname[0].lower(), []) + + package = modname.split('.')[0] + if package != modname: + # it's a submodule + if prev_modname == package: + # first submodule - make parent a group head + entries[-1][1] = 1 + elif not prev_modname.startswith(package): + # submodule without parent in list, add dummy entry + current_group += 1 + entries.append([stripped + package, 1, current_group, + '', '', '', '', '']) + grouptype = 2 + else: + num_toplevels += 1 + current_group += 1 + grouptype = 0 + + qualifier = deprecated and _('Deprecated') or '' + entries.append([stripped + modname, grouptype, current_group, + docname, 'module-' + stripped + modname, + platforms, qualifier, synopsis]) + prev_modname = modname + + # apply heuristics when to collapse modindex at page load: + # only collapse if number of toplevel modules is larger than + # number of submodules + collapse = len(modules) - num_toplevels < num_toplevels + + # sort by first letter + content = sorted(content.iteritems()) + + return content, collapse |
