App-CPANIDX
view release on metacpan or search on metacpan
lib/App/CPANIDX/Renderer.pm view on Meta::CPAN
package App::CPANIDX::Renderer;
use strict;
use warnings;
use YAML::Tiny;
use JSON::XS;
use XML::Simple;
use HTML::Tiny;
use vars qw[$VERSION];
$VERSION = '0.40';
my %types = (
'yaml', 'application/x-yaml; charset=utf-8',
'json', 'application/json; charset=utf-8',
'xml', 'application/xml; charset=utf-8',
'html', 'text/html',
);
my %renderers = (
'yaml', sub {
my $ref = shift;
my $string;
eval { $string = YAML::Tiny::Dump( $ref ); };
return $string;
},
'json', sub {
my $ref = shift;
my $string;
eval { $string = JSON::XS->new->utf8(1)->pretty(1)->encode( $ref ); };
return $string;
},
'xml', sub {
my $ref = shift;
my $type = shift || 'opt';
my %data;
$data{$type} = $ref;
my $string;
eval { $string = XMLout(\%data, RootName => 'results' ); };
return $string;
},
'html', sub {
my $ref = shift;
return _gen_html( @{ $ref } );;
},
);
sub renderers {
return sort keys %renderers;
}
sub new {
my $package = shift;
my $data = shift;
return unless $data and ref $data eq 'ARRAY';
my $format = shift || 'yaml';
$format = lc $format;
return unless exists $types{ $format };
bless { _data => $data, _format => $format }, $package;
}
sub render {
my $self = shift;
my $type = shift;
my $contype = $types{ $self->{_format} };
my $content = $renderers{ $self->{_format} }->( $self->{_data}, $type );
return ($contype, $content) if wantarray;
return [ $contype, $content ];
}
sub _gen_html {
my @results = @_;
my $h = HTML::Tiny->new();
my $data;
if ( !scalar @results ) {
$data = $h->p('There were no results, sorry');
( run in 2.096 seconds using v1.01-cache-2.11-cpan-5a3173703d6 )