SVG::Convert - The fantastic new SVG::Convert!


SVG-Convert documentation Contained in the SVG-Convert distribution.

Index


Code Index:

NAME

Top

SVG::Convert - The fantastic new SVG::Convert!

VERSION

Top

version 0.02

SYNOPSIS

Top

  use SVG::Convert;

  my $svgconv = SVG::Convert->new();
  print $svgconv->convert(format => "xaml", src_file => "examples/01.svg", output => "string");

METHODS

Top

new

Constructor. The "$args" arguments is HASHREF. See below more details about $args.

driver_opts

The driver_opts parameter is HASHREF. The keys of HASHREF are lower-cased suffix of driver module name.

For example, If driver is SVG::Convert::XAML, then the key is "xaml". The values of HASHREF are parameter needed by each of drivers.

  my $sconv = SVG::Convert->new({
    driver_opts => {
      xaml => {
        ## for Driver::XAML
      }
    }
  });

convert(%args)

See below about %args details.

  my $xaml_doc = $sconv->convert(
    format => "xaml",
    src_file => $src_file,
    output => "doc"
  );

format

The format parameter is string value represented format type for converting. This value is lower-cased suffix of driver module name.

For example, If the driver module is SVG::Convert::Driver::XAML, then this value is "xaml".

src_file

The src_file parameter is string value represented SVG source file name.

src_string

The src_file parameter is string value represented SVG source string.

src_doc

The src_doc parameter is XML::LibXML::Document object value represented SVG source document.

output

The output parameter is "file" or "string" or "doc".

output_file

The output_file parameter is output filename.

convert_opts

The convert_opts parameter is extra params for driver.

SEE ALSO

Top

Carp::Clan
Module::Load
Module::Pluggable::Fast
Params::Validate
Scalar::Util
XML::LibXML
SVG::Convert::Driver::XAML
SVG::Convert::Driver::PNG

AUTHOR

Top

Toru Yamaguchi, <zigorou@cpan.org>

BUGS

Top

Please report any bugs or feature requests to bug-svg-convert@rt.cpan.org, or through the web interface at http://rt.cpan.org. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

COPYRIGHT & LICENSE

Top


SVG-Convert documentation Contained in the SVG-Convert distribution.
package SVG::Convert;

use strict;
use warnings;

use base qw(Class::Accessor::Fast);

__PACKAGE__->mk_accessors(qw/drivers parser/);

use Carp::Clan;
use Module::Load;
use Module::Pluggable::Fast (
    name => '_drivers',
    search => ['SVG::Convert::Driver'],
    require => 1
);
use Params::Validate qw(:all);
use Scalar::Util qw(weaken);
use XML::LibXML;

our $VERSION = '0.02';

sub new {
    my ($class, $args) = @_;

    $args ||= {};
    $args = { driver_opts => {}, %$args, drivers => {} };

    my $self = $class->SUPER::new($args);
    $self->parser(XML::LibXML->new);

    for my $driver ($self->_drivers) {
        eval { load $driver; };
        if ($@) {
            croak($@);
        }

        my ($suffix) = map { lc } $driver =~ m/SVG::Convert::Driver::(.+)/;

        my $driver_opts = (
            exists $args->{driver_opts}->{$suffix} && 
            ref $args->{driver_opts}->{$suffix} eq 'HASH'
        ) ? $args->{driver_opts}->{$suffix} : {};

        $self->drivers->{$suffix} = $driver->new({
            parser => $self->parser,
            %$driver_opts
        });
    }

    return $self;
}

sub convert {
    my $self = shift;
    my %args = validate_with(
        params => \@_, 
        spec => {
            format => {
                type => SCALAR,
                callbacks => {
                    'installed driver' => sub {
                        exists $self->drivers->{$_[0]};
                    }
                }
            },
            src_file => {
                type => SCALAR,
                optional => 1,
                callbacks => {
                    'exists file' => sub {
                        -e $_[0] && -f $_[0];
                    }
                }
            },
            src_string => {
                type => SCALAR,
                optional => 1,
            },
            src_doc => {
                type => OBJECT,
                optional => 1,
                isa => [qw/XML::LibXML::Document/]
            },
            output => {
                type => SCALAR,
                default => 'string',
                callbacks => {
                    'enable parameters' => sub {
                        $_[0] eq 'file' || $_[0] eq 'string' || $_[0] eq 'doc'
                    }
                }
            },
            output_file => {
                type => SCALAR,
                optional => 1,
                depends => [qw/output/]
            },
            convert_opts => {
                type => HASHREF,
                optional => 1,
            },
        }
    );

    my $driver = $self->drivers->{$args{format}};
    my $src_doc = $args{src_doc} || 
        ($args{src_file}) ? 
            $self->parser->parse_file($args{src_file}) :
            $self->parser->parse_string($args{src_string});;

    my $convert_opts = ($args{convert_opts}) ? $args{convert_opts} : {};

    my $method = "convert_" . $args{output};
    return $driver->$method($src_doc, $args{output_file}, $convert_opts);
}

1; # End of SVG::Convert