aboutsummaryrefslogtreecommitdiff
path: root/server/tools/src/diagram_dot.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-10-05 23:42:35 +0200
committermetamuffin <metamuffin@disroot.org>2025-10-05 23:42:39 +0200
commit6d7e8fda46be9d531551670cd66de2161e5dbeb5 (patch)
tree89ca36fa656a63272b50a56308c4940f41b0405f /server/tools/src/diagram_dot.rs
parent1ff014de21c6f37399c222ac16cd5ae9b4bce219 (diff)
downloadhurrycurry-6d7e8fda46be9d531551670cd66de2161e5dbeb5.tar
hurrycurry-6d7e8fda46be9d531551670cd66de2161e5dbeb5.tar.bz2
hurrycurry-6d7e8fda46be9d531551670cd66de2161e5dbeb5.tar.zst
diagram native svg output
Diffstat (limited to 'server/tools/src/diagram_dot.rs')
-rw-r--r--server/tools/src/diagram_dot.rs31
1 files changed, 27 insertions, 4 deletions
diff --git a/server/tools/src/diagram_dot.rs b/server/tools/src/diagram_dot.rs
index 2c953987..b3e54881 100644
--- a/server/tools/src/diagram_dot.rs
+++ b/server/tools/src/diagram_dot.rs
@@ -16,19 +16,42 @@
*/
-use anyhow::Result;
+use anyhow::{Result, bail};
use hurrycurry_protocol::{
Gamedata, Message,
book::{Diagram, NodeStyle},
};
-use std::fmt::Write;
+use std::{
+ fmt::Write,
+ io::Write as W2,
+ process::{Command, Stdio},
+};
+
+pub fn diagram_dot_svg(data: &Gamedata, diagram: &Diagram) -> Result<String> {
+ let mut child = Command::new("dot")
+ .arg("-Tsvg")
+ .arg("-Knop2")
+ .stdin(Stdio::piped())
+ .stdout(Stdio::piped())
+ .spawn()?;
-pub fn diagram_dot(data: &Gamedata, diagram: &Diagram) -> Result<String> {
+ let dot = diagram_dot(data, diagram, true)?;
+ child.stdin.as_mut().unwrap().write_all(dot.as_bytes())?;
+ let output = child.wait_with_output()?;
+ if !output.status.success() {
+ bail!("dot failed");
+ }
+ Ok(String::from_utf8(output.stdout)?)
+}
+
+pub fn diagram_dot(data: &Gamedata, diagram: &Diagram, use_position: bool) -> Result<String> {
let mut out = String::new();
writeln!(out, "digraph {{")?;
for (i, n) in diagram.nodes.iter().enumerate() {
let mut attrs = Vec::new();
-
+ if use_position {
+ attrs.push(format!("pos=\"{},{}!\"", n.position.x, n.position.y));
+ }
node_style(&mut attrs, &n.style);
match &n.label {
Message::Text(text) => {