The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use warnings;
use strict;

use Best 0.05 [ [qw/YAML::Syck YAML/], qw/Dump Load/ ];
use Getopt::Long;
use Test::TAP::HTMLMatrix;
use Test::TAP::Model::Visual;
use File::Spec;

GetOptions \our %Config, qw(inlinecss|e cssfile|c=s help|h);
$Config{cssfile} ||= Test::TAP::HTMLMatrix->css_file();
usage() if $Config{help};

my $yamlfile = shift || 'tests.yml';

open(my $yamlfh, '<', $yamlfile) or die "Couldn't open $yamlfile for reading: $!";
binmode $yamlfh, ":utf8" or die "binmode: $!";
local $/=undef;

my $data = Load(<$yamlfh>);
undef $yamlfh;

my $tap = My::Model->new_with_struct(delete $data->{meat});
my $v = Test::TAP::HTMLMatrix->new($tap, Dump($data));
$v->has_inline_css($Config{inlinecss});

my $fh;
if (my $out = shift) {
    open $fh, '>', $out or die $!;
}
else {
    $fh = \*STDOUT;
}
binmode $fh, ":utf8" or die "binmode: $!";
print $fh "$v";
close $fh;

sub usage {
  print <<"USAGE";
usage: $0 [OPTIONS] > output_file.html

Generates an HTML summary of a YAML test run. Options:

   --inlinecss, -e      inline css in HTML header (for broken webservers)
   --cssfile,  -c FILE  location of css. [default: $Config{cssfile}]

See also:
   util/yaml_harness.pl  - produce the data for this tool
   util/catalog_tests.pl - produce cross-linkable tests
   util/run-smome.pl     - automate the smoke process

USAGE
  exit 0;
}

{
    package My::Model;
    use base qw/Test::TAP::Model::Visual/;
    sub file_class { "My::File" }
    
    package My::File;
    use base qw/Test::TAP::Model::File::Visual/;
    sub subtest_class { "My::Subtest" }
    sub link {
        my $self = shift;
        my $link = $self->SUPER::link;
        $link =~ s/\.t$/.html/;
        File::Spec->catdir("t_index",$link);
    }

    package My::Subtest;
    use base qw/Test::TAP::Model::Subtest::Visual/;
    sub link {
        my $self = shift;
        my $link = $self->SUPER::link;
        $link =~ s/\.t(?=#line|$)/.html/;
        File::Spec->catdir("t_index",$link);
    }
}