From 4eb1fe0bf257598f074cbc17160ee2cadad14be7 Mon Sep 17 00:00:00 2001 From: Lyna Date: Thu, 12 Mar 2026 01:00:11 +0000 Subject: [PATCH] feat: support xml+svg and svg --- src/map.rs | 6 ++++++ src/matchers/image.rs | 19 +++++++++++++++++++ src/matchers/text.rs | 12 ++++++++++-- testdata/sample.svg | 3 +++ testdata/sample2.svg | 4 ++++ tests/image.rs | 4 ++++ 6 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 testdata/sample.svg create mode 100644 testdata/sample2.svg diff --git a/src/map.rs b/src/map.rs index f42fbac..e863a76 100644 --- a/src/map.rs +++ b/src/map.rs @@ -227,6 +227,12 @@ matcher_map!( "dwg", matchers::image::is_dwg ), + ( + MatcherType::Image, + "image/svg+xml", + "svg", + matchers::image::is_svg + ), // Video ( MatcherType::Video, diff --git a/src/matchers/image.rs b/src/matchers/image.rs index fc0b3e7..906840e 100644 --- a/src/matchers/image.rs +++ b/src/matchers/image.rs @@ -227,6 +227,25 @@ pub fn is_djvu(buf: &[u8]) -> bool { && buf[14] == 0x56 } +/// Returns whether a buffer is SVG image data. +#[must_use] +pub fn is_svg(buf: &[u8]) -> bool { + if buf.starts_with(b" bool { diff --git a/src/matchers/text.rs b/src/matchers/text.rs index a63962c..e68b880 100644 --- a/src/matchers/text.rs +++ b/src/matchers/text.rs @@ -47,7 +47,7 @@ pub fn is_xml(buf: &[u8]) -> bool { let val: &[u8] = b" bool { #[cfg(test)] mod tests { - use super::{is_html, is_shellscript, trim_start_whitespaces}; + use super::{is_html, is_shellscript, is_xml, trim_start_whitespaces}; #[test] fn trim_whitespaces() { @@ -114,4 +114,12 @@ mod tests { fn shellscript() { assert!(!is_shellscript(b"#!")); } + + #[test] + fn xml_excludes_svg() { + assert!(!is_xml( + b"\n" + )); + assert!(is_xml(b"\n")); + } } diff --git a/testdata/sample.svg b/testdata/sample.svg new file mode 100644 index 0000000..54484c4 --- /dev/null +++ b/testdata/sample.svg @@ -0,0 +1,3 @@ + + + diff --git a/testdata/sample2.svg b/testdata/sample2.svg new file mode 100644 index 0000000..d1b2f39 --- /dev/null +++ b/testdata/sample2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/tests/image.rs b/tests/image.rs index 26d9fbb..b6eb4d8 100644 --- a/tests/image.rs +++ b/tests/image.rs @@ -37,3 +37,7 @@ test_format!(Image, "image/vnd.djvu", "djvu", djvu1, "sample_single.djvu"); test_format!(Image, "image/vnd.djvu", "djvu", djvu2, "sample_multi.djvu"); test_format!(Image, "image/vnd.dwg", "dwg", dwg, "sample.dwg"); + +test_format!(Image, "image/svg+xml", "svg", svg, "sample.svg"); + +test_format!(Image, "image/svg+xml", "svg", svg2, "sample2.svg");