1*0Syaroslav@ivinco.com<?php
2*0Syaroslav@ivinco.com/**
3*0Syaroslav@ivinco.com * Script to search in uploaded pdf documents
4*0Syaroslav@ivinco.com *
5*0Syaroslav@ivinco.com * @author Dominik Eckelmann <eckelmann@cosmocode.de>
6*0Syaroslav@ivinco.com */
7*0Syaroslav@ivinco.com
8*0Syaroslav@ivinco.comif(!defined('DOKU_INC')) die();
9*0Syaroslav@ivinco.comif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
10*0Syaroslav@ivinco.com
11*0Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'action.php');
12*0Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/sphinxapi.php');
13*0Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/PageMapper.php');
14*0Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/SphinxSearch.php');
15*0Syaroslav@ivinco.com
16*0Syaroslav@ivinco.com
17*0Syaroslav@ivinco.comclass action_plugin_sphinxsearch extends DokuWiki_Action_Plugin {
18*0Syaroslav@ivinco.com
19*0Syaroslav@ivinco.com    /**
20*0Syaroslav@ivinco.com	* return some info
21*0Syaroslav@ivinco.com	*/
22*0Syaroslav@ivinco.com    function getInfo() {
23*0Syaroslav@ivinco.com        return confToHash(dirname(__FILE__).'/plugin.info.txt');
24*0Syaroslav@ivinco.com	}
25*0Syaroslav@ivinco.com
26*0Syaroslav@ivinco.com    /**
27*0Syaroslav@ivinco.com	* Register to the content display event to place the results under it.
28*0Syaroslav@ivinco.com	*/
29*0Syaroslav@ivinco.com    /**
30*0Syaroslav@ivinco.com     * register the eventhandlers
31*0Syaroslav@ivinco.com     */
32*0Syaroslav@ivinco.com    function register(&$controller){
33*0Syaroslav@ivinco.com        $controller->register_hook('ACTION_ACT_PREPROCESS',
34*0Syaroslav@ivinco.com                                   'BEFORE',
35*0Syaroslav@ivinco.com                                   $this,
36*0Syaroslav@ivinco.com                                   'handle_act_preprocess',
37*0Syaroslav@ivinco.com                                   array());
38*0Syaroslav@ivinco.com
39*0Syaroslav@ivinco.com        $controller->register_hook('TPL_ACT_UNKNOWN',
40*0Syaroslav@ivinco.com                                   'BEFORE',
41*0Syaroslav@ivinco.com                                   $this,
42*0Syaroslav@ivinco.com                                   'handle_act_unknown',
43*0Syaroslav@ivinco.com                                   array());
44*0Syaroslav@ivinco.com    }
45*0Syaroslav@ivinco.com
46*0Syaroslav@ivinco.com    /**
47*0Syaroslav@ivinco.com     * Checks if 'googlesearch' was given as action, if so we
48*0Syaroslav@ivinco.com     * do handle the event our self and no further checking takes place
49*0Syaroslav@ivinco.com     */
50*0Syaroslav@ivinco.com    function handle_act_preprocess(&$event, $param){
51*0Syaroslav@ivinco.com        if($event->data != 'sphinxsearch') return; // nothing to do for us
52*0Syaroslav@ivinco.com
53*0Syaroslav@ivinco.com        $event->stopPropagation(); // this is our very own action, no need to check other plugins
54*0Syaroslav@ivinco.com        $event->preventDefault();  // we handle it our self, thanks
55*0Syaroslav@ivinco.com    }
56*0Syaroslav@ivinco.com
57*0Syaroslav@ivinco.com    /**
58*0Syaroslav@ivinco.com     * If our own 'googlesearch' action was given we produce our content here
59*0Syaroslav@ivinco.com     */
60*0Syaroslav@ivinco.com    function handle_act_unknown(&$event, $param){
61*0Syaroslav@ivinco.com        if($event->data != 'sphinxsearch') return; // nothing to do for us
62*0Syaroslav@ivinco.com
63*0Syaroslav@ivinco.com        // we can handle it -> prevent others
64*0Syaroslav@ivinco.com        $event->stopPropagation();
65*0Syaroslav@ivinco.com        $event->preventDefault();
66*0Syaroslav@ivinco.com
67*0Syaroslav@ivinco.com        global $QUERY;
68*0Syaroslav@ivinco.com        $this->_search($QUERY,$_REQUEST['start']);
69*0Syaroslav@ivinco.com    }
70*0Syaroslav@ivinco.com
71*0Syaroslav@ivinco.com    /**
72*0Syaroslav@ivinco.com     * do the search and displays the result
73*0Syaroslav@ivinco.com     */
74*0Syaroslav@ivinco.com    function _search($query, $start) {
75*0Syaroslav@ivinco.com
76*0Syaroslav@ivinco.com        $start = (int) $start;
77*0Syaroslav@ivinco.com        if($start < 0) $start = 0;
78*0Syaroslav@ivinco.com
79*0Syaroslav@ivinco.com	// backup the config array
80*0Syaroslav@ivinco.com	$cp = $conf;
81*0Syaroslav@ivinco.com
82*0Syaroslav@ivinco.com        $search = new SphinxSearch($this->getConf('host'), $this->getConf('port'), $this->getConf('index'));
83*0Syaroslav@ivinco.com        $pagesList = $search->search($query, $start, $this->getConf('maxresults'));
84*0Syaroslav@ivinco.com        $totalFound = $search->getTotalFound();
85*0Syaroslav@ivinco.com
86*0Syaroslav@ivinco.com        echo '<h2>Found '.$totalFound .' documents for query "' . hsc($query).'"</h2>';
87*0Syaroslav@ivinco.com	echo '<div class="search_result">';
88*0Syaroslav@ivinco.com        // printout the results
89*0Syaroslav@ivinco.com	foreach ($pagesList as $id => $excerpt) {
90*0Syaroslav@ivinco.com            $metaData = p_get_metadata($id);
91*0Syaroslav@ivinco.com            echo '<a href="/doku.php/'.$id.'" title="" class="wikilink1">'.hsc($id).' ('.hsc($metaData['title']).')'.'</a><br/>';
92*0Syaroslav@ivinco.com            echo '<span class="search_cnt">Last modified:'.date("Y-m-d H:i",$metaData['date']['modified']).'</span>';
93*0Syaroslav@ivinco.com            echo '<div class="search_snippet">';
94*0Syaroslav@ivinco.com            echo $excerpt;
95*0Syaroslav@ivinco.com            echo '</div>';
96*0Syaroslav@ivinco.com            echo '<br />';
97*0Syaroslav@ivinco.com	}
98*0Syaroslav@ivinco.com        echo '</div>';
99*0Syaroslav@ivinco.com        echo '<div class="sphinxsearch_nav">';
100*0Syaroslav@ivinco.com        if ($start > 1){
101*0Syaroslav@ivinco.com            $prev = $start - $this->getConf('maxresults');
102*0Syaroslav@ivinco.com            if($prev < 0) $prev = 0;
103*0Syaroslav@ivinco.com
104*0Syaroslav@ivinco.com            echo $this->external_link(wl('',array('do'=>'sphinxsearch','id'=>$query,'start'=>$prev),'false','&'),
105*0Syaroslav@ivinco.com                                      'prev','wikilink1 gs_prev',$conf['target']['interwiki']);
106*0Syaroslav@ivinco.com        }
107*0Syaroslav@ivinco.com        echo ' ';
108*0Syaroslav@ivinco.com        if($start + $this->getConf('maxresults') < $totalFound){
109*0Syaroslav@ivinco.com            $next = $start + $this->getConf('maxresults');
110*0Syaroslav@ivinco.com
111*0Syaroslav@ivinco.com            echo $this->external_link(wl('',array('do'=>'sphinxsearch','id'=>$query,'start'=>$next),'false','&'),
112*0Syaroslav@ivinco.com                                      'next','wikilink1 gs_next',$conf['target']['interwiki']);
113*0Syaroslav@ivinco.com        }
114*0Syaroslav@ivinco.com        echo '</div>';
115*0Syaroslav@ivinco.com
116*0Syaroslav@ivinco.com    }
117*0Syaroslav@ivinco.com
118*0Syaroslav@ivinco.com     function searchform(){
119*0Syaroslav@ivinco.com          global $lang;
120*0Syaroslav@ivinco.com          global $ACT;
121*0Syaroslav@ivinco.com          global $QUERY;
122*0Syaroslav@ivinco.com
123*0Syaroslav@ivinco.com          // don't print the search form if search action has been disabled
124*0Syaroslav@ivinco.com          if (!actionOk('sphinxsearch')) return false;
125*0Syaroslav@ivinco.com
126*0Syaroslav@ivinco.com          print '<form action="'.wl().'" accept-charset="utf-8" class="search" id="dw__search"><div class="no">';
127*0Syaroslav@ivinco.com          print '<input type="hidden" name="do" value="sphinxsearch" />';
128*0Syaroslav@ivinco.com          print '<input type="text" ';
129*0Syaroslav@ivinco.com          if($ACT == 'sphinxsearch') print 'value="'.htmlspecialchars($QUERY).'" ';
130*0Syaroslav@ivinco.com          print 'id="qsearch__in" accesskey="f" name="id" class="edit" title="[ALT+F]" />';
131*0Syaroslav@ivinco.com          print '<input type="submit" value="'.$lang['btn_search'].'" class="button" title="'.$lang['btn_search'].'" />';
132*0Syaroslav@ivinco.com          print '</div></form>';
133*0Syaroslav@ivinco.com          return true;
134*0Syaroslav@ivinco.com    }
135*0Syaroslav@ivinco.com}
136*0Syaroslav@ivinco.com
137*0Syaroslav@ivinco.com?>
138