sphinx-d2lang/sphinxcontrib/d2lang/d2lang.py

60 lines
1.9 KiB
Python
Raw Normal View History

2023-12-10 08:07:10 +01:00
from docutils import nodes
2023-12-11 11:31:13 +01:00
from docutils.parsers.rst import Directive, directives
from sphinx.util.docutils import SphinxDirective
2023-12-10 08:07:10 +01:00
2023-12-10 09:04:28 +01:00
from shutil import which
from pathlib import Path
2023-12-10 09:03:13 +01:00
import shlex
2023-12-10 09:05:27 +01:00
import subprocess
2023-12-10 21:49:39 +01:00
import tempfile
2023-12-11 11:46:48 +01:00
import uuid
2023-12-10 09:03:13 +01:00
2023-12-11 11:31:13 +01:00
class D2langDirective(SphinxDirective):
required_arguments = 0
2023-12-10 09:03:13 +01:00
has_content = True
2023-12-11 11:31:13 +01:00
optional_arguments = 3
option_spec = {
'layout': directives.unchanged_required,
'filename': directives.unchanged_required,
}
2023-12-09 23:11:43 +01:00
def run(self):
2023-12-10 21:49:39 +01:00
d2_bin = which('d2')
2023-12-10 21:41:35 +01:00
srcdir = self.state.document.settings.env.srcdir
2023-12-10 09:03:13 +01:00
diag_source = self.content
2023-12-11 11:31:13 +01:00
if 'filename' in self.options:
output_fname = self.options.get('filename')
else:
2023-12-11 11:49:40 +01:00
output_fname = "d2lang_svg/" + str(uuid.uuid4()) + ".svg"
if 'layout' in self.options:
2023-12-11 11:31:13 +01:00
layout = self.options.get('layout')
else:
layout = 'dagre'
if self.arguments:
2023-12-11 11:55:45 +01:00
path = Path(srcdir + '/' + self.arguments[0])
if path.is_file():
2023-12-11 12:03:04 +01:00
build_svg(
srcdir + '/' + self.arguments[0],
srcdir,
output_fname,
layout
)
else:
raise
2023-12-11 11:31:13 +01:00
else:
with tempfile.NamedTemporaryFile() as fp:
for line in self.content.data:
fp.write(bytes(line,'utf-8'))
fp.write(bytes('\n','utf-8'))
fp.seek(0)
build_svg(fp.name, srcdir, output_fname, layout)
image_node = nodes.image(uri=output_fname)
2023-12-10 21:32:38 +01:00
return [image_node]
2023-12-11 11:31:13 +01:00
2023-12-11 11:31:55 +01:00
def build_svg(diag_src, out_dir, filename, layout):
2023-12-11 11:31:13 +01:00
d2_bin = which('d2')
cmd_line = '%s -l %s %s %s' % (d2_bin, layout, diag_src, out_dir + "/" + filename)
args = shlex.split(cmd_line)
subprocess.run(args)
return True