From 010d293a18e572917d2d0427c54977a57c4770e8 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 24 Sep 2025 08:56:09 -0700 Subject: [PATCH] rust: Move output drivers to drivers module. --- rust/doc/src/spv/index.md | 18 ++++++++---- rust/pspp/src/file.rs | 2 +- rust/pspp/src/output.rs | 9 +----- .../pspp/src/output/{driver.rs => drivers.rs} | 29 ++++++++++++------- rust/pspp/src/output/{ => drivers}/cairo.rs | 2 +- .../src/output/{ => drivers}/cairo/driver.rs | 10 ++++--- .../src/output/{ => drivers}/cairo/fsm.rs | 2 +- .../src/output/{ => drivers}/cairo/pager.rs | 2 +- rust/pspp/src/output/{ => drivers}/csv.rs | 4 +-- rust/pspp/src/output/{ => drivers}/html.rs | 2 +- rust/pspp/src/output/{ => drivers}/json.rs | 2 +- rust/pspp/src/output/{ => drivers}/spv.rs | 28 +++++++++--------- rust/pspp/src/output/{ => drivers}/text.rs | 12 ++++---- .../output/{ => drivers/text}/text_line.rs | 0 rust/pspp/src/output/pivot/tests.rs | 10 ++++--- rust/pspp/src/show.rs | 2 +- rust/pspp/src/show_pc.rs | 2 +- rust/pspp/src/show_por.rs | 2 +- rust/pspp/src/sys/write.rs | 2 +- 19 files changed, 77 insertions(+), 63 deletions(-) rename rust/pspp/src/output/{driver.rs => drivers.rs} (93%) rename rust/pspp/src/output/{ => drivers}/cairo.rs (95%) rename rust/pspp/src/output/{ => drivers}/cairo/driver.rs (96%) rename rust/pspp/src/output/{ => drivers}/cairo/fsm.rs (99%) rename rust/pspp/src/output/{ => drivers}/cairo/pager.rs (99%) rename rust/pspp/src/output/{ => drivers}/csv.rs (98%) rename rust/pspp/src/output/{ => drivers}/html.rs (99%) rename rust/pspp/src/output/{ => drivers}/json.rs (97%) rename rust/pspp/src/output/{ => drivers}/spv.rs (98%) rename rust/pspp/src/output/{ => drivers}/text.rs (99%) rename rust/pspp/src/output/{ => drivers/text}/text_line.rs (100%) diff --git a/rust/doc/src/spv/index.md b/rust/doc/src/spv/index.md index 100a531c41..499d6dbf26 100644 --- a/rust/doc/src/spv/index.md +++ b/rust/doc/src/spv/index.md @@ -42,18 +42,19 @@ table, a heading, a block of text, etc.) or a group of them. The member whose output goes at the beginning of the document is numbered 0, the next member in the output is numbered 1, and so on. -Structure members contain XML. This XML is sometimes self-contained, +[Structure members] contain XML. This XML is sometimes self-contained, but it often references detail members in the Zip archive, which are named as follows: * `PREFIX_table.xml` and `PREFIX_tableData.bin` `PREFIX_lightTableData.bin` The structure of a table plus its data. Older SPV files pair a - `PREFIX_table.xml` file that describes the table's structure with a - binary `PREFIX_tableData.bin` file that gives its data. Newer SPV - files (the majority of those in the corpus) instead include a - single `PREFIX_lightTableData.bin` file that incorporates both into - a single binary format. + `PREFIX_table.xml` [legacy detail XML member] that describes the + table's structure with a `PREFIX_tableData.bin` [legacy detail + binary member] that gives its data. Newer SPV files (the majority + of those in the corpus) instead include a single + `PREFIX_lightTableData.bin` [light detail binary member] that + incorporates both into a single binary format. * `PREFIX_warning.xml` and `PREFIX_warningData.bin` `PREFIX_lightWarningData.bin` @@ -88,3 +89,8 @@ their exact names do not matter to readers as long as they are unique. SPSS tolerates corrupted Zip archives that Zip reader libraries tend to reject. These can be fixed up with `zip -FF`. + +[Structure members]: structure.md +[legacy detail XML member]: legacy-detail-xml.md +[legacy detail binary member]: legacy-detail-binary.md +[light detail binary member]: light-detail.md diff --git a/rust/pspp/src/file.rs b/rust/pspp/src/file.rs index 7c9cf4fe52..bc9bb85ec4 100644 --- a/rust/pspp/src/file.rs +++ b/rust/pspp/src/file.rs @@ -42,7 +42,7 @@ pub enum FileType { /// An SPSS PC+ data file. Pc, - /// An [SPSS Viewer file](crate::output::spv). + /// An [SPSS Viewer file](crate::output::drivers::spv). Viewer { /// Whether the file is encrypted. encrypted: bool, diff --git a/rust/pspp/src/output.rs b/rust/pspp/src/output.rs index c1e061ed9b..23f2435d36 100644 --- a/rust/pspp/src/output.rs +++ b/rust/pspp/src/output.rs @@ -31,18 +31,11 @@ use crate::{ use self::pivot::Value; -pub mod cairo; -pub mod csv; -pub mod driver; -pub mod html; -pub mod json; +pub mod drivers; pub mod page; pub mod pivot; pub mod render; -pub mod spv; pub mod table; -pub mod text; -pub mod text_line; /// A single output item. #[derive(Serialize)] diff --git a/rust/pspp/src/output/driver.rs b/rust/pspp/src/output/drivers.rs similarity index 93% rename from rust/pspp/src/output/driver.rs rename to rust/pspp/src/output/drivers.rs index 6015ed8284..9c03cd3561 100644 --- a/rust/pspp/src/output/driver.rs +++ b/rust/pspp/src/output/drivers.rs @@ -19,17 +19,26 @@ use std::{borrow::Cow, path::Path, sync::Arc}; use clap::ValueEnum; use serde::{Deserialize, Serialize}; -use crate::output::{ - cairo::{CairoConfig, CairoDriver}, - csv::{CsvConfig, CsvDriver}, - html::{HtmlConfig, HtmlDriver}, - json::{JsonConfig, JsonDriver}, - spv::{SpvConfig, SpvDriver}, - text::{TextConfig, TextDriver}, -}; - use super::{Item, page::PageSetup}; +pub mod cairo; +use cairo::{CairoConfig, CairoDriver}; + +pub mod csv; +use csv::{CsvConfig, CsvDriver}; + +pub mod html; +use html::{HtmlConfig, HtmlDriver}; + +pub mod json; +use json::{JsonConfig, JsonDriver}; + +pub mod spv; +use spv::{SpvConfig, SpvDriver}; + +pub mod text; +use text::{TextConfig, TextDriver}; + // An output driver. pub trait Driver { fn name(&self) -> Cow<'static, str>; @@ -142,7 +151,7 @@ impl dyn Driver { mod tests { use serde::Serialize; - use crate::output::driver::Config; + use crate::output::drivers::Config; #[test] fn toml() { diff --git a/rust/pspp/src/output/cairo.rs b/rust/pspp/src/output/drivers/cairo.rs similarity index 95% rename from rust/pspp/src/output/cairo.rs rename to rust/pspp/src/output/drivers/cairo.rs index 260e5c3e2c..71d15df078 100644 --- a/rust/pspp/src/output/cairo.rs +++ b/rust/pspp/src/output/drivers/cairo.rs @@ -43,7 +43,7 @@ fn horz_align_to_pango(horz_align: HorzAlign) -> pango::Alignment { #[cfg(test)] mod tests { - use crate::output::cairo::{CairoConfig, CairoDriver}; + use crate::output::drivers::cairo::{CairoConfig, CairoDriver}; #[test] fn create() { diff --git a/rust/pspp/src/output/cairo/driver.rs b/rust/pspp/src/output/drivers/cairo/driver.rs similarity index 96% rename from rust/pspp/src/output/cairo/driver.rs rename to rust/pspp/src/output/drivers/cairo/driver.rs index e239298110..2bfd4be85e 100644 --- a/rust/pspp/src/output/cairo/driver.rs +++ b/rust/pspp/src/output/drivers/cairo/driver.rs @@ -27,11 +27,13 @@ use serde::{Deserialize, Serialize}; use crate::output::{ Item, - cairo::{ - fsm::{CairoFsmStyle, parse_font_style}, - pager::{CairoPageStyle, CairoPager}, + drivers::{ + Driver, + cairo::{ + fsm::{CairoFsmStyle, parse_font_style}, + pager::{CairoPageStyle, CairoPager}, + }, }, - driver::Driver, page::PageSetup, pivot::{Color, Coord2, FontStyle}, }; diff --git a/rust/pspp/src/output/cairo/fsm.rs b/rust/pspp/src/output/drivers/cairo/fsm.rs similarity index 99% rename from rust/pspp/src/output/cairo/fsm.rs rename to rust/pspp/src/output/drivers/cairo/fsm.rs index 13597f30a0..d4bbb01aca 100644 --- a/rust/pspp/src/output/cairo/fsm.rs +++ b/rust/pspp/src/output/drivers/cairo/fsm.rs @@ -26,7 +26,7 @@ use pango::{ use pangocairo::functions::show_layout; use smallvec::{SmallVec, smallvec}; -use crate::output::cairo::{horz_align_to_pango, px_to_xr, xr_to_pt}; +use crate::output::drivers::cairo::{horz_align_to_pango, px_to_xr, xr_to_pt}; use crate::output::pivot::{Axis2, BorderStyle, Coord2, FontStyle, HorzAlign, Rect2, Stroke}; use crate::output::render::{Device, Extreme, Pager, Params}; use crate::output::table::DrawCell; diff --git a/rust/pspp/src/output/cairo/pager.rs b/rust/pspp/src/output/drivers/cairo/pager.rs similarity index 99% rename from rust/pspp/src/output/cairo/pager.rs rename to rust/pspp/src/output/drivers/cairo/pager.rs index 6106eb6a0e..3bc05f0503 100644 --- a/rust/pspp/src/output/cairo/pager.rs +++ b/rust/pspp/src/output/drivers/cairo/pager.rs @@ -22,7 +22,7 @@ use pango::{FontDescription, Layout}; use crate::output::{ Item, ItemCursor, - cairo::{ + drivers::cairo::{ fsm::{CairoFsm, CairoFsmStyle}, horz_align_to_pango, xr_to_pt, }, diff --git a/rust/pspp/src/output/csv.rs b/rust/pspp/src/output/drivers/csv.rs similarity index 98% rename from rust/pspp/src/output/csv.rs rename to rust/pspp/src/output/drivers/csv.rs index 0eded20bdb..1a48eeaa30 100644 --- a/rust/pspp/src/output/csv.rs +++ b/rust/pspp/src/output/drivers/csv.rs @@ -28,9 +28,9 @@ use serde::{ de::{Unexpected, Visitor}, }; -use crate::output::pivot::Coord2; +use crate::output::{Item, drivers::Driver, pivot::Coord2}; -use super::{Details, Item, TextType, driver::Driver, pivot::PivotTable, table::Table}; +use crate::output::{Details, TextType, pivot::PivotTable, table::Table}; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct CsvConfig { diff --git a/rust/pspp/src/output/html.rs b/rust/pspp/src/output/drivers/html.rs similarity index 99% rename from rust/pspp/src/output/html.rs rename to rust/pspp/src/output/drivers/html.rs index 949724b9af..2c5f0aebcc 100644 --- a/rust/pspp/src/output/html.rs +++ b/rust/pspp/src/output/drivers/html.rs @@ -28,7 +28,7 @@ use smallstr::SmallString; use crate::output::{ Details, Item, - driver::Driver, + drivers::Driver, pivot::{Axis2, BorderStyle, Color, Coord2, HorzAlign, PivotTable, Rect2, Stroke, VertAlign}, table::{DrawCell, Table}, }; diff --git a/rust/pspp/src/output/json.rs b/rust/pspp/src/output/drivers/json.rs similarity index 97% rename from rust/pspp/src/output/json.rs rename to rust/pspp/src/output/drivers/json.rs index c7f52bd5e7..8288bdde37 100644 --- a/rust/pspp/src/output/json.rs +++ b/rust/pspp/src/output/drivers/json.rs @@ -24,7 +24,7 @@ use std::{ use serde::{Deserialize, Serialize}; -use super::{Item, driver::Driver}; +use super::{Driver, Item}; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct JsonConfig { diff --git a/rust/pspp/src/output/spv.rs b/rust/pspp/src/output/drivers/spv.rs similarity index 98% rename from rust/pspp/src/output/spv.rs rename to rust/pspp/src/output/drivers/spv.rs index 9f7290f1b3..58c40f6282 100644 --- a/rust/pspp/src/output/spv.rs +++ b/rust/pspp/src/output/drivers/spv.rs @@ -38,9 +38,9 @@ use zip::{ZipWriter, result::ZipResult, write::SimpleFileOptions}; use crate::{ format::{Format, Type}, output::{ - Item, Text, - driver::Driver, - page::{Heading, PageSetup}, + Details, Item, Text, + drivers::Driver, + page::{ChartSize, Heading, PageSetup}, pivot::{ Area, AreaStyle, Axis2, Axis3, Border, BorderStyle, BoxBorder, Category, CellStyle, Color, Dimension, FontStyle, Footnote, FootnoteMarkerPosition, FootnoteMarkerType, @@ -189,9 +189,9 @@ where X: Write, { match &item.details { - super::Details::Chart => todo!(), - super::Details::Image => todo!(), - super::Details::Group(children) => { + Details::Chart => todo!(), + Details::Image => todo!(), + Details::Group(children) => { let mut attributes = Vec::::new(); if let Some(command_name) = &item.command_name { attributes.push(("commandName", command_name.as_str()).into()); @@ -212,14 +212,14 @@ where }) .unwrap(); } - super::Details::Message(diagnostic) => { + Details::Message(diagnostic) => { self.write_text(item, &Text::from(diagnostic.as_ref()), structure) } - super::Details::PageBreak => { + Details::PageBreak => { self.needs_page_break = true; } - super::Details::Table(pivot_table) => self.write_table(item, pivot_table, structure), - super::Details::Text(text) => self.write_text(item, text, structure), + Details::Table(pivot_table) => self.write_table(item, pivot_table, structure), + Details::Text(text) => self.write_text(item, text, structure), } } @@ -602,10 +602,10 @@ where .with_attribute(( "chart-size", match page_setup.chart_size { - super::page::ChartSize::AsIs => "as-is", - super::page::ChartSize::FullHeight => "full-height", - super::page::ChartSize::HalfHeight => "half-height", - super::page::ChartSize::QuarterHeight => "quarter-height", + ChartSize::AsIs => "as-is", + ChartSize::FullHeight => "full-height", + ChartSize::HalfHeight => "half-height", + ChartSize::QuarterHeight => "quarter-height", }, )) .with_attribute(("margin-left", inches(page_setup.margins[Axis2::X][0]))) diff --git a/rust/pspp/src/output/text.rs b/rust/pspp/src/output/drivers/text.rs similarity index 99% rename from rust/pspp/src/output/text.rs rename to rust/pspp/src/output/drivers/text.rs index 990f1fae7a..8ad1c477e4 100644 --- a/rust/pspp/src/output/text.rs +++ b/rust/pspp/src/output/drivers/text.rs @@ -29,17 +29,19 @@ use serde::{Deserialize, Serialize}; use unicode_linebreak::{BreakOpportunity, linebreaks}; use unicode_width::UnicodeWidthStr; -use crate::output::{render::Extreme, table::DrawCell, text_line::Emphasis}; +use crate::output::{render::Extreme, table::DrawCell}; -use super::{ +use crate::output::{ Details, Item, - driver::Driver, + drivers::Driver, pivot::{Axis2, BorderStyle, Coord2, HorzAlign, PivotTable, Rect2, Stroke}, render::{Device, Pager, Params}, table::Content, - text_line::{TextLine, clip_text}, }; +mod text_line; +use text_line::{Emphasis, TextLine, clip_text}; + #[derive(Clone, Debug, Default, Deserialize, Serialize)] #[serde(rename_all = "snake_case")] pub enum Boxes { @@ -655,7 +657,7 @@ impl Device for TextRenderer { mod tests { use unicode_width::{UnicodeWidthChar, UnicodeWidthStr}; - use crate::output::text::new_line_breaks; + use crate::output::drivers::text::new_line_breaks; #[test] fn unicode_width() { diff --git a/rust/pspp/src/output/text_line.rs b/rust/pspp/src/output/drivers/text/text_line.rs similarity index 100% rename from rust/pspp/src/output/text_line.rs rename to rust/pspp/src/output/drivers/text/text_line.rs diff --git a/rust/pspp/src/output/pivot/tests.rs b/rust/pspp/src/output/pivot/tests.rs index 27c3f1975d..d54e865a95 100644 --- a/rust/pspp/src/output/pivot/tests.rs +++ b/rust/pspp/src/output/pivot/tests.rs @@ -20,15 +20,17 @@ use enum_map::EnumMap; use crate::output::{ Details, Item, - cairo::{CairoConfig, CairoDriver}, - driver::Driver, - html::HtmlDriver, + drivers::{ + Driver, + cairo::{CairoConfig, CairoDriver}, + html::HtmlDriver, + spv::SpvDriver, + }, pivot::{ Area, Axis2, Border, BorderStyle, Class, Color, Dimension, Footnote, FootnoteMarkerPosition, FootnoteMarkerType, Footnotes, Group, HeadingRegion, LabelPosition, Look, PivotTable, RowColBorder, Stroke, }, - spv::SpvDriver, }; use super::{Axis3, Value}; diff --git a/rust/pspp/src/show.rs b/rust/pspp/src/show.rs index 2a866c5d47..494d322e27 100644 --- a/rust/pspp/src/show.rs +++ b/rust/pspp/src/show.rs @@ -22,7 +22,7 @@ use pspp::{ data::cases_to_output, output::{ Details, Item, Text, - driver::{Config, Driver}, + drivers::{Config, Driver}, pivot::PivotTable, }, sys::{ diff --git a/rust/pspp/src/show_pc.rs b/rust/pspp/src/show_pc.rs index 385f8770be..a6dea1286a 100644 --- a/rust/pspp/src/show_pc.rs +++ b/rust/pspp/src/show_pc.rs @@ -20,7 +20,7 @@ use pspp::{ data::cases_to_output, output::{ Details, Item, Text, - driver::{Config, Driver}, + drivers::{Config, Driver}, pivot::PivotTable, }, pc::PcFile, diff --git a/rust/pspp/src/show_por.rs b/rust/pspp/src/show_por.rs index d0ba365eca..f3e6ca6369 100644 --- a/rust/pspp/src/show_por.rs +++ b/rust/pspp/src/show_por.rs @@ -20,7 +20,7 @@ use pspp::{ data::cases_to_output, output::{ Details, Item, Text, - driver::{Config, Driver}, + drivers::{Config, Driver}, pivot::PivotTable, }, por::PortableFile, diff --git a/rust/pspp/src/sys/write.rs b/rust/pspp/src/sys/write.rs index 741a9dd423..350f7d0720 100644 --- a/rust/pspp/src/sys/write.rs +++ b/rust/pspp/src/sys/write.rs @@ -37,7 +37,7 @@ use crate::{ dictionary::{CategoryLabels, Dictionary, MultipleResponseType}, format::{DisplayPlain, Format}, identifier::Identifier, - output::spv::Zeros, + output::drivers::spv::Zeros, sys::{ ProductVersion, encoding::codepage_from_encoding, -- 2.30.2