Filter invalid XML characters from SVG Dublin Core metadata

Found while testing crates/svg/src/export/output.rs:360 (dublin_core, around line 81)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Prin.Ing
2026-11-02 14:36:13 +07:00
committed by bflatastic
co-authored by Claude Haiku 5.5
parent 37bbb00b55
commit 743f8c526b
2 changed files with 17 additions and 1 deletions
+1 -1
View File
@@ -357,7 +357,7 @@ impl Writer<'_> {
line(2, "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">");
line(3, "<rdf:Description rdf:about=\"\">");
for (term, value) in dublin_core(self.doc) {
line(4, &format!("<dc:{term}>{}</dc:{term}>", xml_escape(&value)));
line(4, &format!("<dc:{term}>{}</dc:{term}>", xml_text(&value)));
}
line(3, "</rdf:Description>");
line(2, "</rdf:RDF>");
@@ -53,3 +53,19 @@ fn an_artboard_exported_alone_is_titled_after_it() {
d.artboards[1].name = "\u{1}\u{2}".into();
assert_eq!(title(&d, alone(Some(1))).as_deref(), Some("<title>Icons</title>"));
}
#[test]
fn dublin_core_metadata_control_chars_are_filtered() {
let mut d = Document::new(200.0, 200.0);
d.title = "Poster\u{b}v2".into();
d.metadata.author = "Ann\u{1}e".into();
d.metadata.description = "a\u{1}b".into();
d.metadata.keywords = vec!["k\u{1}w".into()];
d.metadata.copyright_notice = "(c)\u{b}me\u{2}".into();
let svg = export(&d, &ExportOptions { metadata: true, ..ExportOptions::default() });
assert!(import(&svg).is_ok(), "export wrote invalid XML: {svg}");
assert!(svg.contains("<dc:creator>Anne</dc:creator>"));
assert!(svg.contains("<dc:title>Poster v2</dc:title>"));
assert!(svg.contains("<dc:subject>kw</dc:subject>"));
assert!(svg.contains("<dc:rights>(c) me</dc:rights>"));
}