Change Markdown templating engine

This commit is contained in:
snow flurry 2024-06-15 21:10:34 -07:00
parent e89cb21c82
commit b848bc58c9
2 changed files with 136 additions and 30 deletions

129
build.pl
View file

@ -9,7 +9,7 @@ use File::Slurp;
use POSIX qw(strftime);
use Text::FrontMatter::YAML;
use Text::Template;
use Text::MultiMarkdown 'markdown';
use Markdent::Simple::Fragment;
use strict;
use utf8;
@ -31,6 +31,69 @@ my $post_tmpl = Text::Template->new(SOURCE => "$tmpl_dir/post.html.tmpl");
my $assets_path = $cwd . ASSETS_PATH;
my $out_path = $cwd . OUT_PATH;
my $postout_path = $out_path . POSTS_PATH;
my $return_link = qq{<img src="/assets/img/return.gif" />};
# used across a couple functions
my $parser = Markdent::Simple::Fragment->new;
sub make_fragment {
my $body = shift;
$parser->markdown_to_html(
dialect => 'GitHub',
markdown => $body,
);
}
sub strip_id {
my $id = shift;
$id =~ s/[ \t]/-/g;
$id =~ s/[^A-Za-z0-9_-]//g;
return $id;
}
sub do_footnotes {
my $text = shift;
my %footnotes;
my @used;
my $footnote_counter = 0;
# First grab the definitions
while ($text =~ s{
\n\[\^([^\n]+?)\]\:[ \t]*
\n?
(.*?)(?:\n{1,2} # end at new paragraph
(?=\n[ ]{0,4}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
}{\n}sx) {
my $id = strip_id($1);
$footnotes{$1} = make_fragment(qq{$2 [$return_link](#fnref:$id)});
}
# then replace the inline footnotes
$text =~ s{
\[\^(.*?)\]
}{
my $result = '';
my $id = strip_id($1);
if (defined $footnotes{$id}) {
$footnote_counter++;
$result = qq{<sup>[<a href="#fn:$id" id="fnref:$id" class="footnote">$footnote_counter</a>]</sup>};
push(@used, $id);
}
$result;
}xsge;
my $fn_block = qq{<div id="footnotes"><hr /><ol>};
# finally, append the footnotes
foreach my $id (@used) {
my $footnote = $footnotes{$id};
$fn_block .= qq{<li id="fn:$id">$footnote</li>};
}
$fn_block .= qq{</ol></div>};
return ($text, $fn_block);
}
# Converts a post file to a metadata hash.
#
@ -49,19 +112,65 @@ sub post_to_meta {
my $metadata = $mdfm->frontmatter_hashref;
if (chomp($mdfm->body_text) ne "") {
my $parser = Text::MultiMarkdown->new(
disable_bibliography => 1,
use_metadata => 0,
document_format => 'fragment'
);
chomp(my $body = $mdfm->data_text);
if ($body ne "") {
# for very funny bits, i assure you
$mdfm->body_text =~ s{\$cn\$}{
"<a class=\"fn\">[citation needed]</a>"
$body =~ s{\[\^citation\sneeded\]}{
"<sup>[<i>citation needed</i>]</sup>"
}egm;
$metadata->{content} = $parser->markdown( $mdfm->body_text );
my $tag_attrs = qr{
(?: # Match one attr name/value pair
\s+ # There needs to be at least some whitespace
# before each attribute name.
[\w.:_-]+ # Attribute name
\s*=\s*
(?:
".+?" # "Attribute value"
|
'.+?' # 'Attribute value'
|
[^\s]+? # AttributeValue (HTML5)
)
)* # Zero or more
}x;
my $markdown_attr = qr{ \s* markdown \s* = \s* (['"]) (.*?) \1 }xs;
my $empty_tag = qr{< \w+ $tag_attrs \s* />}oxms;
use Text::Balanced qw(gen_extract_tagged);
my $extract_block = gen_extract_tagged(qr{< div $tag_attrs \s* >}oxms,
undef,
undef,
{ ignore => [$empty_tag] });
$body =~ s{
(
<div.*?</div>
)
}{
my $return = $1;
my ($tag, $remainder, $prefix, $opening_tag, $text_in_tag, $closing_tag) = $extract_block->($return);
if ($tag) {
if ($opening_tag =~ s/$markdown_attr//i) {
my $markdown = $2;
if ($markdown =~ /^(1|on|yes)$/) {
$tag = $prefix . $opening_tag . "\n"
. make_fragment($text_in_tag) . "\n" . $closing_tag;
} else {
$tag = $prefix . $opening_tag . $text_in_tag . $closing_tag;
}
$return = $tag;
}
}
$return;
}egmxs;
my $fn_body;
($body, $fn_body) = do_footnotes($body);
$fn_body = "" unless defined $fn_body;
$metadata->{content} = make_fragment($body) . $fn_body;
}
# HACK: Stuffing the basename in the metadata because I don't want

View file

@ -3,9 +3,10 @@
use strict;
use utf8;
use Getopt::Std;
use Tie::File;
use File::Slurp;
use Text::FrontMatter::YAML;
$::VERSION = "1.0.0";
$::VERSION = "2.0.0";
getopts("ne", \my %opts);
@ -23,24 +24,20 @@ if (defined $opts{n}) {
my $timestamp = time;
my $fname = shift @ARGV;
tie my @fharr, 'Tie::File', $fname or die $!;
my $done = 0;
for (@fharr) {
if (s/^$metavar=.+/$metavar=$timestamp/) {
print "$fname:$.: Overwriting existing \`$metavar\'\n";
$done++;
}
if (s/^(--.+?--)$/$metavar=$timestamp\n$1/) {
print "$fname:$.: Inserting new \`$metavar\'\n";
$done++;
}
last if ($done);
}
my $fdata = read_file($fname);
my $mdfm = Text::FrontMatter::YAML->new(
document_string => $fdata
);
if (!$done) {
print "$fname: No content and no \`$metavar\', inserting at end\n";
push @fharr, "$metavar=$timestamp";
}
my $metadata = $mdfm->frontmatter_hashref;
$metadata->{$metavar} = $timestamp;
untie @fharr;
my $wrfm = Text::FrontMatter::YAML->new(
frontmatter_hashref => $metadata,
data_text => $mdfm->data_text
);
write_file($fname, $wrfm->document_string);
1;