File Manager

Current Path : /webspace/www.promiel.be/html/modules/Search/
Upload File :
Current File : //webspace/www.promiel.be/html/modules/Search/search.tools.php

<?php
#CMS - CMS Made Simple
#(c)2004 by Ted Kulp (wishy@users.sf.net)
#This project's homepage is: http://www.cmsmadesimple.org
#
#This program is free software; you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation; either version 2 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

function search_StemPhrase(&$module,$phrase)
{
  // strip out html and php stuff
  $phrase = strip_tags($phrase);
  
  // strip out smarty tags
  $phrase = preg_replace('/{.*}/', '', $phrase);
  
  // add spaces between tags
  $phrase = str_replace("<"," <",$phrase);
  $phrase = str_replace(">","> ",$phrase);
  
  // escape meta characters
  $phrase = preg_quote($phrase);
  
  // strtolower isn't friendly to other charsets
  $phrase = preg_replace("/([A-Z]+)/e","strtolower('\\1')",$phrase);

  // split into words
  //$words = preg_split('/[\s,!.()+-\/\\\\]+/', $phrase);
  $words = preg_split('/[\s,!.;:\?()+-\/\\\\]+/', $phrase);

  // strip off anything 3 chars or less
  if( !function_exists('__search_stemphrase_filter') ) {
    function __search_stemphrase_filter($a) {
      return (strlen($a) >= 3);
    }
  }
  $words = array_filter($words, '__search_stemphrase_filter');

  // ignore stop words
  $words = $module->RemoveStopWordsFromArray($words);
  
  // stem words
  $stemmed_words = array();
  $stemmer = null; 
  if( $module->GetPreference('usestemming', 'false') != 'false' ) $stemmer = new PorterStemmer();

  foreach ($words as $word) {
    $word = trim($word);
    $word = trim($word, ' \'"');
    $word = trim($word);
    if (strlen($word) < 3) continue;

    //trim words get rid of wrapping quotes
    if (is_object($stemmer)) {
      $stemmed_words[] = $stemmer->stem($word, true);
    }
    else {
      $stemmed_words[] = $word;
    }
  }
  return $stemmed_words;
}


function search_AddWords(&$obj, $module = 'Search', $id = -1, $attr = '', $content = '', $expires = NULL)
{
  $obj->DeleteWords($module, $id, $attr);
  $db = $obj->GetDb();
		
  $non_indexable = strpos($content, NON_INDEXABLE_CONTENT);
  if( $non_indexable !== FALSE ) return;

  @$obj->SendEvent('SearchItemAdded', array($module, $id, $attr, &$content, $expires));
		
  if ($content != "")
    {		
      //Clean up the content
      $stemmed_words = $obj->StemPhrase($content);
      $words = array_count_values($stemmed_words);
		
      $q = "SELECT id FROM ".cms_db_prefix().'module_search_items WHERE module_name=?';
      $parms = array($module);

      if( $id != -1 )
	{
	  $q .= " AND content_id=?";
	  $parms[] = $id;
	}
      if( $attr != '' )
	{
	  $q .= " AND extra_attr=?";
	  $parms[] = $attr;
	}
      $dbresult = $db->Execute($q, $parms);
		
      if ($dbresult && $dbresult->RecordCount() > 0 && $row = $dbresult->FetchRow())
	{
	  $itemid = $row['id'];
	}
      else
	{
	  $itemid = $db->GenID(cms_db_prefix()."module_search_items_seq");
	  $db->Execute('INSERT INTO '.cms_db_prefix().'module_search_items (id, module_name, content_id, extra_attr, expires) VALUES (?,?,?,?,?)', array($itemid, $module, $id, $attr, ($expires != NULL ? trim($db->DBTimeStamp($expires), "'") : NULL) ));
	}
		
      foreach ($words as $word=>$count)
	{
	  $db->Execute('INSERT INTO '.cms_db_prefix().'module_search_index (item_id, word, count) VALUES (?,?,?)', array($itemid, $word, $count));
	}
    }
}

function search_DeleteWords(&$obj, $module = 'Search', $id = -1, $attr = '')
{
  $db = $obj->GetDb();
  $parms = array( $module );
  $q = "DELETE FROM ".cms_db_prefix().'module_search_items WHERE module_name=?';
  if( $id != -1 )
    {
      $q .= " AND content_id=?";
      $parms[] = $id;
    }
  if( $attr != '' )
    {
      $q .= " AND extra_attr=?";
      $parms[] = $attr;
    }
  $db->Execute($q, $parms);
  $db->Execute('DELETE FROM '.cms_db_prefix().'module_search_index WHERE item_id NOT IN (SELECT id FROM '.cms_db_prefix().'module_search_items)');
  @$obj->SendEvent('SearchItemDeleted', array($module, $id, $attr));
}


function search_Reindex(&$module)
{
  audit('',$module->GetName(),'Reindex Operation Started');
  @set_time_limit(999);
  $module->DeleteAllWords();

  // this could run out of memory...
  cmsms()->GetContentOperations()->LoadAllContent(TRUE,FALSE,TRUE);
  $full_list = cmsms()->GetHierarchyManager()->getFlatList();
  
  foreach( $full_list as $node ) {
    $cid = $node->get_tag('id');
    $content = cmsms()->GetContentOperations()->LoadContentFromId($cid);
    if( !is_object($content) ) continue;
    
    $parms = array('content'=>$content);
    search_DoEvent($module,'Core','ContentEditPost',$parms,TRUE);
  }

  // this could run out of memory very quickly.
  $modules = ModuleOperations::get_instance()->GetInstalledModules();
  foreach( $modules as $name ) {
    if( !$name || $name == 'Search' ) continue;
    $object = ModuleOperations::get_instance()->get_module_instance($name);
    if( !is_object($object) ) continue;

    if (method_exists($object, 'SearchReindex')) $object->SearchReindex($module);
  }
  audit('',$module->GetName(),'Reindex Operation Completed');
}


function search_DoEvent(&$module, $originator, $eventname, &$params, $in_reindex = FALSE )
{
  if ($originator != 'Core') return;

  switch ($eventname) {
  case 'ContentEditPost':
    $content = $params['content'];					
    if (!isset($content)) return;
    if (!is_object($content)) return;

    $searchable = $content->Active();
    $searchable = $searchable && $content->IsViewable();
    $searchable = $searchable && $content->HasUsableLink();
    $searchable = $searchable && !$content->IsSystemPage();
    $tmp = $content->GetPropertyValue('searchable');
    if( $tmp == '' ) $tmp = 1;
    $searchable = $searchable && $tmp;

    if( $searchable ) {
      //Weight the title and menu text higher
      $text = str_repeat(' '.$content->Name(), 2) . ' ';
      $text .= str_repeat(' '.$content->MenuText(), 2) . ' ';

      $props = $content->Properties();
      foreach( $props as $k => $v ) {
	$pos = strpos($text, NON_INDEXABLE_CONTENT);
	if( $pos === FALSE ) $text .= $v.' ';
      }

      $module->AddWords($module->GetName(), $content->Id(), 'content', $text);
    }
    else if( !$in_reindex ) {
      $module->DeleteWords($module->GetName(), $content->Id(), 'content');
    }
    break;

  case 'ContentDeletePost':
    $content = $params['content'];
    if (!isset($content)) return;
    $module->DeleteWords($module->GetName(), $content->Id(), 'content');
    break;
					
  case 'ModuleUninstalled':
    $module_name = $params['name'];
    $module->DeleteWords($module_name);
    break;
  }
}


#
#
?>

File Manager Version 1.0, Coded By Lucas
Email: hehe@yahoo.com