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){
59*87Syaroslav@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
74*87Syaroslav@ivinco.com        if (!extension_loaded('sqlite')) {
75*87Syaroslav@ivinco.com            echo "SQLite extension is not loaded!";
76*87Syaroslav@ivinco.com            return;
77*87Syaroslav@ivinco.com        }
78*87Syaroslav@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
12569Syaroslav@ivinco.com        if (!$result || $search->getError()){
12682Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br/>
12782Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
12828Syaroslav@ivinco.com            return;
12928Syaroslav@ivinco.com        }
13069Syaroslav@ivinco.com
13177Syaroslav@ivinco.com        $pagesList = $search->getPages($keywords);
1324Syaroslav@ivinco.com
1330Syaroslav@ivinco.com        $totalFound = $search->getTotalFound();
13479Syaroslav@ivinco.com        if(empty($pagesList) || 0 == $totalFound){
13582Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br/>
13682Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
13727Syaroslav@ivinco.com            return;
13827Syaroslav@ivinco.com        } else {
13927Syaroslav@ivinco.com            echo '<style type="text/css">
14051Syaroslav@ivinco.com                div.dokuwiki .search{
14151Syaroslav@ivinco.com                    width:1024px;
14251Syaroslav@ivinco.com                }
14327Syaroslav@ivinco.com                div.dokuwiki .search_snippet{
14427Syaroslav@ivinco.com                    color:#000000;
14527Syaroslav@ivinco.com                    margin-left:0px;
14639Syaroslav@ivinco.com                    font-size: 13px;
14739Syaroslav@ivinco.com                }
14839Syaroslav@ivinco.com                div.dokuwiki .search_result{
14951Syaroslav@ivinco.com                    width:600px;
15039Syaroslav@ivinco.com                    float:left;
15139Syaroslav@ivinco.com                }
15250Syaroslav@ivinco.com                div.dokuwiki .search_result a.title{
15350Syaroslav@ivinco.com                    font:16px Arial,Helvetica,sans-serif;
15450Syaroslav@ivinco.com                }
15550Syaroslav@ivinco.com                div.dokuwiki .search_result span{
15651Syaroslav@ivinco.com                    font:12px Arial,Helvetica,sans-serif;
15750Syaroslav@ivinco.com                }
15839Syaroslav@ivinco.com                div.dokuwiki .search_sidebar{
15950Syaroslav@ivinco.com                    width:300px;
16039Syaroslav@ivinco.com                    float:right;
16139Syaroslav@ivinco.com                    margin-right: 30px;
16239Syaroslav@ivinco.com                }
16339Syaroslav@ivinco.com                div.dokuwiki .search_result_row{
16439Syaroslav@ivinco.com                    color:#000000;
16539Syaroslav@ivinco.com                    margin-left:0px;
16650Syaroslav@ivinco.com                    width:600px;
16750Syaroslav@ivinco.com                    text-align:left;
16839Syaroslav@ivinco.com                }
16939Syaroslav@ivinco.com                div.dokuwiki .search_result_row_child{
17039Syaroslav@ivinco.com                    color:#000000;
17139Syaroslav@ivinco.com                    margin-left:30px;
17250Syaroslav@ivinco.com                    width:600px;
17350Syaroslav@ivinco.com                    text-align:left;
17450Syaroslav@ivinco.com                }
17550Syaroslav@ivinco.com                div.dokuwiki .hide{
17650Syaroslav@ivinco.com                    display:none;
17727Syaroslav@ivinco.com                }
17827Syaroslav@ivinco.com                div.dokuwiki .search_cnt{
17950Syaroslav@ivinco.com                    color:#909090;
18051Syaroslav@ivinco.com                    font:12px Arial,Helvetica,sans-serif;
18127Syaroslav@ivinco.com                }
18227Syaroslav@ivinco.com                div.dokuwiki .search_nmsp{
18327Syaroslav@ivinco.com                    font-size: 10px;
18427Syaroslav@ivinco.com                }
18539Syaroslav@ivinco.com                div.dokuwiki .sphinxsearch_nav{
18639Syaroslav@ivinco.com                    clear:both;
18739Syaroslav@ivinco.com                }
18827Syaroslav@ivinco.com                </style>
18950Syaroslav@ivinco.com                <script type="text/javascript">
19050Syaroslav@ivinco.comfunction sh(id)
19150Syaroslav@ivinco.com{
19250Syaroslav@ivinco.com    var e = document.getElementById(id);
19350Syaroslav@ivinco.com    if(e.style.display == "block")
19450Syaroslav@ivinco.com        e.style.display = "none";
19550Syaroslav@ivinco.com    else
19650Syaroslav@ivinco.com        e.style.display = "block";
19750Syaroslav@ivinco.com}
19851Syaroslav@ivinco.com</script>
19950Syaroslav@ivinco.com';
20027Syaroslav@ivinco.com
20152Syaroslav@ivinco.com            echo '<h2>Found '.$totalFound . ($totalFound == 1  ? ' match ' : ' matches ') . ' for query "' . hsc($query).'"</h2>';
20251Syaroslav@ivinco.com            echo '<div class="search">';
20327Syaroslav@ivinco.com            echo '<div class="search_result">';
20427Syaroslav@ivinco.com            // printout the results
20543Syaroslav@ivinco.com            $pageListGroupByPage = array();
20643Syaroslav@ivinco.com            foreach ($pagesList as $row) {
20727Syaroslav@ivinco.com                $page = $row['page'];
20843Syaroslav@ivinco.com                if(!isset ($pageListGroupByPage[$page])){
20943Syaroslav@ivinco.com                    $pageListGroupByPage[$page] = $row;
21027Syaroslav@ivinco.com                } else {
21143Syaroslav@ivinco.com                    $pageListGroupByPage[$page]['subpages'][] = $row;
21227Syaroslav@ivinco.com                }
21343Syaroslav@ivinco.com            }
21443Syaroslav@ivinco.com            foreach ($pageListGroupByPage as $row) {
21550Syaroslav@ivinco.com                $this->_showResult($row, $keywords, false);
21643Syaroslav@ivinco.com                if(!empty($row['subpages'])){
21750Syaroslav@ivinco.com                    echo '<div id="more'.$row['page'].'" class="hide">';
21843Syaroslav@ivinco.com                    foreach($row['subpages'] as $sub){
21949Syaroslav@ivinco.com                        $this->_showResult($sub, $keywords, true);
22027Syaroslav@ivinco.com                    }
22150Syaroslav@ivinco.com                    echo '</div>';
22227Syaroslav@ivinco.com                }
22343Syaroslav@ivinco.com
2244Syaroslav@ivinco.com            }
22527Syaroslav@ivinco.com            echo '</div>';
22653Syaroslav@ivinco.com            echo '<div class="search_sidebar">';
22775Syaroslav@ivinco.com            printNamespacesNew($this->_getMatchingPagenames($keywords, $categories));
22839Syaroslav@ivinco.com            echo '</div>';
22927Syaroslav@ivinco.com            echo '<div class="sphinxsearch_nav">';
23043Syaroslav@ivinco.com            if ($start > 1){
23143Syaroslav@ivinco.com                if(false !== strpos($prev, ',')){
23246Syaroslav@ivinco.com                    $prevArry = explode(",", $prev);
23346Syaroslav@ivinco.com                    $prevNum = $prevArry[count($prevArry)-1];
23446Syaroslav@ivinco.com                    unset($prevArry[count($prevArry)-1]);
23546Syaroslav@ivinco.com                    $prevString = implode(",", $prevArry);
23643Syaroslav@ivinco.com                } else {
23743Syaroslav@ivinco.com                    $prevNum = 0;
23843Syaroslav@ivinco.com                }
2394Syaroslav@ivinco.com
24046Syaroslav@ivinco.com                echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$prevNum, 'prev'=>$prevString),'false','&'),
24143Syaroslav@ivinco.com                                          'prev','wikilink1 gs_prev',$conf['target']['interwiki']);
24218Syaroslav@ivinco.com            }
24327Syaroslav@ivinco.com            echo ' ';
24443Syaroslav@ivinco.com
24539Syaroslav@ivinco.com            //if($start + $this->getConf('maxresults') < $totalFound){
24639Syaroslav@ivinco.com                //$next = $start + $this->getConf('maxresults');
24743Syaroslav@ivinco.com            if($start + $search->getOffset()< $totalFound){
24839Syaroslav@ivinco.com                $next = $start + $search->getOffset();
24945Syaroslav@ivinco.com                if($start > 1){
25046Syaroslav@ivinco.com                    $prevString = $prev.','.$start;
25145Syaroslav@ivinco.com                }
25246Syaroslav@ivinco.com                echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$next,'prev'=>$prevString),'false','&'),
25327Syaroslav@ivinco.com                                          'next','wikilink1 gs_next',$conf['target']['interwiki']);
25427Syaroslav@ivinco.com            }
25527Syaroslav@ivinco.com            echo '</div>';
25682Syaroslav@ivinco.com            echo '<a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
25751Syaroslav@ivinco.com            echo '</div>';
2580Syaroslav@ivinco.com        }
25951Syaroslav@ivinco.com
2600Syaroslav@ivinco.com
2610Syaroslav@ivinco.com    }
2620Syaroslav@ivinco.com
26349Syaroslav@ivinco.com    function _showResult($row, $keywords, $subpages = false)
26443Syaroslav@ivinco.com    {
26543Syaroslav@ivinco.com        $page = $row['page'];
26643Syaroslav@ivinco.com        $bodyExcerpt = $row['bodyExcerpt'];
26743Syaroslav@ivinco.com        $titleTextExcerpt = $row['titleTextExcerpt'];
26843Syaroslav@ivinco.com        $hid = $row['hid'];
26943Syaroslav@ivinco.com
27043Syaroslav@ivinco.com        $metaData = p_get_metadata($page);
27143Syaroslav@ivinco.com
27243Syaroslav@ivinco.com        if (!empty($titleTextExcerpt)){
27343Syaroslav@ivinco.com            $titleText = $titleTextExcerpt;
27443Syaroslav@ivinco.com        } elseif(!empty($row['title_text'])){
27543Syaroslav@ivinco.com            $titleText = $row['title_text'];
27643Syaroslav@ivinco.com        } elseif(!empty($metaData['title'])){
27743Syaroslav@ivinco.com            $titleText = hsc($metaData['title']);
27843Syaroslav@ivinco.com        } else {
27943Syaroslav@ivinco.com            $titleText = hsc($page);
28043Syaroslav@ivinco.com        }
28143Syaroslav@ivinco.com
28243Syaroslav@ivinco.com        $namespaces = getNsLinks($page, $keywords, $this->_search);
28343Syaroslav@ivinco.com        $href = !empty($hid) ? (wl($page).'#'.$hid) : wl($page);
28443Syaroslav@ivinco.com
28546Syaroslav@ivinco.com        if($subpages){
28646Syaroslav@ivinco.com            echo '<div class="search_result_row_child">';
28743Syaroslav@ivinco.com        } else {
28846Syaroslav@ivinco.com            echo '<div class="search_result_row">';
28943Syaroslav@ivinco.com        }
29043Syaroslav@ivinco.com
29150Syaroslav@ivinco.com        echo '<a class="wikilink1 title" href="'.$href.'" title="" >'.$titleText.'</a><br/>';
29243Syaroslav@ivinco.com        echo '<div class="search_snippet">';
29343Syaroslav@ivinco.com        echo strip_tags($bodyExcerpt, '<b>,<strong>');
29443Syaroslav@ivinco.com        echo '</div>';
29543Syaroslav@ivinco.com        $sep=':';
29643Syaroslav@ivinco.com        $i = 0;
29743Syaroslav@ivinco.com        echo '<span class="search_nmsp">';
29843Syaroslav@ivinco.com        foreach ($namespaces as $name){
29943Syaroslav@ivinco.com            $link = $name['link'];
30043Syaroslav@ivinco.com            $pageTitle = $name['title'];
30151Syaroslav@ivinco.com            tpl_link($link, $pageTitle);
30243Syaroslav@ivinco.com            if ($i++ < count($namespaces)-1){
30343Syaroslav@ivinco.com                echo $sep;
30443Syaroslav@ivinco.com            }
30543Syaroslav@ivinco.com        }
30643Syaroslav@ivinco.com        if (!empty($hid)){
30743Syaroslav@ivinco.com            echo '#'.$hid;
30843Syaroslav@ivinco.com        }
30943Syaroslav@ivinco.com        echo '</span>';
31057Syaroslav@ivinco.com
31157Syaroslav@ivinco.com        if (!empty($metaData['last_change']['date'])){
31257Syaroslav@ivinco.com            echo '<span class="search_cnt"> - Last modified '.date("Y-m-d H:i",$metaData['last_change']['date']).'</span> ';
31357Syaroslav@ivinco.com        } else if (!empty($metaData['date']['created'])){
31457Syaroslav@ivinco.com            echo '<span class="search_cnt"> - Last modified '.date("Y-m-d H:i",$metaData['date']['created']).'</span> ';
31557Syaroslav@ivinco.com        }
31657Syaroslav@ivinco.com
31757Syaroslav@ivinco.com        if(!empty($metaData['last_change']['user'])){
31857Syaroslav@ivinco.com            echo '<span class="search_cnt">by '.$metaData['last_change']['user'].'</span> ';
31957Syaroslav@ivinco.com        } else if(!empty($metaData['creator'])){
32057Syaroslav@ivinco.com            echo '<span class="search_cnt">by '.$metaData['creator'].'</span> ';
32157Syaroslav@ivinco.com        }
32257Syaroslav@ivinco.com
32350Syaroslav@ivinco.com        if (!empty($row['subpages'])){
32450Syaroslav@ivinco.com            echo '<br />';
32551Syaroslav@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>';
32650Syaroslav@ivinco.com        }else {
32750Syaroslav@ivinco.com            echo '<br />';
32850Syaroslav@ivinco.com        }
32943Syaroslav@ivinco.com        echo '<br />';
33043Syaroslav@ivinco.com        echo '</div>';
33143Syaroslav@ivinco.com    }
33243Syaroslav@ivinco.com
33382Syaroslav@ivinco.com     function searchform()
33482Syaroslav@ivinco.com    {
3350Syaroslav@ivinco.com          global $lang;
3360Syaroslav@ivinco.com          global $ACT;
3370Syaroslav@ivinco.com          global $QUERY;
3380Syaroslav@ivinco.com
3390Syaroslav@ivinco.com          // don't print the search form if search action has been disabled
34027Syaroslav@ivinco.com          if (!actionOk('search')) return false;
3410Syaroslav@ivinco.com
3420Syaroslav@ivinco.com          print '<form action="'.wl().'" accept-charset="utf-8" class="search" id="dw__search"><div class="no">';
34327Syaroslav@ivinco.com          print '<input type="hidden" name="do" value="search" />';
3440Syaroslav@ivinco.com          print '<input type="text" ';
34527Syaroslav@ivinco.com          if($ACT == 'search') print 'value="'.htmlspecialchars($QUERY).'" ';
3460Syaroslav@ivinco.com          print 'id="qsearch__in" accesskey="f" name="id" class="edit" title="[ALT+F]" />';
3470Syaroslav@ivinco.com          print '<input type="submit" value="'.$lang['btn_search'].'" class="button" title="'.$lang['btn_search'].'" />';
3480Syaroslav@ivinco.com          print '</div></form>';
3490Syaroslav@ivinco.com          return true;
3500Syaroslav@ivinco.com    }
35115Syaroslav@ivinco.com
35215Syaroslav@ivinco.com    function _getCategories($query)
35315Syaroslav@ivinco.com    {
35415Syaroslav@ivinco.com        $categories = '';
35515Syaroslav@ivinco.com        $query = urldecode($query);
35682Syaroslav@ivinco.com        if (false !== ($pos = strpos($query, "@ns"))){;
35782Syaroslav@ivinco.com            $categories = substr($query, $pos + strlen("@ns"));
35815Syaroslav@ivinco.com        }
35915Syaroslav@ivinco.com        return trim($categories);
36015Syaroslav@ivinco.com    }
36115Syaroslav@ivinco.com
36215Syaroslav@ivinco.com    function _getKeywords($query)
36315Syaroslav@ivinco.com    {
36415Syaroslav@ivinco.com        $keywords = $query;
36515Syaroslav@ivinco.com        $query = urldecode($query);
36682Syaroslav@ivinco.com        if (false !== ($pos = strpos($query, "-@ns"))){;
36715Syaroslav@ivinco.com            $keywords = substr($keywords, 0, $pos);
36882Syaroslav@ivinco.com        }else if (false !== ($pos = strpos($query, "@ns"))){;
36963Syaroslav@ivinco.com            $keywords = substr($keywords, 0, $pos);
37063Syaroslav@ivinco.com        }
37115Syaroslav@ivinco.com        return trim($keywords);
37215Syaroslav@ivinco.com    }
37369Syaroslav@ivinco.com
37470Syaroslav@ivinco.com    function _getMatchingPagenames($keywords, $categories)
37569Syaroslav@ivinco.com    {
37670Syaroslav@ivinco.com        $this->_search->setSearchCategoryQuery($keywords, $categories);
37780Syaroslav@ivinco.com        $this->_search->setNamespacePriority($this->getConf('mp_namespace_priority'));
37880Syaroslav@ivinco.com        $this->_search->setPagenamePriority($this->getConf('mp_pagename_priority'));
37980Syaroslav@ivinco.com
38077Syaroslav@ivinco.com        $res = $this->_search->search(0, 10);
38169Syaroslav@ivinco.com        if (!$res){
38269Syaroslav@ivinco.com            return false;
38369Syaroslav@ivinco.com        }
38469Syaroslav@ivinco.com        $pageIds = $this->_search->getPagesIds();
38569Syaroslav@ivinco.com
38669Syaroslav@ivinco.com        $matchPages = array();
38769Syaroslav@ivinco.com        foreach($pageIds as $page){
38877Syaroslav@ivinco.com            $matchPages[$page['page']] = $page['hid'];
38969Syaroslav@ivinco.com        }
39069Syaroslav@ivinco.com        return array_unique($matchPages);
39169Syaroslav@ivinco.com    }
3920Syaroslav@ivinco.com}
3930Syaroslav@ivinco.com
3940Syaroslav@ivinco.com?>
395