Basic pandoc module
This commit is contained in:
parent
43585ac89e
commit
ec491f6c98
1 changed files with 49 additions and 0 deletions
49
lib/Pandoc.rakumod
Normal file
49
lib/Pandoc.rakumod
Normal file
|
@ -0,0 +1,49 @@
|
|||
#| Interaction with pandoc
|
||||
unit module Pandoc;
|
||||
|
||||
use JSON::Fast;
|
||||
|
||||
sub markdown-title(IO::Path:D $file --> Str:D) is export {
|
||||
# Call into pandoc
|
||||
my $pandoc = run 'pandoc', '-t', 'JSON', $file, :out, :err;
|
||||
my $output = $pandoc.out.slurp: :close;
|
||||
my $stderr = $pandoc.err.slurp: :close;
|
||||
|
||||
# Throw an error if pandoc failed
|
||||
if !$pandoc {
|
||||
die "Pandoc exited with {$pandoc.exitcode}\nout: $output\nerr: $stderr";
|
||||
}
|
||||
|
||||
# Parse out output from pandoc, we are making an executive decision to trust
|
||||
# pandoc here, so we won't do any error handling for pandoc's output
|
||||
my $parsed = from-json $output;
|
||||
# Extract a list of top level headers from the pandoc output, this should
|
||||
# only have one element in it, but as this is user input, its untrusted and
|
||||
# we need to do some error handling
|
||||
my @headers = $parsed.blocks.grep(*.t == "Header").grep(*.c[0] == 1);
|
||||
if @headers.elems > 1 {
|
||||
die "More than one top level header in $file";
|
||||
};
|
||||
if @headers.elems == 0 {
|
||||
die "No top level hearders in $file";
|
||||
};
|
||||
|
||||
# Extract the header and process it into a string
|
||||
my @header = @headers[0].c[2];
|
||||
my $title = "";
|
||||
for @header -> $component {
|
||||
given $component.t {
|
||||
when "Str" {
|
||||
$title = $title ~ $component.c;
|
||||
}
|
||||
when "Space" {
|
||||
$title = $title ~ " ";
|
||||
}
|
||||
default {
|
||||
die "Invalid component type: $_";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $title;
|
||||
}
|
Loading…
Add table
Reference in a new issue