diff options
Diffstat (limited to 'sphinx/writers/html.py')
-rw-r--r-- | sphinx/writers/html.py | 143 |
1 files changed, 106 insertions, 37 deletions
diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py index c69c2e09..836464a3 100644 --- a/sphinx/writers/html.py +++ b/sphinx/writers/html.py @@ -14,6 +14,7 @@ import posixpath import os import copy +from six import string_types from docutils import nodes from docutils.writers.html4css1 import Writer, HTMLTranslator as BaseTranslator @@ -70,11 +71,11 @@ class HTMLTranslator(BaseTranslator): self.no_smarty = 0 self.builder = builder self.highlightlang = builder.config.highlight_language - self.highlightlinenothreshold = sys.maxint + self.highlightlinenothreshold = sys.maxsize self.protect_literal_text = 0 self.permalink_text = builder.config.html_add_permalinks # support backwards-compatible setting to a bool - if not isinstance(self.permalink_text, basestring): + if not isinstance(self.permalink_text, string_types): self.permalink_text = self.permalink_text and u'\u00B6' or '' self.permalink_text = self.encode(self.permalink_text) self.secnumber_suffix = builder.config.html_secnumber_suffix @@ -101,18 +102,13 @@ class HTMLTranslator(BaseTranslator): and node['ids'] and node['first']: self.body.append('<!--[%s]-->' % node['ids'][0]) def depart_desc_signature(self, node): - if node['ids'] and self.permalink_text and self.builder.add_permalinks: - self.body.append(u'<a class="headerlink" href="#%s" ' - % node['ids'][0] + - u'title="%s">%s</a>' % ( - _('Permalink to this definition'), - self.permalink_text)) + self.add_permalink_ref(node, 'definition') self.body.append('</dt>\n') def visit_desc_addname(self, node): - self.body.append(self.starttag(node, 'tt', '', CLASS='descclassname')) + self.body.append(self.starttag(node, 'code', '', CLASS='descclassname')) def depart_desc_addname(self, node): - self.body.append('</tt>') + self.body.append('</code>') def visit_desc_type(self, node): pass @@ -125,12 +121,12 @@ class HTMLTranslator(BaseTranslator): pass def visit_desc_name(self, node): - self.body.append(self.starttag(node, 'tt', '', CLASS='descname')) + self.body.append(self.starttag(node, 'code', '', CLASS='descname')) def depart_desc_name(self, node): - self.body.append('</tt>') + self.body.append('</code>') def visit_desc_parameterlist(self, node): - self.body.append('<big>(</big>') + self.body.append('<span class="sig-paren">(</span>') self.first_param = 1 self.optional_param_level = 0 # How many required parameters are left. @@ -138,7 +134,7 @@ class HTMLTranslator(BaseTranslator): for c in node.children]) self.param_separator = node.child_text_separator def depart_desc_parameterlist(self, node): - self.body.append('<big>)</big>') + self.body.append('<span class="sig-paren">)</span>') # If required parameters are still to come, then put the comma after # the parameter. Otherwise, put the comma before. This ensures that @@ -211,6 +207,12 @@ class HTMLTranslator(BaseTranslator): self.body.append(('%s' + self.secnumber_suffix) % '.'.join(map(str, node['secnumber']))) + def visit_number_reference(self, node): + self.visit_reference(node) + + def depart_number_reference(self, node): + self.depart_reference(node) + # overwritten -- we don't want source comments to show up in the HTML def visit_comment(self, node): raise nodes.SkipNode @@ -233,14 +235,44 @@ class HTMLTranslator(BaseTranslator): self.body.append('.'.join(map(str, node['secnumber'])) + self.secnumber_suffix) elif isinstance(node.parent, nodes.section): - anchorname = '#' + node.parent['ids'][0] - if anchorname not in self.builder.secnumbers: - anchorname = '' # try first heading which has no anchor + if self.builder.name == 'singlehtml': + docname = node.parent.get('docname') + anchorname = '#' + node.parent['ids'][0] + if (docname, anchorname) not in self.builder.secnumbers: + anchorname = (docname, '') # try first heading which has no anchor + else: + anchorname = (docname, anchorname) + else: + anchorname = '#' + node.parent['ids'][0] + if anchorname not in self.builder.secnumbers: + anchorname = '' # try first heading which has no anchor if self.builder.secnumbers.get(anchorname): numbers = self.builder.secnumbers[anchorname] self.body.append('.'.join(map(str, numbers)) + self.secnumber_suffix) + def add_fignumber(self, node): + def append_fignumber(figtype, figure_id): + if figure_id in self.builder.fignumbers.get(figtype, {}): + self.body.append('<span class="caption-number">') + prefix = self.builder.config.numfig_prefix.get(figtype, '') + numbers = self.builder.fignumbers[figtype][figure_id] + self.body.append(prefix % '.'.join(map(str, numbers)) + ' ') + self.body.append('</span>') + + if isinstance(node.parent, nodes.figure): + append_fignumber('figure', node.parent['ids'][0]) + elif isinstance(node.parent, nodes.table): + append_fignumber('table', node.parent['ids'][0]) + elif isinstance(node.parent, nodes.container): + append_fignumber('code-block', node.parent['ids'][0]) + + def add_permalink_ref(self, node, typename): + if node['ids'] and self.permalink_text and self.builder.add_permalinks: + title = _('Permalink to this %s' % typename) + format = u'<a class="headerlink" href="#%s" title="%s">%s</a>' + self.body.append(format % (node['ids'][0], title, self.permalink_text)) + # overwritten to avoid emitting empty <ul></ul> def visit_bullet_list(self, node): if len(node) == 1 and node[0].tagname == 'toctree': @@ -251,6 +283,9 @@ class HTMLTranslator(BaseTranslator): def visit_title(self, node): BaseTranslator.visit_title(self, node) self.add_secnumber(node) + self.add_fignumber(node) + if isinstance(node.parent, nodes.table): + self.body.append('<span class="caption-text">') # overwritten def visit_literal_block(self, node): @@ -261,11 +296,11 @@ class HTMLTranslator(BaseTranslator): linenos = node.rawsource.count('\n') >= \ self.highlightlinenothreshold - 1 highlight_args = node.get('highlight_args', {}) - if node.has_key('language'): + if 'language' in node: # code-block directives lang = node['language'] highlight_args['force'] = True - if node.has_key('linenos'): + if 'linenos' in node: linenos = node['linenos'] def warner(msg): self.builder.warn(msg, (self.builder.current_docname, node.line)) @@ -277,6 +312,28 @@ class HTMLTranslator(BaseTranslator): self.body.append(starttag + highlighted + '</div>\n') raise nodes.SkipNode + def visit_caption(self, node): + if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'): + self.body.append('<div class="code-block-caption">') + else: + BaseTranslator.visit_caption(self, node) + self.add_fignumber(node) + self.body.append(self.starttag(node, 'span', '', CLASS='caption-text')) + + def depart_caption(self, node): + self.body.append('</span>') + + # append permalink if available + if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'): + self.add_permalink_ref(node.parent, 'code') + elif isinstance(node.parent, nodes.figure): + self.add_permalink_ref(node.parent, 'image') + + if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'): + self.body.append('</div>\n') + else: + BaseTranslator.depart_caption(self, node) + def visit_doctest_block(self, node): self.visit_literal_block(node) @@ -288,12 +345,12 @@ class HTMLTranslator(BaseTranslator): # overwritten def visit_literal(self, node): - self.body.append(self.starttag(node, 'tt', '', + self.body.append(self.starttag(node, 'code', '', CLASS='docutils literal')) self.protect_literal_text += 1 def depart_literal(self, node): self.protect_literal_text -= 1 - self.body.append('</tt>') + self.body.append('</code>') def visit_productionlist(self, node): self.body.append(self.starttag(node, 'pre')) @@ -371,13 +428,13 @@ class HTMLTranslator(BaseTranslator): if node['uri'].lower().endswith('svg') or \ node['uri'].lower().endswith('svgz'): atts = {'src': node['uri']} - if node.has_key('width'): + if 'width' in node: atts['width'] = node['width'] - if node.has_key('height'): + if 'height' in node: atts['height'] = node['height'] - if node.has_key('alt'): + if 'alt' in node: atts['alt'] = node['alt'] - if node.has_key('align'): + if 'align' in node: self.body.append('<div align="%s" class="align-%s">' % (node['align'], node['align'])) self.context.append('</div>\n') @@ -386,21 +443,21 @@ class HTMLTranslator(BaseTranslator): self.body.append(self.emptytag(node, 'img', '', **atts)) return - if node.has_key('scale'): + if 'scale' in node: # Try to figure out image height and width. Docutils does that too, # but it tries the final file name, which does not necessarily exist # yet at the time the HTML file is written. - if Image and not (node.has_key('width') - and node.has_key('height')): + if Image and not ('width' in node + and 'height' in node): try: im = Image.open(os.path.join(self.builder.srcdir, olduri)) except (IOError, # Source image can't be found or opened UnicodeError): # PIL doesn't like Unicode paths. pass else: - if not node.has_key('width'): + if 'width' not in node: node['width'] = str(im.size[0]) - if not node.has_key('height'): + if 'height' not in node: node['height'] = str(im.size[1]) try: im.fp.close() @@ -518,6 +575,11 @@ class HTMLTranslator(BaseTranslator): def depart_literal_emphasis(self, node): return self.depart_emphasis(node) + def visit_literal_strong(self, node): + return self.visit_strong(node) + def depart_literal_strong(self, node): + return self.depart_strong(node) + def visit_abbreviation(self, node): attrs = {} if node.hasattr('explanation'): @@ -533,20 +595,19 @@ class HTMLTranslator(BaseTranslator): def depart_title(self, node): close_tag = self.context[-1] if (self.permalink_text and self.builder.add_permalinks and - node.parent.hasattr('ids') and node.parent['ids']): - aname = node.parent['ids'][0] + node.parent.hasattr('ids') and node.parent['ids']): # add permalink anchor if close_tag.startswith('</h'): - self.body.append(u'<a class="headerlink" href="#%s" ' % aname + - u'title="%s">%s</a>' % ( - _('Permalink to this headline'), - self.permalink_text)) + self.add_permalink_ref(node.parent, 'headline') elif close_tag.startswith('</a></h'): self.body.append(u'</a><a class="headerlink" href="#%s" ' % - aname + + node.parent['ids'][0] + u'title="%s">%s' % ( _('Permalink to this headline'), self.permalink_text)) + elif isinstance(node.parent, nodes.table): + self.body.append('</span>') + self.add_permalink_ref(node.parent, 'table') BaseTranslator.depart_title(self, node) @@ -628,6 +689,14 @@ class SmartyPantsHTMLTranslator(HTMLTranslator): self.depart_emphasis(node) self.no_smarty -= 1 + def visit_literal_strong(self, node): + self.no_smarty += 1 + self.visit_strong(node) + + def depart_literal_strong(self, node): + self.depart_strong(node) + self.no_smarty -= 1 + def visit_desc_signature(self, node): self.no_smarty += 1 HTMLTranslator.visit_desc_signature(self, node) |