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 )