diff options
-rw-r--r-- | IkiWiki/CGI.pm | 13 | ||||
-rw-r--r-- | IkiWiki/Render.pm | 70 | ||||
-rw-r--r-- | basewiki/style.css | 11 | ||||
-rw-r--r-- | debian/control | 2 | ||||
-rw-r--r-- | doc/features.mdwn | 5 | ||||
-rw-r--r-- | doc/ikiwiki.setup | 2 | ||||
-rw-r--r-- | doc/todo/done/search.mdwn (renamed from doc/todo/search.mdwn) | 0 | ||||
-rw-r--r-- | doc/usage.mdwn | 5 | ||||
-rwxr-xr-x | ikiwiki | 5 | ||||
-rw-r--r-- | templates/estseek.conf | 21 | ||||
-rw-r--r-- | templates/misc.tmpl | 6 | ||||
-rw-r--r-- | templates/page.tmpl | 8 |
12 files changed, 144 insertions, 4 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 diff --git a/basewiki/style.css b/basewiki/style.css index 97b30fbf8..6da3e6253 100644 --- a/basewiki/style.css +++ b/basewiki/style.css @@ -1,11 +1,11 @@ #header h1 { margin: 0; - padding: 2px 0; + padding: 0 0; } #actions ul { margin: 0; - padding: 2px; + padding: 6px; list-style-type: none; border-bottom: 1px solid #000; } @@ -15,6 +15,11 @@ padding: .2em .4em; } +#searchform { + display: inline; + float: right; +} + #content { border-bottom: 1px solid #000; } @@ -23,8 +28,8 @@ #blogform { padding: 10px 10px; border: 1px solid #aaa; - color: black !important;; background: #eee; + color: black !important; } #backlinks { diff --git a/debian/control b/debian/control index 1d69e55a5..8eaffedb6 100644 --- a/debian/control +++ b/debian/control @@ -8,7 +8,7 @@ Standards-Version: 3.6.2 Package: ikiwiki Architecture: all Depends: ${perl:Depends}, markdown, libhtml-template-perl, libcgi-formbuilder-perl, libtime-duration-perl, libcgi-session-perl, libmail-sendmail-perl, gcc | c-compiler -Recommends: subversion +Recommends: subversion, hyperestraier Suggests: viewcvs Description: a wiki compiler ikiwiki converts a directory full of wiki pages into html pages suitable diff --git a/doc/features.mdwn b/doc/features.mdwn index eaf0d539f..3b3b8ff9b 100644 --- a/doc/features.mdwn +++ b/doc/features.mdwn @@ -102,6 +102,11 @@ Currently implemented: Wiki admins can lock pages so that only other admins can edit them. +* Full text search + + ikiwiki can use the [[HyperEstraier]] search engine to add powerful + full text search capabilities to your wiki. + ---- It also has some [[TODO]] items and [[Bugs]]. diff --git a/doc/ikiwiki.setup b/doc/ikiwiki.setup index bd82f3d10..17b647e75 100644 --- a/doc/ikiwiki.setup +++ b/doc/ikiwiki.setup @@ -46,4 +46,6 @@ use IkiWiki::Setup::Standard { #anonok => 1, # Generate rss feeds for pages? rss => 1, + # Use the Hyper Estraier search engine? + #hyperestraier => 1, } diff --git a/doc/todo/search.mdwn b/doc/todo/done/search.mdwn index cbbec7d97..cbbec7d97 100644 --- a/doc/todo/search.mdwn +++ b/doc/todo/done/search.mdwn diff --git a/doc/usage.mdwn b/doc/usage.mdwn index 9a8b97ceb..228d4e595 100644 --- a/doc/usage.mdwn +++ b/doc/usage.mdwn @@ -143,6 +143,11 @@ These options configure the wiki. Currently allows locking of any page, other powers may be added later. May be specified multiple times for multiple admins. +* --hyperestraier + + Enables use of the [[HyperEstraier]] search engine for full test page + searches. + * --verbose Be vebose about what it's doing. @@ -36,6 +36,7 @@ sub getconfig () { #{{{ rebuild => 0, refresh => 0, getctime => 0, + hyperestraier => 0, wrapper => undef, wrappermode => undef, srcdir => undef, @@ -57,6 +58,7 @@ sub getconfig () { #{{{ "wrappermode=i" => \$config{wrappermode}, "svn!" => \$config{svn}, "anonok!" => \$config{anonok}, + "hyperestraier" => \$config{hyperestraier}, "rss!" => \$config{rss}, "cgi!" => \$config{cgi}, "url=s" => \$config{url}, @@ -102,6 +104,9 @@ sub checkconfig () { #{{{ if ($config{rss} && ! length $config{url}) { error("Must specify url to wiki with --url when using --rss\n"); } + if ($config{hyperestraier} && ! length $config{url}) { + error("Must specify --url when using --hyperestraier\n"); + } $config{wikistatedir}="$config{srcdir}/.ikiwiki" unless exists $config{wikistatedir}; diff --git a/templates/estseek.conf b/templates/estseek.conf new file mode 100644 index 000000000..91e144d78 --- /dev/null +++ b/templates/estseek.conf @@ -0,0 +1,21 @@ +indexname: <TMPL_VAR INDEX> +tmplfile: <TMPL_VAR TMPLFILE> +topfile: /dev/null +logfile: +replace: ^file://<TMPL_VAR DESTDIR>{{!}}<TMPL_VAR URL> +showreal: false +perpage: 10,20,30,40,50,100 +attrselect: false +showscore: false +extattr: date|Date +snipwwidth: 480 +sniphwidth: 96 +snipawidth: 96 +condgstep: 2 +dotfidf: true +scancheck: false +smplphrase: true +candetail: true +smlrvnum: 0 +clipview: 2 +spcache: diff --git a/templates/misc.tmpl b/templates/misc.tmpl index 98d60d703..442db8c21 100644 --- a/templates/misc.tmpl +++ b/templates/misc.tmpl @@ -8,13 +8,19 @@ </head> <body> +<div id="header"> <h1> <TMPL_VAR INDEXLINK>/ <TMPL_VAR TITLE> </h1> +</div> +<div id="content"> <TMPL_VAR PAGEBODY> +</div> +<div id="footer"> <!-- from <TMPL_VAR NAME=WIKINAME> --> +</div> </body> </html> diff --git a/templates/page.tmpl b/templates/page.tmpl index 8b018ddfb..fb7383acb 100644 --- a/templates/page.tmpl +++ b/templates/page.tmpl @@ -15,6 +15,13 @@ </TMPL_LOOP> <TMPL_VAR TITLE> </h1> +<TMPL_IF NAME="HYPERESTRAIERURL"> +<form method="get" action="<TMPL_VAR HYPERESTRAIERURL>" id="searchform"> +<input type="text" name="phrase" value="" size="32" /> +<input type="submit" value="Search" /> +<input type="hidden" name="enc" value="UTF-8" /> +<input type="hidden" name="do" value="hyperestraier" /> +</TMPL_IF> </div> <div id="actions"> @@ -36,6 +43,7 @@ </TMPL_IF> <li><TMPL_VAR DISCUSSIONLINK><br /></li> + </ul> </div> |