10Syaroslav@ivinco.com<?php
20Syaroslav@ivinco.com/**
312Syaroslav@ivinco.com * Script to search in dokuwiki documents
40Syaroslav@ivinco.com *
512Syaroslav@ivinco.com * @author Yaroslav Vorozhko <yaroslav@ivinco.com>
60Syaroslav@ivinco.com */
70Syaroslav@ivinco.com
80Syaroslav@ivinco.comif(!defined('DOKU_INC')) die();
90Syaroslav@ivinco.comif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
100Syaroslav@ivinco.com
116Syaroslav@ivinco.comrequire_once(DOKU_INC.'inc/parser/parser.php');
126Syaroslav@ivinco.com
130Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'action.php');
140Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/sphinxapi.php');
150Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/PageMapper.php');
160Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/SphinxSearch.php');
176Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/functions.php');
180Syaroslav@ivinco.com
190Syaroslav@ivinco.com
200Syaroslav@ivinco.comclass action_plugin_sphinxsearch extends DokuWiki_Action_Plugin {
2143Syaroslav@ivinco.com    var $_search = null;
220Syaroslav@ivinco.com
2382Syaroslav@ivinco.com    var $_helpMessage = "
2482Syaroslav@ivinco.com===== DokuWiki Sphinx Search plugin features=====
2582Syaroslav@ivinco.com
2685Syaroslav@ivinco.comTo use the search you need to just enter your search keywords into the searchbox at the top right corner of the DokuWiki. When basic simple search is not enough you can try using the methods listed below:
2782Syaroslav@ivinco.com
2882Syaroslav@ivinco.com=== Phrase search (\"\") ===
2982Syaroslav@ivinco.comPut double quotes around a set of words to enable phrase search mode. For example:
3082Syaroslav@ivinco.com<code>\"James Bond\"</code>
3182Syaroslav@ivinco.com
3282Syaroslav@ivinco.com=== Search within a namespace ===
3382Syaroslav@ivinco.comYou can add \"@ns\" parameter to limit the search to some namespace. For exapmle:
3482Syaroslav@ivinco.com<code>hotel @ns personal:mike:travel</code>
3582Syaroslav@ivinco.comSuch query will return only results from \"personal:mike:travel\" namespace for keyword \"hotel\".
3682Syaroslav@ivinco.com
3782Syaroslav@ivinco.com=== Excluding keywords or namespaces from search ===
3882Syaroslav@ivinco.comYou can add a minus sign to a keyword or a category name exclude it from search. For example:
3982Syaroslav@ivinco.com<code>hotel @ns -personal:mike</code>
4082Syaroslav@ivinco.comSuch query will look for \"hotel\" everywhere except the \"personal:mike\" namespace.
4182Syaroslav@ivinco.com<code>blog -post</code>
4282Syaroslav@ivinco.comSuch query will look for documents that have keyword \"blog\" but don't have keyword \"post\".
4382Syaroslav@ivinco.com";
4482Syaroslav@ivinco.com
450Syaroslav@ivinco.com    /**
460Syaroslav@ivinco.com	* return some info
470Syaroslav@ivinco.com	*/
480Syaroslav@ivinco.com    function getInfo() {
490Syaroslav@ivinco.com        return confToHash(dirname(__FILE__).'/plugin.info.txt');
500Syaroslav@ivinco.com	}
510Syaroslav@ivinco.com
520Syaroslav@ivinco.com    /**
530Syaroslav@ivinco.com	* Register to the content display event to place the results under it.
540Syaroslav@ivinco.com	*/
550Syaroslav@ivinco.com    /**
560Syaroslav@ivinco.com     * register the eventhandlers
570Syaroslav@ivinco.com     */
580Syaroslav@ivinco.com    function register(&$controller){
5987Syaroslav@ivinco.com        $controller->register_hook('TPL_CONTENT_DISPLAY',   'BEFORE', $this, 'handle_act_unknown', array());
600Syaroslav@ivinco.com    }
610Syaroslav@ivinco.com
620Syaroslav@ivinco.com    /**
630Syaroslav@ivinco.com     * If our own 'googlesearch' action was given we produce our content here
640Syaroslav@ivinco.com     */
650Syaroslav@ivinco.com    function handle_act_unknown(&$event, $param){
6627Syaroslav@ivinco.com        global $ACT;
6727Syaroslav@ivinco.com        global $QUERY;
6827Syaroslav@ivinco.com        if($ACT != 'search') return; // nothing to do for us
690Syaroslav@ivinco.com
700Syaroslav@ivinco.com        // we can handle it -> prevent others
710Syaroslav@ivinco.com        $event->stopPropagation();
720Syaroslav@ivinco.com        $event->preventDefault();
730Syaroslav@ivinco.com
7491Syaroslav@ivinco.com/*        if (!extension_loaded('sqlite')) {
7587Syaroslav@ivinco.com            echo "SQLite extension is not loaded!";
7687Syaroslav@ivinco.com            return;
7791Syaroslav@ivinco.com        }*/
7887Syaroslav@ivinco.com
7982Syaroslav@ivinco.com        if(!empty($_REQUEST['ssplugininfo'])){
8082Syaroslav@ivinco.com            $info = array();
8182Syaroslav@ivinco.com            echo p_render('xhtml',p_get_instructions($this->_helpMessage), $info);
8282Syaroslav@ivinco.com            return;
8382Syaroslav@ivinco.com        }
8427Syaroslav@ivinco.com
8543Syaroslav@ivinco.com        $this->_search($QUERY,$_REQUEST['start'],$_REQUEST['prev']);
860Syaroslav@ivinco.com    }
870Syaroslav@ivinco.com
880Syaroslav@ivinco.com    /**
890Syaroslav@ivinco.com     * do the search and displays the result
900Syaroslav@ivinco.com     */
9143Syaroslav@ivinco.com    function _search($query, $start, $prev) {
9226Syaroslav@ivinco.com        global $conf;
930Syaroslav@ivinco.com
940Syaroslav@ivinco.com        $start = (int) $start;
9544Syaroslav@ivinco.com        if($start < 0){
9644Syaroslav@ivinco.com            $start = 0;
9744Syaroslav@ivinco.com        }
9844Syaroslav@ivinco.com        if(empty($prev)){
9944Syaroslav@ivinco.com            $prev = 0;
10044Syaroslav@ivinco.com        }
1010Syaroslav@ivinco.com
10263Syaroslav@ivinco.com        $categories = $this->_getCategories($query);
10367Syaroslav@ivinco.com        $keywords = $this->_getKeywords($query);
1040Syaroslav@ivinco.com
1050Syaroslav@ivinco.com        $search = new SphinxSearch($this->getConf('host'), $this->getConf('port'), $this->getConf('index'));
10616Syaroslav@ivinco.com        $search->setSnippetSize($this->getConf('snippetsize'));
10731Syaroslav@ivinco.com        $search->setArroundWordsCount($this->getConf('aroundwords'));
10819Syaroslav@ivinco.com        $search->setTitlePriority($this->getConf('title_priority'));
10919Syaroslav@ivinco.com        $search->setBodyPriority($this->getConf('body_priority'));
11080Syaroslav@ivinco.com        $search->setNamespacePriority($this->getConf('namespace_priority'));
11180Syaroslav@ivinco.com        $search->setPagenamePriority($this->getConf('pagename_priority'));
11269Syaroslav@ivinco.com
11369Syaroslav@ivinco.com        if (!empty($keywords) && empty($categories)){
11469Syaroslav@ivinco.com            $search->setSearchAllQuery($keywords, $categories);
11579Syaroslav@ivinco.com        } elseif (!empty($keywords)) {
11679Syaroslav@ivinco.com            $search->setSearchAllQueryWithCategoryFilter($keywords, $categories);
11769Syaroslav@ivinco.com        } else {
11882Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br>
11982Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
12079Syaroslav@ivinco.com            return;
12169Syaroslav@ivinco.com        }
12269Syaroslav@ivinco.com        $result = $search->search($start, $this->getConf('maxresults'));
12343Syaroslav@ivinco.com        $this->_search = $search;
12428Syaroslav@ivinco.com
12588Syaroslav@ivinco.com        if ($search->getError()){
12689Syaroslav@ivinco.com            echo "Could not connect to Sphinx search engine.";
12728Syaroslav@ivinco.com            return;
12828Syaroslav@ivinco.com        }
12969Syaroslav@ivinco.com
130*93Syaroslav@ivinco.com        if(!$result){
131*93Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br/>
132*93Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
133*93Syaroslav@ivinco.com            return;
134*93Syaroslav@ivinco.com        }
135*93Syaroslav@ivinco.com
13677Syaroslav@ivinco.com        $pagesList = $search->getPages($keywords);
1374Syaroslav@ivinco.com
1380Syaroslav@ivinco.com        $totalFound = $search->getTotalFound();
139*93Syaroslav@ivinco.com        if(empty($pagesList) || 0 == $totalFound){
14082Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br/>
14182Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
14227Syaroslav@ivinco.com            return;
14327Syaroslav@ivinco.com        } else {
14427Syaroslav@ivinco.com            echo '<style type="text/css">
14551Syaroslav@ivinco.com                div.dokuwiki .search{
14651Syaroslav@ivinco.com                    width:1024px;
14751Syaroslav@ivinco.com                }
14827Syaroslav@ivinco.com                div.dokuwiki .search_snippet{
14927Syaroslav@ivinco.com                    color:#000000;
15027Syaroslav@ivinco.com                    margin-left:0px;
15139Syaroslav@ivinco.com                    font-size: 13px;
15239Syaroslav@ivinco.com                }
15339Syaroslav@ivinco.com                div.dokuwiki .search_result{
15451Syaroslav@ivinco.com                    width:600px;
15539Syaroslav@ivinco.com                    float:left;
15639Syaroslav@ivinco.com                }
15750Syaroslav@ivinco.com                div.dokuwiki .search_result a.title{
15850Syaroslav@ivinco.com                    font:16px Arial,Helvetica,sans-serif;
15950Syaroslav@ivinco.com                }
16050Syaroslav@ivinco.com                div.dokuwiki .search_result span{
16151Syaroslav@ivinco.com                    font:12px Arial,Helvetica,sans-serif;
16250Syaroslav@ivinco.com                }
16339Syaroslav@ivinco.com                div.dokuwiki .search_sidebar{
16450Syaroslav@ivinco.com                    width:300px;
16539Syaroslav@ivinco.com                    float:right;
16639Syaroslav@ivinco.com                    margin-right: 30px;
16739Syaroslav@ivinco.com                }
16839Syaroslav@ivinco.com                div.dokuwiki .search_result_row{
16939Syaroslav@ivinco.com                    color:#000000;
17039Syaroslav@ivinco.com                    margin-left:0px;
17150Syaroslav@ivinco.com                    width:600px;
17250Syaroslav@ivinco.com                    text-align:left;
17339Syaroslav@ivinco.com                }
17439Syaroslav@ivinco.com                div.dokuwiki .search_result_row_child{
17539Syaroslav@ivinco.com                    color:#000000;
17639Syaroslav@ivinco.com                    margin-left:30px;
17750Syaroslav@ivinco.com                    width:600px;
17850Syaroslav@ivinco.com                    text-align:left;
17950Syaroslav@ivinco.com                }
18050Syaroslav@ivinco.com                div.dokuwiki .hide{
18150Syaroslav@ivinco.com                    display:none;
18227Syaroslav@ivinco.com                }
18327Syaroslav@ivinco.com                div.dokuwiki .search_cnt{
18450Syaroslav@ivinco.com                    color:#909090;
18551Syaroslav@ivinco.com                    font:12px Arial,Helvetica,sans-serif;
18627Syaroslav@ivinco.com                }
18727Syaroslav@ivinco.com                div.dokuwiki .search_nmsp{
18827Syaroslav@ivinco.com                    font-size: 10px;
18927Syaroslav@ivinco.com                }
19039Syaroslav@ivinco.com                div.dokuwiki .sphinxsearch_nav{
19139Syaroslav@ivinco.com                    clear:both;
19239Syaroslav@ivinco.com                }
19327Syaroslav@ivinco.com                </style>
19450Syaroslav@ivinco.com                <script type="text/javascript">
19550Syaroslav@ivinco.comfunction sh(id)
19650Syaroslav@ivinco.com{
19750Syaroslav@ivinco.com    var e = document.getElementById(id);
19850Syaroslav@ivinco.com    if(e.style.display == "block")
19950Syaroslav@ivinco.com        e.style.display = "none";
20050Syaroslav@ivinco.com    else
20150Syaroslav@ivinco.com        e.style.display = "block";
20250Syaroslav@ivinco.com}
20351Syaroslav@ivinco.com</script>
20450Syaroslav@ivinco.com';
20527Syaroslav@ivinco.com
20652Syaroslav@ivinco.com            echo '<h2>Found '.$totalFound . ($totalFound == 1  ? ' match ' : ' matches ') . ' for query "' . hsc($query).'"</h2>';
20751Syaroslav@ivinco.com            echo '<div class="search">';
20827Syaroslav@ivinco.com            echo '<div class="search_result">';
20927Syaroslav@ivinco.com            // printout the results
21043Syaroslav@ivinco.com            $pageListGroupByPage = array();
21143Syaroslav@ivinco.com            foreach ($pagesList as $row) {
21227Syaroslav@ivinco.com                $page = $row['page'];
21343Syaroslav@ivinco.com                if(!isset ($pageListGroupByPage[$page])){
21443Syaroslav@ivinco.com                    $pageListGroupByPage[$page] = $row;
21527Syaroslav@ivinco.com                } else {
21643Syaroslav@ivinco.com                    $pageListGroupByPage[$page]['subpages'][] = $row;
21727Syaroslav@ivinco.com                }
21843Syaroslav@ivinco.com            }
21943Syaroslav@ivinco.com            foreach ($pageListGroupByPage as $row) {
22050Syaroslav@ivinco.com                $this->_showResult($row, $keywords, false);
22143Syaroslav@ivinco.com                if(!empty($row['subpages'])){
22250Syaroslav@ivinco.com                    echo '<div id="more'.$row['page'].'" class="hide">';
22343Syaroslav@ivinco.com                    foreach($row['subpages'] as $sub){
22449Syaroslav@ivinco.com                        $this->_showResult($sub, $keywords, true);
22527Syaroslav@ivinco.com                    }
22650Syaroslav@ivinco.com                    echo '</div>';
22727Syaroslav@ivinco.com                }
22843Syaroslav@ivinco.com
2294Syaroslav@ivinco.com            }
23027Syaroslav@ivinco.com            echo '</div>';
23153Syaroslav@ivinco.com            echo '<div class="search_sidebar">';
23275Syaroslav@ivinco.com            printNamespacesNew($this->_getMatchingPagenames($keywords, $categories));
23339Syaroslav@ivinco.com            echo '</div>';
23427Syaroslav@ivinco.com            echo '<div class="sphinxsearch_nav">';
23543Syaroslav@ivinco.com            if ($start > 1){
23643Syaroslav@ivinco.com                if(false !== strpos($prev, ',')){
23746Syaroslav@ivinco.com                    $prevArry = explode(",", $prev);
23846Syaroslav@ivinco.com                    $prevNum = $prevArry[count($prevArry)-1];
23946Syaroslav@ivinco.com                    unset($prevArry[count($prevArry)-1]);
24046Syaroslav@ivinco.com                    $prevString = implode(",", $prevArry);
24143Syaroslav@ivinco.com                } else {
24243Syaroslav@ivinco.com                    $prevNum = 0;
24343Syaroslav@ivinco.com                }
2444Syaroslav@ivinco.com
24546Syaroslav@ivinco.com                echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$prevNum, 'prev'=>$prevString),'false','&'),
24643Syaroslav@ivinco.com                                          'prev','wikilink1 gs_prev',$conf['target']['interwiki']);
24718Syaroslav@ivinco.com            }
24827Syaroslav@ivinco.com            echo ' ';
24943Syaroslav@ivinco.com
25039Syaroslav@ivinco.com            //if($start + $this->getConf('maxresults') < $totalFound){
25139Syaroslav@ivinco.com                //$next = $start + $this->getConf('maxresults');
25243Syaroslav@ivinco.com            if($start + $search->getOffset()< $totalFound){
25339Syaroslav@ivinco.com                $next = $start + $search->getOffset();
25445Syaroslav@ivinco.com                if($start > 1){
25546Syaroslav@ivinco.com                    $prevString = $prev.','.$start;
25645Syaroslav@ivinco.com                }
25746Syaroslav@ivinco.com                echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$next,'prev'=>$prevString),'false','&'),
25827Syaroslav@ivinco.com                                          'next','wikilink1 gs_next',$conf['target']['interwiki']);
25927Syaroslav@ivinco.com            }
26027Syaroslav@ivinco.com            echo '</div>';
26182Syaroslav@ivinco.com            echo '<a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
26251Syaroslav@ivinco.com            echo '</div>';
2630Syaroslav@ivinco.com        }
26451Syaroslav@ivinco.com
2650Syaroslav@ivinco.com
2660Syaroslav@ivinco.com    }
2670Syaroslav@ivinco.com
26849Syaroslav@ivinco.com    function _showResult($row, $keywords, $subpages = false)
26943Syaroslav@ivinco.com    {
27043Syaroslav@ivinco.com        $page = $row['page'];
27143Syaroslav@ivinco.com        $bodyExcerpt = $row['bodyExcerpt'];
27243Syaroslav@ivinco.com        $titleTextExcerpt = $row['titleTextExcerpt'];
27343Syaroslav@ivinco.com        $hid = $row['hid'];
27443Syaroslav@ivinco.com
27543Syaroslav@ivinco.com        $metaData = p_get_metadata($page);
27643Syaroslav@ivinco.com
27743Syaroslav@ivinco.com        if (!empty($titleTextExcerpt)){
27843Syaroslav@ivinco.com            $titleText = $titleTextExcerpt;
27943Syaroslav@ivinco.com        } elseif(!empty($row['title_text'])){
28043Syaroslav@ivinco.com            $titleText = $row['title_text'];
28143Syaroslav@ivinco.com        } elseif(!empty($metaData['title'])){
28243Syaroslav@ivinco.com            $titleText = hsc($metaData['title']);
28343Syaroslav@ivinco.com        } else {
28443Syaroslav@ivinco.com            $titleText = hsc($page);
28543Syaroslav@ivinco.com        }
28643Syaroslav@ivinco.com
28743Syaroslav@ivinco.com        $namespaces = getNsLinks($page, $keywords, $this->_search);
28843Syaroslav@ivinco.com        $href = !empty($hid) ? (wl($page).'#'.$hid) : wl($page);
28943Syaroslav@ivinco.com
29046Syaroslav@ivinco.com        if($subpages){
29146Syaroslav@ivinco.com            echo '<div class="search_result_row_child">';
29243Syaroslav@ivinco.com        } else {
29346Syaroslav@ivinco.com            echo '<div class="search_result_row">';
29443Syaroslav@ivinco.com        }
29543Syaroslav@ivinco.com
29650Syaroslav@ivinco.com        echo '<a class="wikilink1 title" href="'.$href.'" title="" >'.$titleText.'</a><br/>';
29743Syaroslav@ivinco.com        echo '<div class="search_snippet">';
29843Syaroslav@ivinco.com        echo strip_tags($bodyExcerpt, '<b>,<strong>');
29943Syaroslav@ivinco.com        echo '</div>';
30043Syaroslav@ivinco.com        $sep=':';
30143Syaroslav@ivinco.com        $i = 0;
30243Syaroslav@ivinco.com        echo '<span class="search_nmsp">';
30343Syaroslav@ivinco.com        foreach ($namespaces as $name){
30443Syaroslav@ivinco.com            $link = $name['link'];
30543Syaroslav@ivinco.com            $pageTitle = $name['title'];
30651Syaroslav@ivinco.com            tpl_link($link, $pageTitle);
30743Syaroslav@ivinco.com            if ($i++ < count($namespaces)-1){
30843Syaroslav@ivinco.com                echo $sep;
30943Syaroslav@ivinco.com            }
31043Syaroslav@ivinco.com        }
31143Syaroslav@ivinco.com        if (!empty($hid)){
31243Syaroslav@ivinco.com            echo '#'.$hid;
31343Syaroslav@ivinco.com        }
31443Syaroslav@ivinco.com        echo '</span>';
31557Syaroslav@ivinco.com
31657Syaroslav@ivinco.com        if (!empty($metaData['last_change']['date'])){
31757Syaroslav@ivinco.com            echo '<span class="search_cnt"> - Last modified '.date("Y-m-d H:i",$metaData['last_change']['date']).'</span> ';
31857Syaroslav@ivinco.com        } else if (!empty($metaData['date']['created'])){
31957Syaroslav@ivinco.com            echo '<span class="search_cnt"> - Last modified '.date("Y-m-d H:i",$metaData['date']['created']).'</span> ';
32057Syaroslav@ivinco.com        }
32157Syaroslav@ivinco.com
32257Syaroslav@ivinco.com        if(!empty($metaData['last_change']['user'])){
32357Syaroslav@ivinco.com            echo '<span class="search_cnt">by '.$metaData['last_change']['user'].'</span> ';
32457Syaroslav@ivinco.com        } else if(!empty($metaData['creator'])){
32557Syaroslav@ivinco.com            echo '<span class="search_cnt">by '.$metaData['creator'].'</span> ';
32657Syaroslav@ivinco.com        }
32757Syaroslav@ivinco.com
32850Syaroslav@ivinco.com        if (!empty($row['subpages'])){
32950Syaroslav@ivinco.com            echo '<br />';
33051Syaroslav@ivinco.com            echo '<div style="text-align:right;font:12px Arial,Helvetica,sans-serif;text-decoration:underline;"><a href="javascript:void(0)" onClick="sh('."'more".$page."'".');" >More matches in this document</a></div>';
33150Syaroslav@ivinco.com        }else {
33250Syaroslav@ivinco.com            echo '<br />';
33350Syaroslav@ivinco.com        }
33443Syaroslav@ivinco.com        echo '<br />';
33543Syaroslav@ivinco.com        echo '</div>';
33643Syaroslav@ivinco.com    }
33743Syaroslav@ivinco.com
33882Syaroslav@ivinco.com     function searchform()
33982Syaroslav@ivinco.com    {
3400Syaroslav@ivinco.com          global $lang;
3410Syaroslav@ivinco.com          global $ACT;
3420Syaroslav@ivinco.com          global $QUERY;
3430Syaroslav@ivinco.com
3440Syaroslav@ivinco.com          // don't print the search form if search action has been disabled
34527Syaroslav@ivinco.com          if (!actionOk('search')) return false;
3460Syaroslav@ivinco.com
3470Syaroslav@ivinco.com          print '<form action="'.wl().'" accept-charset="utf-8" class="search" id="dw__search"><div class="no">';
34827Syaroslav@ivinco.com          print '<input type="hidden" name="do" value="search" />';
3490Syaroslav@ivinco.com          print '<input type="text" ';
35027Syaroslav@ivinco.com          if($ACT == 'search') print 'value="'.htmlspecialchars($QUERY).'" ';
3510Syaroslav@ivinco.com          print 'id="qsearch__in" accesskey="f" name="id" class="edit" title="[ALT+F]" />';
3520Syaroslav@ivinco.com          print '<input type="submit" value="'.$lang['btn_search'].'" class="button" title="'.$lang['btn_search'].'" />';
3530Syaroslav@ivinco.com          print '</div></form>';
3540Syaroslav@ivinco.com          return true;
3550Syaroslav@ivinco.com    }
35615Syaroslav@ivinco.com
35715Syaroslav@ivinco.com    function _getCategories($query)
35815Syaroslav@ivinco.com    {
35915Syaroslav@ivinco.com        $categories = '';
36015Syaroslav@ivinco.com        $query = urldecode($query);
36182Syaroslav@ivinco.com        if (false !== ($pos = strpos($query, "@ns"))){;
36282Syaroslav@ivinco.com            $categories = substr($query, $pos + strlen("@ns"));
36315Syaroslav@ivinco.com        }
36415Syaroslav@ivinco.com        return trim($categories);
36515Syaroslav@ivinco.com    }
36615Syaroslav@ivinco.com
36715Syaroslav@ivinco.com    function _getKeywords($query)
36815Syaroslav@ivinco.com    {
36915Syaroslav@ivinco.com        $keywords = $query;
37015Syaroslav@ivinco.com        $query = urldecode($query);
37182Syaroslav@ivinco.com        if (false !== ($pos = strpos($query, "-@ns"))){;
37215Syaroslav@ivinco.com            $keywords = substr($keywords, 0, $pos);
37382Syaroslav@ivinco.com        }else if (false !== ($pos = strpos($query, "@ns"))){;
37463Syaroslav@ivinco.com            $keywords = substr($keywords, 0, $pos);
37563Syaroslav@ivinco.com        }
37615Syaroslav@ivinco.com        return trim($keywords);
37715Syaroslav@ivinco.com    }
37869Syaroslav@ivinco.com
37970Syaroslav@ivinco.com    function _getMatchingPagenames($keywords, $categories)
38069Syaroslav@ivinco.com    {
38170Syaroslav@ivinco.com        $this->_search->setSearchCategoryQuery($keywords, $categories);
38280Syaroslav@ivinco.com        $this->_search->setNamespacePriority($this->getConf('mp_namespace_priority'));
38380Syaroslav@ivinco.com        $this->_search->setPagenamePriority($this->getConf('mp_pagename_priority'));
38480Syaroslav@ivinco.com
38577Syaroslav@ivinco.com        $res = $this->_search->search(0, 10);
38669Syaroslav@ivinco.com        if (!$res){
38769Syaroslav@ivinco.com            return false;
38869Syaroslav@ivinco.com        }
38969Syaroslav@ivinco.com        $pageIds = $this->_search->getPagesIds();
39069Syaroslav@ivinco.com
39169Syaroslav@ivinco.com        $matchPages = array();
39269Syaroslav@ivinco.com        foreach($pageIds as $page){
39377Syaroslav@ivinco.com            $matchPages[$page['page']] = $page['hid'];
39469Syaroslav@ivinco.com        }
39569Syaroslav@ivinco.com        return array_unique($matchPages);
39669Syaroslav@ivinco.com    }
3970Syaroslav@ivinco.com}
3980Syaroslav@ivinco.com
3990Syaroslav@ivinco.com?>
400