161 lines
3.1 KiB
Perl
Executable File
161 lines
3.1 KiB
Perl
Executable File
#! /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";
|
|
|
|
<link rel="stylesheet" href="$style_sheet" />
|
|
END_HTML
|
|
}
|
|
|
|
print OUT <<'END_HTML';
|
|
<!DOCTYPE html>
|
|
<html lang="en-US">
|
|
<head>
|
|
END_HTML
|
|
|
|
my $title = <IN>;
|
|
chomp $title;
|
|
my $old_title = $title;
|
|
$title =~ s/^#\s*//;
|
|
|
|
print OUT <<"END_HTML";
|
|
<title>$title</title>
|
|
<meta charset="utf-8" />$style_stanza </head>
|
|
<body>
|
|
END_HTML
|
|
|
|
my $line = convert_gmi_line($old_title);
|
|
print OUT " $line";
|
|
|
|
foreach $line (<IN>) {
|
|
chomp $line;
|
|
my $out = convert_gmi_line($line);
|
|
|
|
if (defined $out) {
|
|
print OUT " $out";
|
|
}
|
|
}
|
|
|
|
print OUT <<'END_HTML';
|
|
</body>
|
|
</html>
|
|
END_HTML
|
|
|
|
sub convert_gmi_line {
|
|
state $pre = 0;
|
|
state $list = 0;
|
|
|
|
my ($line) = @_;
|
|
|
|
if ($pre == 1) {
|
|
if ($line eq '```') {
|
|
$pre = 0;
|
|
return "</pre>\n";
|
|
}
|
|
|
|
return " $line\n";
|
|
}
|
|
|
|
if ($line eq '```') {
|
|
$pre = 1;
|
|
|
|
if ($list == 1) {
|
|
$list = 0;
|
|
return "</ul>\n <pre>\n";
|
|
}
|
|
|
|
return "<pre>\n";
|
|
}
|
|
|
|
if ($list == 0) {
|
|
if ($line =~ /^\* /) {
|
|
$list = 1;
|
|
my $listitem = convert_gmi_line($line);
|
|
|
|
return "<ul>\n $listitem";
|
|
}
|
|
}
|
|
else {
|
|
if (not $line =~ /^\* /) {
|
|
$list = 0;
|
|
my $nextline = convert_gmi_line($line);
|
|
|
|
if (defined $nextline) {
|
|
return "</ul>\n $nextline";
|
|
}
|
|
else {
|
|
return "</ul>\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
given($line) {
|
|
when(/^=>/) {
|
|
$line =~ m/^=>\s*([^\s]*)\s*(.*)$/;
|
|
my $link = $1;
|
|
my $text = $2;
|
|
$link =~ s/\.gmi/\.html/;
|
|
|
|
return "<p><a href=\"$link\">$text</a></p>\n";
|
|
}
|
|
when(/^#[^#]/) {
|
|
$line =~ s/^#\s*//;
|
|
|
|
return "<h1>$line</h1>\n";
|
|
}
|
|
when(/^##[^#]/) {
|
|
$line =~ s/^##\s*//;
|
|
|
|
return "<h2>$line</h2>\n";
|
|
}
|
|
when(/^###/) {
|
|
$line =~ s/^###\s*//;
|
|
|
|
return "<h3>$line</h3>\n";
|
|
}
|
|
when(/^\*\s*/) {
|
|
$line =~ s/^\*\s*//;
|
|
|
|
return " <li>$line</li>\n";
|
|
}
|
|
when(/^>/) {
|
|
$line =~ s/^>\s*//;
|
|
|
|
return "<blockquote>$line</blockquote>\n";
|
|
}
|
|
default {
|
|
if ($line eq '') {
|
|
return undef;
|
|
}
|
|
|
|
return "<p>$line</p>\n";
|
|
}
|
|
}
|
|
}
|