From c575c019793fc9f4b8e68c1ada32b32fef0febae Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Fri, 13 Nov 2026 08:50:22 -0500 Subject: [PATCH] Parse IDML table style assignments in shared model --- crates/idml/src/model/document.rs | 40 +++++++++++++++++++++++++++++++ crates/idml/src/model/mod.rs | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/crates/idml/src/model/document.rs b/crates/idml/src/model/document.rs index bf29c45ed..546d1eed3 100644 --- a/crates/idml/src/model/document.rs +++ b/crates/idml/src/model/document.rs @@ -239,6 +239,46 @@ impl CellStyleValues { } } +/// Parsed table-style assignments that are independent of DesignCraft's style resolution. +#[derive(Clone, Debug, Default, PartialEq)] +pub struct TableStyleValues { + pub name: Option, + pub based_on: Option, + pub header_cell_style: Option, + pub body_cell_style: Option, + pub footer_cell_style: Option, + pub left_column_cell_style: Option, + pub right_column_cell_style: Option, + pub header_same_as_body: Option, + pub footer_same_as_body: Option, + pub left_column_same_as_body: Option, + pub right_column_same_as_body: Option, + pub space_before: Option, + pub space_after: Option, +} + +impl TableStyleValues { + /// Reads table-style regions, inheritance, spacing, and region reuse values. + pub fn from_el(el: &El) -> Self { + let values = Values::of(el); + Self { + name: values.name().map(str::to_owned), + based_on: values.prop("BasedOn"), + header_cell_style: values.get("HeaderRegionCellStyle").map(str::to_owned), + body_cell_style: values.get("BodyRegionCellStyle").map(str::to_owned), + footer_cell_style: values.get("FooterRegionCellStyle").map(str::to_owned), + left_column_cell_style: values.get("LeftColumnRegionCellStyle").map(str::to_owned), + right_column_cell_style: values.get("RightColumnRegionCellStyle").map(str::to_owned), + header_same_as_body: values.boolean("HeaderRegionSameAsBodyRegion"), + footer_same_as_body: values.boolean("FooterRegionSameAsBodyRegion"), + left_column_same_as_body: values.boolean("LeftColumnRegionSameAsBodyRegion"), + right_column_same_as_body: values.boolean("RightColumnRegionSameAsBodyRegion"), + space_before: values.num("SpaceBefore"), + space_after: values.num("SpaceAfter"), + } + } +} + impl NumberingListValues { /// Reads a `NumberingList` element. pub fn from_el(el: &El) -> Self { diff --git a/crates/idml/src/model/mod.rs b/crates/idml/src/model/mod.rs index d473e843c..0846c9aab 100644 --- a/crates/idml/src/model/mod.rs +++ b/crates/idml/src/model/mod.rs @@ -23,7 +23,7 @@ mod story; use craft_xml::{El, Local, Node}; pub use document::{ CellStyleValues, ConditionValues, CrossReferenceBuildingBlock, CrossReferenceFormatValues, EpubSplitValues, ModelDocument, NumberingListValues, - TextDateKind, TextVariableKind, TextVariableValues, TocStyleEntryValues, TocStyleValues, TopLevelKind, TopLevelNode, + TableStyleValues, TextDateKind, TextVariableKind, TextVariableValues, TocStyleEntryValues, TocStyleValues, TopLevelKind, TopLevelNode, }; pub use effects::{DirectionalFeatherValues, DropShadowValues, FeatherValues, GradientFeatherValues, OpacityStopValues, TransparencySetting}; pub use geometry::{MAX_PATH_POINTS, PathGeometry, PathGeometryError, PathPoint, SubPath};