Salvation
view release on metacpan or search on metacpan
lib/Salvation/Service/View/Stack/Convert/To/XML.pm view on Meta::CPAN
use strict;
package Salvation::Service::View::Stack::Convert::To::XML;
use Salvation::Service::View::Stack::Parser ();
use IO::String ();
use XML::Writer ();
sub parse
{
my ( undef, $stack, $args ) = @_;
$args ||= {};
my $writer = ( $args -> { 'writer' } or XML::Writer -> new(
OUTPUT =>
my $io = IO::String -> new(
my $xml
)
) );
my $charset = ( $args -> { 'charset' } or 'UTF-8' );
my $stack_tag_name = ( $args -> { 'tags' } -> { 'stack' } or 'stack' );
my $list_tag_name = ( $args -> { 'tags' } -> { 'list' } or 'list' );
my $frame_tag_name = ( $args -> { 'tags' } -> { 'frame' } or 'frame' );
$writer -> xmlDecl( $charset ) unless $args -> { 'nocharset' };
my %default_events = (
before_stack => sub{ $writer -> startTag( $stack_tag_name ) },
after_stack => sub{ $writer -> endTag( $stack_tag_name ) },
before_frame_list => sub{ $writer -> startTag( $list_tag_name, name => shift -> fname() ) },
after_frame_list => sub{ $writer -> endTag( $list_tag_name ) },
before_frame_single => sub{
my $frame = shift;
$writer -> startTag( $frame_tag_name,
title => $frame -> cap(),
name => $frame -> fname(),
type => $frame -> ftype() );
},
after_frame_single => sub{ $writer -> endTag( $frame_tag_name ) },
raw => sub{ $writer -> cdata( shift or '' ) }
);
foreach my $event ( keys %default_events )
{
unless( exists $args -> { 'events' } -> { $event } )
{
$args -> { 'events' } -> { $event } = $default_events{ $event };
}
}
{
my %filter = (
tags => 1,
charset => 1,
writer => 1,
nocharset => 1
);
Salvation::Service::View::Stack::Parser -> parse( $stack, { map{ $_ => $args -> { $_ } } grep{ not $filter{ $_ } } keys %$args } );
}
$io -> close() if $io;
return $xml;
}
-1;
# ABSTRACT: Salvation::Service::View::Stack to XML converter
=pod
=head1 NAME
Salvation::Service::View::Stack::Convert::To::XML - L<Salvation::Service::View::Stack> to XML converter
=head1 SYNOPSIS
my $writer = XML::Writer -> new( ... );
my %args = (
writer => $writer,
charset => 'UTF-8',
nocharset => 0,
tags => {
stack => 'stack_xml_tag',
list => 'list_xml_tag',
frame => 'frame_xml_tag'
},
events => {
...
}
);
Salvation::Service::View::Stack::Convert::To::XML
-> parse(
$stack,
\%args
)
;
( run in 0.444 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )