diff --git a/sphinxcontrib/mermaid.py b/sphinxcontrib/mermaid.py
index ccec878..798e7c6 100644
--- a/sphinxcontrib/mermaid.py
+++ b/sphinxcontrib/mermaid.py
@@ -411,6 +411,10 @@ def install_js(
context: dict,
doctree: nodes.document | None,
) -> None:
+ # Skip when not emitting raw Mermaid diagrams which need rendering
+ if app.config.mermaid_output_format != "raw":
+ return
+
# Skip for pages without Mermaid diagrams
if doctree and not doctree.next_node(mermaid):
return
@@ -432,53 +436,52 @@ def install_js(
)
app.add_js_file(None, body=app.config.mermaid_init_js, priority=priority)
- if app.config.mermaid_output_format == "raw":
- if app.config.mermaid_d3_zoom:
+ if app.config.mermaid_d3_zoom:
+ _d3_js_url = "https://unpkg.com/d3/dist/d3.min.js"
+ _d3_js_script = """
+ window.addEventListener("load", function () {
+ var svgs = d3.selectAll(".mermaid svg");
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("" + svg.html() + "");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ });
+ """
+ app.add_js_file(_d3_js_url, priority=app.config.mermaid_js_priority)
+ app.add_js_file(None, body=_d3_js_script, priority=app.config.mermaid_js_priority)
+ elif doctree:
+ mermaid_nodes = doctree.findall(mermaid)
+ _d3_selector = ""
+ for mermaid_node in mermaid_nodes:
+ if "zoom_id" in mermaid_node:
+ _zoom_id = mermaid_node["zoom_id"]
+ if _d3_selector == "":
+ _d3_selector += f".mermaid#{_zoom_id} svg"
+ else:
+ _d3_selector += f", .mermaid#{_zoom_id} svg"
+ if _d3_selector != "":
_d3_js_url = "https://unpkg.com/d3/dist/d3.min.js"
- _d3_js_script = """
- window.addEventListener("load", function () {
- var svgs = d3.selectAll(".mermaid svg");
- svgs.each(function() {
+ _d3_js_script = f"""
+ window.addEventListener("load", function () {{
+ var svgs = d3.selectAll("{_d3_selector}");
+ svgs.each(function() {{
var svg = d3.select(this);
svg.html("" + svg.html() + "");
var inner = svg.select("g");
- var zoom = d3.zoom().on("zoom", function(event) {
+ var zoom = d3.zoom().on("zoom", function(event) {{
inner.attr("transform", event.transform);
- });
+ }});
svg.call(zoom);
- });
- });
+ }});
+ }});
"""
app.add_js_file(_d3_js_url, priority=app.config.mermaid_js_priority)
app.add_js_file(None, body=_d3_js_script, priority=app.config.mermaid_js_priority)
- elif doctree:
- mermaid_nodes = doctree.findall(mermaid)
- _d3_selector = ""
- for mermaid_node in mermaid_nodes:
- if "zoom_id" in mermaid_node:
- _zoom_id = mermaid_node["zoom_id"]
- if _d3_selector == "":
- _d3_selector += f".mermaid#{_zoom_id} svg"
- else:
- _d3_selector += f", .mermaid#{_zoom_id} svg"
- if _d3_selector != "":
- _d3_js_url = "https://unpkg.com/d3/dist/d3.min.js"
- _d3_js_script = f"""
- window.addEventListener("load", function () {{
- var svgs = d3.selectAll("{_d3_selector}");
- svgs.each(function() {{
- var svg = d3.select(this);
- svg.html("" + svg.html() + "");
- var inner = svg.select("g");
- var zoom = d3.zoom().on("zoom", function(event) {{
- inner.attr("transform", event.transform);
- }});
- svg.call(zoom);
- }});
- }});
- """
- app.add_js_file(_d3_js_url, priority=app.config.mermaid_js_priority)
- app.add_js_file(None, body=_d3_js_script, priority=app.config.mermaid_js_priority)
def setup(app):