From 6d7e8fda46be9d531551670cd66de2161e5dbeb5 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 5 Oct 2025 23:42:35 +0200 Subject: diagram native svg output --- server/tools/src/diagram_dot.rs | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'server/tools/src/diagram_dot.rs') 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 { + 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 { + 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 { 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) => { -- cgit v1.2.3-70-g09d2