dotfiles/bin/gmi2html

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";
}
}
}