Login   Register  
PHP Classes
elePHPant
Icontem

File: htdig-object.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Ted Stresen-Reuter  >  htdig-php-helper  >  htdig-object.php  >  Download  
File: htdig-object.php
Role: Class source
Content type: text/plain
Description: The htdig class
Class: htdig-php-helper
model an htdig search request as a PHP object
Author: By
Last change:
Date: 12 years ago
Size: 7,662 bytes
 

Contents

Class file image Download
<?
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 * 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;
}

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 explodestrtolower($needle), strtolower($haystack) );

    
$pos 0;

    foreach( 
$parts as $key=>$part )
    {
        
$parts$key ] = substr($haystack$posstrlen($part));
        
$pos += strlen($part);

        
$parts$key ] .= '<strong>'.substr($haystack$posstrlen($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 ) < )
        {
            
$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 ];
            }
            
            
$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 != $i )
            {
                
// version 3.1.6 produces different page links than 3.2
                
if ( substr$this->version0) < 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 != "<" "") . 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_wordsstrlen$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;
    }
}
?>