From 00f16cee6b8a64a61f68fa3760435600360f4bf5 Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Fri, 13 Nov 2026 05:51:07 -0500 Subject: [PATCH] Read IDML alternating table values through shared model --- Cargo.lock | 58 ++++++++++++++++---------------- Cargo.toml | 4 +-- crates/idml/src/import/styles.rs | 40 +++++++++++----------- 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a0453b1c8..91cc0a757 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1242,20 +1242,20 @@ dependencies = [ [[package]] name = "craft-idml" version = "0.1.0" -source = "git+https://github.com/storytold/craft-libs?rev=eed3c28cf016723d004d6f2c79c61424c15d4558#eed3c28cf016723d004d6f2c79c61424c15d4558" +source = "git+https://github.com/storytold/craft-libs?rev=cda7d1338#cda7d13387abb9cbefab887fb57dd4910bfff70c" dependencies = [ - "craft-xml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=eed3c28cf016723d004d6f2c79c61424c15d4558)", - "craft-zip 0.1.0 (git+https://github.com/storytold/craft-libs?rev=eed3c28cf016723d004d6f2c79c61424c15d4558)", + "craft-xml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=cda7d1338)", + "craft-zip 0.1.0 (git+https://github.com/storytold/craft-libs?rev=cda7d1338)", "thiserror 2.0.21", ] [[package]] name = "craft-idml" version = "0.1.0" -source = "git+https://github.com/storytold/craft-libs?rev=fb5824a22#fb5824a2295d564af0fe578cf869d6509b4474b6" +source = "git+https://github.com/storytold/craft-libs?rev=eed3c28cf016723d004d6f2c79c61424c15d4558#eed3c28cf016723d004d6f2c79c61424c15d4558" dependencies = [ - "craft-xml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=fb5824a22)", - "craft-zip 0.1.0 (git+https://github.com/storytold/craft-libs?rev=fb5824a22)", + "craft-xml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=eed3c28cf016723d004d6f2c79c61424c15d4558)", + "craft-zip 0.1.0 (git+https://github.com/storytold/craft-libs?rev=eed3c28cf016723d004d6f2c79c61424c15d4558)", "thiserror 2.0.21", ] @@ -1680,6 +1680,15 @@ dependencies = [ "thiserror 2.0.21", ] +[[package]] +name = "craft-xml" +version = "0.1.0" +source = "git+https://github.com/storytold/craft-libs?rev=cda7d1338#cda7d13387abb9cbefab887fb57dd4910bfff70c" +dependencies = [ + "quick-xml 0.41.0", + "thiserror 2.0.21", +] + [[package]] name = "craft-xml" version = "0.1.0" @@ -1708,15 +1717,6 @@ dependencies = [ "thiserror 2.0.21", ] -[[package]] -name = "craft-xml" -version = "0.1.0" -source = "git+https://github.com/storytold/craft-libs?rev=fb5824a22#fb5824a2295d564af0fe578cf869d6509b4474b6" -dependencies = [ - "quick-xml 0.41.0", - "thiserror 2.0.21", -] - [[package]] name = "craft-zip" version = "0.1.0" @@ -1747,6 +1747,16 @@ dependencies = [ "zip 9.1.1", ] +[[package]] +name = "craft-zip" +version = "0.1.0" +source = "git+https://github.com/storytold/craft-libs?rev=cda7d1338#cda7d13387abb9cbefab887fb57dd4910bfff70c" +dependencies = [ + "flate2", + "thiserror 2.0.21", + "zip 9.1.1", +] + [[package]] name = "craft-zip" version = "0.1.0" @@ -1767,16 +1777,6 @@ dependencies = [ "zip 9.1.1", ] -[[package]] -name = "craft-zip" -version = "0.1.0" -source = "git+https://github.com/storytold/craft-libs?rev=fb5824a22#fb5824a2295d564af0fe578cf869d6509b4474b6" -dependencies = [ - "flate2", - "thiserror 2.0.21", - "zip 9.1.1", -] - [[package]] name = "crc32fast" version = "1.5.3" @@ -2021,8 +2021,8 @@ dependencies = [ "craft-prepress", "craft-print", "craft-svg 0.1.0 (git+https://github.com/storytold/craft-libs?rev=cc23ffd4d26f3074808e2187d332564817624f8f)", + "craft-xml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=cda7d1338)", "craft-xml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=f23b0f33f0d00b157476533a43cbbcfd901aa1f1)", - "craft-xml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=fb5824a22)", "designcraft-color", "designcraft-compose", "designcraft-doc", @@ -2103,9 +2103,9 @@ name = "designcraft-idml" version = "0.20.1" dependencies = [ "craft-file-formats", - "craft-idml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=fb5824a22)", + "craft-idml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=cda7d1338)", "craft-svg 0.1.0 (git+https://github.com/storytold/craft-libs?rev=cc23ffd4d26f3074808e2187d332564817624f8f)", - "craft-xml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=fb5824a22)", + "craft-xml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=cda7d1338)", "designcraft-color", "designcraft-compose", "designcraft-doc", @@ -2222,7 +2222,7 @@ version = "0.20.1" dependencies = [ "craft-docx", "craft-file-formats", - "craft-idml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=fb5824a22)", + "craft-idml 0.1.0 (git+https://github.com/storytold/craft-libs?rev=cda7d1338)", "craft-rtf", "craft-wordmodel", "craft-xlsx", diff --git a/Cargo.toml b/Cargo.toml index db8c28eae..f18f54311 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,10 +16,10 @@ craft-pdf = { git = "https://github.com/storytold/craft-libs", rev = "4052591363 craft-designcraft-format = { git = "https://github.com/storytold/craft-libs", rev = "19692b6190465671e41967c75d0cd4c439d0c84c", version = "=0.1.0" } craft-eps = { git = "https://github.com/storytold/craft-libs", rev = "ba24fe2435adb3c81ad6057faf36365fbba736cf", version = "=0.1.0" } craft-epub = { git = "https://github.com/storytold/craft-libs", rev = "ba24fe2435adb3c81ad6057faf36365fbba736cf", version = "=0.1.0" } -craft-idml = { git = "https://github.com/storytold/craft-libs", rev = "fb5824a22", version = "=0.1.0" } +craft-idml = { git = "https://github.com/storytold/craft-libs", rev = "cda7d1338", version = "=0.1.0" } craft-indd = { git = "https://github.com/storytold/craft-libs", rev = "47bf5650b0d503b97bfb5e841746c4957897d11f", version = "=0.1.0" } craft-svg = { git = "https://github.com/storytold/craft-libs", rev = "cc23ffd4d26f3074808e2187d332564817624f8f", version = "=0.1.0", features = ["tree-render", "tree-text"] } -craft-xml = { git = "https://github.com/storytold/craft-libs", rev = "fb5824a22", version = "=0.1.0" } +craft-xml = { git = "https://github.com/storytold/craft-libs", rev = "cda7d1338", version = "=0.1.0" } craft-xml-dtd = { package = "craft-xml", git = "https://github.com/storytold/craft-libs", rev = "f23b0f33f0d00b157476533a43cbbcfd901aa1f1", version = "=0.1.0" } craft-rtf = { git = "https://github.com/storytold/craft-libs", rev = "ba24fe2435adb3c81ad6057faf36365fbba736cf", version = "=0.1.0" } craft-xlsx = { git = "https://github.com/storytold/craft-libs", rev = "ba24fe2435adb3c81ad6057faf36365fbba736cf", version = "=0.1.0" } diff --git a/crates/idml/src/import/styles.rs b/crates/idml/src/import/styles.rs index 3faa8115e..72a1d0ef8 100644 --- a/crates/idml/src/import/styles.rs +++ b/crates/idml/src/import/styles.rs @@ -355,6 +355,10 @@ impl<'r> Importer<'r> { pub(super) fn cell_stroke_attrs(&mut self, el: &El, prefix: &str) -> designcraft_doc::CellStrokeAttrs { let values = craft_idml::model::Values::of(&crate::xml::to_craft(el)).stroke_values(prefix); + self.map_stroke_values(values) + } + + fn map_stroke_values(&mut self, values: craft_idml::model::StrokeValues) -> designcraft_doc::CellStrokeAttrs { designcraft_doc::CellStrokeAttrs { weight: values.weight, color: values.color.map(|v| self.swatch_ref(&v)), @@ -366,34 +370,30 @@ impl<'r> Importer<'r> { } pub(super) fn alt_fill_attrs(&mut self, el: &El, kind: &str) -> designcraft_doc::AltFillsAttrs { + let values = craft_idml::model::Values::of(&crate::xml::to_craft(el)).alternating_fill_values(kind); designcraft_doc::AltFillsAttrs { - first: el.num(&format!("Start{kind}FillCount")).map(|v| v.max(0.0) as u32), - first_color: el.prop(&format!("Start{kind}FillColor")).map(|v| self.swatch_ref(&v)), - first_tint: tint(el.num(&format!("Start{kind}FillTint"))), - next: el.num(&format!("End{kind}FillCount")).map(|v| v.max(0.0) as u32), - next_color: el.prop(&format!("End{kind}FillColor")).map(|v| self.swatch_ref(&v)), - next_tint: tint(el.num(&format!("End{kind}FillTint"))), - skip_first: el.num(&format!("SkipFirstAlternatingFill{kind}s")).map(|v| v.max(0.0) as u32), - skip_last: el.num(&format!("SkipLastAlternatingFill{kind}s")).map(|v| v.max(0.0) as u32), + first: values.first_count.map(|v| v as u32), + first_color: values.first_color.map(|v| self.swatch_ref(&v)), + first_tint: tint(values.first_tint), + next: values.next_count.map(|v| v as u32), + next_color: values.next_color.map(|v| self.swatch_ref(&v)), + next_tint: tint(values.next_tint), + skip_first: values.skip_first.map(|v| v as u32), + skip_last: values.skip_last.map(|v| v as u32), } } pub(super) fn alt_stroke_attrs(&mut self, el: &El, kind: &str) -> designcraft_doc::AltStrokesAttrs { - let first_stroke = self.cell_stroke_attrs(el, &format!("Start{kind}")); - let mut next_stroke = self.cell_stroke_attrs(el, &format!("End{kind}")); - // IDML uses LineStyle for this one attribute (rather than StrokeType). - if kind == "Column" - && let Some(value) = el.prop("EndColumnLineStyle") - { - next_stroke.kind = Some(names::stroke_type_in(&value)); - } + let values = craft_idml::model::Values::of(&crate::xml::to_craft(el)).alternating_stroke_values(kind); + let first_stroke = self.map_stroke_values(values.first); + let next_stroke = self.map_stroke_values(values.next); designcraft_doc::AltStrokesAttrs { - first: el.num(&format!("Start{kind}StrokeCount")).map(|v| v.max(0.0) as u32), - next: el.num(&format!("End{kind}StrokeCount")).map(|v| v.max(0.0) as u32), + first: values.first_count.map(|v| v as u32), + next: values.next_count.map(|v| v as u32), first_stroke, next_stroke, - skip_first: el.num(&format!("SkipFirstAlternatingStroke{kind}s")).map(|v| v.max(0.0) as u32), - skip_last: el.num(&format!("SkipLastAlternatingStroke{kind}s")).map(|v| v.max(0.0) as u32), + skip_first: values.skip_first.map(|v| v as u32), + skip_last: values.skip_last.map(|v| v as u32), } } }