Fix #2846: `singlehtml` builder does not include figure numbers

This commit is contained in:
Takeshi KOMIYA 2016-08-17 13:29:07 +09:00
parent b69d37375e
commit ed2d55431d
3 changed files with 34 additions and 4 deletions

View File

@ -19,6 +19,7 @@ Bugs fixed
* #1911: ``-D`` option of ``sphinx-build`` does not override the ``extensions`` variable * #1911: ``-D`` option of ``sphinx-build`` does not override the ``extensions`` variable
* #2789: `sphinx.ext.intersphinx` generates wrong hyperlinks if the inventory is given * #2789: `sphinx.ext.intersphinx` generates wrong hyperlinks if the inventory is given
* parsing errors for caption of code-blocks are displayed in document (ref: #2845) * parsing errors for caption of code-blocks are displayed in document (ref: #2845)
* #2846: ``singlehtml`` builder does not include figure numbers
Release 1.4.5 (released Jul 13, 2016) Release 1.4.5 (released Jul 13, 2016)
===================================== =====================================

View File

@ -981,6 +981,26 @@ class SingleFileHTMLBuilder(StandaloneHTMLBuilder):
return {self.config.master_doc: new_secnumbers} return {self.config.master_doc: new_secnumbers}
def assemble_toc_fignumbers(self):
# Assemble toc_fignumbers to resolve figure numbers on SingleHTML.
# Merge all fignumbers to single fignumber.
#
# Note: current Sphinx has refid confliction in singlehtml mode.
# To avoid the problem, it replaces key of secnumbers to
# tuple of docname and refid.
#
# There are related codes in inline_all_toctres() and
# HTMLTranslter#add_fignumber().
new_fignumbers = {}
# {u'foo': {'figure': {'id2': (2,), 'id1': (1,)}}, u'bar': {'figure': {'id1': (3,)}}}
for docname, fignumlist in iteritems(self.env.toc_fignumbers):
for figtype, fignums in iteritems(fignumlist):
new_fignumbers.setdefault((docname, figtype), {})
for id, fignum in iteritems(fignums):
new_fignumbers[(docname, figtype)][id] = fignum
return {self.config.master_doc: new_fignumbers}
def get_doc_context(self, docname, body, metatags): def get_doc_context(self, docname, body, metatags):
# no relation links... # no relation links...
toc = self.env.get_toctree_for(self.config.master_doc, self, False) toc = self.env.get_toctree_for(self.config.master_doc, self, False)
@ -1017,6 +1037,7 @@ class SingleFileHTMLBuilder(StandaloneHTMLBuilder):
self.info(bold('assembling single document... '), nonl=True) self.info(bold('assembling single document... '), nonl=True)
doctree = self.assemble_doctree() doctree = self.assemble_doctree()
self.env.toc_secnumbers = self.assemble_toc_secnumbers() self.env.toc_secnumbers = self.assemble_toc_secnumbers()
self.env.toc_fignumbers = self.assemble_toc_fignumbers()
self.info() self.info()
self.info(bold('writing... '), nonl=True) self.info(bold('writing... '), nonl=True)
self.write_doc_serialized(self.config.master_doc, doctree) self.write_doc_serialized(self.config.master_doc, doctree)
@ -1069,6 +1090,7 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder):
self.config_hash = '' self.config_hash = ''
self.tags_hash = '' self.tags_hash = ''
self.imagedir = '_images' self.imagedir = '_images'
self.current_docname = None
self.theme = None # no theme necessary self.theme = None # no theme necessary
self.templates = None # no template bridge necessary self.templates = None # no template bridge necessary
self.init_translator_class() self.init_translator_class()

View File

@ -69,6 +69,7 @@ class HTMLTranslator(BaseTranslator):
builder.config.highlight_language builder.config.highlight_language
self.highlightopts = builder.config.highlight_options self.highlightopts = builder.config.highlight_options
self.highlightlinenothreshold = sys.maxsize self.highlightlinenothreshold = sys.maxsize
self.docnames = [builder.current_docname] # for singlehtml builder
self.protect_literal_text = 0 self.protect_literal_text = 0
self.permalink_text = builder.config.html_add_permalinks self.permalink_text = builder.config.html_add_permalinks
# support backwards-compatible setting to a bool # support backwards-compatible setting to a bool
@ -82,10 +83,11 @@ class HTMLTranslator(BaseTranslator):
def visit_start_of_file(self, node): def visit_start_of_file(self, node):
# only occurs in the single-file builder # only occurs in the single-file builder
self.docnames.append(node['docname'])
self.body.append('<span id="document-%s"></span>' % node['docname']) self.body.append('<span id="document-%s"></span>' % node['docname'])
def depart_start_of_file(self, node): def depart_start_of_file(self, node):
pass self.docnames.pop()
def visit_desc(self, node): def visit_desc(self, node):
self.body.append(self.starttag(node, 'dl', CLASS=node['objtype'])) self.body.append(self.starttag(node, 'dl', CLASS=node['objtype']))
@ -247,7 +249,7 @@ class HTMLTranslator(BaseTranslator):
self.secnumber_suffix) self.secnumber_suffix)
elif isinstance(node.parent, nodes.section): elif isinstance(node.parent, nodes.section):
if self.builder.name == 'singlehtml': if self.builder.name == 'singlehtml':
docname = node.parent.get('docname') docname = self.docnames[-1]
anchorname = '#' + node.parent['ids'][0] anchorname = '#' + node.parent['ids'][0]
if (docname, anchorname) not in self.builder.secnumbers: if (docname, anchorname) not in self.builder.secnumbers:
anchorname = (docname, '') # try first heading which has no anchor anchorname = (docname, '') # try first heading which has no anchor
@ -264,14 +266,19 @@ class HTMLTranslator(BaseTranslator):
def add_fignumber(self, node): def add_fignumber(self, node):
def append_fignumber(figtype, figure_id): def append_fignumber(figtype, figure_id):
if figure_id in self.builder.fignumbers.get(figtype, {}): if self.builder.name == 'singlehtml':
key = (self.docnames[-1], figtype)
else:
key = figtype
if figure_id in self.builder.fignumbers.get(key, {}):
self.body.append('<span class="caption-number">') self.body.append('<span class="caption-number">')
prefix = self.builder.config.numfig_format.get(figtype) prefix = self.builder.config.numfig_format.get(figtype)
if prefix is None: if prefix is None:
msg = 'numfig_format is not defined for %s' % figtype msg = 'numfig_format is not defined for %s' % figtype
self.builder.warn(msg) self.builder.warn(msg)
else: else:
numbers = self.builder.fignumbers[figtype][figure_id] numbers = self.builder.fignumbers[key][figure_id]
self.body.append(prefix % '.'.join(map(str, numbers)) + ' ') self.body.append(prefix % '.'.join(map(str, numbers)) + ' ')
self.body.append('</span>') self.body.append('</span>')