#!/usr/bin/env perl
#
# gem2html - opinionated converter text/gemini to html
# public domain
use v5.10;
use strict;
use warnings;
use open ":std", ":encoding(UTF-8)";
my $in_pre = 0;
my $in_list = 0;
while (<>) {
chomp;
if ($in_pre && m/^```/) {
$in_pre = 0;
say "";
} elsif (!$in_pre && m/^```/) {
if ($in_list) {
$in_list = 0;
say "";
}
$in_pre = 1;
print "
";
} elsif ($in_pre) {
say san($_);
} elsif ($in_list && m/^$/) {
say "";
$in_list = 0;
} elsif (m/^\*\s+(.*)/) { # NB: at least one space
if (!$in_list) {
$in_list = "item";
say "
";
} elsif ($in_list eq "link") {
$in_list = "item";
say "
";
say "";
}
output("li", $1);
} elsif (m/^=>\s*([^\s]*)\s*(.*)$/) {
if (!$in_list) {
$in_list = "link";
say "";
} elsif ($in_list eq "item") {
$in_list = "link";
say "
";
say "";
}
say "- ". san($2 || $1) ."
";
} elsif (m/^###\s*(.*)$/) {
output("h3", $1);
} elsif (m/^##\s*(.*)$/) {
output("h2", $1);
} elsif (m/^#\s*(.*)$/) {
output("h1", $1);
} elsif (m/^>\s*(.*)$/) {
output("blockquote", $1);
} else {
output("p", $_);
}
}
sub san {
$_ = shift;
s/&/\&/g;
s/\</g;
s/>/\>/g;
return $_;
}
sub output {
my ($tn, $content) = @_;
if (!$in_list && $tn eq "li") {
$in_list = 1;
say "";
}
if ($in_list && $tn ne "li") {
$in_list = 0;
say "
";
}
return if $tn eq "p" && $content eq "";
say "<$tn>". san($content) ."$tn>";
}