From af9566ff1ae55d273ff96c7ca39e34265623a55d Mon Sep 17 00:00:00 2001 From: joey Date: Wed, 3 May 2006 21:50:39 +0000 Subject: 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 --- IkiWiki/Plugin/search.pm | 122 +++++++++++++++++++++++++++++++++++++++++++++ IkiWiki/Plugin/skeleton.pm | 33 +++++++++++- 2 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 IkiWiki/Plugin/search.pm (limited to 'IkiWiki/Plugin') 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{ +
+
+ + + +
+
+}; +} #}}} + +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", + "\n\n\n\n\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 -- cgit v1.2.3