Completed
Push — betterCoreSearch ( 4c924e...d09b5b )
by Michael
04:03
created

Search   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 95
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 3

Importance

Changes 0
Metric Value
dl 0
loc 95
rs 10
c 0
b 0
f 0
wmc 20
lcom 0
cbo 3

5 Methods

Rating   Name   Duplication   Size   Complexity  
A minimumPermission() 0 3 1
A checkPermissions() 0 6 2
A preProcess() 0 4 1
A tplContent() 0 6 1
C adjustGlobalQuery() 0 57 15
1
<?php
2
3
namespace dokuwiki\Action;
4
5
use dokuwiki\Action\Exception\ActionAbort;
6
7
/**
8
 * Class Search
9
 *
10
 * Search for pages and content
11
 *
12
 * @package dokuwiki\Action
13
 */
14
class Search extends AbstractAction {
15
16
    /** @inheritdoc */
17
    public function minimumPermission() {
18
        return AUTH_NONE;
19
    }
20
21
    /**
22
     * we only search if a search word was given
23
     *
24
     * @inheritdoc
25
     */
26
    public function checkPermissions() {
27
        parent::checkPermissions();
28
        global $QUERY;
29
        $s = cleanID($QUERY);
30
        if($s === '') throw new ActionAbort();
31
    }
32
33
    public function preProcess()
34
    {
35
        $this->adjustGlobalQuery();
36
    }
37
38
    /** @inheritdoc */
39
    public function tplContent()
40
    {
41
        $search = new \dokuwiki\Ui\Search();
42
        $search->execute();
43
        $search->show();
44
    }
45
46
    /**
47
     * Adjust the global query accordingly to the config search_limit_to_first_ns and search_default_fragment_behaviour
48
     *
49
     * This will only do something if the search didn't originate from the form on the searchpage itself
50
     */
51
    protected function adjustGlobalQuery()
52
    {
53
        global $conf, $INPUT, $QUERY;
54
55
        if ($INPUT->bool('searchPageForm')) {
56
            return;
57
        }
58
59
        $Indexer = idx_get_indexer();
60
        $parsedQuery = ft_queryParser($Indexer, $QUERY);
61
62
        if (empty($parsedQuery['ns']) && empty($parsedQuery['notns'])) {
63
            if ($conf['search_limit_to_first_ns'] > 0) {
64
                $searchOriginPage = $INPUT->str('from');
65
                if (getNS($searchOriginPage) !== false) {
66
                    $nsParts = explode(':', getNS($searchOriginPage));
67
                    $ns = implode(':', array_slice($nsParts, 0, $conf['search_limit_to_first_ns']));
68
                    $QUERY .= " @$ns";
69
                }
70
            }
71
        }
72
73
        if ($conf['search_default_fragment_behaviour'] !== 'exact') {
74
            if (empty(array_diff($parsedQuery['words'], $parsedQuery['and']))) {
75
                if (strpos($QUERY, '*') === false) {
76
                    $queryParts = explode(' ', $QUERY);
77
                    $queryParts = array_map(function ($part) {
78
                        if (strpos($part, '@') === 0) {
79
                            return $part;
80
                        }
81
                        if (strpos($part, 'ns:') === 0) {
82
                            return $part;
83
                        }
84
                        if (strpos($part, '^') === 0) {
85
                            return $part;
86
                        }
87
                        if (strpos($part, '-ns:') === 0) {
88
                            return $part;
89
                        }
90
91
                        global $conf;
92
93
                        if ($conf['search_default_fragment_behaviour'] === 'starts_with') {
94
                            return $part . '*';
95
                        }
96
                        if ($conf['search_default_fragment_behaviour'] === 'ends_with') {
97
                            return '*' . $part;
98
                        }
99
100
                        return '*' . $part . '*';
101
102
                    }, $queryParts);
103
                    $QUERY = implode(' ', $queryParts);
104
                }
105
            }
106
        }
107
    }
108
}
109