#!/usr/bin/env perl
use strict;
use warnings;
use Text::MultiMarkdown qw(markdown);

=head1 NAME

MultiMarkdown.pl - Convert MultiMarkdown syntax to (X)HTML

=head1 DESCRIPTION

This program is distributed as part of Perl's Text::MultiMarkdown module,
illustrating sample usage.

MultiMarkdown.pl can be invoked on any file containing MultiMarkdown-syntax, and
will produce the corresponding (X)HTML on STDOUT:

    $ cat file.txt
    [MultiMarkdown][] *extends* the very well-known [Markdown][] syntax.

    [MultiMarkdown]: http://fletcherpenney.net/What_is_MultiMarkdown
    [Markdown]: http://daringfireball.net/projects/markdown/

    $ multimarkdown file.txt
    <p><a href="http://fletcherpenney.net/What_is_MultiMarkdown">MultiMarkdown</a> <em>extends</em> the very well-known <a href="http://daringfireball.net/projects/markdown/">Markdown</a> syntax.</p>


If no file is specified, it will expect its input from STDIN:

    $ echo "A **simple** test" | multimarkdown
    <p>A <strong>simple</strong> test</p>

=head1 OPTIONS

=over

=item version

Shows the full information for this version

=item shortversion

Shows only the version number

=item html4tags

Produce HTML 4-style tags instead of XHTML - XHTML requires elements
that do not wrap a block (i.e. the C<hr> tag) to state they will not
be closed, by closing with C</E<gt>>. HTML 4-style will plainly output
the tag as it comes:

    $ echo '---' | multimarkdown
    <hr />
    $ echo '---' | multimarkdown --html4tags
    <hr>

=item help

Shows this documentation

=back

=head1 AUTHOR

Copyright 2004 John Gruber

Copyright 2006 Fletcher Penny

Copyright 2008 Tomas Doran

The manpage was written by Gunnar Wolf <gwolf@debian.org> for its use
in Debian systems, but can be freely used elsewhere.

For full licensing information, please refer to
Text::MultiMarkdown.pm's full documentation.

=head1 SEE ALSO

L<Text::MultiMarkdown>, L<http://fletcherpenney.net/What_is_MultiMarkdown>

=cut

#### Check for command-line switches: #################
my %cli_opts;
use Getopt::Long;
Getopt::Long::Configure('pass_through');
GetOptions(\%cli_opts,
    'version',
    'shortversion',
    'html4tags',
    'help'
);
if ($cli_opts{'version'}) {     # Version info
    print "\nThis is MultiMarkdown, version $Text::MultiMarkdown::VERSION.\n";
    print "Copyright 2004 John Gruber\n";
    print "Copyright 2006 Fletcher Penny\n";
    print "Copyright 2008 Tomas Doran\n";
    print "Parts contributed by several other people.";
    print "http://fletcherpenney.net/MultiMarkdown/\n\n";
    exit 0;
}
if ($cli_opts{'shortversion'}) {        # Just the version number string.
    print $Text::MultiMarkdown::VERSION;
    exit 0;
}
if ($cli_opts{'help'}) {
    for my $dir (split m/:/, $ENV{PATH}) {
	my $cmd = "$dir/perldoc";
	exec($cmd, $0) if (-f $cmd and -x $cmd);
    }
    die "perldoc could not be found in your path - Cannot show help, sorry\n";
}
my $m;
if ($cli_opts{'html4tags'}) {           # Use HTML tag style instead of XHTML
    $m = Text::MultiMarkdown->new(empty_element_suffix => '>');
}
else {
    $m = Text::MultiMarkdown->new;
}

sub main {
    my (@fns) = @_;
    
    my $f;
    if (scalar @fns) {
        foreach my $fn (@fns) {
            die("Cannot find file $fn") unless (-r $fn);

            my $fh;
            open($fh, '<', $fn) or die;
            $f = join('', <$fh>);
            close($fh) or die;
        }
    }
    else { # STDIN
        local $/;               # Slurp the whole file
        $f = <>;
    }
    
    return $m->markdown($f);
}

print main(@ARGV) unless caller();