<?
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* This class expects the following:
*
* - that the following files exist:
* - results-header.html
* - results-footer.html
* - results-template.html
*
* - that the location of these files is specified below in this->templatesDir
*
* - that results-header.html contains at a minimum $(MATCHES) and $(MATCHES_PER_PAGE)
*
* - that each template file consists of an htdig variable followed by
* a new line and/or carriage return
*
* - that none of the templates contain variabls that produce form elements (sorry!)
*
* - that the search is executed outside this class and the class is passed
* the results of the search when an new object is created
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// functions called from within Ht primarily
function reorderWords ( $a, $b )
{
if (strlen( $a ) == strlen( $b )) return 0;
return ( strlen( $a ) > strlen( $b ) ) ? -1 : 1;
}
function setVars ( &$val, $key )
{
trim($val);
eregi( "[^a-zA-Z]*([a-zA-Z_]*).*", "$val", $matches );
$val = $matches[1];
}
// function for doing case-insensitive search and replace
// found on php.net under str_replace()
function highlight( $needle, $haystack )
{
$parts = explode( strtolower($needle), strtolower($haystack) );
$pos = 0;
foreach( $parts as $key=>$part )
{
$parts[ $key ] = substr($haystack, $pos, strlen($part));
$pos += strlen($part);
$parts[ $key ] .= '<strong>'.substr($haystack, $pos, strlen($needle)).'</strong>';
$pos += strlen($needle);
}
return( join( '', $parts ) );
}
class Ht
{
var $anchor;
var $cgi;
var $current;
var $description;
var $descriptions;
var $docid;
var $excerpt;
var $firstdisplayed;
var $format;
var $hopcount;
var $keywords;
var $lastdisplayed;
var $logical_words;
var $match_message;
var $matches;
var $matches_per_page;
var $max_stars;
var $metadescription;
var $method;
var $modified;
var $nextpage;
var $nstars;
var $page;
var $pageheader;
var $pagelist;
var $pages;
var $percent;
var $plural_matches;
var $prevpage;
var $score;
var $selected_format;
var $selected_method;
var $selected_sort;
var $size;
var $sizek;
var $sort;
var $starsleft;
var $starsright;
var $startyear;
var $startmonth;
var $startday;
var $endyear;
var $endmonth;
var $endday;
var $syntaxerror;
var $title;
var $url;
var $version;
var $words;
var $htError;
var $template;
var $header;
var $footer;
var $templatesDir;
var $results;
var $nomatch;
var $syntaxerror;
function Ht ( $result )
{
function setVars ( &$val, $key )
{
trim($val);
eregi( "[^a-zA-Z]*([a-zA-Z_]*).*", "$val", $matches );
$val = $matches[1];
}
$this->results = $result;
// make sure there are some results to work with
if ( sizeof( $this->results ) < 3 )
{
$this->error = "Unknown error. No results were returned from the search request.";
$continue = false;
}
else // something was returned, even if it was no matches
{
if ( eregi( "^nomatch.*", $this->results ) )
{
$this->nomatch = "Sorry. No matches were found. Please try again but with a modified query.";
}
if ( eregi( "^SYNTAXERROR.*", $this->results ) )
{
$this->syntaxerror = "Sorry. There was a syntax error. It's probably not your fault, but there's nothing more that can be done to fix it at this time. Try contacting the webmaster of this site.";
}
// NOTE: even if no results were returned, we want to try and
// stuff the variables because some of them may be useful
// tell us where to find the template, header, footer files
// this is relative to the document that this class is included in
if ( eregi( ".*\.com$", $GLOBALS["HTTP_HOST"] ) )
{
$this->templatesDir = "/htdocs/dev/search/";
}
else
{
$this->templatesDir = "/Library/WebServer/susansexton/search/";
}
// fill the template, header, footer vars with data
$header = file($this->templatesDir."results-header.html");
array_walk( $header, "setVars" );
$this->header = $header;
for ( $i = 0; $i < sizeof( $this->header ); $i++ )
{
$var = strtolower( $this->header[$i] );
$this->$var = $this->results[ $i + 2 ];
}
$template = file($this->templatesDir."results-template.html");
array_walk( $template, "setVars" );
$this->template = $template;
// process sets of template elements in batches of results
for ( $i = 0; $i < $this->matches_per_page; $i++ )
{
// update pointer for template results
$pointer = $i * sizeof( $this->template ) + sizeof( $this->header ) + 2;
for ($j = 0; $j < sizeof( $this->template ); $j++ )
{
$var = strtolower( $this->template[$j] );
if ( !is_array( $this->$var ) )
{
$this->$var = Array();
}
array_push( $this->$var, $this->results[$j+$pointer] );
}
}
$footer = file($this->templatesDir."results-footer.html");
array_walk( $footer, "setVars" );
$this->footer = $footer;
$offset = sizeof( $this->results ) - sizeof( $this->footer );
for ( $i = 0; $i < sizeof( $this->footer ); $i++ )
{
$var = strtolower( $this->footer[$i] );
$this->$var = $this->results[ $i + $offset ];
}
}
}
// i use this function to append arguments to htdig's prev and next links
function appendArgToNextPrevLinks ( $source, $newPart )
{
$href = explode( " ", $source );
eregi("\?(.*)\">", $href[1], $matches );
$qstring = $matches[1] . $newPart;
$href[1] = "href=\"?$qstring\"><img";
$href = implode( " ", $href );
return $href;
}
// i use this function to append arguments to htdig's pages links
function appendArgToPagesLinks ( $source, $newPart, $current )
{
$href = explode( "> <", $source );
for ( $i = 0; $i < sizeof( $href ); $i++ )
{
if ( $current - 1 != $i )
{
// version 3.1.6 produces different page links than 3.2
if ( substr( $this->version, 0, 3 ) < 3.2 )
{
if ( eregi( "^<?a href=\"\?(.*)\">(.*)</a", $href[$i]) )
{
eregi( "^<?a href=\"\?(.*)\">(.*)</a", $href[$i], $matches);
}
else
{
echo "<br>no match on $i";
}
}
else
{
eregi( "^<?a href=\"".$GLOBALS["PHP_SELF"]."\?(.*)\">(.*)</a", $href[$i], $matches );
}
$qstring = $matches[1] . $newPart;
$display = $matches[2];
$href[$i] = "a href=\"".$GLOBALS["PHP_SELF"]."?$qstring\">$display</a";
}
}
$href = ($current != 1 ? "<" : "") . implode( "> <", $href );
return $href;
}
// I use this function to display the description of the image instead of the excerpt, but maintaining the bold
// believe it or not, it took me three hourse to get this right.
// main sumbling blocks were: str_replace is not case-sensitive,
// and referencing a callback function from within a class
function swapExcerpt ( $desc )
{
// put logical words into an array
$words = substr ( $this->logical_words, 1 , strlen( $this->logical_words ) - 2);
$words = explode( " or ", $words );
// put words in order by length, longest first
// forces highlighting of entire word (not omitting plural 's')
usort( $words, "reorderWords" );
// embolden matched words
if ( $desc != "" )
{
for ( $i = 0; $i < sizeof( $words ); $i++ )
{
$desc = highlight( $words[$i], $desc );
}
}
return $desc;
}
}
?>
|