# $Id$ package Youri::Check::Output::File::Format::HTML; =head1 NAME Youri::Check::Output::File::Format::HTML - File HTML format support =head1 DESCRIPTION This format plugin for L provides HTML format support. =cut use warnings; use strict; use Carp; use CGI; use base 'Youri::Check::Output::File::Format'; sub extension { return 'html'; } sub _init { my $self = shift; my %options = ( style => <{_style} = $options{style}; $self->{_cgi} = CGI->new(); } sub get_report { my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; my $content; my $lead_columns = [ $maintainer ? qw/package media/ : qw/package media maintainer/ ]; my $line; my @results; $content .= $self->{_cgi}->start_table(); $content .= $self->{_cgi}->Tr([ $self->{_cgi}->th([ @$lead_columns, @$columns ]) ]); while (my $result = $iterator->get_result()) { if (@results && $result->{package} ne $results[0]->{package}) { $content .= $self->_get_formated_results( $lead_columns, $columns, $links, $line++ % 2 ? 'odd' : 'even', \@results ); @results = (); } push(@results, $result); } $content .= $self->_get_formated_results( $lead_columns, $columns, $links, $line++ % 2 ? 'odd' : 'even', \@results ); $content .= $self->{_cgi}->end_table(); return $self->_get_html_page($time, $title, \$content); } sub get_index { my ($self, $time, $title, $reports, $maintainers) = @_; my $content; if ($reports) { $content .= $self->{_cgi}->h2("Reports"); my @types = keys %{$reports}; $content .= $self->{_cgi}->start_ul(); foreach my $type (sort @types) { my $item; $item = $self->{_cgi}->a( { href => "$type.html" }, $type ); foreach my $extension (@{$reports->{$type}}) { next if ($extension eq extension()); $item .= " ".$self->{_cgi}->a( { href => "$type.$extension" }, "[$extension]" ); } $content .= $self->{_cgi}->li($item); } $content .= $self->{_cgi}->end_ul(); } if ($maintainers) { $content .= $self->{_cgi}->h2("Individual reports"); $content .= $self->{_cgi}->start_ul(); foreach my $maintainer (sort @{$maintainers}) { $content .= $self->{_cgi}->li( $self->{_cgi}->a( { href => "$maintainer/index.html" }, _obfuscate($maintainer) ) ); } $content .= $self->{_cgi}->end_ul(); } return $self->_get_html_page($time, $title, \$content); } sub _get_formated_results { my ($self, $lead_columns, $columns, $links, $class, $results) = @_; my $content; $content .= $self->{_cgi}->end_Tr(); for my $i (0 .. $#$results) { $content .= $self->{_cgi}->start_Tr( { class => $class } ); if ($i == 0) { # first line contains spanned cells $content .= $self->{_cgi}->td( { rowspan => scalar @$results }, [ map { $results->[$i]->{$_} } @$lead_columns ] ); } $content .= $self->{_cgi}->td( [ map { $links->{$_} && $results->[$i]->{$links->{$_}} ? $self->{_cgi}->a( { href => $results->[$i]->{$links->{$_}} }, $self->{_cgi}->escapeHTML($results->[$i]->{$_}) ) : $self->{_cgi}->escapeHTML($results->[$i]->{$_}) } @$columns ] ); $content .= $self->{_cgi}->end_Tr(); } return $content; } sub _get_html_page { my ($self, $time, $title, $body) = @_; my $content; $content .= $self->{_cgi}->start_html( -title => $title, -style => { code => $self->{_style} } ); $content .= $self->{_cgi}->h1($title); $content .= $$body; $content .= $self->{_cgi}->hr(); $content .= $self->{_cgi}->p( { class => 'footer' }, "Page generated $time" ); $content .= $self->{_cgi}->end_html(); return \$content; } sub _obfuscate { my ($email) = @_; return unless $email; $email =~ s/\@/ at /; $email =~ s/\./ dot /; return $email; } =head1 COPYRIGHT AND LICENSE Copyright (C) 2002-2006, YOURI project This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut 1;