#! /usr/bin/perl use strict; use warnings; use feature qw(state); use experimental qw(switch); my $input_file = $ARGV[0]; my $output_file = $ARGV[1]; my $style_sheet = $ARGV[2]; if (defined $input_file and $input_file ne "-") { open IN, $input_file or die "Could not open input file $input_file!"; } else { *IN = *STDIN; } if (defined $output_file and $output_file ne "-") { open OUT, $output_file or die "Could not open output file $output_file!"; } else { *OUT = *STDOUT; } my $style_stanza = <<'END_HTML'; END_HTML if (defined $style_sheet) { $style_stanza = <<"END_HTML"; END_HTML } print OUT <<'END_HTML'; END_HTML my $title = ; chomp $title; my $old_title = $title; $title =~ s/^#\s*//; print OUT <<"END_HTML"; $title $style_stanza END_HTML my $line = convert_gmi_line($old_title); print OUT " $line"; foreach $line () { chomp $line; my $out = convert_gmi_line($line); if (defined $out) { print OUT " $out"; } } print OUT <<'END_HTML'; END_HTML sub convert_gmi_line { state $pre = 0; state $list = 0; my ($line) = @_; if ($pre == 1) { if ($line eq '```') { $pre = 0; return "\n"; } return " $line\n"; } if ($line eq '```') { $pre = 1; if ($list == 1) { $list = 0; return "\n
\n";
        }

        return "
\n";
    }

    if ($list == 0) {
        if ($line =~ /^\* /) {
            $list = 1;
            my $listitem = convert_gmi_line($line);

            return "
    \n $listitem"; } } else { if (not $line =~ /^\* /) { $list = 0; my $nextline = convert_gmi_line($line); if (defined $nextline) { return "
\n $nextline"; } else { return "\n"; } } } given($line) { when(/^=>/) { $line =~ m/^=>\s*([^\s]*)\s*(.*)$/; my $link = $1; my $text = $2; $link =~ s/\.gmi/\.html/; return "

$text

\n"; } when(/^#[^#]/) { $line =~ s/^#\s*//; return "

$line

\n"; } when(/^##[^#]/) { $line =~ s/^##\s*//; return "

$line

\n"; } when(/^###/) { $line =~ s/^###\s*//; return "

$line

\n"; } when(/^\*\s*/) { $line =~ s/^\*\s*//; return "
  • $line
  • \n"; } when(/^>/) { $line =~ s/^>\s*//; return "
    $line
    \n"; } default { if ($line eq '') { return undef; } return "

    $line

    \n"; } } }