136 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace dokuwiki\Action;
 | 
						|
 | 
						|
use dokuwiki\Action\Exception\ActionAbort;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class Search
 | 
						|
 *
 | 
						|
 * Search for pages and content
 | 
						|
 *
 | 
						|
 * @package dokuwiki\Action
 | 
						|
 */
 | 
						|
class Search extends AbstractAction {
 | 
						|
 | 
						|
    protected $pageLookupResults = array();
 | 
						|
    protected $fullTextResults = array();
 | 
						|
    protected $highlight = array();
 | 
						|
 | 
						|
    /** @inheritdoc */
 | 
						|
    public function minimumPermission() {
 | 
						|
        return AUTH_NONE;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * we only search if a search word was given
 | 
						|
     *
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    public function checkPreconditions() {
 | 
						|
        parent::checkPreconditions();
 | 
						|
    }
 | 
						|
 | 
						|
    public function preProcess()
 | 
						|
    {
 | 
						|
        global $QUERY, $ID, $conf, $INPUT;
 | 
						|
        $s = cleanID($QUERY);
 | 
						|
 | 
						|
        if ($ID !== $conf['start'] && !$INPUT->has('q')) {
 | 
						|
            parse_str($INPUT->server->str('QUERY_STRING'), $urlParts);
 | 
						|
            $urlParts['q'] = $urlParts['id'];
 | 
						|
            unset($urlParts['id']);
 | 
						|
            $url = wl($ID, $urlParts, true, '&');
 | 
						|
            send_redirect($url);
 | 
						|
        }
 | 
						|
 | 
						|
        if ($s === '') throw new ActionAbort();
 | 
						|
        $this->adjustGlobalQuery();
 | 
						|
    }
 | 
						|
 | 
						|
    /** @inheritdoc */
 | 
						|
    public function tplContent()
 | 
						|
    {
 | 
						|
        $this->execute();
 | 
						|
 | 
						|
        $search = new \dokuwiki\Ui\Search($this->pageLookupResults, $this->fullTextResults, $this->highlight);
 | 
						|
        $search->show();
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * run the search
 | 
						|
     */
 | 
						|
    protected function execute()
 | 
						|
    {
 | 
						|
        global $INPUT, $QUERY;
 | 
						|
        $after = $INPUT->str('min');
 | 
						|
        $before = $INPUT->str('max');
 | 
						|
        $this->pageLookupResults = ft_pageLookup($QUERY, true, useHeading('navigation'), $after, $before);
 | 
						|
        $this->fullTextResults = ft_pageSearch($QUERY, $highlight, $INPUT->str('srt'), $after, $before);
 | 
						|
        $this->highlight = $highlight;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Adjust the global query accordingly to the config search_nslimit and search_fragment
 | 
						|
     *
 | 
						|
     * This will only do something if the search didn't originate from the form on the searchpage itself
 | 
						|
     */
 | 
						|
    protected function adjustGlobalQuery()
 | 
						|
    {
 | 
						|
        global $conf, $INPUT, $QUERY, $ID;
 | 
						|
 | 
						|
        if ($INPUT->bool('sf')) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        $Indexer = idx_get_indexer();
 | 
						|
        $parsedQuery = ft_queryParser($Indexer, $QUERY);
 | 
						|
 | 
						|
        if (empty($parsedQuery['ns']) && empty($parsedQuery['notns'])) {
 | 
						|
            if ($conf['search_nslimit'] > 0) {
 | 
						|
                if (getNS($ID) !== false) {
 | 
						|
                    $nsParts = explode(':', getNS($ID));
 | 
						|
                    $ns = implode(':', array_slice($nsParts, 0, $conf['search_nslimit']));
 | 
						|
                    $QUERY .= " @$ns";
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if ($conf['search_fragment'] !== 'exact') {
 | 
						|
            if (empty(array_diff($parsedQuery['words'], $parsedQuery['and']))) {
 | 
						|
                if (strpos($QUERY, '*') === false) {
 | 
						|
                    $queryParts = explode(' ', $QUERY);
 | 
						|
                    $queryParts = array_map(function ($part) {
 | 
						|
                        if (strpos($part, '@') === 0) {
 | 
						|
                            return $part;
 | 
						|
                        }
 | 
						|
                        if (strpos($part, 'ns:') === 0) {
 | 
						|
                            return $part;
 | 
						|
                        }
 | 
						|
                        if (strpos($part, '^') === 0) {
 | 
						|
                            return $part;
 | 
						|
                        }
 | 
						|
                        if (strpos($part, '-ns:') === 0) {
 | 
						|
                            return $part;
 | 
						|
                        }
 | 
						|
 | 
						|
                        global $conf;
 | 
						|
 | 
						|
                        if ($conf['search_fragment'] === 'starts_with') {
 | 
						|
                            return $part . '*';
 | 
						|
                        }
 | 
						|
                        if ($conf['search_fragment'] === 'ends_with') {
 | 
						|
                            return '*' . $part;
 | 
						|
                        }
 | 
						|
 | 
						|
                        return '*' . $part . '*';
 | 
						|
 | 
						|
                    }, $queryParts);
 | 
						|
                    $QUERY = implode(' ', $queryParts);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |