diff options
author | metamuffin <metamuffin@disroot.org> | 2025-10-05 23:42:35 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-10-05 23:42:39 +0200 |
commit | 6d7e8fda46be9d531551670cd66de2161e5dbeb5 (patch) | |
tree | 89ca36fa656a63272b50a56308c4940f41b0405f /server/tools/src/diagram_dot.rs | |
parent | 1ff014de21c6f37399c222ac16cd5ae9b4bce219 (diff) | |
download | hurrycurry-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.rs | 31 |
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) => { |