dockerwiki/content/inc/Action/Search.php

136 lines
3.9 KiB
PHP
Raw Permalink Normal View History

2021-10-26 13:02:53 +02:00
<?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);
}
}
}
}
}