124 lines
2.6 KiB
Plaintext
124 lines
2.6 KiB
Plaintext
|
#!/usr/bin/perl
|
||
|
|
||
|
use strict;
|
||
|
use warnings;
|
||
|
|
||
|
use File::Which;
|
||
|
use File::Path qw(make_path);
|
||
|
use JSON;
|
||
|
|
||
|
# Accept input on stdin regardless of whether the 'md2gemini' executable
|
||
|
# is present, to avoid "Broken pipe" errors from mdBook.
|
||
|
|
||
|
my $data;
|
||
|
{
|
||
|
local $/;
|
||
|
undef $/;
|
||
|
$data = <>;
|
||
|
}
|
||
|
|
||
|
if (! defined which 'md2gemini') {
|
||
|
print "'md2gemini' not found in PATH; not building Gemini output\n";
|
||
|
# We can't return non-zero here, as that would cause the entire
|
||
|
# mdBook build process to fail.
|
||
|
exit 0;
|
||
|
}
|
||
|
|
||
|
my $json = JSON->new->decode($data);
|
||
|
my $sections = $json->{book}->{sections};
|
||
|
|
||
|
# Create toc.gmi from SUMMARY.md
|
||
|
|
||
|
my $leader;
|
||
|
|
||
|
open(my $summary, '<', '../../src/SUMMARY.md')
|
||
|
or die "Can't open SUMMARY.md for reading: $!\n";
|
||
|
open(my $toc, '>', 'toc.gmi')
|
||
|
or die "Can't open toc.gmi for writing: $!\n";
|
||
|
|
||
|
print $toc "# Table of Contents\n\n";
|
||
|
while (<$summary>) {
|
||
|
|
||
|
if (/^(\s*)- \[([^\]]+)\]\(([^\)]+)\)/) {
|
||
|
|
||
|
my $depth = $1;
|
||
|
my $heading = $2;
|
||
|
my $path = $3;
|
||
|
|
||
|
if (length($depth) == 0) {
|
||
|
$leader = '-';
|
||
|
} else {
|
||
|
$leader = '-' x (1 + (length($depth) / 3));
|
||
|
}
|
||
|
|
||
|
$path =~ s/\.md$/.gmi/;
|
||
|
|
||
|
print $toc "=> " . $path . " " . $leader . " " . $heading . "\n";
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
close($summary)
|
||
|
or die "Can't close SUMMARY.md after reading: $!\n";
|
||
|
close($toc)
|
||
|
or die "Can't close toc.gmi after writing: $!\n";
|
||
|
|
||
|
# Create individual pages.
|
||
|
|
||
|
foreach my $i (@$sections) {
|
||
|
process_json($i);
|
||
|
}
|
||
|
|
||
|
exit 0;
|
||
|
|
||
|
|
||
|
### Functions
|
||
|
|
||
|
sub process_json {
|
||
|
|
||
|
my $i = shift;
|
||
|
my $type = ref($i);
|
||
|
if ($type eq 'HASH') {
|
||
|
if (defined $i->{content}) {
|
||
|
process_content($i->{path},$i->{content});
|
||
|
}
|
||
|
if (defined $i->{Chapter}) {
|
||
|
process_json($i->{Chapter});
|
||
|
}
|
||
|
if (defined $i->{sub_items}) {
|
||
|
foreach my $j ($i->{sub_items}) {
|
||
|
process_json($j);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if ($type eq 'ARRAY') {
|
||
|
foreach my $j (@{$i}) {
|
||
|
process_json($j);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sub process_content {
|
||
|
|
||
|
my $path = shift;
|
||
|
my $directory = $path;
|
||
|
my $filename = $path;
|
||
|
my $content = shift;
|
||
|
my $fh;
|
||
|
|
||
|
$directory =~ s|/[^/]+\.md$||;
|
||
|
$filename =~ s|^.*/([^/]+)\.md$|$1.gmi|;
|
||
|
|
||
|
make_path($directory);
|
||
|
|
||
|
open($fh, "| md2gemini --links copy --md-links --ascii-table > " .
|
||
|
$directory . '/' . $filename)
|
||
|
or die "Can't open pipe to md2gemini: $!\n";
|
||
|
print $fh $content;
|
||
|
print $fh "\n\n" . "=> /toc.gmi Table of Contents" . "\n";
|
||
|
close $fh
|
||
|
or die "Can't close pipe to md2gemini: $!\n";
|
||
|
|
||
|
}
|