File Coverage

blib/lib/App/CPANIDX/Renderer.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             package App::CPANIDX::Renderer;
2              
3 2     2   24667 use strict;
  2         3  
  2         67  
4 2     2   12 use warnings;
  2         4  
  2         54  
5 2     2   1967 use YAML::Tiny;
  2         13504  
  2         148  
6 2     2   1207 use JSON::XS;
  2         13939  
  2         1669  
7 2     2   3000 use XML::Simple;
  0            
  0            
8             use HTML::Tiny;
9             use vars qw[$VERSION];
10              
11             $VERSION = '0.36';
12              
13             my %types = (
14             'yaml', 'application/x-yaml; charset=utf-8',
15             'json', 'application/json; charset=utf-8',
16             'xml', 'application/xml; charset=utf-8',
17             'html', 'text/html',
18             );
19              
20             my %renderers = (
21             'yaml', sub {
22             my $ref = shift;
23             my $string;
24             eval { $string = YAML::Tiny::Dump( $ref ); };
25             return $string;
26             },
27             'json', sub {
28             my $ref = shift;
29             my $string;
30             eval { $string = JSON::XS->new->utf8(1)->pretty(1)->encode( $ref ); };
31             return $string;
32             },
33             'xml', sub {
34             my $ref = shift;
35             my $type = shift || 'opt';
36             my %data;
37             $data{$type} = $ref;
38             my $string;
39             eval { $string = XMLout(\%data, RootName => 'results' ); };
40             return $string;
41             },
42             'html', sub {
43             my $ref = shift;
44             return _gen_html( @{ $ref } );;
45             },
46             );
47              
48             sub renderers {
49             return sort keys %renderers;
50             }
51              
52             sub new {
53             my $package = shift;
54             my $data = shift;
55             return unless $data and ref $data eq 'ARRAY';
56             my $format = shift || 'yaml';
57             $format = lc $format;
58             return unless exists $types{ $format };
59             bless { _data => $data, _format => $format }, $package;
60             }
61              
62             sub render {
63             my $self = shift;
64             my $type = shift;
65             my $contype = $types{ $self->{_format} };
66             my $content = $renderers{ $self->{_format} }->( $self->{_data}, $type );
67             return ($contype, $content) if wantarray;
68             return [ $contype, $content ];
69             }
70              
71             sub _gen_html {
72             my @results = @_;
73             my $h = HTML::Tiny->new();
74             my $data;
75             if ( !scalar @results ) {
76             $data = $h->p('There were no results, sorry');
77             }
78             else {
79             my @th = sort keys %{ $results[0] };
80             $data = $h->table( { border => 1, cellspacing => 0, width => '100%' },
81             [
82             \'tr',
83             [ \'th', @th ],
84             map { my $href = $_;
85             [ \'td', map { $href->{$_} } sort keys %$href ] } @results,
86             ]
87             );
88             }
89             return $h->html(
90             [
91             $h->head( $h->title( 'Results' ) ),
92             $h->body(
93             [
94             $data
95             ]
96             )
97             ]
98             );
99             }
100              
101             1;
102              
103             __END__