From c9484a1ad2414669f6ea4a4416f5b93ec8e8a710 Mon Sep 17 00:00:00 2001 From: Guillaume Rousse Date: Mon, 29 Dec 2025 17:23:52 +0100 Subject: [PATCH 1/8] fallback on viewBox if needed Use viewbox attribute if width or heigth attribute is missing --- lib/Image/Info/SVG/XMLLibXMLReader.pm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/Image/Info/SVG/XMLLibXMLReader.pm b/lib/Image/Info/SVG/XMLLibXMLReader.pm index 6afa880..62e8e7c 100644 --- a/lib/Image/Info/SVG/XMLLibXMLReader.pm +++ b/lib/Image/Info/SVG/XMLLibXMLReader.pm @@ -38,8 +38,13 @@ sub process_file { # first XML element my $root_name = $reader->name; if ($root_name eq 'svg') { - $info->push_info(0, 'height', $reader->getAttribute('height')); - $info->push_info(0, 'width', $reader->getAttribute('width')); + my @dimensions; + my $viewbox = $reader->getAttribute('viewBox'); + @dimensions = split(/(\w|,)/, $viewbox) if $viewbox; + my $height = $reader->getAttribute('height') || $dimensions[3]; + my $width = $reader->getAttribute('width') || $dimensions[2]; + $info->push_info(0, 'height', $height); + $info->push_info(0, 'width', $width); my $version = $reader->getAttribute('version') || 'unknown'; $info->push_info(0, 'SVG_Version', $version); From 19b44860a39c49c0e7ed55b841e6d7f86a28b122 Mon Sep 17 00:00:00 2001 From: Guillaume Rousse Date: Mon, 29 Dec 2025 17:44:36 +0100 Subject: [PATCH 2/8] fix splitting on alternative --- lib/Image/Info/SVG/XMLLibXMLReader.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Image/Info/SVG/XMLLibXMLReader.pm b/lib/Image/Info/SVG/XMLLibXMLReader.pm index 62e8e7c..c958bf8 100644 --- a/lib/Image/Info/SVG/XMLLibXMLReader.pm +++ b/lib/Image/Info/SVG/XMLLibXMLReader.pm @@ -40,7 +40,7 @@ sub process_file { if ($root_name eq 'svg') { my @dimensions; my $viewbox = $reader->getAttribute('viewBox'); - @dimensions = split(/(\w|,)/, $viewbox) if $viewbox; + @dimensions = split(/(?: |,)/, $viewbox) if $viewbox; my $height = $reader->getAttribute('height') || $dimensions[3]; my $width = $reader->getAttribute('width') || $dimensions[2]; $info->push_info(0, 'height', $height); From a37ab1a563cb8da291ce4b7ec480a74f8a963bf4 Mon Sep 17 00:00:00 2001 From: Guillaume Rousse Date: Mon, 29 Dec 2025 17:49:53 +0100 Subject: [PATCH 3/8] round to integer value --- lib/Image/Info/SVG/XMLLibXMLReader.pm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/Image/Info/SVG/XMLLibXMLReader.pm b/lib/Image/Info/SVG/XMLLibXMLReader.pm index c958bf8..8acc8eb 100644 --- a/lib/Image/Info/SVG/XMLLibXMLReader.pm +++ b/lib/Image/Info/SVG/XMLLibXMLReader.pm @@ -41,8 +41,12 @@ sub process_file { my @dimensions; my $viewbox = $reader->getAttribute('viewBox'); @dimensions = split(/(?: |,)/, $viewbox) if $viewbox; - my $height = $reader->getAttribute('height') || $dimensions[3]; - my $width = $reader->getAttribute('width') || $dimensions[2]; + my $height = + $reader->getAttribute('height') || + $dimensions[3] ? int($dimensions[3]) : undef; + my $width = + $reader->getAttribute('width') || + $dimensions[2] ? int($dimensions[2]) : undef; $info->push_info(0, 'height', $height); $info->push_info(0, 'width', $width); From 6c595de7d3d08fb2f870f243ec06332066a63f3a Mon Sep 17 00:00:00 2001 From: Guillaume Rousse Date: Mon, 29 Dec 2025 17:55:53 +0100 Subject: [PATCH 4/8] same behaviour with XML::Simple --- lib/Image/Info/SVG/XMLSimple.pm | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/Image/Info/SVG/XMLSimple.pm b/lib/Image/Info/SVG/XMLSimple.pm index f28b09b..215f322 100644 --- a/lib/Image/Info/SVG/XMLSimple.pm +++ b/lib/Image/Info/SVG/XMLSimple.pm @@ -52,8 +52,18 @@ sub process_file { # "image/svg+xml" is the official MIME type $info->push_info(0, "file_media_type" => "image/svg+xml"); - $info->push_info(0, "height", $img->{height}); - $info->push_info(0, "width", $img->{width}); + my @dimensions; + @dimensions = split(/(?: |,)/, $img->{viewBox}) if $img->{viewBox}; + + my $height = + $img->{height} || + $dimensions[3] ? int($dimensions[3]) : undef; + my $width = + $img->{width} || + $dimensions[2] ? int($dimensions[2]) : undef; + + $info->push_info(0, "height", $height); + $info->push_info(0, "width", $width); $info->push_info(0, "SVG_StandAlone", $info{standalone}); $info->push_info(0, "SVG_Version", $img->{version} || 'unknown'); From 1417940c1d14a12556565991aece0217294077c4 Mon Sep 17 00:00:00 2001 From: Guillaume Rousse Date: Wed, 31 Dec 2025 16:21:05 +0100 Subject: [PATCH 5/8] a bit more readability --- lib/Image/Info/SVG/XMLLibXMLReader.pm | 19 ++++++++++--------- lib/Image/Info/SVG/XMLSimple.pm | 16 ++++++++-------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/lib/Image/Info/SVG/XMLLibXMLReader.pm b/lib/Image/Info/SVG/XMLLibXMLReader.pm index 8acc8eb..a26115b 100644 --- a/lib/Image/Info/SVG/XMLLibXMLReader.pm +++ b/lib/Image/Info/SVG/XMLLibXMLReader.pm @@ -38,15 +38,16 @@ sub process_file { # first XML element my $root_name = $reader->name; if ($root_name eq 'svg') { - my @dimensions; - my $viewbox = $reader->getAttribute('viewBox'); - @dimensions = split(/(?: |,)/, $viewbox) if $viewbox; - my $height = - $reader->getAttribute('height') || - $dimensions[3] ? int($dimensions[3]) : undef; - my $width = - $reader->getAttribute('width') || - $dimensions[2] ? int($dimensions[2]) : undef; + my @dimensions; + my $viewbox = $reader->getAttribute('viewBox'); + if ($viewbox) { + @dimensions = + map { int($_) } + split(/(?: |,)/, $viewbox) + } + + my $height = $reader->getAttribute('height') || $dimensions[3]; + my $width = $reader->getAttribute('width') || $dimensions[2]; $info->push_info(0, 'height', $height); $info->push_info(0, 'width', $width); diff --git a/lib/Image/Info/SVG/XMLSimple.pm b/lib/Image/Info/SVG/XMLSimple.pm index 215f322..4283d18 100644 --- a/lib/Image/Info/SVG/XMLSimple.pm +++ b/lib/Image/Info/SVG/XMLSimple.pm @@ -53,14 +53,14 @@ sub process_file { $info->push_info(0, "file_media_type" => "image/svg+xml"); my @dimensions; - @dimensions = split(/(?: |,)/, $img->{viewBox}) if $img->{viewBox}; - - my $height = - $img->{height} || - $dimensions[3] ? int($dimensions[3]) : undef; - my $width = - $img->{width} || - $dimensions[2] ? int($dimensions[2]) : undef; + if ($img->{viewBox}) { + @dimensions = + map { int($_) } + split(/(?: |,)/, $img->{viewBox}); + } + + my $height = $img->{height} || $dimensions[3]; + my $width = $img->{width} || $dimensions[2]; $info->push_info(0, "height", $height); $info->push_info(0, "width", $width); From 12cb29ccd32fc7757a293cdeba0c22d33b23111c Mon Sep 17 00:00:00 2001 From: Guillaume Rousse Date: Wed, 31 Dec 2025 16:30:27 +0100 Subject: [PATCH 6/8] test fallback behaviour --- img/logo.svg | 1 + t/svg.t | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 img/logo.svg diff --git a/img/logo.svg b/img/logo.svg new file mode 100644 index 0000000..4dad3e2 --- /dev/null +++ b/img/logo.svg @@ -0,0 +1 @@ +Logo-rdv \ No newline at end of file diff --git a/t/svg.t b/t/svg.t index ee1bf3d..81657e0 100755 --- a/t/svg.t +++ b/t/svg.t @@ -17,7 +17,7 @@ BEGIN plan skip_all => "Need XML::Simple+XML::SAX::PurePerl or XML::LibXML::Reader+XML::Simple for this test"; } - plan tests => 14; + plan tests => 19; } use Image::Info qw(image_info dim); @@ -67,6 +67,20 @@ is ($i->{SVG_Version}, '1.1', 'SVG_Version 1.1'); is (dim($i), '209x51', 'dim()'); +############################################################################# +# third test file +$i = image_info("../img/logo.svg") || + die ("Couldn't read logo.svg: $!"); + +#use Data::Dumper; print Dumper($i), "\n"; + +is ($i->{SVG_StandAlone}, 'no', 'SVG_StandAlone'); +is ($i->{file_ext}, 'svg', 'file_ext'); +is ($i->{file_media_type}, 'image/svg+xml', 'file_media_type'); +is ($i->{SVG_Title}, 'Logo-rdv', 'title'); + +is (dim($i), '383x57', 'dim()'); + ############################################################################# # first file without xml preamble { From a21bb29a4a54f2e92ce179fce788878e64fcfe8e Mon Sep 17 00:00:00 2001 From: Guillaume Rousse Date: Thu, 29 Jan 2026 17:25:09 +0100 Subject: [PATCH 7/8] make 'no' the default value for XML standalone property That mimic XML::LibXML behaviour, and seems the default value according to the specification anyway --- lib/Image/Info/SVG/XMLSimple.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Image/Info/SVG/XMLSimple.pm b/lib/Image/Info/SVG/XMLSimple.pm index 4283d18..6719f5e 100644 --- a/lib/Image/Info/SVG/XMLSimple.pm +++ b/lib/Image/Info/SVG/XMLSimple.pm @@ -64,7 +64,7 @@ sub process_file { $info->push_info(0, "height", $height); $info->push_info(0, "width", $width); - $info->push_info(0, "SVG_StandAlone", $info{standalone}); + $info->push_info(0, "SVG_StandAlone", $info{standalone} || 'no'); $info->push_info(0, "SVG_Version", $img->{version} || 'unknown'); # XXX Description, title etc. could be tucked away in a :-( From 35c6d59411db76bd705e981ed24af7a38176bc2f Mon Sep 17 00:00:00 2001 From: Guillaume Rousse Date: Wed, 7 Oct 2026 12:17:25 +0200 Subject: [PATCH 8/8] add test case to manifest --- MANIFEST | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST b/MANIFEST index 47c9380..afd8c58 100644 --- a/MANIFEST +++ b/MANIFEST @@ -46,6 +46,7 @@ img/test1-fuji.jpg Testcase for RT #49546 img/tiny.pgm img/upside-down.bmp img/xxe.svg Testcase for RT #118099 +img/logo.svg Testcase for GH PR#19 img/ztxt.png PNG example with ztxt chunk imgdump Test driver script lib/Bundle/Image/Info/Everything.pm