summaryrefslogtreecommitdiff
path: root/pandoc-filter-bib
diff options
context:
space:
mode:
Diffstat (limited to 'pandoc-filter-bib')
-rwxr-xr-xpandoc-filter-bib68
1 files changed, 68 insertions, 0 deletions
diff --git a/pandoc-filter-bib b/pandoc-filter-bib
new file mode 100755
index 0000000..27ba8d4
--- /dev/null
+++ b/pandoc-filter-bib
@@ -0,0 +1,68 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+
+use v5.10.1; # use switch keyword "when" (but avoid too complex "given")
+no if $] >= 5.018, warnings => "experimental::smartmatch";
+
+use Pandoc::Filter;
+use Pandoc::Elements;
+
+use Path::Tiny;
+use List::Util qw(pairmap);
+
+my $bibfilename = $ENV{'PANDOC_CITEPROC_FILE'} || 'bibliography.bib';
+my $bibfile = path($bibfilename);
+
+my (@a, $i);
+
+pandoc_filter sub {
+ my $self = shift;
+ return unless ($self->name eq 'RawInline' and $self->format eq 'mediawiki');
+
+ for ($self->content) {
+ when (/^{{cite\s+(\w+)\s*\|([^}]*)}}$/) {
+ my $id = 'ref'.++$i;
+ my @data = pairmap { $b =~ s/"/\\"/g; "$a=\"$b\"" }
+ map { /^\s*(\w+)\s*=\s*"?(.*?)"?\s*$/ }
+ split( /\|/, $2 );
+ push @a, join ",\n",
+ '@'.$1.'{'.$id,
+ @data,
+ '}';
+ return Cite(
+ [{
+ 'citationId' => $id,
+ 'citationPrefix' => [],
+ 'citationSuffix' => [],
+ 'citationMode' => {
+ t => 'NormalCitation',
+ c => [],
+ },
+ 'citationNoteNum' => 0,
+ 'citationHash' => 0,
+ }],
+ [ Str $id ],
+ );
+ }
+ when (/^{{citation needed}}$/) {
+ say STDERR "WARNING: Mediawiki citation needed.";
+ return [
+ Str "citation",
+ Space,
+ Str "needed",
+ ];
+ }
+ default {
+ say STDERR "WARNING: Mediawiki unknown data skipped: "
+ . '"' . $_[0]->content . '"';
+ return Str "";
+ }
+ }
+};
+
+END {
+ $bibfile->spew_utf8( join "\n\n", @a )
+ if (@a);
+}