home *** CD-ROM | disk | FTP | other *** search
- package Image::Info::SVG;
-
- $VERSION = '1.02';
-
- use strict;
- no strict 'refs';
- use XML::Simple;
-
- sub process_file{
- my($info, $source) = @_;
- my(@comments, @warnings, %info, $comment, $img, $imgdata, $xs);
- local($_);
-
- while(<$source>){
- if( ! exists($info{standalone}) && /standalone="(.+?)"/ ){
- $info{standalone} = $1;
- }
- if( /<!--/ .. /-->/ ){
- $comment .= $_;
- }
- if( /-->/ ){
- $comment =~ s/<!--//;
- $comment =~ s/-->//;
- chomp($comment);
- push @comments, $comment;
- $comment = '';
- }
- $imgdata .= $_;
- }
- if( $imgdata =~ /<!DOCTYPE\s+svg\s+.+?\s+"(.+?)">/ ){
- $info{dtd} = $1;
- }
- elsif( $imgdata !~ /<svg/ ){
- return $info->push_info(0, "error", "Not a valid SVG image");
- }
-
- local $SIG{__WARN__} = sub {
- push(@warnings, @_);
- };
-
- $xs = XML::Simple->new;
- $img = $xs->XMLin($imgdata);
-
- $info->push_info(0, "color_type" => "sRGB");
- $info->push_info(0, "file_ext" => "svg");
- # XXX not official type yet, may be image/svg+xml
- $info->push_info(0, "file_media_type" => "image/svg-xml");
- $info->push_info(0, "height", $img->{height});
- # $info->push_info(0, "resolution", "1/1");
- $info->push_info(0, "width", $img->{width});
- # $info->push_info(0, "BitsPerSample", 8);
- #$info->push_info(0, "SamplesPerPixel", -1);
-
- # XXX Description, title etc. could be tucked away in a <g> :-(
- $info->push_info(0, "ImageDescription", $img->{desc}) if $img->{desc};
- if( $img->{image} ){
- if( ref($img->{image}) eq 'ARRAY' ){
- foreach my $img (@{$img->{image}}){
- $info->push_info(0, "SVG_Image", $img->{'xlink:href'});
- }
- }
- else{
- $info->push_info(0, "SVG_Image", $img->{image}->{'xlink:href'});
- }
- }
- $info->push_info(0, "SVG_StandAlone", $info{standalone});
- $info->push_info(0, "SVG_Title", $img->{title}) if $img->{title};
- $info->push_info(0, "SVG_Version", $info{dtd}||'unknown');
-
- for (@comments) {
- $info->push_info(0, "Comment", $_);
- }
-
- for (@warnings) {
- $info->push_info(0, "Warn", $_);
- }
- }
- 1;
- __END__
- Colors
- # iterate over polygon,rect,circle,ellipse,line,polyline,text for style->stroke: style->fill:?
- # and iterate over each of these within <g> too?! and recurse?!
- # append <color>'s
- # perhaps even deep recursion through <svg>'s?
- ColorProfile <color-profile>
- RenderingIntent ?
- requiredFeatures
- requiredExtensions
- systemLanguage
-
- =pod
-
- =head1 NAME
-
- Image::Info::SVG - SVG support for Image::Info
-
- =head1 SYNOPSIS
-
- use Image::Info qw(image_info dim);
-
- my $info = image_info("image.svg");
- if (my $error = $info->{error}) {
- die "Can't parse image info: $error\n";
- }
- my $color = $info->{color_type};
-
- my($w, $h) = dim($info);
-
- =head1 DESCRIPTION
-
- A functional yet thus far rudimentary SVG implementation.
- SVG also provides (for) a plethora of attributes and metadata of an image.
-
- This modules supplies the standard key names except for
- BitsPerSample, Compression, Gamma, Interlace, LastModificationTime, as well as:
-
- =over
-
- =item ImageDescription
-
- The image description, corresponds to <desc>.
-
- =item SVG_Image
-
- A scalar or reference to an array of scalars containing the URI's of
- embedded images (JPG or PNG) that are embedded in the image.
-
- =item SVG_StandAlone
-
- Whether or not the image is standalone.
-
- =item SVG_Title
-
- The image title, corresponds to <title>
-
- =item SVG_Version
-
- The URI of the DTD the image conforms to.
-
- =back
-
- =item FILES
-
- This module requires L<XML::Simple>
-
- =head1 SEE ALSO
-
- L<Image::Info>, L<XML::Simple>, L<expat>
-
- =head1 NOTES
-
- SVG is not yet a standard,
- though much software exists which is capable of creating and displaying SVG images.
- For more information about SVG see:
-
- http://www.w3.org/Graphics/SVG/
-
- =head1 AUTHOR
-
- Jerrad Pierce <belg4mit@mit.edu>/<webmaster@pthbb.org>
-
- This library is free software; you can redistribute it and/or
- modify it under the same terms as Perl itself.
-
- =cut
-
- =begin register
-
- MAGIC: /^<\?xml/
-
- SVG also provides (for) a plethora of attributes and metadata of an image.
- See L<Image::Info::SVG> for details.
-
- =end register
-
- =cut
-