From 8e8ae969d56db3befb1b62be6970127c9319d869 Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Fri, 13 Nov 2026 08:23:29 -0500 Subject: [PATCH] Read IDML document preferences in shared model --- crates/idml/src/model/mod.rs | 2 +- crates/idml/src/model/preferences.rs | 74 ++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/crates/idml/src/model/mod.rs b/crates/idml/src/model/mod.rs index 5a73586af..5ceeef2b5 100644 --- a/crates/idml/src/model/mod.rs +++ b/crates/idml/src/model/mod.rs @@ -24,7 +24,7 @@ use craft_xml::{El, Local, Node}; pub use document::{ModelDocument, TopLevelKind, TopLevelNode}; pub use effects::{DirectionalFeatherValues, DropShadowValues, FeatherValues, GradientFeatherValues, OpacityStopValues, TransparencySetting}; pub use geometry::{MAX_PATH_POINTS, PathGeometry, PathGeometryError, PathPoint, SubPath}; -pub use preferences::TextFramePreferences; +pub use preferences::{DocumentPreferences, GridPreferences, TextFramePreferences}; pub use resources::{ CharacterAppearanceValues, CharacterSpecialValues, CharacterTypographyValues, CjkCharacterValues, CjkParagraphValues, ColorDefinition, ColorGroup, ColorGroupDefinition, ColorGroupMember, ColorSpace, CompositeFontDefinition, CompositeFontEntryDefinition, EpubExportTagMap, diff --git a/crates/idml/src/model/preferences.rs b/crates/idml/src/model/preferences.rs index 608dcb69c..33c7fbc2e 100644 --- a/crates/idml/src/model/preferences.rs +++ b/crates/idml/src/model/preferences.rs @@ -4,6 +4,80 @@ use craft_xml::El; use super::Values; +/// Parsed values from IDML `DocumentPreference` elements. +#[derive(Clone, Debug, Default, PartialEq)] +pub struct DocumentPreferences { + pub overprint_black: Option, + pub page_width: Option, + pub page_height: Option, + pub facing_pages: Option, + pub page_binding: Option, + pub bleed: [Option; 4], + pub slug: [Option; 4], + pub intent: Option, + pub primary_text_frame: Option, + pub column_guides_locked: Option, +} + +impl DocumentPreferences { + /// Reads the document-level page, bleed, slug, and intent values. + pub fn from_el(el: &El) -> Self { + let values = Values::of(el); + Self { + overprint_black: values.get("OverprintBlack").map(|value| value != "false"), + page_width: values.num("PageWidth"), + page_height: values.num("PageHeight"), + facing_pages: values.boolean("FacingPages"), + page_binding: values.prop("PageBinding"), + bleed: [ + values.num("DocumentBleedTopOffset"), + values.num("DocumentBleedBottomOffset"), + values.num("DocumentBleedInsideOrLeftOffset"), + values.num("DocumentBleedOutsideOrRightOffset"), + ], + slug: [ + values.num("SlugTopOffset"), + values.num("SlugBottomOffset"), + values.num("SlugInsideOrLeftOffset"), + values.num("SlugRightOrOutsideOffset"), + ], + intent: values.prop("Intent"), + primary_text_frame: values.boolean("CreatePrimaryTextFrame"), + column_guides_locked: values.boolean("ColumnGuideLocked"), + } + } +} + +/// Parsed document and baseline-grid preference values. +#[derive(Clone, Debug, Default, PartialEq)] +pub struct GridPreferences { + pub baseline_start: Option, + pub baseline_division: Option, + pub baseline_view_threshold: Option, + pub baseline_relative_option: Option, + pub horizontal_division: Option, + pub vertical_division: Option, + pub horizontal_subdivision: Option, + pub grids_in_back: Option, +} + +impl GridPreferences { + /// Reads baseline and document-grid values. + pub fn from_el(el: &El) -> Self { + let values = Values::of(el); + Self { + baseline_start: values.num("BaselineStart"), + baseline_division: values.num("BaselineDivision"), + baseline_view_threshold: values.num("BaselineViewThreshold"), + baseline_relative_option: values.prop("BaselineGridRelativeOption"), + horizontal_division: values.num("HorizontalGridlineDivision"), + vertical_division: values.num("VerticalGridlineDivision"), + horizontal_subdivision: values.num("HorizontalGridSubdivision"), + grids_in_back: values.boolean("GridsInBack"), + } + } +} + /// Parsed `TextFramePreference` values in nearest-to-farthest precedence order. #[derive(Clone, Debug, Default, PartialEq)] pub struct TextFramePreferences {