145 lines
2.8 KiB
Plaintext
145 lines
2.8 KiB
Plaintext
|
#! /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\n";
|
||
|
|
||
|
foreach $line (<IN>) {
|
||
|
chomp $line;
|
||
|
my $out = convert_gmi_line($line);
|
||
|
|
||
|
if (defined $out) {
|
||
|
print OUT " $out\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
print OUT <<'END_HTML';
|
||
|
</body>
|
||
|
</html>
|
||
|
END_HTML
|
||
|
|
||
|
sub convert_gmi_line {
|
||
|
state $mode = 'normal';
|
||
|
state $list = 0;
|
||
|
|
||
|
my ($line) = @_;
|
||
|
|
||
|
if ($mode eq 'pre') {
|
||
|
if ($line eq '```') {
|
||
|
$mode = 'normal';
|
||
|
return undef;
|
||
|
}
|
||
|
|
||
|
return $line;
|
||
|
}
|
||
|
|
||
|
if ($line =~ /^\* /) {
|
||
|
if ($list == 0) {
|
||
|
return '<ul>';
|
||
|
$list = 1;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
if ($list == 1) {
|
||
|
return '</ul>';
|
||
|
$list = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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>";
|
||
|
}
|
||
|
when(/^#[^#]/) {
|
||
|
$line =~ s/^#\s*//;
|
||
|
|
||
|
return "<h1>$line</h1>";
|
||
|
}
|
||
|
when(/^##[^#]/) {
|
||
|
$line =~ s/^##\s*//;
|
||
|
|
||
|
return "<h2>$line</h2>";
|
||
|
}
|
||
|
when(/^###/) {
|
||
|
$line =~ s/^###\s*//;
|
||
|
|
||
|
return "<h3>$line</h3>";
|
||
|
}
|
||
|
when(/^\*\s*/) {
|
||
|
$line =~ s/^\*\s*//;
|
||
|
|
||
|
return "<li>$line</li>";
|
||
|
}
|
||
|
when(/^>/) {
|
||
|
$line =~ s/^>//;
|
||
|
|
||
|
return "<blockquote>$line</blockquote>";
|
||
|
}
|
||
|
when('```') {
|
||
|
$mode = 'pre';
|
||
|
return undef;
|
||
|
}
|
||
|
default {
|
||
|
if ($line eq '') {
|
||
|
return undef;
|
||
|
}
|
||
|
|
||
|
return "<p>$line</p>";
|
||
|
}
|
||
|
}
|
||
|
}
|