Preserve whitespace in OpenRaster layer names (#3207)

This commit is contained in:
imSlicedBread 2026-10-11 16:17:06 -07:00 committed by GitHub
parent aa1febaffb
commit 92baf43103
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 16 additions and 1 deletions

View File

@ -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);

View File

@ -254,6 +254,21 @@ fn reads_other_applications_stacks() {
}
}
#[test]
fn preserves_surrounding_whitespace_in_layer_and_group_names() {
let xml = r#"<image w="2" h="2"><stack>
<stack name=" Folder "><layer name=" Pixel " src="a.png"/></stack>
<layer name=" " src="a.png"/>
</stack></image>"#;
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]);