Plugin: bibtex2html
Author: anarcat
Included in ikiwiki: no
Enabled by default: no
Included in goodstuff: no
Currently enabled: no

Trivial plugin to implement BibTeX support simply using bibtex2html. It only takes a bib file as an argument and dumps whatever bibtex2html returns for it, so it shows all the entries, something that is not really possible with the existing bibtex plugin, as that one requires you to explicitly state every citation you want to show.

It is hopefully secure enough, but I have still marked it as unsafe because I am worried about parameter expansion in bibtex calls from bibtex2html that wouldn't escape those characters properly. The pipeline is called safely, but certain -flags could be maliciously added to the filenames somehow.

#!/usr/bin/perl
package IkiWiki::Plugin::bibtex2html;
use warnings;
use strict;
use IkiWiki 3.00;
use open qw{:utf8 :std};

sub import {
    hook(type => "getsetup", id => "bibtex2html",  call => \&getsetup);
    hook(type => "preprocess", id => "bibtex2html", call => \&bibtex2html);
}

sub getsetup () {
    return
        plugin => {
            safe => 0,
            rebuild => undef,
                        section => "core",
        },
}

sub bibtex2html {
    my %params=@_;

    # check the files exist
    my $file=shift;
    if (! defined $file) {
        error sprintf(gettext('file parameter is required'));
    }
    my $near = bestlink($params{page}, $file);
    if (! $near) {
        error sprintf(gettext('cannot find bestlink for "%s"'), $file);
    }
    if (! exists $pagesources{$near}) {
        error sprintf(gettext('cannot find file "%s"'), $near);
    }
    add_depends($params{page}, $near);
    $near = srcfile($near);
    my @bibtex_cmd = (qw[bibtex2html -noheader -nofooter -nobibsource -nodoc -q -o -], $near);
    
    open(PIPE, "-|", @bibtex_cmd)
        || error "can't open pipe to @bibtex_cmd: $!";
    my $html = join("", <PIPE>);
    close PIPE;
    debug "ran @bibtex_cmd: $html";
    return "<div class=\"bibtex2html\">$html<!-- The above was generated with @bibtex_cmd--></div>";
}

1;

This could be extended to process .bib files directly as source files instead of injecting them in the HTML like this.

The plugin is generic enough that it could be abstracted to do more than just bibtex2html, in a manner similar to the compile plugin. Unfortunately, the compile plugin gives too much power to the user providing input to the wiki, which can modify even the commands being run in the directives. There is therefore some room here to make generic preprocessor or even htmlize plugin that would take a hash of extension -> command configuration to turn (say) .bib or .tex files into HTML or PDF or whatever you fancy.

Obviously, this very plugin should have been implemented with Text::Bibtex because forking to bibtex2html is expensive. Yet I haven't found a way to do what this plugin does with the existing bibtex module. bibtex could of course be extended and then render this plugin obsolete, but I have found it simpler to just reuse an existing working rendered than rewrite my own in Perl. --anarcat