From f3e59accad1e8dfe4380506dca3295dcb67fbe6c Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Fri, 13 Nov 2026 07:09:05 -0500 Subject: [PATCH] Model IDML EPUB export tag maps --- crates/idml/src/model/mod.rs | 6 +++--- crates/idml/src/model/resources.rs | 32 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/crates/idml/src/model/mod.rs b/crates/idml/src/model/mod.rs index 7a1d74724..223cdec08 100644 --- a/crates/idml/src/model/mod.rs +++ b/crates/idml/src/model/mod.rs @@ -27,9 +27,9 @@ pub use geometry::{MAX_PATH_POINTS, PathGeometry, PathGeometryError, PathPoint, pub use preferences::TextFramePreferences; pub use resources::{ ColorDefinition, ColorGroup, ColorGroupDefinition, ColorGroupMember, ColorSpace, CompositeFontDefinition, CompositeFontEntryDefinition, - FontDefinition, FontFamilyDefinition, FontsPart, GradientDefinition, GradientStop, GradientStopDefinition, GradientStopValue, GraphicPart, Ink, - InkDefinition, StrokeDefinition, StrokeStyle, StrokeStyleKind, Style, StyleGroup, StyleGroupWriter, StyleKind, StyleNode, Swatch, SwatchKind, - TintDefinition, color_groups, inks, named, preference, stroke_styles, style_groups, swatches, + EpubExportTagMap, FontDefinition, FontFamilyDefinition, FontsPart, GradientDefinition, GradientStop, GradientStopDefinition, GradientStopValue, + GraphicPart, Ink, InkDefinition, StrokeDefinition, StrokeStyle, StrokeStyleKind, Style, StyleGroup, StyleGroupWriter, StyleKind, StyleNode, + Swatch, SwatchKind, TintDefinition, color_groups, inks, named, preference, stroke_styles, style_groups, swatches, }; pub use spread::{ Graphic, GraphicChild, GraphicKind, Guide, ItemChild, ItemKind, Link, MarginPreference, Page, PageChild, PageItem, Spread, SpreadChild, TextPath, diff --git a/crates/idml/src/model/resources.rs b/crates/idml/src/model/resources.rs index cf509becc..2ceb652b3 100644 --- a/crates/idml/src/model/resources.rs +++ b/crates/idml/src/model/resources.rs @@ -140,6 +140,38 @@ pub enum StyleNode { Other(El), } +/// EPUB export tagging stored on a style in IDML. +#[derive(Clone, Debug, Default, PartialEq, Eq)] +pub struct EpubExportTagMap { + pub tag: String, + pub class: String, + pub split_document: bool, +} + +impl EpubExportTagMap { + /// Reads an EPUB `StyleExportTagMap`; other export types are not this record. + pub fn from_el(el: &El) -> Option { + let values = Values::of(el); + (el.local() == "StyleExportTagMap" && values.get("ExportType") == Some("EPUB")).then(|| Self { + tag: values.get("ExportTag").unwrap_or("").to_owned(), + class: values.get("ExportClass").unwrap_or("").to_owned(), + split_document: values.get("SplitDocument") == Some("true"), + }) + } + + /// Writes the EPUB tag map with its caller-assigned IDML `Self` identifier. + pub fn to_el(&self, self_id: &str) -> El { + El::new("StyleExportTagMap") + .with_attr("Self", self_id) + .with_attr("ExportType", "EPUB") + .with_attr("ExportTag", &self.tag) + .with_attr("ExportClass", &self.class) + .with_attr("ExportAttributes", "") + .with_attr("SplitDocument", if self.split_document { "true" } else { "false" }) + .with_attr("EmitCss", "true") + } +} + /// A style, its values as written: `Name`, `Self`, `Properties/BasedOn`, its attributes; and its /// other children (an object style's `TextFramePreference`, effect settings, …). #[derive(Clone, Debug, PartialEq)]