diff options
author | joey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071> | 2006-05-03 21:50:39 +0000 |
---|---|---|
committer | joey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071> | 2006-05-03 21:50:39 +0000 |
commit | af9566ff1ae55d273ff96c7ca39e34265623a55d (patch) | |
tree | be91c4464b174b72efbd6453068e8f7308c49e02 /IkiWiki/Plugin | |
parent | b0952742b29373bd762cf13c258cfd4559a680ad (diff) | |
download | ikiwiki-af9566ff1ae55d273ff96c7ca39e34265623a55d.tar ikiwiki-af9566ff1ae55d273ff96c7ca39e34265623a55d.tar.gz |
rather a lot of changes to make hyperestraier search be a plugin, allowing
for other types of search engine plugins if wanted, and also opening up a
lot of new possibilities for other kinds of plugins later
some notable changes along the way:
- lots of new hook types: cgi, render, delete
- wrapper files fixed to support config strings with newlines in them
- HEADERCONTENT in page template useful for plugins. Probably needs to be
expanded to more such for other places plugins might want to add content.
- remove unnecessary wrappers field from config info stored in wrappers
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r-- | IkiWiki/Plugin/search.pm | 122 | ||||
-rw-r--r-- | IkiWiki/Plugin/skeleton.pm | 33 |
2 files changed, 154 insertions, 1 deletions
diff --git a/IkiWiki/Plugin/search.pm b/IkiWiki/Plugin/search.pm new file mode 100644 index 000000000..c71fef76e --- /dev/null +++ b/IkiWiki/Plugin/search.pm @@ -0,0 +1,122 @@ +#!/usr/bin/perl +# hyperestraier search engine plugin +package IkiWiki::Plugin::search; + +use warnings; +use strict; +use IkiWiki; + +sub import { #{{{ + IkiWiki::hook(type => "checkconfig", id => "hyperestraier", + call => \&checkconfig); + IkiWiki::hook(type => "delete", id => "hyperestraier", + call => \&delete); + IkiWiki::hook(type => "render", id => "hyperestraier", + call => \&render); + IkiWiki::hook(type => "cgi", id => "hyperestraier", + call => \&cgi); +} # }}} + +sub checkconfig () { #{{{ + foreach my $required (qw(url cgiurl)) { + if (! length $IkiWiki::config{$required}) { + IkiWiki::error("Must specify $required when using the search plugin\n"); + } + } + + $IkiWiki::config{headercontent}.=qq{ +<form method="get" action="$IkiWiki::config{cgiurl}" id="searchform"> +<div> +<input type="text" name="phrase" value="" size="16" /> +<input type="hidden" name="enc" value="UTF-8" /> +<input type="hidden" name="do" value="hyperestraier" /> +</div> +</form> +}; +} #}}} + +sub delete (@) { #{{{ + IkiWiki::debug("cleaning hyperestraier search index"); + IkiWiki::estcmd("purge -cl"); + IkiWiki::estcfg(); +} #}}} + +sub render (@) { #{{{ + IkiWiki::debug("updating hyperestraier search index"); + IkiWiki::estcmd("gather -cm -bc -cl -sd", + map { + $IkiWiki::config{destdir}."/".$IkiWiki::renderedfiles{IkiWiki::pagename($_)} + } @_ + ); + IkiWiki::estcfg(); +} #}}} + +sub cgi ($) { #{{{ + my $cgi=shift; + + if (defined $cgi->param('phrase')) { + # only works for GET requests + chdir("$IkiWiki::config{wikistatedir}/hyperestraier") || IkiWiki::error("chdir: $!"); + exec("./".IkiWiki::basename($IkiWiki::config{cgiurl})) || IkiWiki::error("estseek.cgi failed"); + } +} #}}} + +# Easier to keep these in the IkiWiki namespace. +package IkiWiki; + +my $configured=0; +sub estcfg () { #{{{ + return if $configured; + $configured=1; + + my $estdir="$config{wikistatedir}/hyperestraier"; + my $cgi=basename($config{cgiurl}); + $cgi=~s/\..*$//; + open(TEMPLATE, ">$estdir/$cgi.tmpl") || + error("write $estdir/$cgi.tmpl: $!"); + print TEMPLATE misctemplate("search", + "<!--ESTFORM-->\n\n<!--ESTRESULT-->\n\n<!--ESTINFO-->\n\n"); + close TEMPLATE; + open(TEMPLATE, ">$estdir/$cgi.conf") || + error("write $estdir/$cgi.conf: $!"); + my $template=HTML::Template->new( + filename => "$config{templatedir}/estseek.conf" + ); + eval q{use Cwd 'abs_path'}; + $template->param( + index => $estdir, + tmplfile => "$estdir/$cgi.tmpl", + destdir => abs_path($config{destdir}), + url => $config{url}, + ); + print TEMPLATE $template->output; + close TEMPLATE; + $cgi="$estdir/".basename($config{cgiurl}); + unlink($cgi); + symlink("/usr/lib/estraier/estseek.cgi", $cgi) || + error("symlink $cgi: $!"); +} # }}} + +sub estcmd ($;@) { #{{{ + my @params=split(' ', shift); + push @params, "-cl", "$config{wikistatedir}/hyperestraier"; + if (@_) { + push @params, "-"; + } + + my $pid=open(CHILD, "|-"); + if ($pid) { + # parent + foreach (@_) { + print CHILD "$_\n"; + } + close(CHILD) || error("estcmd @params exited nonzero: $?"); + } + else { + # child + open(STDOUT, "/dev/null"); # shut it up (closing won't work) + exec("estcmd", @params) || error("can't run estcmd"); + } +} #}}} + +1 diff --git a/IkiWiki/Plugin/skeleton.pm b/IkiWiki/Plugin/skeleton.pm index 89308c45f..d6d8cc0ed 100644 --- a/IkiWiki/Plugin/skeleton.pm +++ b/IkiWiki/Plugin/skeleton.pm @@ -1,6 +1,7 @@ #!/usr/bin/perl # Ikiwiki skeleton plugin. Replace "skeleton" with the name of your plugin -# in the lines below, and flesh out the code to make it do something. +# in the lines below, remove hooks you don't use, and flesh out the code to +# make it do something. package IkiWiki::Plugin::skeleton; use warnings; @@ -8,14 +9,44 @@ use strict; use IkiWiki; sub import { #{{{ + IkiWiki::hook(type => "checkconfig", id => "skeleton", + call => \&checkconfig); IkiWiki::hook(type => "preprocess", id => "skeleton", call => \&preprocess); + IkiWiki::hook(type => "delete", id => "skeleton", + call => \&delete); + IkiWiki::hook(type => "render", id => "skeleton", + call => \&render); + IkiWiki::hook(type => "cgi", id => "skeleton", + call => \&cgi); } # }}} +sub checkconfig () { #{{{ + IkiWiki::debug("skeleton plugin checkconfig"); +} #}}} + sub preprocess (@) { #{{{ my %params=@_; return "skeleton plugin result"; } # }}} +sub delete (@) { #{{{ + my @files=@_; + + IkiWiki::debug("skeleton plugin told that files were deleted: @files"); +} #}}} + +sub render (@) { #{{{ + my @files=@_; + + IkiWiki::debug("skeleton plugin told that files were rendered: @files"); +} #}}} + +sub cgi ($) { #{{{ + my $cgi=shift; + + IkiWiki::debug("skeleton plugin running in cgi"); +} #}}} + 1 |