diff --git a/CHANGES b/CHANGES index e7cf04313..de1cb32ed 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,7 @@ Bugs fixed * #1911: ``-D`` option of ``sphinx-build`` does not override the ``extensions`` variable * #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) +* #2846: ``singlehtml`` builder does not include figure numbers Release 1.4.5 (released Jul 13, 2016) ===================================== diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py index f541daa1a..e19da2271 100644 --- a/sphinx/builders/html.py +++ b/sphinx/builders/html.py @@ -981,6 +981,26 @@ class SingleFileHTMLBuilder(StandaloneHTMLBuilder): 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): # no relation links... 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) doctree = self.assemble_doctree() self.env.toc_secnumbers = self.assemble_toc_secnumbers() + self.env.toc_fignumbers = self.assemble_toc_fignumbers() self.info() self.info(bold('writing... '), nonl=True) self.write_doc_serialized(self.config.master_doc, doctree) @@ -1069,6 +1090,7 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder): self.config_hash = '' self.tags_hash = '' self.imagedir = '_images' + self.current_docname = None self.theme = None # no theme necessary self.templates = None # no template bridge necessary self.init_translator_class() diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py index 5dbe56597..6a30d4c3a 100644 --- a/sphinx/writers/html.py +++ b/sphinx/writers/html.py @@ -69,6 +69,7 @@ class HTMLTranslator(BaseTranslator): builder.config.highlight_language self.highlightopts = builder.config.highlight_options self.highlightlinenothreshold = sys.maxsize + self.docnames = [builder.current_docname] # for singlehtml builder self.protect_literal_text = 0 self.permalink_text = builder.config.html_add_permalinks # support backwards-compatible setting to a bool @@ -82,10 +83,11 @@ class HTMLTranslator(BaseTranslator): def visit_start_of_file(self, node): # only occurs in the single-file builder + self.docnames.append(node['docname']) self.body.append('' % node['docname']) def depart_start_of_file(self, node): - pass + self.docnames.pop() def visit_desc(self, node): self.body.append(self.starttag(node, 'dl', CLASS=node['objtype'])) @@ -247,7 +249,7 @@ class HTMLTranslator(BaseTranslator): self.secnumber_suffix) elif isinstance(node.parent, nodes.section): if self.builder.name == 'singlehtml': - docname = node.parent.get('docname') + docname = self.docnames[-1] anchorname = '#' + node.parent['ids'][0] if (docname, anchorname) not in self.builder.secnumbers: anchorname = (docname, '') # try first heading which has no anchor @@ -264,14 +266,19 @@ class HTMLTranslator(BaseTranslator): def add_fignumber(self, node): 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('') prefix = self.builder.config.numfig_format.get(figtype) if prefix is None: msg = 'numfig_format is not defined for %s' % figtype self.builder.warn(msg) 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('')