*/
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_INC.'inc/parser/parser.php');
require_once(DOKU_PLUGIN . 'action.php');
require_once(DOKU_PLUGIN . 'sphinxsearch/sphinxapi.php');
require_once(DOKU_PLUGIN . 'sphinxsearch/PageMapper.php');
require_once(DOKU_PLUGIN . 'sphinxsearch/SphinxSearch.php');
require_once(DOKU_PLUGIN . 'sphinxsearch/functions.php');
class action_plugin_sphinxsearch extends DokuWiki_Action_Plugin {
/**
* return some info
*/
function getInfo() {
return confToHash(dirname(__FILE__).'/plugin.info.txt');
}
/**
* Register to the content display event to place the results under it.
*/
/**
* register the eventhandlers
*/
function register(&$controller){
$controller->register_hook('TPL_CONTENT_DISPLAY', 'BEFORE', $this, 'handle_act_unknown', array());
}
/**
* If our own 'googlesearch' action was given we produce our content here
*/
function handle_act_unknown(&$event, $param){
global $ACT;
global $QUERY;
if($ACT != 'search') return; // nothing to do for us
// we can handle it -> prevent others
$event->stopPropagation();
$event->preventDefault();
$this->_search($QUERY,$_REQUEST['start']);
}
/**
* do the search and displays the result
*/
function _search($query, $start) {
global $conf;
$start = (int) $start;
if($start < 0) $start = 0;
$categories = $this->_getCategories($query);
$keywords = $this->_getKeywords($query);
$search = new SphinxSearch($this->getConf('host'), $this->getConf('port'), $this->getConf('index'));
$search->setSnippetSize($this->getConf('snippetsize'));
$search->setArroundWordsCount($this->getConf('arroundwords'));
$search->setTitlePriority($this->getConf('title_priority'));
$search->setBodyPriority($this->getConf('body_priority'));
$search->setCategoriesPriority($this->getConf('categories_priority'));
$pagesList = $search->search($keywords, $categories, $start, $this->getConf('maxresults'));
if ($search->getError()){
echo '' . $search->getError() . '!';
return;
}
$totalFound = $search->getTotalFound();
if(empty($pagesList)){
echo 'Nothing was found by ' . $query . '!';
return;
} else {
echo '
';
echo '
Found '.$totalFound . ($totalFound == 1 ? ' document ' : ' documents ') . ' for query "' . hsc($query).'"
';
echo '';
// printout the results
foreach ($pagesList as $crc => $row) {
$page = $row['page'];
$bodyExcerpt = $row['bodyExcerpt'];
$titleTextExcerpt = $row['titleTextExcerpt'];
$hid = $row['hid'];
$metaData = p_get_metadata($page);
if (!empty($titleTextExcerpt)){
$titleText = $titleTextExcerpt;
} elseif(!empty($row['title_text'])){
$titleText = $row['title_text'];
} elseif(!empty($metaData['title'])){
$titleText = hsc($metaData['title']);
} else {
$titleText = hsc($page);
}
$namespaces = getNsLinks($page, $keywords, $search);
$href = !empty($hid) ? (wl($page).'#'.$hid) : wl($page);
echo '
'.$titleText.'';
echo '
';
echo strip_tags($bodyExcerpt, ',');
echo '
';
$sep=':';
$i = 0;
echo '
';
foreach ($namespaces as $name){
$link = $name['link'];
$pageTitle = $name['title'];
tpl_link($link, $pageTitle);
if ($i++ < count($namespaces)-1){
echo $sep;
}
}
if (!empty($hid)){
echo '#'.$hid;
}
echo '';
echo '
- Last modified '.date("Y-m-d H:i",$metaData['date']['modified']).' ';
echo '
by '.$metaData['last_change']['user'].' ';
echo '
';echo '
';
}
echo '
';
echo '';
if ($start > 1){
$prev = $start - $this->getConf('maxresults');
if($prev < 0) $prev = 0;
echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$prev),'false','&'),
'prev','wikilink1 gs_prev',$conf['target']['interwiki']);
}
echo ' ';
if($start + $this->getConf('maxresults') < $totalFound){
$next = $start + $this->getConf('maxresults');
echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$next),'false','&'),
'next','wikilink1 gs_next',$conf['target']['interwiki']);
}
echo '
';
}
}
function searchform(){
global $lang;
global $ACT;
global $QUERY;
// don't print the search form if search action has been disabled
if (!actionOk('search')) return false;
print '';
return true;
}
function _getCategories($query)
{
$categories = '';
$query = urldecode($query);
if (false !== ($pos = strpos($query, "@categories"))){;
$categories = substr($query, $pos + strlen("@categories"));
}
return trim($categories);
}
function _getKeywords($query)
{
$keywords = $query;
$query = urldecode($query);
if (false !== ($pos = strpos($query, "@categories"))){;
$keywords = substr($keywords, 0, $pos);
}
return trim($keywords);
}
}
?>