]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blob - doc/plugins/contrib/bibtex2html.mdwn
answer: an exec plugin?
[git.ikiwiki.info.git] / doc / plugins / contrib / bibtex2html.mdwn
1 [[!template id=plugin name=bibtex2html author="[[anarcat]]"]]
2 [[!tag type/format]]
4 Trivial plugin to implement [[todo/BibTeX]] support simply using [bibtex2html](https://www.lri.fr/~filliatr/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.
6 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.
8 [[!format perl """
9 #!/usr/bin/perl
10 package IkiWiki::Plugin::bibtex2html;
11 use warnings;
12 use strict;
13 use IkiWiki 3.00;
14 use open qw{:utf8 :std};
16 sub import {
17         hook(type => "getsetup", id => "bibtex2html",  call => \&getsetup);
18         hook(type => "preprocess", id => "bibtex2html", call => \&bibtex2html);
19 }
21 sub getsetup () {
22         return
23                 plugin => {
24                         safe => 0,
25                         rebuild => undef,
26                         section => "core",
27                 },
28 }
30 sub bibtex2html {
31     my %params=@_;
33     # check the files exist
34     my $file=shift;
35     if (! defined $file) {
36         error sprintf(gettext('file parameter is required'));
37     }
38     my $near = bestlink($params{page}, $file);
39     if (! $near) {
40         error sprintf(gettext('cannot find bestlink for "%s"'), $file);
41     }
42     if (! exists $pagesources{$near}) {
43         error sprintf(gettext('cannot find file "%s"'), $near);
44     }
45     add_depends($params{page}, $near);
46     $near = srcfile($near);
47     my @bibtex_cmd = (qw[bibtex2html -noheader -nofooter -nobibsource -nodoc -q -o -], $near);
48     
49     open(PIPE, "-|", @bibtex_cmd)
50         || error "can't open pipe to @bibtex_cmd: $!";
51     my $html = join("", <PIPE>);
52     close PIPE;
53     debug "ran @bibtex_cmd: $html";
54     return "<div class=\"bibtex2html\">$html<!-- The above was generated with @bibtex_cmd--></div>";
55 }
57 1;
58 """]]
60 This could be extended to process `.bib` files directly as source files instead of injecting them in the HTML like this.
62 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.
64 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]]