Merge pull request #1712

# Conflicts:
#	crates/pptx/tests/it/roundtrip.rs
This commit is contained in:
Brandon Thomas
2026-11-03 08:53:00 -05:00
4 changed files with 39 additions and 2 deletions
+3 -1
View File
@@ -467,6 +467,7 @@ pub struct RunProps {
pub soft_edge: Option<f64>,
/// Spelling/grammar errors are not flagged.
pub no_proof: Option<bool>,
pub normalize_height: Option<bool>,
}
fn bounded_language<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
@@ -508,7 +509,8 @@ impl RunProps {
glow,
reflection,
soft_edge,
no_proof
no_proof,
normalize_height
);
}
}
+1
View File
@@ -581,6 +581,7 @@ pub fn rpr(imp: &mut Imp, part: &Part, r: &El) -> RunProps {
spacing: r.f64("spc").map(|s| (s / 100.0).clamp(-4000.0, 4000.0)),
kern: r.f64("kern").map(|k| (k / 100.0).clamp(0.0, 4000.0)),
no_proof: r.bool("noProof"),
normalize_height: r.bool("normalizeH"),
..Default::default()
};
for e in r.elements() {
+2 -1
View File
@@ -661,7 +661,8 @@ pub fn rpr(w: &mut W, x: &mut Exp, o: &mut Out, tag: &str, r: &RunProps) {
)
.o("spc", r.spacing.map(|s| (s.clamp(-4000.0, 4000.0) * 100.0).round() as i64))
.o("baseline", r.baseline.map(|b| pct(b.clamp(-10.0, 10.0))))
.b("noProof", r.no_proof);
.b("noProof", r.no_proof)
.b("normalizeH", r.normalize_height);
let has_fx = r.shadow.is_some() || r.inner_shadow.is_some() || r.glow.is_some() || r.reflection.is_some() || r.soft_edge.is_some();
let has_kids = r.outline.is_some()
|| r.fill.is_some()
+33
View File
@@ -486,6 +486,39 @@ fn centered_cell_anchor_survives_two_pptx_round_trips() {
assert_eq!(table.rows[0].cells[0].anchor_ctr, Some(true));
}
#[test]
fn normalized_character_height_survives_two_pptx_round_trips() {
let mut p = Presentation::default();
let mut slide = new_slide(&mut p, "Normalized height");
let mut enabled = shape(&mut p, "Enabled", 10.0, 10.0, 200.0, 80.0);
let mut enabled_body = TextBody::from_text("enabled");
enabled_body.paragraphs[0].runs[0].props.normalize_height = Some(true);
enabled_body.paragraphs[0].runs[0].props.size = Some(18.0);
enabled_body.paragraphs[0].runs[0].props.caps = Some(Caps::Small);
enabled_body.paragraphs[0].runs[0].props.spacing = Some(1.5);
enabled.text = Some(enabled_body);
let mut disabled = shape(&mut p, "Disabled", 10.0, 100.0, 200.0, 80.0);
let mut disabled_body = TextBody::from_text("disabled");
disabled_body.paragraphs[0].runs[0].props.normalize_height = Some(false);
disabled.text = Some(disabled_body);
let mut absent = shape(&mut p, "Absent", 10.0, 190.0, 200.0, 80.0);
absent.text = Some(TextBody::from_text("absent"));
slide.shapes = vec![enabled, disabled, absent];
p.slides.push(Arc::new(slide));
let twice = round(&round(&p));
let slide = twice.slides.last().expect("added slide");
let run = &by_name(slide, "Enabled").text.as_ref().expect("text").paragraphs[0].runs[0];
assert_eq!(run.props.normalize_height, Some(true));
assert_eq!(run.props.size, Some(18.0));
assert_eq!(run.props.caps, Some(Caps::Small));
assert_eq!(run.props.spacing, Some(1.5));
let run = &by_name(slide, "Disabled").text.as_ref().expect("text").paragraphs[0].runs[0];
assert_eq!(run.props.normalize_height, Some(false));
let run = &by_name(slide, "Absent").text.as_ref().expect("text").paragraphs[0].runs[0];
assert_eq!(run.props.normalize_height, None);
}
#[test]
fn shapes_fills_lines_effects_round_trip() {
let p = rich_deck();