Add a way to mark deprecated modules, and show this information in the module index.

Also, generate a useful "title" attribute for module crossreferences.
This commit is contained in:
Georg Brandl 2007-08-15 18:42:00 +00:00
parent 11cab438b8
commit d302c52646
5 changed files with 37 additions and 18 deletions

View File

@ -393,8 +393,8 @@ class StandaloneHTMLBuilder(Builder):
# the sorted list of all modules, for the global module index # the sorted list of all modules, for the global module index
modules = sorted(((mn, (self.get_relative_uri('modindex.rst', fn) + modules = sorted(((mn, (self.get_relative_uri('modindex.rst', fn) +
'#module-' + mn, sy, pl)) '#module-' + mn, sy, pl, dep))
for (mn, (fn, sy, pl)) in self.env.modules.iteritems()), for (mn, (fn, sy, pl, dep)) in self.env.modules.iteritems()),
key=lambda x: x[0].lower()) key=lambda x: x[0].lower())
# collect all platforms # collect all platforms
platforms = set() platforms = set()
@ -403,11 +403,11 @@ class StandaloneHTMLBuilder(Builder):
pmn = '' pmn = ''
cg = 0 # collapse group cg = 0 # collapse group
fl = '' # first letter fl = '' # first letter
for mn, (fn, sy, pl) in modules: for mn, (fn, sy, pl, dep) in modules:
pl = pl.split(', ') if pl else [] pl = pl.split(', ') if pl else []
platforms.update(pl) platforms.update(pl)
if fl != mn[0].lower() and mn[0] != '_': if fl != mn[0].lower() and mn[0] != '_':
modindexentries.append(['', False, 0, False, mn[0].upper(), '', []]) modindexentries.append(['', False, 0, False, mn[0].upper(), '', [], False])
tn = mn.partition('.')[0] tn = mn.partition('.')[0]
if tn != mn: if tn != mn:
# submodule # submodule
@ -417,10 +417,10 @@ class StandaloneHTMLBuilder(Builder):
elif not pmn.startswith(tn): elif not pmn.startswith(tn):
# submodule without parent in list, add dummy entry # submodule without parent in list, add dummy entry
cg += 1 cg += 1
modindexentries.append([tn, True, cg, False, '', '', []]) modindexentries.append([tn, True, cg, False, '', '', [], False])
else: else:
cg += 1 cg += 1
modindexentries.append([mn, False, cg, (tn != mn), fn, sy, pl]) modindexentries.append([mn, False, cg, (tn != mn), fn, sy, pl, dep])
pmn = mn pmn = mn
fl = mn[0].lower() fl = mn[0].lower()
platforms = sorted(platforms) platforms = sorted(platforms)

View File

@ -472,7 +472,9 @@ def module_directive(name, arguments, options, content, lineno,
env = state.document.settings.env env = state.document.settings.env
modname = arguments[0].strip() modname = arguments[0].strip()
env.currmodule = modname env.currmodule = modname
env.note_module(modname, options.get('synopsis', ''), options.get('platform', '')) env.note_module(modname, options.get('synopsis', ''),
options.get('platform', ''),
'deprecated' in options)
ret = [] ret = []
targetnode = nodes.target('', '', ids=['module-' + modname]) targetnode = nodes.target('', '', ids=['module-' + modname])
state.document.note_explicit_target(targetnode) state.document.note_explicit_target(targetnode)
@ -489,7 +491,8 @@ def module_directive(name, arguments, options, content, lineno,
module_directive.arguments = (1, 0, 0) module_directive.arguments = (1, 0, 0)
module_directive.options = {'platform': lambda x: x, module_directive.options = {'platform': lambda x: x,
'synopsis': lambda x: x} 'synopsis': lambda x: x,
'deprecated': directives.flag}
directives.register_directive('module', module_directive) directives.register_directive('module', module_directive)

View File

@ -52,7 +52,7 @@ default_settings = {
# This is increased every time a new environment attribute is added # This is increased every time a new environment attribute is added
# to properly invalidate pickle files. # to properly invalidate pickle files.
ENV_VERSION = 9 ENV_VERSION = 10
def walk_depth(node, depth, maxdepth): def walk_depth(node, depth, maxdepth):
@ -203,7 +203,7 @@ class BuildEnvironment:
# X-ref target inventory # X-ref target inventory
self.descrefs = {} # fullname -> filename, desctype self.descrefs = {} # fullname -> filename, desctype
self.filemodules = {} # filename -> [modules] self.filemodules = {} # filename -> [modules]
self.modules = {} # modname -> filename, synopsis, platform self.modules = {} # modname -> filename, synopsis, platform, deprecated
self.tokens = {} # tokenname -> filename self.tokens = {} # tokenname -> filename
self.labels = {} # labelname -> filename, labelid self.labels = {} # labelname -> filename, labelid
@ -238,7 +238,7 @@ class BuildEnvironment:
if fn == filename: if fn == filename:
del self.descrefs[fullname] del self.descrefs[fullname]
self.filemodules.pop(filename, None) self.filemodules.pop(filename, None)
for modname, (fn, _, _) in self.modules.items(): for modname, (fn, _, _, _) in self.modules.items():
if fn == filename: if fn == filename:
del self.modules[modname] del self.modules[modname]
for tokenname, fn in self.tokens.items(): for tokenname, fn in self.tokens.items():
@ -490,8 +490,8 @@ class BuildEnvironment:
'in %s and %s' % (self.descrefs[fullname][0], self.filename)) 'in %s and %s' % (self.descrefs[fullname][0], self.filename))
self.descrefs[fullname] = (self.filename, desctype) self.descrefs[fullname] = (self.filename, desctype)
def note_module(self, modname, synopsis, platform): def note_module(self, modname, synopsis, platform, deprecated):
self.modules[modname] = (self.filename, synopsis, platform) self.modules[modname] = (self.filename, synopsis, platform, deprecated)
self.filemodules.setdefault(self.filename, []).append(modname) self.filemodules.setdefault(self.filename, []).append(modname)
def note_token(self, tokenname): def note_token(self, tokenname):
@ -605,7 +605,8 @@ class BuildEnvironment:
docfilename, filename) + '#grammar-token-' + target docfilename, filename) + '#grammar-token-' + target
newnode.append(contnode) newnode.append(contnode)
elif typ == 'mod': elif typ == 'mod':
filename, synopsis, platform = self.modules.get(target, ('','','')) filename, synopsis, platform, deprecated = \
self.modules.get(target, ('','',''))
# just link to an anchor if there are multiple modules in one file # just link to an anchor if there are multiple modules in one file
# because the anchor is generally below the heading which is ugly # because the anchor is generally below the heading which is ugly
# but can't be helped easily # but can't be helped easily
@ -619,6 +620,9 @@ class BuildEnvironment:
newnode = nodes.reference('', '') newnode = nodes.reference('', '')
newnode['refuri'] = ( newnode['refuri'] = (
builder.get_relative_uri(docfilename, filename) + anchor) builder.get_relative_uri(docfilename, filename) + anchor)
newnode['reftitle'] = '%s%s%s' % (
('(%s) ' % platform if platform else ''),
synopsis, (' (deprecated)' if deprecated else ''))
newnode.append(contnode) newnode.append(contnode)
else: else:
searchorder = 1 if node.hasattr('refspecific') else 0 searchorder = 1 if node.hasattr('refspecific') else 0
@ -803,7 +807,7 @@ class BuildEnvironment:
""" """
if keyword in self.modules: if keyword in self.modules:
filename, title, system = self.modules[keyword] filename, title, system, deprecated = self.modules[keyword]
return 'module', filename, 'module-' + keyword return 'module', filename, 'module-' + keyword
if keyword in self.descrefs: if keyword in self.descrefs:
filename, ref_type = self.descrefs[keyword] filename, ref_type = self.descrefs[keyword]
@ -827,7 +831,7 @@ class BuildEnvironment:
s.set_seq2(keyword.lower()) s.set_seq2(keyword.lower())
def possibilities(): def possibilities():
for title, (fn, desc, _) in self.modules.iteritems(): for title, (fn, desc, _, _) in self.modules.iteritems():
yield ('module', fn, 'module-'+title, desc) yield ('module', fn, 'module-'+title, desc)
for title, (fn, desctype) in self.descrefs.iteritems(): for title, (fn, desctype) in self.descrefs.iteritems():
yield (desctype, fn, title, '') yield (desctype, fn, title, '')

View File

@ -25,7 +25,7 @@
{% endif %} {% endif %}
<table width="100%" class="indextable" cellspacing="0" cellpadding="2"> <table width="100%" class="indextable" cellspacing="0" cellpadding="2">
{%- for modname, collapse, cgroup, indent, fname, synops, pform in modindexentries %} {%- for modname, collapse, cgroup, indent, fname, synops, pform, dep in modindexentries %}
{%- if not modname -%} {%- if not modname -%}
<tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr> <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
<tr class="cap"><td></td><td><strong>{{ fname }}</strong></td><td></td></tr> <tr class="cap"><td></td><td><strong>{{ fname }}</strong></td><td></td></tr>
@ -40,7 +40,8 @@
<tt class="xref">{{ modname|e }}</tt> <tt class="xref">{{ modname|e }}</tt>
{%- if fname %}</a>{% endif %} {%- if fname %}</a>{% endif %}
{%- if pform[0] %} <em>({{ pform|join(', ') }})</em>{% endif -%} {%- if pform[0] %} <em>({{ pform|join(', ') }})</em>{% endif -%}
</td><td><em>{{ synops|e }}</em></td></tr> </td><td>{% if dep %}<strong>Deprecated:</strong>{% endif %}
<em>{{ synops|e }}</em></td></tr>
{%- endif -%} {%- endif -%}
{% endfor %} {% endfor %}
</table> </table>

View File

@ -112,6 +112,17 @@ class HTMLTranslator(BaseTranslator):
def depart_versionmodified(self, node): def depart_versionmodified(self, node):
self.body.append('</p>\n') self.body.append('</p>\n')
# overwritten
def visit_reference(self, node):
BaseTranslator.visit_reference(self, node)
if node.hasattr('reftitle'):
# ugly hack to add a title attribute
starttag = self.body[-1]
if not starttag.startswith('<a '):
return
self.body[-1] = '<a title="%s"' % self.attval(node['reftitle']) + \
starttag[2:]
# overwritten -- we don't want source comments to show up in the HTML # overwritten -- we don't want source comments to show up in the HTML
def visit_comment(self, node): def visit_comment(self, node):
raise nodes.SkipNode raise nodes.SkipNode