From 6d4924ebafb3e9ce1bae3579e1e0876106ed1e05 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 6 May 2026 07:46:38 -0700 Subject: [PATCH] work on styles --- rust/pspp/build.rs | 48 ++-- rust/pspp/src/spv/read/graph.rs | 280 +------------------- rust/pspp/src/spv/read/graph/style.rs | 310 +++++++++++++++++++++++ rust/pspp/src/spv/read/graph/symbols.rs | 185 ++++++++++++-- rust/pspp/src/spv/read/graph/symbols.svg | 112 +++----- 5 files changed, 551 insertions(+), 384 deletions(-) create mode 100644 rust/pspp/src/spv/read/graph/style.rs diff --git a/rust/pspp/build.rs b/rust/pspp/build.rs index 09f2e017ef..964684f4c8 100644 --- a/rust/pspp/build.rs +++ b/rust/pspp/build.rs @@ -16,7 +16,7 @@ use anyhow::{Result as AnyResult, anyhow}; use enum_map::{Enum, EnumMap}; -use quick_xml::{Writer, events::Event}; +use quick_xml::events::Event; use serde::{Deserialize, Deserializer}; use serde_json::{Value, from_value}; use std::{ @@ -25,7 +25,7 @@ use std::{ ffi::OsStr, fmt::{Display, Write as _}, fs::{File, read_to_string}, - io::{Cursor, Error as IoError, Write}, + io::{Error as IoError, Write}, path::{Path, PathBuf}, }; use zip::ZipArchive; @@ -744,6 +744,13 @@ pub static PATTERNS: [Pattern; 30] = [" /// Read `src/spv/read/graph/symbols.svg` and write /// `src/spv/read/graph/symbols/data.rs`. fn build_symbols() -> AnyResult<()> { + fn title_case(s: &str) -> String { + let mut iter = s.chars(); + let first = iter.next().unwrap().to_ascii_uppercase(); + let rest = iter.as_str(); + format!("{first}{rest}") + } + let input_file = Path::new(env!("CARGO_MANIFEST_DIR")).join("src/spv/read/graph/symbols.svg"); println!("cargo:rerun-if-changed={}", input_file.display()); let input = read_to_string(&input_file) @@ -763,7 +770,7 @@ fn build_symbols() -> AnyResult<()> { in_defs = true; } else if in_defs && local_name.as_ref() == b"g" { let span = reader.read_to_end(start.to_end().name()).unwrap(); - let content = &input[span.start as usize..span.end as usize]; + let content = input[span.start as usize..span.end as usize].trim_matches('\n'); let mut attributes = start .attributes() .map(|attribute| { @@ -780,13 +787,20 @@ fn build_symbols() -> AnyResult<()> { "false" => false, _ => unreachable!(), }; - symbols.push((name.clone(), hollow, content)); + let kind = attributes.remove("kind").unwrap_or_default(); + let sides = attributes + .remove("sides") + .map(|sides| sides.parse::().unwrap()); + symbols.push((name.clone(), hollow, kind.clone(), sides, content)); if !hollow { - let mut iter = name.chars(); - let first = iter.next().unwrap().to_ascii_uppercase(); - let rest = iter.as_str(); - symbols.push((format!("hollow{first}{rest}"), true, content)); + symbols.push(( + format!("hollow{}", title_case(&name)), + true, + kind, + sides, + content, + )); } } } @@ -803,27 +817,25 @@ fn build_symbols() -> AnyResult<()> { let mut output = String::new(); writeln!( &mut output, - "use super::Symbol; + "use super::{{Symbol, SymbolKind}}; pub static SYMBOLS: [Symbol; {}] = [", symbols.len() ) .unwrap(); - for (name, hollow, content) in &symbols { - let mut writer = Writer::new(Cursor::new(Vec::new())); - writer - .create_element("g") - .with_attribute(("id", name.as_str())) - .write_inner_content(|w| w.get_mut().write_all(content.as_bytes())) - .unwrap(); - let definition = String::from_utf8(writer.into_inner().into_inner()).unwrap(); + for (name, hollow, kind, sides, content) in &symbols { + let kind = if kind == "" { + format!("SymbolKind::Fixed({content:?})") + } else { + format!("SymbolKind::{}({})", title_case(&kind), sides.unwrap()) + }; writeln!( &mut output, " Symbol {{ name: {name:?}, hollow: {hollow:?}, - definition: {definition:?}, + kind: {kind}, }}," ) .unwrap(); diff --git a/rust/pspp/src/spv/read/graph.rs b/rust/pspp/src/spv/read/graph.rs index 7dd2adb179..fd2c73746e 100644 --- a/rust/pspp/src/spv/read/graph.rs +++ b/rust/pspp/src/spv/read/graph.rs @@ -57,16 +57,14 @@ use crate::{ output::{ SpvGraphMembers, SpvInfo, SpvMembers, drivers::cairo::xr_to_pt, - pivot::{ - Axis2, Axis3, Length, ParseLengthError, - look::{Color, VertAlign}, - }, + pivot::{Axis2, Axis3, Length, ParseLengthError, look::Color}, }, spv::{ legacy_bin::{DataSeries, DataSource, DataSources, LegacyBin, LegacyBinWarning}, read::graph::{ format::Formatter, frames::{Component, Frames, Position}, + style::{Style, StyleCycle}, }, }, }; @@ -74,6 +72,7 @@ use crate::{ mod format; mod frames; mod patterns; +mod style; mod symbols; #[derive(Debug)] @@ -2392,279 +2391,6 @@ struct ValueMapEntry { to: String, } -#[derive(Clone, Deserialize, Debug)] -#[serde(rename_all = "camelCase")] -struct StyleCycle { - #[serde(default, rename = "cycle")] - cycles: Vec, -} - -#[derive(Clone, Deserialize, Debug)] -#[serde(rename_all = "camelCase")] -struct Cycle { - #[serde(default, rename = "style")] - styles: Vec