zenwerks - 2005-08-17

I coded up a page search for v1.0.4:
Here are the modifications to files:

# added: rs to English.pl
$txt{'98'} = 'Search'; # in the header - to search site pages.
$txt{'99'} = 'Search for:'; # on the search page
$txt{'100'} = 'Search > >'; # on the search submit button
$txt{'101'} = ''; # default text for search
$txt{'102'} = 'Search Results for'; # search results page.
$txt{'103'} = 'You did not enter anything to search on!'; # search error.
$txt{'104'} = 'No results found.'; # no results found

# IN PageTemplate.pl
#rs new sub
sub print_SearchForm() {
    print qq~<h1></h1><p>
    <form name="sf" method="get" action="$WikiURL?action=startsearch">
      <input type="hidden" name="action" value="startsearch">
      $txt{'99'} <input type="text" name="searchstring" size="40" value="$txt{'101'}">
    </form>
    <br><br><input type="button" value="$txt{'100'}" onClick="javascript:document.sf.submit()" />
    </p>~;
}

#rs new sub
sub print_SearchResults() {
    my $string = shift; # search string
    $string =~ s/\<.*?\>//g;      # Simple HTML flusher
    $string =~ tr/A-Z/a-z/;       # Case insensitive
    $string =~ s/[^a-z0-9]/ /g;   # If it's not a legal character make it whitespace
    $string =~ s/^\s*([\s\S]*\S+)\s*$/$1/g;  # Remove any leading and trailing spaces.
    my $ns = "site";
    my $span=20;
    my $count=0;
    my ($pagedata,$wd,$pos,$p1,$p2,$substr);
    my @words = split(' ', $string);
    if((@words)==0){     # check for error
      print qq~<h3>$txt{'103'}</h3>~;
      return; # abort.
    }
    print qq~<h1>$txt{'102'}: <i>$string</i></h1><ul>~;
    my @pageslist = &db_GetIndexOfPages($ns);
    foreach $page (@pageslist){
      &db_load_PageData($page);  # initialize.
      $pagedata = &db_get_PageData($page, 'article/content');
      $substr="";
      foreach $wd (@words){
        $pos = index($pagedata,$wd);
        if($pos >= 0){
          $p1 = ($pos-$span)>0?($pos-$span):0;
          $p2 = ($pos+$span)<length($pagedata)?($pos+$span):length($pagedata);
          #print "$p1, $p2  ";
          $substr .= " ..." . substr($pagedata,$p1,$p2-$p1) . "... ";
          $substr =~ s/($wd)/<font color='red'>$1<\/font>/g;
          $count++;
        }
      }   
      if($substr ne ""){
        print qq~<li><a href="$WikiURL?page=$ns:$page">$page</a><br><i>$substr</i></li><br>~;
      }
    }
    print qq~</ul>~;
    if($count==0){ print qq~<h4>$txt{'104'}</h4>~; }
}

# IN PageTemplate.pl
sub print_PageHeader() {
  my $title = shift;
  $title =~ tr/_#/ \//;
  # Prints header
  my $mainpg = &decodeWikiWord($MainPage);
  print qq~<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>$SiteName - $title</title><link type="text/css" rel="stylesheet" href="$ResourcesURL/wiki.css"></head><body>
  <a href="$WikiURL"><img class="mainlogo" src="$ResourcesURL/defaultlogo.png" alt="$SiteName" border="0"></a>

# rs changed...3rd link action=search
  <div class="menu"><a href="$WikiURL">$mainpg</a>|<a href="$WikiURL?action=nsindex">$txt{'2'}</a>|<a href="$WikiURL?action=search">$txt{'98'}</a>|<a href="$WikiURL/$RecentChangesPageName">$txt{'78'}</a>|<a href="$WikiURL?action=new">$txt{'88'}</a>~;
[snip]

In mxwiki.pl
  } elsif ($form{'action'} eq 'new'){
    print_PageHeader();
    &print_NewPageForm();
    print_PageFooter();
# rs added following prior to default else...
  } elsif ($form{'action'} eq 'search'){
    print_PageHeader();
    &print_SearchForm();
    print_PageFooter();
  } elsif ($form{'action'} eq 'startsearch'){
    print_PageHeader();
    &print_SearchResults($form{'searchstring'});
    print_PageFooter();

Thanks
--Rick