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

# util/smartlinks.pl - The successor to util/catalog_tests.pl.

# This program is still under active development, and
# you're very welcome to improve it.
# Most of the code has already moved to the Text-SmartLinks subdirectory
# with the aim to make it generic enought to be usefule for any
# perl script, module or application.

# Please read the Pod documentation at the end of file before reading and/or
# modifying the source.
# CAUTION: please make sure your changes don't break anything, because
# breakage of this script will also break http://perlcabal.org/syn/
# immediately. Running the tests of Text::SmartLinks and trying the script using 
# perl smartlinks.pl --dir ../../t/ --out-dir ../../html/
# and then checking the result before committing is
# strongly recommended. Thank you for your contribution :)

use strict;
use warnings;
no warnings 'once';

use Getopt::Long;
use File::Basename;
use FindBin;
use File::Find::Rule;
use File::Slurp;
use Data::Dumper;

#use Pod::Simple::HTML;

use Text::SmartLinks;

sub help () {
    print <<_EOC_;
Usage:
  $0 t/*/*.t t/*/*/*.t
  $0 --dir t
  $0 --css foo.css --out-dir=public_html t/syntax/*.t
  $0 --check t/*/*.t t/*/*/*.t
  $0 --check t/some/test.t
  $0 --check --missing t/*/*.t t/*/*/*.t

Options:
  --help          Show this help.
  --check         Only check the validity of the smartlinks, no
                  HTML outputs.
  --missing       Print files whitout smartlinks
  --wiki          Print out a wiki link to test files missing links
  --count         Show the count of links per file 
  --out-dir <dir> Specify the output directory for HTML files.
  --css <file>    Specify the CSS file used by the HTML outputs,
                  defaults to http://dev.perl.org/css/perl.css.
  --test-res <ymlfile>
                  Set .yml file generated from Test::TAP::Model's
                  ``structure''. Usually <ymlfile> should be set
                  to ``smoke.yml''.
  --pod-dir       Specify the directory where the .pod and .pm files 
                  are located. smarlinks.pl will recurse in the 
                  subdirectories to locate the files. Defaults to lib/
  --index         Also generates an index.html page with links to
                  pages.
  --dir <dir>     Name of the directory where to look for .t files
                  recursively.
  --line-anchor   Insert line anchors to the resulting HTML pages.
  --version <VERSION>
_EOC_
    exit(0);
}

sub main {
    my ($pod_dir, $out_dir, $help, $cssfile, $yml_file, $index, $dir,$count,$wiki);
    my $check;
    my $line_anchor;
    my $print_missing;
    my $version;
    GetOptions(
        'check'       => \$check,
        'count'       => \$count,
        'missing'     => \$print_missing,
        'wiki'        => \$wiki,
        'pod-dir=s'   => \$pod_dir,
        'out-dir=s'   => \$out_dir,
        'css=s'       => \$cssfile,
        'help'        => \$help,
        'test-res=s'  => \$yml_file,
        'index'       => \$index,
        'dir=s'       => \$dir,
        'line-anchor' => \$line_anchor,
        'version=s'   => \$version,
    ) or help();

    if ($help || !@ARGV && !$dir) {
        help();
    }
    $cssfile ||= 'http://dev.perl.org/css/perl.css';

    my $sl = Text::SmartLinks->new({
        count         => $count,
        check         => $check,
        line_anchor   => $line_anchor,
        print_missing => $print_missing,
        wiki          => $wiki,  # #TODO: do we need this flag?
        out_dir       => $out_dir,
        cssfile       => $cssfile,
        version       => $version,
    });

    $out_dir = $sl->out_dir;
    mkdir $out_dir if !-d $out_dir;

    my @t_files = map glob, @ARGV;
    push @t_files, File::Find::Rule->file()->name('*.t')->in($dir) if $dir;
    $sl->process_test_files(@t_files);
    $sl->process_yml_file($yml_file);

	die "--pod-dir was not given. It usually should be '.' or lib/\n" if not defined $pod_dir;
	die "Directory '$pod_dir' does not exist\n" if not -e $pod_dir;
    my @pod_files = sort File::Find::Rule->file()->name('*.pod', '*.pm')->relative->in($pod_dir);
    $sl->{docs} = \@pod_files;
    for my $pod_file (@pod_files) {
        $sl->process_pod_file($pod_dir, $pod_file, 1);
    }

    $sl->report_broken_links;
    $sl->report_stats;
    $sl->create_stats_page();
    $sl->create_index() if $index;

    exit;
}


main();

1;
__END__

=head1 NAME

smartlinks.pl - The successor to catalog_tests.pl.

See L<Text::SmartLinks>

=head1 AUTHOR

Agent Zhang (E<lt>agentzh@gmail.comE<gt>) wrote the initial
implementation, getting help from many others in the Pugs team.

=head1 COPYRIGHT

Copyright (c) 2006 - 2009 by the Pugs Team.