diff options
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/CGI.pm | 13 | ||||
-rw-r--r-- | IkiWiki/Render.pm | 70 |
2 files changed, 83 insertions, 0 deletions
diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index f360b6778..08d796142 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -475,12 +475,22 @@ sub cgi_editpage ($$) { #{{{ } } #}}} +sub cgi_hyperestraier () { #{{{ + # only works for GET requests + chdir("$config{wikistatedir}/hyperestraier") || error("chdir: $!"); + exec("./".basename($config{cgiurl})) || error("estseek.cgi failed"); +} #}}} + sub cgi () { #{{{ eval q{use CGI}; eval q{use CGI::Session}; my $q=CGI->new; + if (defined $q->param('phrase')) { + cgi_hyperestraier(); + } + my $do=$q->param('do'); if (! defined $do || ! length $do) { error("\"do\" parameter missing"); @@ -491,6 +501,9 @@ sub cgi () { #{{{ cgi_recentchanges($q); return; } + elsif ($do eq 'hyperestraier') { + cgi_hyperestraier(); + } CGI::Session->name("ikiwiki_session_$config{wikiname}"); diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 9e340c26e..8375cfe7a 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -214,6 +214,9 @@ sub genpage ($$$) { #{{{ $u=~s/\[\[file\]\]/$pagesources{$page}/g; $template->param(historyurl => $u); } + if ($config{hyperestraier}) { + $template->param(hyperestraierurl => cgiurl()); + } if ($config{rss} && $inlinepages{$page}) { $template->param(rssurl => rsspage(basename($page))); @@ -381,6 +384,56 @@ sub prune ($) { #{{{ } } #}}} +sub estcfg () { #{{{ + 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; + symlink("/usr/lib/estraier/estseek.cgi", + "$estdir/".basename($config{cgiurl})) || + error("symlink: $!"); +} # }}} + +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"); + } +} #}}} + sub refresh () { #{{{ # find existing pages my %exists; @@ -505,6 +558,7 @@ FILE: foreach my $file (@files) { if (globlist_match($page, $inlinepages{$p})) { debug("rendering $f, which inlines $page"); render($f); + $rendered{$f}=1; last; } } @@ -539,9 +593,25 @@ FILE: foreach my $file (@files) { if (defined $linkfile) { debug("rendering $linkfile, to update its backlinks"); render($linkfile); + $rendered{$linkfile}=1; } } } + + if ($config{hyperestraier} && (%rendered || @del)) { + debug("updating hyperestraier search index"); + if (%rendered) { + estcmd("gather -cm -bc -cl -sd", + map { $config{destdir}."/".$renderedfiles{pagename($_)} } + keys %rendered); + } + if (@del) { + estcmd("purge -cl"); + } + + debug("generating hyperestraier cgi config"); + estcfg(); + } } #}}} 1 |