From 92baf43103e3a79478717a20f8b904ccd6eea248 Mon Sep 17 00:00:00 2001 From: imSlicedBread <56609001+imSlicedBread@users.noreply.github.com> Date: Sun, 11 Oct 2026 16:17:06 -0700 Subject: [PATCH] Preserve whitespace in OpenRaster layer names (#3207) --- crates/io/src/ora.rs | 2 +- crates/io/src/ora/tests.rs | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/crates/io/src/ora.rs b/crates/io/src/ora.rs index 083ba89b..dba3c961 100644 --- a/crates/io/src/ora.rs +++ b/crates/io/src/ora.rs @@ -245,7 +245,7 @@ fn flag(node: roxmltree::Node<'_, '_>, name: &str) -> bool { /// Shared node properties: name, visibility, opacity and composite operation. fn props(node: roxmltree::Node<'_, '_>, layer: &mut Layer, index: usize, warnings: &mut Warnings) -> Result<()> { - layer.name = node.attribute("name").map(str::trim).filter(|n| !n.is_empty()).map_or_else(|| format!("Layer {index}"), str::to_string); + layer.name = node.attribute("name").filter(|name| !name.trim().is_empty()).map_or_else(|| format!("Layer {index}"), str::to_string); layer.visible = node.attribute("visibility").is_none_or(|v| v.trim() != "hidden"); layer.opacity = num(node, "opacity", 1.0)?.clamp(0.0, 1.0) as f32; layer.blend = composite_op(node.attribute("composite-op").map_or("svg:src-over", str::trim), &layer.name, warnings); diff --git a/crates/io/src/ora/tests.rs b/crates/io/src/ora/tests.rs index 707653c2..625630d0 100644 --- a/crates/io/src/ora/tests.rs +++ b/crates/io/src/ora/tests.rs @@ -254,6 +254,21 @@ fn reads_other_applications_stacks() { } } +#[test] +fn preserves_surrounding_whitespace_in_layer_and_group_names() { + let xml = r#" + + + "#; + let bytes = archive(xml, &[("a.png", solid_png(2, 2, [255, 0, 0, 255]))]); + let result = crate::import("names.ora", &bytes).unwrap(); + let layers = &result.document.layers; + + let folder = layers.iter().find(|layer| layer.name == " Folder ").expect("group name is preserved"); + assert_eq!(folder.children().unwrap()[0].name, " Pixel "); + assert!(layers.iter().any(|layer| layer.name == "Layer 3"), "blank names keep the fallback"); +} + #[test] fn malformed_archives_fail_cleanly() { let png = solid_png(2, 2, [1, 2, 3, 4]);