diff options
Diffstat (limited to 'pandoc-filter-bib')
-rwxr-xr-x | pandoc-filter-bib | 68 |
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); +} |