diff --git a/inc/Ui/Search.php b/inc/Ui/Search.php index 917d28d52e0efd34ebf28fb697d0e99a6ae9cdc2..bb12542b18e8e6d50583486794611e0b02a76b7c 100644 --- a/inc/Ui/Search.php +++ b/inc/Ui/Search.php @@ -130,11 +130,8 @@ class Search extends Ui $listItem->addClass('active'); $searchForm->addHTML($option['label']); } else { - $this->searchState->addSearchLinkSort( - $searchForm, - $option['label'], - $option['sort'] - ); + $link = $this->searchState->withSorting($option['sort'])->getSearchLink($option['label']); + $searchForm->addHTML($link); } $searchForm->addTagClose('li'); } @@ -266,12 +263,11 @@ class Search extends Ui $listItem->addClass('active'); $searchForm->addHTML($option['label']); } else { - $this->searchState->addSearchLinkFragment( - $searchForm, - $option['label'], - $option['and'], - $option['not'] - ); + $link = $this->searchState + ->withFragments($option['and'], $option['not']) + ->getSearchLink($option['label']) + ; + $searchForm->addHTML($link); } $searchForm->addTagClose('li'); } @@ -315,11 +311,8 @@ class Search extends Ui $listItem = $searchForm->addTagOpen('li'); if ($baseNS) { $listItem->addClass('active'); - $this->searchState->addSeachLinkNS( - $searchForm, - $lang['search_any_ns'], - '' - ); + $link = $this->searchState->withNamespace('')->getSearchLink($lang['search_any_ns']); + $searchForm->addHTML($link); } else { $searchForm->addHTML($lang['search_any_ns']); } @@ -333,11 +326,8 @@ class Search extends Ui $listItem->addClass('active'); $searchForm->addHTML($label); } else { - $this->searchState->addSeachLinkNS( - $searchForm, - $label, - $ns - ); + $link = $this->searchState->withNamespace($ns)->getSearchLink($label); + $searchForm->addHTML($link); } $searchForm->addTagClose('li'); } @@ -436,12 +426,11 @@ class Search extends Ui $listItem->addClass('active'); $searchForm->addHTML($option['label']); } else { - $this->searchState->addSearchLinkTime( - $searchForm, - $option['label'], - $option['after'], - $option['before'] - ); + $link = $this->searchState + ->withTimeLimitations($option['after'], $option['before']) + ->getSearchLink($option['label']) + ; + $searchForm->addHTML($link); } $searchForm->addTagClose('li'); } @@ -620,9 +609,8 @@ class Search extends Ui if (!empty($this->parsedQuery['ns']) && $this->parsedQuery['ns'][0] === $ns) { return false; } + $name = '@' . $ns; - $tmpForm = new Form(); - $this->searchState->addSeachLinkNS($tmpForm, $name, $ns); - return $tmpForm->toHTML(); + return $this->searchState->withNamespace($ns)->getSearchLink($name); } } diff --git a/inc/Ui/SearchState.php b/inc/Ui/SearchState.php index 65a4ce83265d5eaef6bf1acb2c8d2ffa1bf20787..beaac4e1c374f1ff0a377109ad6c406e5102889b 100644 --- a/inc/Ui/SearchState.php +++ b/inc/Ui/SearchState.php @@ -2,8 +2,6 @@ namespace dokuwiki\Ui; -use dokuwiki\Form\Form; - class SearchState { /** @@ -11,85 +9,113 @@ class SearchState */ protected $parsedQuery = []; + /** + * SearchState constructor. + * + * @param array $parsedQuery + */ public function __construct(array $parsedQuery) { global $INPUT; $this->parsedQuery = $parsedQuery; - $this->parsedQuery['after'] = $INPUT->str('dta'); - $this->parsedQuery['before'] = $INPUT->str('dtb'); - $this->parsedQuery['sort'] = $INPUT->str('srt'); + if (!isset($parsedQuery['after'])) { + $this->parsedQuery['after'] = $INPUT->str('dta'); + } + if (!isset($parsedQuery['before'])) { + $this->parsedQuery['before'] = $INPUT->str('dtb'); + } + if (!isset($parsedQuery['sort'])) { + $this->parsedQuery['sort'] = $INPUT->str('srt'); + } } /** - * Add a link to the form which limits the search to the provided namespace + * Get a search state for the current search limited to a new namespace + * + * @param string $ns the namespace to which to limit the search, falsy to remove the limitation + * @param array $notns * - * @param Form $searchForm - * @param string $label - * @param string $ns namespace to which to limit the search, empty string to remove namespace limitation + * @return SearchState */ - public function addSeachLinkNS(Form $searchForm, $label, $ns) + public function withNamespace($ns, array $notns = []) { $parsedQuery = $this->parsedQuery; - $parsedQuery['notns'] = []; $parsedQuery['ns'] = $ns ? [$ns] : []; - $this->addSearchLink($searchForm, $label, $parsedQuery); + $parsedQuery['notns'] = $notns; + + return new SearchState($parsedQuery); } /** - * Add a link to the form which searches only for the provided words, but keeps the namespace and time limitations + * Get a search state for the current search with new search fragments and optionally phrases * - * @param Form $searchForm - * @param string $label - * @param array $and - * @param array $not + * @param array $and + * @param array $not + * @param array $phrases + * + * @return SearchState */ - public function addSearchLinkFragment(Form $searchForm, $label, array $and, array $not) + public function withFragments(array $and, array $not, array $phrases = []) { $parsedQuery = $this->parsedQuery; $parsedQuery['and'] = $and; $parsedQuery['not'] = $not; - $this->addSearchLink($searchForm, $label, $parsedQuery); + $parsedQuery['phrases'] = $phrases; + + return new SearchState($parsedQuery); } /** - * Add a link to the form which modifies the current search's time limitations + * Get a search state for the current search with with adjusted time limitations * - * @param Form $searchForm - * @param string $label - * @param string $after - * @param null|string $before + * @param $after + * @param $before + * + * @return SearchState */ - public function addSearchLinkTime(Form $searchForm, $label, $after, $before = null) + public function withTimeLimitations($after, $before) { $parsedQuery = $this->parsedQuery; $parsedQuery['after'] = $after; $parsedQuery['before'] = $before; - $this->addSearchLink($searchForm, $label, $parsedQuery); + return new SearchState($parsedQuery); } /** - * Add a link to the form which sets the sort preference for the current search + * Get a search state for the current search with adjusted sort preference + * + * @param $sort * - * @param Form $searchForm - * @param string $label - * @param string $sort + * @return SearchState */ - public function addSearchLinkSort(Form $searchForm, $label, $sort) + public function withSorting($sort) { $parsedQuery = $this->parsedQuery; $parsedQuery['sort'] = $sort; - $this->addSearchLink($searchForm, $label, $parsedQuery); + return new SearchState($parsedQuery); } - protected function addSearchLink( - Form $searchForm, - $label, - $parsedQuery - ) { - global $ID; + /** + * Get a link that represents the current search state + * + * Note that this represents only a simplified version of the search state. + * Grouping with braces and "OR" conditions are not supported. + * + * @param $label + * + * @return string + */ + public function getSearchLink($label) + { + global $ID, $conf; + $parsedQuery = $this->parsedQuery; + + $tagAttributes = [ + 'target' => $conf['target']['wiki'], + ]; $newQuery = ft_queryUnparser_simple( $parsedQuery['and'], @@ -108,11 +134,8 @@ class SearchState if ($parsedQuery['sort']) { $hrefAttributes['srt'] = $parsedQuery['sort']; } - $searchForm->addTagOpen('a') - ->attrs([ - 'href' => wl($ID, $hrefAttributes, false, '&') - ]); - $searchForm->addHTML($label); - $searchForm->addTagClose('a'); + + $href = wl($ID, $hrefAttributes, false, '&'); + return "<a href='$href' " . buildAttributes($tagAttributes) . ">$label</a>"; } }