def _replace_inheritance_diagram(self, doctree): """ replace inheritance diagrams with images Inheritance diagrams are pre-processed and replaced with respective images in the processed documentation set. Typically, the node support from `sphinx.ext.inheritance_diagram` would be added to the builder; however, this extension renders graphs during the translation phase (which is not ideal for how assets are managed in this extension). Instead, this implementation just traverses for inheritance diagrams, generates renderings and replaces the nodes with image nodes (which in turn will be handled by the existing image-based implementation). Note that the interactive image map is not handled in this implementation since Confluence does not support image maps (without external extensions). Args: doctree: the doctree to replace blocks on """ if inheritance_diagram is None: return # graphviz's render_dot call expects a translator to be passed in; mock # a translator tied to our self-builder class MockTranslator: def __init__(self, builder): self.builder = builder mock_translator = MockTranslator(self) for node in doctree.traverse(inheritance_diagram.inheritance_diagram): graph = node['graph'] graph_hash = inheritance_diagram.get_graph_hash(node) name = 'inheritance%s' % graph_hash dotcode = graph.generate_dot(name, {}, env=self.env) try: _, out_filename = render_dot(mock_translator, dotcode, {}, self.graphviz_output_format, 'inheritance') if not out_filename: node.parent.remove(node) continue new_node = nodes.image(candidates={'?'}, uri=out_filename) if 'align' in node: new_node['align'] = node['align'] node.replace_self(new_node) except GraphvizError as exc: ConfluenceLogger.warn('dot code {}: {}'.format(dotcode, exc)) node.parent.remove(node)
def texinfo_visit_mermaid_inheritance(self: TexinfoTranslator, node: inheritance_diagram) -> None: """ Output the graph for Texinfo. This will insert a PNG. """ graph = node["graph"] graph_hash = get_graph_hash(node) name = "inheritance%s" % graph_hash dotcode = graph.generate_dot( name, env=self.builder.env, ) # graph_attrs={'size': '"6.0,6.0"'}) render_mm_texinfo(self, node, dotcode, {}, "inheritance") raise nodes.SkipNode
def html_visit_mermaid_inheritance(self: HTMLTranslator, node: inheritance_diagram) -> None: """ Output the graph for HTML. This will insert a PNG with clickable image map. """ graph = node["graph"] graph_hash = get_graph_hash(node) name = "inheritance%s" % graph_hash # Create a mapping from fully-qualified class names to URLs. mermaid_output_format = self.builder.env.config.mermaid_output_format.upper( ) current_filename = self.builder.current_docname + self.builder.out_suffix urls = {} pending_xrefs = cast(Iterable[addnodes.pending_xref], node) for child in pending_xrefs: if child.get("refuri") is not None: if mermaid_output_format == "SVG": urls[child["reftitle"]] = "../" + child.get("refuri") else: urls[child["reftitle"]] = child.get("refuri") elif child.get("refid") is not None: if mermaid_output_format == "SVG": urls[child["reftitle"]] = ("../" + current_filename + "#" + child.get("refid")) else: urls[child["reftitle"]] = "#" + child.get("refid") dotcode = graph.generate_dot(name, urls, env=self.builder.env) render_mm_html( self, node, dotcode, {}, "inheritance", "inheritance", alt="Inheritance diagram of " + node["content"], ) raise nodes.SkipNode