Skip to content
Browse files

global sync to HEAD for passing fixes

  • Loading branch information...
1 parent 3702d88 commit 2e47bfb16b833d8fe2950419b69ac60001509aae diml committed Apr 7, 2008
View
21 blocks/search/block_search.php
@@ -1,22 +1,25 @@
<?php
/* This is the global search shortcut block - a single query can be entered, and
- the user will be redirected to the query page where they can enter more
- advanced queries, and view the results of their search. When searching from
- this block, the broadest possible selection of documents is searched.
-
- Author: Michael Champanis (mchampan)
- Date: 2006 06 25
-
- Todo: make strings -> get_string()
+ * the user will be redirected to the query page where they can enter more
+ * advanced queries, and view the results of their search. When searching from
+ * this block, the broadest possible selection of documents is searched.
+ *
+ *
+ * Todo: make strings -> get_string()
+ *
+ * @package search
+ * @subpackage search block
+ * @author: Michael Champanis (mchampan), reengineered by Valery Fremaux
+ * @date: 2006 06 25
*/
class block_search extends block_base {
function init() {
$this->title = get_string('blockname', 'block_search');
$this->cron = 1;
- $this->version = 2007081100;
+ $this->version = 2008031500;
} //init
// only one instance of this block is required
View
14 blocks/search/config_global.html
@@ -57,6 +57,20 @@
</tr>
<tr>
<td valign="top" align="right">
+ <b><?php print_string('usemoodleroot', 'block_search') ?>:</b>
+ </td>
+ <td valign="top" align="left">
+ <?php
+ $usemoodleroot = (isset($CFG->block_search_usemoodleroot)) ? 'checked="checked"' : '' ;
+ $notusemoodleroot = (!isset($CFG->block_search_usemoodleroot)) ? 'checked="checked"' : '' ;
+ ?>
+ <input id="block_search_usemoodleroot" type="radio" name="block_search_usemoodleroot" <?php echo $usemoodleroot ?> value="1"/> <?php print_string('yes') ?> -
+ <input id="block_search_usemoodleroot" type="radio" name="block_search_usemoodleroot" <?php echo $notusemoodleroot ?> value="0"/> <?php print_string('no') ?>
+ <br/><br/>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" align="right">
<b><?php print_string('configpdftotextcmd', 'block_search') ?>:</b>
</td>
<td valign="top" align="left">
View
2 search/LISEZMOI.txt
@@ -1,5 +1,5 @@
Cette distribution partielle contient une refonte du moteur de
-recherche globalde Moodle.
+recherche globale de Moodle.
Le moteur de recherche est capable d'indexer et de rechercher
des informations dans un grand nombre de contenus stock�s
View
248 search/add.php
@@ -1,144 +1,158 @@
<?php
/**
* Global Search Engine for Moodle
-* Michael Champanis (mchampan) [cynnical@gmail.com]
-* review 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage search_engine
+* @author Michael Champanis (mchampan) [cynnical@gmail.com], Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* Asynchronous adder for new indexable contents
*
* Major chages in this review is passing the xxxx_db_names return to
* multiple arity to handle multiple document types modules
*/
+/**
+* includes and requires
+*/
require_once('../config.php');
require_once("$CFG->dirroot/search/lib.php");
-require_login();
-
-if (empty($CFG->enableglobalsearch)) {
- error(get_string('globalsearchdisabled', 'search'));
-}
-
-if (!isadmin()) {
- error(get_string('beadmin', 'search'), "$CFG->wwwroot/login/index.php");
-}
-
-//check for php5 (lib.php)
-if (!search_check_php5()) {
- $phpversion = phpversion();
- mtrace("Sorry, global search requires PHP 5.0.0 or later (currently using version $phpversion)");
- exit(0);
-}
-
-require_once("$CFG->dirroot/search/indexlib.php");
-
-$index = new Zend_Search_Lucene(SEARCH_INDEX_PATH);
-$dbcontrol = new IndexDBControl();
-$addition_count = 0;
-$startindextime = time();
-
-$indexdate = $CFG->search_indexer_run_date;
-
-mtrace('<pre>Starting index update (additions)...');
-mtrace('Index size before: '.$CFG->search_index_size."\n");
+/// checks global search activation
+
+ require_login();
+
+ if (empty($CFG->enableglobalsearch)) {
+ error(get_string('globalsearchdisabled', 'search'));
+ }
+
+ if (!isadmin()) {
+ error(get_string('beadmin', 'search'), "$CFG->wwwroot/login/index.php");
+ }
+
+/// check for php5 (lib.php)
-//get all modules
-if ($mods = get_records_select('modules')) {
+ if (!search_check_php5()) {
+ $phpversion = phpversion();
+ mtrace("Sorry, global search requires PHP 5.0.0 or later (currently using version ".phpversion().")");
+ exit(0);
+ }
+
+ require_once("$CFG->dirroot/search/indexlib.php");
+
+ $index = new Zend_Search_Lucene(SEARCH_INDEX_PATH);
+ $dbcontrol = new IndexDBControl();
+ $addition_count = 0;
+ $startindextime = time();
+
+ $indexdate = $CFG->search_indexer_run_date;
+
+ mtrace('Starting index update (additions)...');
+ mtrace('Index size before: '.$CFG->search_index_size."\n");
+
+/// get all modules
+ if ($mods = get_records_select('modules')) {
+
+/// append virtual modules onto array
-//append virtual modules onto array
-$mods = array_merge($mods, search_get_additional_modules());
- foreach ($mods as $mod) {
- //build include file and function names
- $class_file = $CFG->dirroot.'/search/documents/'.$mod->name.'_document.php';
- $db_names_function = $mod->name.'_db_names';
- $get_document_function = $mod->name.'_single_document';
- $get_newrecords_function = $mod->name.'_new_records';
- $additions = array();
-
- if (file_exists($class_file)) {
- require_once($class_file);
+ $mods = array_merge($mods, search_get_additional_modules());
+ foreach ($mods as $mod) {
+ //build include file and function names
+ $class_file = $CFG->dirroot.'/search/documents/'.$mod->name.'_document.php';
+ $db_names_function = $mod->name.'_db_names';
+ $get_document_function = $mod->name.'_single_document';
+ $get_newrecords_function = $mod->name.'_new_records';
+ $additions = array();
- //if both required functions exist
- if (function_exists($db_names_function) and function_exists($get_document_function)) {
- mtrace("Checking $mod->name module for additions.");
- $valuesArray = $db_names_function();
- if ($valuesArray){
- foreach($valuesArray as $values){
- $where = (isset($values[5])) ? 'AND ('.$values[5].')' : '';
- $itemtypes = ($values[4] != '*') ? " AND itemtype = '{$values[4]}' " : '' ;
-
- //select records in MODULE table, but not in SEARCH_DATABASE_TABLE
- $table = SEARCH_DATABASE_TABLE;
- $query = "
- SELECT
- docid,
- itemtype
- FROM
- {$CFG->prefix}{$table}
- WHERE
- doctype = '{$mod->name}'
- $itemtypes
- ";
- $docIds = get_records_sql_menu($query);
- $docIdList = ($docIds) ? implode("','", array_keys($docIds)) : '' ;
-
- $query = "
- SELECT id,
- {$values[0]} as docid
- FROM
- {$CFG->prefix}{$values[1]}
- WHERE
- id NOT IN ('{$docIdList}') and
- {$values[2]} > {$indexdate}
- $where
- ";
- $records = get_records_sql($query);
-
- // foreach record, build a module specific search document using the get_document function
- if (is_array($records)) {
- foreach($records as $record) {
- $add = $get_document_function($record->docid, $values[4]);
- // some documents may not be indexable
- if ($add)
- $additions[] = $add;
+ if (file_exists($class_file)) {
+ require_once($class_file);
+
+ //if both required functions exist
+ if (function_exists($db_names_function) and function_exists($get_document_function)) {
+ mtrace("Checking $mod->name module for additions.");
+ $valuesArray = $db_names_function();
+ if ($valuesArray){
+ foreach($valuesArray as $values){
+ $where = (isset($values[5])) ? 'AND ('.$values[5].')' : '';
+ $itemtypes = ($values[4] != '*' && $values[4] != 'any') ? " AND itemtype = '{$values[4]}' " : '' ;
+
+ //select records in MODULE table, but not in SEARCH_DATABASE_TABLE
+ $table = SEARCH_DATABASE_TABLE;
+ $query = "
+ SELECT
+ docid,
+ itemtype
+ FROM
+ {$CFG->prefix}{$table}
+ WHERE
+ doctype = '{$mod->name}'
+ $itemtypes
+ ";
+ $docIds = get_records_sql_menu($query);
+ $docIdList = ($docIds) ? implode("','", array_keys($docIds)) : '' ;
+
+ $query = "
+ SELECT id,
+ {$values[0]} as docid
+ FROM
+ {$CFG->prefix}{$values[1]}
+ WHERE
+ id NOT IN ('{$docIdList}') and
+ {$values[2]} > {$indexdate}
+ $where
+ ";
+ $records = get_records_sql($query);
+
+ // foreach record, build a module specific search document using the get_document function
+ if (is_array($records)) {
+ foreach($records as $record) {
+ $add = $get_document_function($record->docid, $values[4]);
+ // some documents may not be indexable
+ if ($add)
+ $additions[] = $add;
+ }
}
}
- }
-
- // foreach document, add it to the index and database table
- foreach ($additions as $add) {
- ++$addition_count;
- // object to insert into db
- $dbid = $dbcontrol->addDocument($add);
-
- // synchronise db with index
- $add->addField(Zend_Search_Lucene_Field::Keyword('dbid', $dbid));
-
- mtrace(" Add: $add->title (database id = $add->dbid, moodle instance id = $add->docid)");
-
- $index->addDocument($add);
- }
- }
- else{
- mtrace("No types to add.\n");
- }
- mtrace("Finished $mod->name.\n");
+ // foreach document, add it to the index and database table
+ foreach ($additions as $add) {
+ ++$addition_count;
+
+ // object to insert into db
+ $dbid = $dbcontrol->addDocument($add);
+
+ // synchronise db with index
+ $add->addField(Zend_Search_Lucene_Field::Keyword('dbid', $dbid));
+
+ mtrace(" Add: $add->title (database id = $add->dbid, moodle instance id = $add->docid)");
+
+ $index->addDocument($add);
+ }
+ }
+ else{
+ mtrace("No types to add.\n");
+ }
+ mtrace("Finished $mod->name.\n");
+ }
}
}
}
-}
+
+/// commit changes
-// commit changes
-$index->commit();
+ $index->commit();
+
+/// update index date and size
-// update index date and size
-set_config("search_indexer_run_date", $startindextime);
-set_config("search_index_size", (int)$CFG->search_index_size + (int)$addition_count);
+ set_config("search_indexer_run_date", $startindextime);
+ set_config("search_index_size", (int)$CFG->search_index_size + (int)$addition_count);
+
+/// print some additional info
-// print some additional info
-mtrace("Added $addition_count documents.");
-mtrace('Index size after: '.$index->count().'</pre>');
+ mtrace("Added $addition_count documents.");
+ mtrace('Index size after: '.$index->count());
?>
View
5 search/cron.php
@@ -12,7 +12,10 @@
* adds documents created since the last index run
*/
- require_once('../config.php');
+ if (!defined('MOODLE_INTERNAL')) {
+ die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page
+ }
+
require_once("$CFG->dirroot/search/lib.php");
if (!search_check_php5()) {
View
7 search/cron_php5.php
@@ -4,22 +4,23 @@
* This is a special externalized code for cron handling in PHP5.
* Should never be called by a php 4.3.0 implementation.
*/
+
try{
// overrides php limits
$maxtimelimit = ini_get('max_execution_time');
ini_set('max_execution_time', 300);
$maxmemoryamount = ini_get('memory_limit');
ini_set('memory_limit', '48M');
- mtrace("<pre>Starting cron...\n");
- mtrace("--DELETE----");
+ mtrace("\n--DELETE----");
require_once("$CFG->dirroot/search/delete.php");
mtrace("--UPDATE----");
require_once("$CFG->dirroot/search/update.php");
mtrace("--ADD-------");
require_once("$CFG->dirroot/search/add.php");
mtrace("------------");
- mtrace("cron finished.</pre>");
+ //mtrace("cron finished.</pre>");
+ mtrace('done');
// set back normal values for php limits
ini_set('max_execution_time', $maxtimelimit);
View
212 search/delete.php
@@ -1,132 +1,142 @@
<?php
/**
* Global Search Engine for Moodle
-* Michael Champanis (mchampan) [cynnical@gmail.com]
-* review 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage search_engine
+* @author Michael Champanis (mchampan) [cynnical@gmail.com], Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* Asynchronous index cleaner
*
* Major chages in this review is passing the xxxx_db_names return to
* multiple arity to handle multiple document types modules
*/
+/**
+* includes and requires
+*/
require_once('../config.php');
require_once("$CFG->dirroot/search/lib.php");
-require_login();
-
-if (empty($CFG->enableglobalsearch)) {
- error(get_string('globalsearchdisabled', 'search'));
-}
-
-if (!isadmin()) {
- error(get_string('beadmin', 'search'), "$CFG->wwwroot/login/index.php");
-} //if
-
-//check for php5 (lib.php)
-if (!search_check_php5()) {
- $phpversion = phpversion();
- mtrace("Sorry, global search requires PHP 5.0.0 or later (currently using version $phpversion)");
- exit(0);
-}
-
-require_once("$CFG->dirroot/search/indexlib.php");
-
-$index = new Zend_Search_Lucene(SEARCH_INDEX_PATH);
-$dbcontrol = new IndexDBControl();
-$deletion_count = 0;
-$startcleantime = time();
-mtrace('<pre>Starting clean-up of removed records...');
-mtrace('Index size before: '.$CFG->search_index_size."\n");
-
-if ($mods = get_records_select('modules')) {
- $mods = array_merge($mods, search_get_additional_modules());
+ require_login();
+
+ if (empty($CFG->enableglobalsearch)) {
+ error(get_string('globalsearchdisabled', 'search'));
+ }
+
+ if (!isadmin()) {
+ error(get_string('beadmin', 'search'), "$CFG->wwwroot/login/index.php");
+ } //if
+
+ //check for php5 (lib.php)
+ if (!search_check_php5()) {
+ $phpversion = phpversion();
+ mtrace("Sorry, global search requires PHP 5.0.0 or later (currently using version ".phpversion().")");
+ exit(0);
+ }
+
+ require_once("$CFG->dirroot/search/indexlib.php");
- foreach ($mods as $mod) {
- //build function names
- $class_file = $CFG->dirroot.'/search/documents/'.$mod->name.'_document.php';
- $delete_function = $mod->name.'_delete';
- $db_names_function = $mod->name.'_db_names';
- $deletions = array();
+ $index = new Zend_Search_Lucene(SEARCH_INDEX_PATH);
+ $dbcontrol = new IndexDBControl();
+ $deletion_count = 0;
+ $startcleantime = time();
+
+ mtrace('Starting clean-up of removed records...');
+ mtrace('Index size before: '.$CFG->search_index_size."\n");
+
+ if ($mods = get_records_select('modules')) {
+ $mods = array_merge($mods, search_get_additional_modules());
- if (file_exists($class_file)) {
- require_once($class_file);
+ foreach ($mods as $mod) {
+ //build function names
+ $class_file = $CFG->dirroot.'/search/documents/'.$mod->name.'_document.php';
+ $delete_function = $mod->name.'_delete';
+ $db_names_function = $mod->name.'_db_names';
+ $deletions = array();
- //if both required functions exist
- if (function_exists($delete_function) and function_exists($db_names_function)) {
- mtrace("Checking $mod->name module for deletions.");
- $valuesArray = $db_names_function();
- if ($valuesArray){
- foreach($valuesArray as $values){
- $where = (isset($values[5])) ? 'WHERE '.$values[5] : '';
- $itemtypes = ($values[4] != '*') ? " itemtype = '{$values[4]}' AND " : '' ;
- $query = "
- SELECT
- id,
- {$values[0]}
- FROM
- {$CFG->prefix}{$values[1]}
- $where
- ";
- $docIds = get_records_sql($query);
- $docIdList = ($docIds) ? implode("','", array_keys($docIds)) : '' ;
-
- $table = SEARCH_DATABASE_TABLE;
- $query = "
- SELECT
- id,
- docid
- FROM
- {$CFG->prefix}{$table}
- WHERE
- doctype = '{$mod->name}' AND
- $itemtypes
- docid not in ('{$docIdList}')
- ";
- $records = get_records_sql($query);
-
- // build an array of all the deleted records
- if (is_array($records)) {
- foreach($records as $record) {
- $deletions[] = $delete_function($record->docid, $values[4]);
+ if (file_exists($class_file)) {
+ require_once($class_file);
+
+ //if both required functions exist
+ if (function_exists($delete_function) and function_exists($db_names_function)) {
+ mtrace("Checking $mod->name module for deletions.");
+ $valuesArray = $db_names_function();
+ if ($valuesArray){
+ foreach($valuesArray as $values){
+ $where = (isset($values[5])) ? 'WHERE '.$values[5] : '';
+ $itemtypes = ($values[4] != '*' && $values[4] != 'any') ? " itemtype = '{$values[4]}' AND " : '' ;
+ $query = "
+ SELECT
+ id,
+ {$values[0]}
+ FROM
+ {$CFG->prefix}{$values[1]}
+ $where
+ ";
+ $docIds = get_records_sql($query);
+ $docIdList = ($docIds) ? implode("','", array_keys($docIds)) : '' ;
+
+ $table = SEARCH_DATABASE_TABLE;
+ $query = "
+ SELECT
+ id,
+ docid
+ FROM
+ {$CFG->prefix}{$table}
+ WHERE
+ doctype = '{$mod->name}' AND
+ $itemtypes
+ docid not in ('{$docIdList}')
+ ";
+ $records = get_records_sql($query);
+
+ // build an array of all the deleted records
+ if (is_array($records)) {
+ foreach($records as $record) {
+ $deletions[] = $delete_function($record->docid, $values[4]);
+ }
}
}
- }
-
- foreach ($deletions as $delete) {
- // find the specific document in the index, using it's docid and doctype as keys
- $doc = $index->find("+docid:{$delete->id} +doctype:$mod->name +itemtype:{$delete->itemtype}");
- // get the record, should only be one
- foreach ($doc as $thisdoc) {
- ++$deletion_count;
- mtrace(" Delete: $thisdoc->title (database id = $thisdoc->dbid, index id = $thisdoc->id, moodle instance id = $thisdoc->docid)");
+ foreach ($deletions as $delete) {
+ // find the specific document in the index, using it's docid and doctype as keys
+ $doc = $index->find("+docid:{$delete->id} +doctype:$mod->name +itemtype:{$delete->itemtype}");
- //remove it from index and database table
- $dbcontrol->delDocument($thisdoc);
- $index->delete($thisdoc->id);
+ // get the record, should only be one
+ foreach ($doc as $thisdoc) {
+ ++$deletion_count;
+ mtrace(" Delete: $thisdoc->title (database id = $thisdoc->dbid, index id = $thisdoc->id, moodle instance id = $thisdoc->docid)");
+
+ //remove it from index and database table
+ $dbcontrol->delDocument($thisdoc);
+ $index->delete($thisdoc->id);
+ }
}
}
+ else{
+ mtrace("No types to delete.\n");
+ }
+ mtrace("Finished $mod->name.\n");
}
- else{
- mtrace("No types to delete.\n");
- }
- mtrace("Finished $mod->name.\n");
}
}
}
-}
-
-//commit changes
-$index->commit();
+
+/// commit changes
-//update index date and index size
-set_config("search_indexer_cleanup_date", $startcleantime);
-set_config("search_index_size", (int)$CFG->search_index_size - (int)$deletion_count);
+ $index->commit();
+
+/// update index date and index size
-mtrace("Finished $deletion_count removals.");
-mtrace('Index size after: '.$index->count().'</pre>');
+ set_config("search_indexer_cleanup_date", $startcleantime);
+ set_config("search_index_size", (int)$CFG->search_index_size - (int)$deletion_count);
+
+ mtrace("Finished $deletion_count removals.");
+ mtrace('Index size after: '.$index->count());
?>
View
61 search/documents/chat_document.php
@@ -1,32 +1,36 @@
<?php
/**
* Global Search Engine for Moodle
-* add-on 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* document handling for chat activity module
* This file contains the mapping between a chat history and it's indexable counterpart,
*
* Functions for iterating and retrieving the necessary records are now also included
* in this file, rather than mod/chat/lib.php
*
-* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
-* @package search
-* @version 2007110400
-**/
+*/
+/**
+* includes and requires
+*/
require_once("$CFG->dirroot/search/documents/document.php");
require_once("$CFG->dirroot/mod/chat/lib.php");
-/*
+/**
* a class for representing searchable information
*
-**/
+*/
class ChatTrackSearchDocument extends SearchDocument {
/**
* constructor
- *
*/
public function __construct(&$chatsession, $chat_module_id, $course_id, $group_id, $context_id) {
// generic information; required
@@ -50,28 +54,32 @@ public function __construct(&$chatsession, $chat_module_id, $course_id, $group_i
// construct the parent class
parent::__construct($doc, $data, $course_id, $group_id, 0, PATH_FOR_SEARCH_TYPE_CHAT);
- } //constructor
-} //ChatTrackSearchDocument
+ }
+}
/**
* constructs a valid link to a chat content
* @param cm_id the chat course module
* @param start the start time of the session
* @param end th end time of the session
+* @uses CFG
* @return a well formed link to session display
*/
function chat_make_link($cm_id, $start, $end) {
global $CFG;
return $CFG->wwwroot.'/mod/chat/report.php?id='.$cm_id.'&amp;start='.$start.'&amp;end='.$end;
-} //chat_make_link
+}
/**
* fetches all the records for a given session and assemble them as a unique track
* we revamped here the code of report.php for making sessions, but without any output.
* note that we should collect sessions "by groups" if groupmode() is SEPARATEGROUPS.
-* @param chat_id the database
+* @param int $chat_id the database
+* @param int $fromtime
+* @param int $totime
+* @uses CFG
* @return an array of objects representing the chat sessions.
*/
function chat_get_session_tracks($chat_id, $fromtime = 0, $totime = 0) {
@@ -94,8 +102,7 @@ function chat_get_session_tracks($chat_id, $fromtime = 0, $totime = 0) {
foreach($messages as $aMessage){
$groupedMessages[$aMessage->groupid][] = $aMessage;
}
- }
- else{
+ } else {
$groupedMessages[-1] = &$messages;
}
$sessiongap = 5 * 60; // 5 minutes silence means a new session
@@ -122,9 +129,8 @@ function chat_get_session_tracks($chat_id, $fromtime = 0, $totime = 0) {
$tracks[count($tracks) - 1]->content .= ' '.$message->message;
$tracks[count($tracks) - 1]->sessionstart = $message->timestamp;
}
- }
+ } else {
// we initiate a new session track (backwards)
- else {
$track = new Object();
$track->sessionend = $message->timestamp;
$track->sessionstart = $message->timestamp;
@@ -140,7 +146,7 @@ function chat_get_session_tracks($chat_id, $fromtime = 0, $totime = 0) {
}
}
return $tracks;
-} //chat_get_session_tracks
+}
/**
* part of search engine API
@@ -149,7 +155,7 @@ function chat_get_session_tracks($chat_id, $fromtime = 0, $totime = 0) {
function chat_iterator() {
$chatrooms = get_records('chat');
return $chatrooms;
-} //chat_iterator
+}
/**
* part of search engine API
@@ -169,15 +175,15 @@ function chat_get_content_for_index(&$chat) {
foreach($sessionTracks as $aTrackId => $aTrack) {
foreach($aTrack->sessionusers as $aUserId){
$user = get_record('user', 'id', $aUserId);
- $aTrack->authors = ($user) ? $user->firstname.' '.$user->lastname : '' ;
+ $aTrack->authors = ($user) ? fullname($user) : '' ;
$documents[] = new ChatTrackSearchDocument(get_object_vars($aTrack), $cm->id, $chat->course, $aTrack->groupid, $context->id);
}
}
}
return $documents;
}
return array();
-} //chat_get_content_for_index
+}
/**
* returns a single data search document based on a chat_session id
@@ -202,11 +208,11 @@ function chat_single_document($id, $itemtype) {
if ($tracks){
$aTrack = $tracks[0];
$document = new ChatTrackSearchDocument(get_object_vars($aTrack), $cm->id, $chat->course, $aTrack->groupid, $context->id);
+ return $document;
}
- return $document;
}
return null;
-} //chat_single_document
+}
/**
* dummy delete function that packs id with itemtype.
@@ -217,7 +223,7 @@ function chat_delete($info, $itemtype) {
$object->id = $info;
$object->itemtype = $itemtype;
return $object;
-} //chat_delete
+}
/**
* returns the var names needed to build a sql query for addition/deletions
@@ -226,7 +232,7 @@ function chat_delete($info, $itemtype) {
function chat_db_names() {
//[primary id], [table name], [time created field name], [time modified field name]
return null;
-} //chat_db_names
+}
/**
* this function handles the access policy to contents indexed as searchable documents. If this
@@ -241,6 +247,7 @@ function chat_db_names() {
* points out a session history which is a close sequence of messages.
* @param user the user record denoting the user who searches
* @param group_id the current group used by the user when searching
+* @uses CFG
* @return true if access is allowed, false elsewhere
*/
function chat_check_text_access($path, $itemtype, $this_id, $user, $group_id, $context_id){
@@ -280,7 +287,7 @@ function chat_check_text_access($path, $itemtype, $this_id, $user, $group_id, $c
}
return true;
-} //chat_check_text_access
+}
/**
* this call back is called when displaying the link for some last post processing
@@ -290,5 +297,5 @@ function chat_link_post_processing($title){
setLocale(LC_TIME, substr(current_language(), 0, 2));
$title = preg_replace('/TT_(.*)_TT/e', "userdate(\\1)", $title);
return $title;
-} //chat_link_post_processing
+}
?>
View
66 search/documents/data_document.php
@@ -1,32 +1,36 @@
<?php
/**
* Global Search Engine for Moodle
-* add-on 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* document handling for data activity module
* This file contains the mapping between a database object and it's indexable counterpart,
*
* Functions for iterating and retrieving the necessary records are now also included
* in this file, rather than mod/data/lib.php
*
-* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
-* @package search
-* @version 2007110400
-**/
+*/
+/**
+* includes and requires
+*/
require_once("$CFG->dirroot/search/documents/document.php");
require_once("$CFG->dirroot/mod/data/lib.php");
-/*
+/**
* a class for representing searchable information (data records)
*
-**/
+*/
class DataSearchDocument extends SearchDocument {
/**
* constructor
- *
*/
public function __construct(&$record, $course_id, $context_id) {
// generic information; required
@@ -51,18 +55,17 @@ public function __construct(&$record, $course_id, $context_id) {
// construct the parent class
parent::__construct($doc, $data, $course_id, $record['groupid'], $record['userid'], PATH_FOR_SEARCH_TYPE_DATA);
- } //constructor
-} //ChatSearchDocument
+ }
+}
-/*
+/**
* a class for representing searchable information (comments on data records)
*
-**/
+*/
class DataCommentSearchDocument extends SearchDocument {
/**
* constructor
- *
*/
public function __construct(&$comment, $course_id, $context_id) {
// generic information; required
@@ -83,25 +86,27 @@ public function __construct(&$comment, $course_id, $context_id) {
// construct the parent class
parent::__construct($doc, $data, $course_id, $comment['groupid'], $comment['userid'], PATH_FOR_SEARCH_TYPE_DATA);
- } //constructor
-} //ChatCommentSearchDocument
+ }
+}
/**
* constructs a valid link to a data record content
* @param database_id the database reference
* @param record_id the record reference
+* @uses CFG
* @return a valid url top access the information as a string
*/
function data_make_link($database_id, $record_id) {
global $CFG;
return $CFG->wwwroot.'/mod/data/view.php?d='.$database_id.'&amp;rid='.$record_id;
-} //data_make_link
+}
/**
* fetches all the records for a given database
* @param database_id the database
* @param typematch a comma separated list of types that should be considered for searching or *
+* @uses CFG
* @return an array of objects representing the data records.
*/
function data_get_records($database_id, $typematch = '*') {
@@ -127,19 +132,19 @@ function data_get_records($database_id, $typematch = '*') {
if($typematch == '*' || preg_match("/\\b{$fieldset[$aDatum->fieldid]->type}\\b/", $typematch)){
if (!isset($records[$aDatum->recordid])){
$records[$aDatum->recordid]['_first'] = $aDatum->content.' '.$aDatum->content1.' '.$aDatum->content2.' '.$aDatum->content3.' '.$aDatum->content4.' ';
- }
- else{
+ } else {
$records[$aDatum->recordid][$fieldset[$aDatum->fieldid]->name] = $aDatum->content.' '.$aDatum->content1.' '.$aDatum->content2.' '.$aDatum->content3.' '.$aDatum->content4.' ';
}
}
}
}
return $records;
-} //data_get_records
+}
/**
* fetches all the comments for a given database
* @param database_id the database
+* @uses CFG
* @return an array of objects representing the data record comments.
*/
function data_get_comments($database_id) {
@@ -163,7 +168,7 @@ function data_get_comments($database_id) {
";
$comments = get_records_sql($query);
return $comments;
-} //data_get_comments
+}
/**
@@ -173,7 +178,7 @@ function data_get_comments($database_id) {
function data_iterator() {
$databases = get_records('data');
return $databases;
-} //data_iterator
+}
/**
* part of search engine API
@@ -221,7 +226,7 @@ function data_get_content_for_index(&$database) {
}
}
return $documents;
-} //data_get_content_for_index
+}
/**
* returns a single data search document based on a data entry id
@@ -256,8 +261,7 @@ function data_single_document($id, $itemtype) {
$recordMetaData->content = $accumulator;
// make document
$documents[] = new DataSearchDocument(get_object_vars($recordMetaData), $record_course, $context->id);
- }
- elseif($itemtype == 'comment'){
+ } elseif($itemtype == 'comment') {
// get main records
$comment = get_record('data_comments', 'id', $id);
$record = get_record('data_records', 'id', $comment->recordid);
@@ -272,11 +276,10 @@ function data_single_document($id, $itemtype) {
$comment->groupid = $record->groupid;
// make document
$documents[] = new DataCommentSearchDocument(get_object_vars($comment), $record_course, $context->id);
- }
- else{
+ } else {
mtrace('Error : bad or missing item type');
}
-} //data_single_document
+}
/**
* dummy delete function that packs id with itemtype.
@@ -287,7 +290,7 @@ function data_delete($info, $itemtype) {
$object->id = $info;
$object->itemtype = $itemtype;
return $object;
-} //data_delete
+}
/**
* returns the var names needed to build a sql query for addition/deletions
@@ -299,7 +302,7 @@ function data_db_names() {
array('id', 'data_records', 'timecreated', 'timemodified', 'record'),
array('id', 'data_comments', 'created', 'modified', 'comment')
);
-} //data_db_names
+}
/**
* this function handles the access policy to contents indexed as searchable documents. If this
@@ -314,6 +317,7 @@ function data_db_names() {
* points out an indexed data record page.
* @param user the user record denoting the user who searches
* @param group_id the current group used by the user when searching
+* @uses CFG
* @return true if access is allowed, false elsewhere
*/
function data_check_text_access($path, $itemtype, $this_id, $user, $group_id, $context_id){
@@ -394,5 +398,5 @@ function data_check_text_access($path, $itemtype, $this_id, $user, $group_id, $c
}
return true;
-} // data_check_text_access
+}
?>
View
19 search/documents/document.php
@@ -1,14 +1,21 @@
<?php
/**
* Global Search Engine for Moodle
-* Michael Champanis (mchampan) [cynnical@gmail.com]
-* review 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Michael Campanis (mchampan) [cynnical@gmail.com], Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* Base search document from which other module/block types can
* extend.
-**/
+*/
+/**
+*
+*/
abstract class SearchDocument extends Zend_Search_Lucene_Document {
public function __construct(&$doc, &$data, $course_id, $group_id, $user_id, $path) {
//document identification and indexing
@@ -52,7 +59,7 @@ public function __construct(&$doc, &$data, $course_id, $group_id, $user_id, $pat
// of multiple capabilities in their code. This possibility should be left open here.
$this->addField(Zend_Search_Lucene_Field::UnIndexed('capabilities', $caps));
*/
- } //constructor
-} //SearchDocument
+ }
+}
?>
View
49 search/documents/forum_document.php
@@ -1,34 +1,36 @@
<?php
/**
* Global Search Engine for Moodle
-* Michael Champanis (mchampan) [cynnical@gmail.com]
-* review 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Michael Campanis (mchampan) [cynnical@gmail.com], Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* document handling for forum activity module
* This file contains the mapping between a forum post and it's indexable counterpart,
*
* Functions for iterating and retrieving the necessary records are now also included
* in this file, rather than mod/forum/lib.php
*
-* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
-* @package search
-* @version 2007110400
-**/
-/* see wiki_document.php for descriptions */
+*/
+/**
+* includes and requires
+*/
require_once("$CFG->dirroot/search/documents/document.php");
require_once("$CFG->dirroot/mod/forum/lib.php");
-/*
+/**
* a class for representing searchable information
*
-**/
+*/
class ForumSearchDocument extends SearchDocument {
/**
* constructor
- *
*/
public function __construct(&$post, $forum_id, $course_id, $itemtype, $context_id) {
// generic information
@@ -50,8 +52,8 @@ public function __construct(&$post, $forum_id, $course_id, $itemtype, $context_i
$data->discussion = $post['discussion'];
parent::__construct($doc, $data, $course_id, $post['groupid'], $post['userid'], PATH_FOR_SEARCH_TYPE_FORUM);
- } //constructor
-} //ForumSearchDocument
+ }
+}
/**
* constructs a valid link to a chat content
@@ -63,7 +65,7 @@ function forum_make_link($discussion_id, $post_id) {
global $CFG;
return $CFG->wwwroot.'/mod/forum/discuss.php?d='.$discussion_id.'#'.$post_id;
-} //forum_make_link
+}
/**
* search standard API
@@ -72,7 +74,7 @@ function forum_make_link($discussion_id, $post_id) {
function forum_iterator() {
$forums = get_records('forum');
return $forums;
-} //forum_iterator
+}
/**
* search standard API
@@ -108,7 +110,7 @@ function forum_get_content_for_index(&$forum) {
}
}
return $documents;
-} //forum_get_content_for_index
+}
/**
* returns a single forum search document based on a forum entry id
@@ -128,7 +130,7 @@ function forum_single_document($id, $itemtype) {
return new ForumSearchDocument(get_object_vars($post), $discussion->forum, $discussion->course, $itemtype, $context->id);
}
return null;
-} //forum_single_document
+}
/**
* dummy delete function that aggregates id with itemtype.
@@ -139,7 +141,7 @@ function forum_delete($info, $itemtype) {
$object->id = $info;
$object->itemtype = $itemtype;
return $object;
-} //forum_delete
+}
/**
* returns the var names needed to build a sql query for addition/deletions
@@ -151,11 +153,12 @@ function forum_db_names() {
array('id', 'forum_posts', 'created', 'modified', 'head', 'parent = 0'),
array('id', 'forum_posts', 'created', 'modified', 'post', 'parent != 0')
);
-} //forum_db_names
+}
/**
* reworked faster version from /mod/forum/lib.php
* @param forum_id a forum identifier
+* @uses CFG, USER
* @return an array of posts
*/
function forum_get_discussions_fast($forum_id) {
@@ -202,12 +205,13 @@ function forum_get_discussions_fast($forum_id) {
d.timemodified DESC
";
return get_records_sql($query);
-} //forum_get_discussions_fast
+}
/**
* reworked faster version from /mod/forum/lib.php
* @param parent the id of the first post within the discussion
* @param forum_id the forum identifier
+* @uses CFG
* @return an array of posts
*/
function forum_get_child_posts_fast($parent, $forum_id) {
@@ -241,7 +245,7 @@ function forum_get_child_posts_fast($parent, $forum_id) {
p.created ASC
";
return get_records_sql($query);
-} //forum_get_child_posts_fast
+}
/**
* this function handles the access policy to contents indexed as searchable documents. If this
@@ -256,6 +260,7 @@ function forum_get_child_posts_fast($parent, $forum_id) {
* points out the individual post.
* @param user the user record denoting the user who searches
* @param group_id the current group used by the user when searching
+* @uses CFG, USER
* @return true if access is allowed, false elsewhere
*/
function forum_check_text_access($path, $itemtype, $this_id, $user, $group_id, $context_id){
@@ -290,6 +295,6 @@ function forum_check_text_access($path, $itemtype, $this_id, $user, $group_id, $
}
return true;
-} //forum_check_text_access
+}
?>
View
57 search/documents/glossary_document.php
@@ -1,27 +1,31 @@
<?php
/**
* Global Search Engine for Moodle
-* Michael Champanis (mchampan) [cynnical@gmail.com]
-* review 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Michael Campanis (mchampan) [cynnical@gmail.com], Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* document handling for glossary activity module
* This file contains a mapping between a glossary entry and it's indexable counterpart,
*
* Functions for iterating and retrieving the necessary records are now also included
* in this file, rather than mod/glossary/lib.php
*
-* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
-* @package search
-* @version 2007110400
-**/
+*/
+/**
+* includes and requires
+*/
require_once("$CFG->dirroot/search/documents/document.php");
-/*
+/**
* a class for representing searchable information
*
-**/
+*/
class GlossarySearchDocument extends SearchDocument {
/**
@@ -49,18 +53,17 @@ public function __construct(&$entry, $course_id, $context_id) {
// construct the parent class
parent::__construct($doc, $data, $course_id, -1, $entry['userid'], PATH_FOR_SEARCH_TYPE_GLOSSARY);
- } //constructor
-} //GlossarySearchDocument
+ }
+}
-/*
+/**
* a class for representing searchable information
*
-**/
+*/
class GlossaryCommentSearchDocument extends SearchDocument {
/**
* document constructor
- *
*/
public function __construct(&$entry, $glossary_id, $course_id, $context_id) {
// generic information; required
@@ -83,8 +86,8 @@ public function __construct(&$entry, $glossary_id, $course_id, $context_id) {
// construct the parent class
parent::__construct($doc, $data, $course_id, -1, $entry['userid'], PATH_FOR_SEARCH_TYPE_GLOSSARY);
- } //constructor
-} //GlossaryCommentSearchDocument
+ }
+}
/**
* constructs valid access links to information
@@ -102,7 +105,7 @@ function glossary_make_link($entry_id) {
// preserve glossary pop-up, be careful where you place your ' and "s
//this function is meant to return a url that is placed between href='[url here]'
return "$CFG->wwwroot/mod/glossary/showentry.php?eid=$entry_id' onclick='return openpopup(\"/mod/glossary/showentry.php?eid=$entry_id\", \"entry\", DEFAULT_POPUP_SETTINGS, 0);";
-} //glossary_make_link
+}
/**
* part of search engine API
@@ -111,7 +114,7 @@ function glossary_make_link($entry_id) {
function glossary_iterator() {
$glossaries = get_records('glossary');
return $glossaries;
-} //glossary_iterator
+}
/**
* part of search engine API
@@ -153,7 +156,7 @@ function glossary_get_content_for_index(&$glossary) {
}
}
return $documents;
-} //glossary_get_content_for_index
+}
/**
* part of search engine API
@@ -179,7 +182,7 @@ function glossary_single_document($id, $itemtype) {
elseif ($itemtype == 'comment'){
return new GlossaryCommentSearchDocument(get_object_vars($comment), $entry->glossaryid, $glossary_course, $context->id);
}
-} //glossary_single_document
+}
/**
* dummy delete function that packs id with itemtype.
@@ -190,7 +193,7 @@ function glossary_delete($info, $itemtype) {
$object->id = $info;
$object->itemtype = $itemtype;
return $object;
-} //glossary_delete
+}
/**
* returns the var names needed to build a sql query for addition/deletions
@@ -202,7 +205,7 @@ function glossary_db_names() {
array('id', 'glossary_entries', 'timecreated', 'timemodified', 'standard'),
array('id', 'glossary_comments', 'timemodified', 'timemodified', 'comment')
);
-} //glossary_db_names
+}
/**
* this function handles the access policy to contents indexed as searchable documents. If this
@@ -241,6 +244,14 @@ function glossary_check_text_access($path, $itemtype, $this_id, $user, $group_id
}
return true;
-} //glossary_check_text_access
+}
+
+/**
+* post processes the url for cleaner output.
+* @param string $title
+*/
+function glossary_link_post_processing($title){
+ return mb_convert_encoding($title, 'auto', 'UTF-8');
+}
?>
View
42 search/documents/lesson_document.php
@@ -1,29 +1,31 @@
<?php
/**
* Global Search Engine for Moodle
-* Michael Champanis (mchampan) [cynnical@gmail.com]
-* creation : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Michael Campanis (mchampan) [cynnical@gmail.com], Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* document handling for lesson activity module
* This file contains the mapping between a lesson page and it's indexable counterpart,
*
* Functions for iterating and retrieving the necessary records are now also included
* in this file, rather than mod/lesson/lib.php
-*
-* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
-* @package search
-* @version 2007110400
-**/
-/* see wiki_document.php for descriptions */
+*/
+/**
+* includes and requires
+*/
require_once("$CFG->dirroot/search/documents/document.php");
require_once("$CFG->dirroot/mod/lesson/lib.php");
-/*
+/**
* a class for representing searchable information
*
-**/
+*/
class LessonPageSearchDocument extends SearchDocument {
/**
@@ -48,8 +50,8 @@ public function __construct(&$page, $lessonmodule_id, $course_id, $itemtype, $co
$data->lesson = $page['lessonid'];
parent::__construct($doc, $data, $course_id, 0, 0, PATH_FOR_SEARCH_TYPE_LESSON);
- } //constructor
-} //LessonPageSearchDocument
+ }
+}
/**
* constructs a valid link to a chat content
@@ -64,7 +66,7 @@ function lesson_make_link($lessonmoduleid, $itemid, $itemtype) {
return "{$CFG->wwwroot}/mod/lesson/view.php?id={$lessonmoduleid}&amp;pageid={$itemid}";
}
return $CFG->wwwroot.'/mod/lesson/view.php?id='.$lessonmoduleid;
-} //lesson_make_link
+}
/**
* search standard API
@@ -73,7 +75,7 @@ function lesson_make_link($lessonmoduleid, $itemid, $itemtype) {
function lesson_iterator() {
$lessons = get_records('lesson');
return $lessons;
-} //lesson_iterator
+}
/**
* search standard API
@@ -96,7 +98,7 @@ function lesson_get_content_for_index(&$lesson) {
}
return $documents;
-} //lesson_get_content_for_index
+}
/**
* returns a single lesson search document based on a lesson page id
@@ -116,7 +118,7 @@ function lesson_single_document($id, $itemtype) {
return new LessonPageSearchDocument(get_object_vars($page), $cm->id, $lesson->course, $itemtype, $context->id);
}
return null;
-} //lesson_single_document
+}
/**
* dummy delete function that aggregates id with itemtype.
@@ -127,7 +129,7 @@ function lesson_delete($info, $itemtype) {
$object->id = $info;
$object->itemtype = $itemtype;
return $object;
-} //lesson_delete
+}
/**
* returns the var names needed to build a sql query for addition/deletions
@@ -138,7 +140,7 @@ function lesson_db_names() {
return array(
array('id', 'lesson_pages', 'timecreated', 'timemodified', 'page')
);
-} //lesson_db_names
+}
/**
* this function handles the access policy to contents indexed as searchable documents. If this
@@ -201,5 +203,5 @@ function lesson_check_text_access($path, $itemtype, $this_id, $user, $group_id,
}
return true;
-} //lesson_check_text_access
+}
?>
View
24 search/documents/physical_doc.php
@@ -1,40 +1,50 @@
<?php
/**
* Global Search Engine for Moodle
-* add-on 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* this is a format handler for getting text out of a proprietary binary format
* so it can be indexed by Lucene search engine
*/
-/*
+/**
* MS Word extractor
+* @param object $resource
+* @uses CFG, USER
*/
-
function get_text_for_indexing_doc(&$resource){
global $CFG, $USER;
// SECURITY : do not allow non admin execute anything on system !!
if (!isadmin($USER->id)) return;
+ $moodleroot = (@$CFG->block_search_usemoodleroot) ? "{$CFG->dirroot}/" : '' ;
+
// just call pdftotext over stdout and capture the output
if (!empty($CFG->block_search_word_to_text_cmd)){
- if (!file_exists("{$CFG->dirroot}/{$CFG->block_search_word_to_text_cmd}")){
+ if (!file_exists("{$moodleroot}{$CFG->block_search_word_to_text_cmd}")){
mtrace('Error with MSWord to text converter command : exectuable not found.');
}
else{
$file = escapeshellarg($CFG->dataroot.'/'.$resource->course.'/'.$resource->reference);
- $text_converter_cmd = "{$CFG->dirroot}/{$CFG->block_search_word_to_text_cmd} $file";
+ $command = trim($CFG->block_search_word_to_text_cmd);
+ $text_converter_cmd = "{$moodleroot}{$command} \"$file\"";
if ($CFG->block_search_word_to_text_env){
putenv($CFG->block_search_word_to_text_env);
}
+ mtrace("Executing : $text_converter_cmd");
$result = shell_exec($text_converter_cmd);
if ($result){
return mb_convert_encoding($result, 'UTF8', 'auto');
}
else{
- mtrace('Error with MSWord to text converter command : execution failed.');
+ mtrace('Error with MSWord to text converter command : execution failed. ');
return '';
}
}
View
38 search/documents/physical_htm.php
@@ -1,35 +1,55 @@
<?php
/**
* Global Search Engine for Moodle
-* add-on 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* this is a format handler for getting text out of a proprietary binary format
* so it can be indexed by Lucene search engine
*/
+/**
+* @param object $resource
+* @uses CFG, USER
+*/
function get_text_for_indexing_htm(&$resource){
global $CFG, $USER;
// SECURITY : do not allow non admin execute anything on system !!
if (!isadmin($USER->id)) return;
// just get text
- $text = implode('', file("{$CFG->dataroot}/{$resource->course}/($resource->reference)"));
+ $text = implode('', file("{$CFG->dataroot}/{$resource->course}/{$resource->reference}"));
// extract keywords and other interesting meta information and put it back as real content for indexing
- if (preg_match('/(.*)<meta ([^>]*)>(.*)/is',$text, $matches)){
+ if (preg_match('/(.*)<meta ([^>]*)>(.*)/is', $text, $matches)){
$prefix = $matches[1];
$meta_attributes = $matches[2];
$suffix = $matches[3];
- if (preg_match('/name="(keywords|description)"/i', $attributes)){
- preg_match('/content="[^"]+"/i', $attributes, $matches);
+ if (preg_match('/name="(keywords|description)"/i', $meta_attributes)){
+ preg_match('/content="([^"]+)"/i', $meta_attributes, $matches);
$text = $prefix.' '.$matches[1].' '.$suffix;
}
}
- // filter all html tags
- // $text = clean_text($text, FORMAT_PLAIN);
- // NOTE : this is done in ResourceSearchDocument __constructor
+ // brutally filters all html tags
+ $text = preg_replace("/<[^>]*>/", '', $text);
+ $text = preg_replace("/<!--[^>]*-->/", '', $text);
+ $text = html_entity_decode($text, ENT_COMPAT, 'UTF-8');
+ $text = mb_convert_encoding($text, 'UTF-8', 'AUTO');
+
+ /*
+ * debug code for tracing input
+ echo "<hr/>";
+ $FILE = fopen("filetrace.log", 'w');
+ fwrite($FILE, $text);
+ fclose($FILE);
+ echo "<hr/>";
+ */
if (!empty($CFG->block_search_limit_index_body)){
$text = shorten($text, $CFG->block_search_limit_index_body);
View
14 search/documents/physical_html.php
@@ -1,13 +1,21 @@
<?php
/**
* Global Search Engine for Moodle
-* add-on 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
*
-* this is a format handler for getting text out of a proprietary binary format
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
+*
+* this is a format handler for getting text out of a standard html format
* so it can be indexed by Lucene search engine
*/
+/**
+* @param object $resource
+*/
function get_text_for_indexing_html(&$resource){
// wraps to htm handler
View
20 search/documents/physical_pdf.php
@@ -1,28 +1,40 @@
<?php
/**
* Global Search Engine for Moodle
-* add-on 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* this is a format handler for getting text out of a proprietary binary format
* so it can be indexed by Lucene search engine
*/
+/**
+* @param object $resource
+* @uses CFG, USER
+*/
function get_text_for_indexing_pdf(&$resource){
global $CFG, $USER;
// SECURITY : do not allow non admin execute anything on system !!
if (!isadmin($USER->id)) return;
+ $moodleroot = (@$CFG->block_search_usemoodleroot) ? "{$CFG->dirroot}/" : '' ;
+
// just call pdftotext over stdout and capture the output
if (!empty($CFG->block_search_pdf_to_text_cmd)){
preg_match("/^\S+/", $CFG->block_search_pdf_to_text_cmd, $matches);
- if (!file_exists("{$CFG->dirroot}/{$matches[0]}")){
+ if (!file_exists("{$moodleroot}/{$matches[0]}")){
mtrace('Error with pdf to text converter command : exectuable not found.');
}
else{
$file = escapeshellarg($CFG->dataroot.'/'.$resource->course.'/'.$resource->reference);
- $text_converter_cmd = "{$CFG->dirroot}/{$CFG->block_search_pdf_to_text_cmd} $file -";
+ $command = trim($CFG->block_search_pdf_to_text_cmd);
+ $text_converter_cmd = "{$moodleroot}/{$command} \"$file\" -";
$result = shell_exec($text_converter_cmd);
if ($result){
return $result;
View
15 search/documents/physical_ppt.php
@@ -1,14 +1,19 @@
<?php
/**
* Global Search Engine for Moodle
-* add-on 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* this is a format handler for getting text out of a proprietary binary format
* so it can be indexed by Lucene search engine
*/
-/**
+/*
* first implementation is a trivial heuristic based on ppt character stream :
* text sequence always starts with a 00 9F 0F 04 sequence followed by a 15 bytes
* sequence
@@ -22,6 +27,10 @@
* based on these following rules, here is a little empiric texte extractor for PPT
*/
+/**
+* @param object $resource
+* @uses CFG, USER
+*/
function get_text_for_indexing_ppt(&$resource){
global $CFG, $USER;
View
13 search/documents/physical_txt.php
@@ -1,13 +1,22 @@
<?php
/**
* Global Search Engine for Moodle
-* add-on 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* this is a format handler for getting text out of a proprietary binary format
* so it can be indexed by Lucene search engine
*/
+/**
+* @param object $resource
+* @uses CFG, USER
+*/
function get_text_for_indexing_txt(&$resource){
global $CFG, $USER;
View
13 search/documents/physical_xml.php
@@ -1,13 +1,22 @@
<?php
/**
* Global Search Engine for Moodle
-* add-on 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* this is a format handler for getting text out of a proprietary binary format
* so it can be indexed by Lucene search engine
*/
+/**
+* @param object $resource
+* @uses CFG, USER
+*/
function get_text_for_indexing_xml(&$resource){
global $CFG, $USER;
View
49 search/documents/resource_document.php
@@ -1,24 +1,31 @@
<?php
/**
* Global Search Engine for Moodle
-* Michael Champanis (mchampan) [cynnical@gmail.com]
-* review 1.8+ : Valery Fremaux [valery.fremaux@club-internet.fr]
-* 2007/08/02
+*
+* @package search
+* @category core
+* @subpackage document_wrappers
+* @author Michael Campanis (mchampan) [cynnical@gmail.com], Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
+* @date 2008/03/31
+* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*
* document handling for all resources
* This file contains the mapping between a resource and it's indexable counterpart,
*
* Functions for iterating and retrieving the necessary records are now also included
* in this file, rather than mod/resource/lib.php
-**/
+*/
+/**
+* requires and includes
+*/
require_once("$CFG->dirroot/search/documents/document.php");
require_once("$CFG->dirroot/mod/resource/lib.php");
-/*
+/* *
* a class for representing searchable information
*
-**/
+*/
class ResourceSearchDocument extends SearchDocument {
public function __construct(&$resource, $context_id) {
// generic information; required
@@ -68,6 +75,7 @@ function resource_iterator() {
* this function does not need a content iterator, returns all the info
* itself;
* @param notneeded to comply API, remember to fake the iterator array though
+* @uses CFG
* @return an array of searchable documents
*/
function resource_get_content_for_index(&$notneeded) {
@@ -155,7 +163,10 @@ function resource_get_physical_file(&$resource, $context_id, $getsingle, &$docum
global $CFG;
// cannot index empty references
- if (empty($resource->reference)) return false;
+ if (empty($resource->reference)){
+ mtrace("Cannot index, empty reference.");
+ return false;
+ }
// cannot index remote resources
if (resource_is_url($resource->reference)){
@@ -166,6 +177,7 @@ function resource_get_physical_file(&$resource, $context_id, $getsingle, &$docum
$fileparts = pathinfo($resource->reference);
// cannot index unknown or masked types
if (empty($fileparts['extension'])) {
+ mtrace("Cannot index without explicit extension.");
return false;
}
@@ -189,15 +201,15 @@ function resource_get_physical_file(&$resource, $context_id, $getsingle, &$docum
$resource->alltext = $function_name($resource);
if (!empty($resource->alltext)){
if ($getsingle){
- return new ResourceSearchDocument(get_object_vars($resource), $context_id);
- }
- else{
+ $single = new ResourceSearchDocument(get_object_vars($resource), $context_id);
+ mtrace("finished file $resource->name as {$resource->reference}");
+ return $single;
+ } else {
$documen