some tables parse
authorBen Pfaff <blp@cs.stanford.edu>
Fri, 17 Oct 2025 23:13:42 +0000 (16:13 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Fri, 17 Oct 2025 23:13:42 +0000 (16:13 -0700)
rust/doc/src/spv/legacy-detail-xml.md
rust/pspp/src/output/spv.rs
rust/pspp/src/output/spv/legacy.rs

index cdbcc4af1c6cfb09b7bdeb4be37e87e79ed98949..8d5edf3f87184d310fd38edc5b746ba4292396ab 100644 (file)
@@ -69,7 +69,7 @@ simpleSort :method[sort_method]=(custom) => categoryOrder
 
 categoryOrder => TEXT
 
-container :style=ref style => container_extension? location+ labelFrame*
+container :style=ref style => container_extension? location* labelFrame*
 
 extension[container_extension] :combinedFootnotes=(true) => EMPTY
 
index 292d91926e845298dc90e38ecf4f7e480901b85b..a20ca1eabc0f99eb5a5aeb7526521dc7fef47581 100644 (file)
@@ -428,6 +428,7 @@ impl Table {
                     Ok(result) => result,
                     Err(error) => panic!("{error:?}"),
                 };
+                dbg!(_visualization);
                 Ok(PivotTable::new([]).into_item())
             }
         }
index 7763db5cbdef8519c2fd4823c1754686e8706566..f6fab20c67912359a120e28cc74c87bab1c0bf72 100644 (file)
@@ -56,8 +56,8 @@ pub struct Visualization {
 
     extension: Option<VisualizationExtension>,
     user_source: UserSource,
-    /*#[serde(rename = "$value")]
-    variables: Vec<Variable>,*/
+    #[serde(rename = "$value")]
+    variables: Vec<Variable>,
     categorical_domain: Option<CategoricalDomain>,
     graph: Graph,
     #[serde(default, rename = "labelFrame")]
@@ -114,6 +114,8 @@ struct DerivedVariable {
     /// An expression that defines the variable's value.
     #[serde(rename = "@value")]
     value: String,
+    #[serde(default, rename = "extension")]
+    extensions: Vec<VariableExtension>,
     format: Option<Format>,
     string_format: Option<StringFormat>,
     #[serde(default, rename = "valueMapEntry")]
@@ -130,6 +132,9 @@ struct VariableExtension {
 #[derive(Deserialize, Debug)]
 #[serde(rename_all = "camelCase")]
 struct UserSource {
+    #[serde(rename = "@id")]
+    id: String,
+
     #[serde(rename = "@missing")]
     missing: Option<Missing>,
 }
@@ -254,6 +259,7 @@ struct Format {
     try_strings_as_numbers: Option<bool>,
     #[serde(rename = "@negativesOutside")]
     negatives_outside: Option<bool>,
+    #[serde(default)]
     relabel: Vec<Relabel>,
     #[serde(default, rename = "affix")]
     affixes: Vec<Affix>,
@@ -475,6 +481,9 @@ struct ValueMapEntry {
 #[derive(Deserialize, Debug)]
 #[serde(rename_all = "camelCase")]
 struct Style {
+    #[serde(rename = "@id")]
+    id: Option<String>,
+
     /// The text color or, in some cases, background color.
     #[serde(rename = "@color")]
     color: Option<Color>,
@@ -679,6 +688,9 @@ enum Method {
 #[derive(Deserialize, Debug)]
 #[serde(rename_all = "camelCase")]
 struct Faceting {
+    #[serde(rename = "@id")]
+    id: Option<String>,
+
     #[serde(default)]
     layers1: Vec<Layer>,
     cross: Cross,
@@ -699,10 +711,14 @@ enum CrossChild {
     /// No dimensions along this axis.
     Unity,
     /// Dimensions along this axis.
-    Nest, /*(
-              /// From innermost to outermost.
-              Vec<VariableReference>,
-          )*/
+    Nest(Nest),
+}
+
+#[derive(Deserialize, Debug)]
+#[serde(rename_all = "camelCase")]
+struct Nest {
+    #[serde(rename = "variableReference")]
+    variable_references: Vec<VariableReference>,
 }
 
 #[derive(Deserialize, Debug)]
@@ -726,12 +742,10 @@ struct Layer {
 struct FacetLayout {
     table_layout: TableLayout,
     #[serde(default)]
+    #[serde(rename = "setCellProperties")]
     scp1: Vec<SetCellProperties>,
     #[serde(rename = "facetLevel")]
     facet_levels: Vec<FacetLevel>,
-    #[serde(default)]
-    #[serde(rename = "setCellProperties")]
-    scp2: Vec<SetCellProperties>,
 }
 
 #[derive(Deserialize, Debug)]
@@ -747,6 +761,9 @@ struct TableLayout {
 #[derive(Deserialize, Debug)]
 #[serde(rename_all = "camelCase")]
 struct SetCellProperties {
+    #[serde(rename = "@id")]
+    id: Option<String>,
+
     #[serde(rename = "@applyToConverse")]
     apply_to_converse: Option<bool>,
 
@@ -867,6 +884,9 @@ struct SetFrameStyle {
 #[derive(Deserialize, Debug)]
 #[serde(rename_all = "camelCase")]
 struct Interval {
+    #[serde(rename = "@id")]
+    id: Option<String>,
+
     #[serde(rename = "@style")]
     style: Ref<Style>,
 
@@ -941,6 +961,9 @@ struct FootnoteMapping {
 #[derive(Deserialize, Debug)]
 #[serde(rename_all = "camelCase")]
 struct FacetLevel {
+    #[serde(rename = "@id")]
+    id: Option<String>,
+
     #[serde(rename = "@level")]
     level: usize,
 
@@ -962,6 +985,9 @@ struct Axis {
 #[derive(Deserialize, Debug)]
 #[serde(rename_all = "camelCase")]
 struct MajorTicks {
+    #[serde(rename = "@id")]
+    id: String,
+
     #[serde(rename = "@labelAngle")]
     label_angle: f64,
 
@@ -1081,10 +1107,15 @@ enum Name {
 #[derive(Deserialize, Debug)]
 #[serde(rename_all = "camelCase")]
 struct LabelFrame {
+    #[serde(rename = "@id")]
+    id: Option<String>,
+
     #[serde(rename = "@style")]
     style: Ref<Style>,
+
     #[serde(rename = "location")]
     locations: Vec<Location>,
+
     label: Option<Label>,
     paragraph: Option<Paragraph>,
 }
@@ -1101,7 +1132,9 @@ struct Container {
 
     #[serde(default, rename = "extension")]
     extensions: Option<ContainerExtension>,
+    #[serde(default)]
     locations: Vec<Location>,
+    #[serde(default)]
     label_frames: Vec<LabelFrame>,
 }