From 1bddf18b8a004be7cadf3be6643a3ef146ff8bd4 Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Fri, 13 Nov 2026 08:13:47 -0500 Subject: [PATCH] Parse paragraph list and span values in shared IDML model --- crates/idml/src/model/mod.rs | 4 ++-- crates/idml/src/model/resources.rs | 32 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/crates/idml/src/model/mod.rs b/crates/idml/src/model/mod.rs index e49c6ab0f..5a73586af 100644 --- a/crates/idml/src/model/mod.rs +++ b/crates/idml/src/model/mod.rs @@ -30,8 +30,8 @@ pub use resources::{ ColorGroup, ColorGroupDefinition, ColorGroupMember, ColorSpace, CompositeFontDefinition, CompositeFontEntryDefinition, EpubExportTagMap, FontDefinition, FontFamilyDefinition, FontsPart, GradientDefinition, GradientStop, GradientStopDefinition, GradientStopValue, GraphicPart, GrepStyleValue, Ink, InkDefinition, MojikumiRow, NestedLineStyleValue, NestedStyleValue, NestedStyleValues, OpenTypeFeatureValues, - ParagraphAlignmentValues, ParagraphBoxValues, ParagraphFlowValues, ParagraphListValues, RubyValues, StrokeDefinition, StrokeStyle, - StrokeStyleKind, Style, StyleGroup, StyleGroupWriter, StyleKind, StyleNode, Swatch, SwatchKind, TabStopValues, TextDecorationValues, + ParagraphAlignmentValues, ParagraphBoxValues, ParagraphFlowValues, ParagraphListValues, ParagraphSpanValues, RubyValues, StrokeDefinition, + StrokeStyle, StrokeStyleKind, Style, StyleGroup, StyleGroupWriter, StyleKind, StyleNode, Swatch, SwatchKind, TabStopValues, TextDecorationValues, TintDefinition, color_groups, inks, named, preference, stroke_styles, style_groups, swatches, }; pub use spread::{ diff --git a/crates/idml/src/model/resources.rs b/crates/idml/src/model/resources.rs index 4b94e3a48..2459748ce 100644 --- a/crates/idml/src/model/resources.rs +++ b/crates/idml/src/model/resources.rs @@ -14,6 +14,7 @@ fn others(el: &El) -> impl Iterator { /// Raw bullet and numbering properties on an IDML paragraph style or range. #[derive(Clone, Debug, Default, PartialEq)] pub struct ParagraphListValues { + pub applied_list: Option, pub list_type: Option, pub numbering_format: Option, pub expression: Option, @@ -29,6 +30,8 @@ pub struct ParagraphListValues { pub restart_numbers: Option, pub restart_after_level: Option, pub restart_after_specific_level: bool, + pub numbering_continue: Option, + pub numbering_start_at: Option, pub bullet_font: Option, pub bullet_font_style: Option, } @@ -108,6 +111,32 @@ impl CjkParagraphValues { } } +/// Paragraph span and split-column properties read from IDML. +#[derive(Clone, Debug, Default, PartialEq)] +pub struct ParagraphSpanValues { + pub kind: Option, + pub split_column_count: Option, + pub inside_gutter: Option, + pub outside_gutter: Option, + pub space_before: Option, + pub space_after: Option, +} + +impl ParagraphSpanValues { + /// Reads paragraph span and split-column properties from IDML. + pub fn from_el(el: &El) -> Self { + let values = Values::of(el); + Self { + kind: values.prop("SpanColumnType"), + split_column_count: values.prop("SpanSplitColumnCount").and_then(|value| value.trim().parse().ok()), + inside_gutter: values.num("SplitColumnInsideGutter"), + outside_gutter: values.num("SplitColumnOutsideGutter"), + space_before: values.num("SpanColumnMinSpaceBefore"), + space_after: values.num("SpanColumnMinSpaceAfter"), + } + } +} + /// Paragraph alignment, spacing, drop cap, baseline grid and composer values after the caller /// maps application semantics to IDML enumerations. #[derive(Clone, Debug, Default, PartialEq)] @@ -692,6 +721,7 @@ impl ParagraphListValues { let restart_after_specific_level = restart.is_some_and(|policy| policy.attr("RestartPolicy").map(str::trim) == Some("SpecificPreviousLevel")); let bullet = values.prop_el("BulletChar"); Self { + applied_list: values.prop("AppliedNumberingList"), list_type: values.prop("BulletsAndNumberingListType"), numbering_format: values.prop("NumberingFormat"), expression: values.prop("NumberingExpression"), @@ -707,6 +737,8 @@ impl ParagraphListValues { restart_numbers: values.boolean("NumberingApplyRestartPolicy"), restart_after_level, restart_after_specific_level, + numbering_continue: values.boolean("NumberingContinue"), + numbering_start_at: values.num("NumberingStartAt"), bullet_font: values.prop("BulletsFont"), bullet_font_style: values.prop("BulletsFontStyle"), }