Location: PHPKode > scripts > htdig-php-helper > htdig-php-helper/htdig-object.php
<?
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 * 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;
	}
}
?>
Return current item: htdig-php-helper