diff --git a/sphinxcontrib/yowasp_wavedrom.py b/sphinxcontrib/yowasp_wavedrom.py index 02ec805..bda0ed3 100644 --- a/sphinxcontrib/yowasp_wavedrom.py +++ b/sphinxcontrib/yowasp_wavedrom.py @@ -1,9 +1,10 @@ import re import json -from pathlib import Path +from pathlib import Path, PosixPath from docutils.parsers.rst import Directive from docutils import nodes import sphinx.application +import sphinx.writers.html5 import yowasp_wavedrom @@ -40,7 +41,7 @@ class wavedrom_diagram(nodes.General, nodes.Inline, nodes.Element): pass -def html_visit_wavedrom_diagram(self, node): +def html_visit_wavedrom_diagram(self: sphinx.writers.html5.HTML5Translator, node: wavedrom_diagram): basename: str = node["name"] wavedrom_loc: str = node["loc"] wavedrom_src: dict = node["src"] @@ -65,7 +66,15 @@ def html_visit_wavedrom_diagram(self, node): # significantly different behavior: duplicate IDs result in broken rendering, text can be # selected, media queries can't be overridden with a `color-scheme` CSS attribute for themes # that have a dark/light toggle via JS, etc. - pathname = Path(self.builder.outdir) / self.builder.imagedir / f'{basename}.svg' + pathname = Path(self.builder.outdir).joinpath( + # Note that for documents in subdirectories, the image directory is placed within that + # subdirectory. The other option would be to use enough `../` to locate the top-level + # image directory; using leading `/` in the `` tag isn't feasible since that would + # break on `file:///` URLs. + PosixPath(self.builder.current_docname).parent, + self.builder.imagedir, + f'{basename}.svg' + ) pathname.parent.mkdir(parents=True, exist_ok=True) pathname.write_text(wavedrom_svg) diff --git a/test/index.rst b/test/index.rst index 97e7acb..da592b2 100644 --- a/test/index.rst +++ b/test/index.rst @@ -84,3 +84,10 @@ Circuit diagrams ] ] } + +Subdocument +----------- + +.. toctree:: + + subdir/index diff --git a/test/subdir/index.rst b/test/subdir/index.rst new file mode 100644 index 0000000..b875392 --- /dev/null +++ b/test/subdir/index.rst @@ -0,0 +1,25 @@ +Subdirectory example +-------------------- + +.. + Name intentionally conflicts with the one from a level above. + +.. wavedrom:: skin_default + + { + "signal": [ + {"name": "clk", + "wave": "0P............"}, + {"name": "rd_port.addr", + "wave": "==============", + "data": [0,1,2,3,4,5,6,7,8,9,10,11,0,1], + "node": ".a"}, + {"name": "rd_port.data", + "wave": "==============", + "data": ["H","e","l","l","o"," ","w","o","r","l","d","\\n","H","e"], + "node": ".d"} + ], + "edge": [ + "a-|d" + ] + }