1<?php
2/**
3 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
4 * @author     Todd Augsburger <todd@rollerorgans.com>
5 */
6
7if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
8if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
9require_once(DOKU_INC.'inc/fulltext.php');
10require_once(DOKU_PLUGIN.'syntax.php');
11
12class syntax_plugin_searchresults extends DokuWiki_Syntax_Plugin {
13
14    function getInfo(){
15        return array(
16            'author' => 'Todd Augsburger',
17            'email'  => 'todd@rollerorgans.com',
18            'date'   => '2007-08-30',
19            'name'   => 'SearchResults Plugin',
20            'desc'   => "returns search results as bulleted list:\n{{search>the words}}",
21            'url'    => 'http://wiki.splitbrain.org/plugin:searchresults',
22        );
23    }
24
25    function getType() {
26        return 'substition';
27    }
28
29    function getSort() {
30        return 300;
31    }
32
33    function connectTo($mode) {
34        $this->Lexer->addSpecialPattern("{{search>.*?}}", $mode, 'plugin_searchresults');
35    }
36
37    function handle($match, $state, $pos, &$handler) {
38        if ($state == DOKU_LEXER_SPECIAL) {
39             // strip / from start and / from end
40            $match = substr($match,9,-2);
41            return array($state, $match);
42        }
43        return array();
44    }
45
46    //natsort an array of pagenames
47    function _addSorted(&$target,$names){
48      global $conf;
49      if ($conf['useheading']) {
50        // sort by headings
51        $title_array = array();
52        foreach($names as $key=>$value) {
53          if ($title = p_get_first_heading($value))
54            $title_array[$key] = $title;
55          else
56            $title_array[$key] = $value;
57        }
58        natsort($title_array);
59        foreach($title_array as $key=>$value)
60          $target[] = $names[$key];
61      } else {
62        // sort by pagenames
63        natsort($names);
64        foreach($names as $value)
65          $target[] = $value;
66      }
67    }
68
69    function render($mode, &$renderer, $data) {
70        if ($mode == 'xhtml') {
71            list($state, $match) = $data;
72            if ($state == DOKU_LEXER_SPECIAL) {
73              $search = ft_pageSearch($match,$poswords);
74              if(count($search)){
75                $renderer->doc .= "<ul>\n";
76                $key_array = array();
77                $this->_addSorted($key_array,array_keys($search));
78                foreach($key_array as $value) {
79                  $renderer->doc .= '<li class="level1"><div class="li">';
80                  $renderer->doc .= html_wikilink(':'.$value);
81                  $renderer->doc .= "</div>\n";
82                }
83                $renderer->doc .= "</ul>\n";
84              }
85            }
86            return true;
87        }
88        return false;
89    }
90}
91