From 206e4f2a17f49bd481beb7da48ee6f18a92877ee Mon Sep 17 00:00:00 2001 From: Anna Dabrowska Date: Mon, 7 Jun 2021 16:53:07 +0200 Subject: [PATCH] Add language selection using translation plugin --- action/search.php | 50 ++++++++++++++++++++++++++++++++++++++++++++ conf/default.php | 1 + conf/metadata.php | 1 + helper/form.php | 45 ++++++++++++++++++++++++++++++++++++++- lang/de/lang.php | 1 + lang/de/settings.php | 1 + lang/en/lang.php | 1 + lang/en/settings.php | 1 + 8 files changed, 100 insertions(+), 1 deletion(-) diff --git a/action/search.php b/action/search.php index f4227eb..c20a8b2 100644 --- a/action/search.php +++ b/action/search.php @@ -135,6 +135,9 @@ public function handle_action(Doku_Event $event, $param) { // add ACL subqueries $this->addACLSubqueries($subqueries); + // add language subquery + $this->addLanguageSubquery($subqueries, $this->getLanguageFilter()); + // add date subquery if ($INPUT->has('min')) { $this->addDateSubquery($subqueries, $INPUT->str('min')); @@ -233,6 +236,53 @@ protected function addDateSubquery($subqueries, $min) $subqueries->addMust($dateSubquery); } + /** + * Adds language subquery + * + * @param Elastica\Query\BoolQuery $subqueries + * @param array $langFilter + */ + protected function addLanguageSubquery($subqueries, $langFilter) + { + if (empty($langFilter)) return; + + $langSubquery = new \Elastica\Query\Match(); + $langSubquery->setField('language', implode(',', $langFilter)); + $subqueries->addMust($langSubquery); + } + + /** + * Languages to be used in the current search, determined by: + * 1. $INPUT variables, or 2. translation plugin + * + * @return array + */ + protected function getLanguageFilter() + { + global $ID; + global $INPUT; + + $ns = getNS($ID); + $langFilter = $INPUT->arr('lang'); + + /** @var helper_plugin_translation $transplugin */ + $transplugin = plugin_load('helper', 'translation'); + + // optional translation detection: use current top namespace if it matches translation config + if (empty($langFilter) && $transplugin && $this->getConf('detectTranslation') && $ns) { + $topNs = strtok($ns, ':'); + if (in_array($topNs, $transplugin->translations)) { + $langFilter = [$topNs]; + $INPUT->set('lang', $langFilter); + } + } else if (empty($langFilter) && $transplugin) { + // select all available translations + $INPUT->set('lang', $transplugin->translations); + } + + return $langFilter; + } + /** * Inserts subqueries based on current user's ACLs, none for superusers * diff --git a/conf/default.php b/conf/default.php index 28f247d..9688e9d 100644 --- a/conf/default.php +++ b/conf/default.php @@ -11,5 +11,6 @@ $conf['snippets'] = 'content'; $conf['searchSyntax'] = 1; $conf['perpage'] = 20; +$conf['detectTranslation'] = 0; $conf['debug'] = 0; diff --git a/conf/metadata.php b/conf/metadata.php index ac4bbf8..67553e2 100644 --- a/conf/metadata.php +++ b/conf/metadata.php @@ -11,5 +11,6 @@ $meta['snippets'] = array('multichoice', '_choices' => array('content','abstract')); $meta['searchSyntax'] = array('onoff'); $meta['perpage'] = array('numeric', '_min' => 1); +$meta['detectTranslation'] = array('onoff'); $meta['debug'] = array('onoff'); diff --git a/helper/form.php b/helper/form.php index 4c593a8..d504214 100644 --- a/helper/form.php +++ b/helper/form.php @@ -9,9 +9,11 @@ use dokuwiki\Form\Form; +/** + * Search form helper + */ class helper_plugin_elasticsearch_form extends DokuWiki_Plugin { - /** * Replacement for the standard search form * @@ -55,6 +57,7 @@ protected function addAdvancedSearch(Form $searchForm, array $aggregations) $this->addCheckboxSelector($searchForm, $aggregation['buckets'], $param); } $this->addDateSelector($searchForm); + $this->addLanguageSelector($searchForm); $searchForm->addTagClose('div'); } @@ -136,4 +139,44 @@ protected function addDateSelector(Form $searchForm) $searchForm->addTagClose('div'); } + + /** + * Language filter based on the translation plugin + * + * @param Form $searchForm + */ + protected function addLanguageSelector(Form $searchForm) + { + /** @var helper_plugin_translation $transplugin */ + $transplugin = plugin_load('helper', 'translation'); + if (!$transplugin) return; + + $translations = $transplugin->translations; + if (empty($translations)) return; + + $searchForm->addTagOpen('div') + ->addClass('toggle') + ->id('plugin__elasticsearch-lang') + ->attr('aria-haspopup', 'true'); + + // popup toggler + $searchForm->addTagOpen('div')->addClass('current'); + $label = $this->getLang('lang'); + $searchForm->addHTML($label); + $searchForm->addTagClose('div'); + + // options + $i = 0; + $searchForm->addTagOpen('ul')->attr('aria-expanded', 'false'); + foreach ($translations as $lang) { + $searchForm->addTagOpen('li'); + $searchForm->addCheckbox('lang[]')->val($lang)->id("__lang-" . $i); + $searchForm->addLabel($lang, "__lang-" . $i) + ->attr('title', $lang); + $searchForm->addTagClose('li'); + $i++; + } + $searchForm->addTagClose('ul'); + $searchForm->addTagClose('div'); + } } diff --git a/lang/de/lang.php b/lang/de/lang.php index 2221d2f..3dbc83e 100644 --- a/lang/de/lang.php +++ b/lang/de/lang.php @@ -8,5 +8,6 @@ $lang['ns'] = 'Namensraum:'; $lang['nsp'] = 'Namensräume:'; $lang['lastmod'] = 'Zuletzt geändert:'; +$lang['lang'] = 'Sprache:'; $lang['author'] = 'Autor:'; $lang['totalfound'] = 'Ergebnisse gefunden: %s'; diff --git a/lang/de/settings.php b/lang/de/settings.php index 6375292..23b87fe 100644 --- a/lang/de/settings.php +++ b/lang/de/settings.php @@ -11,4 +11,5 @@ $lang['snippets'] = 'Text, der in den Suchergebnissen als Vorschau angezeigt wird'; $lang['searchSyntax'] = 'Wiki-Syntax zusätzlich zum Seiteninhalt durchsuchen'; $lang['perpage'] = 'Anzahl der Treffer pro Seite'; +$lang['detectTranslation'] = 'Translation Plugin Integration: Zunächst im aktuellen Übersetzungnamensraum suchen'; $lang['debug'] = 'Debugging messages nach data/cache/debug.log schreiben - benötigt eingeschaltete allowdebug Option'; diff --git a/lang/en/lang.php b/lang/en/lang.php index 15f6cb4..b1d39f4 100644 --- a/lang/en/lang.php +++ b/lang/en/lang.php @@ -8,5 +8,6 @@ $lang['ns'] = 'Namespace:'; $lang['nsp'] = 'Namespaces:'; $lang['lastmod'] = 'Last modified:'; +$lang['lang'] = 'Language:'; $lang['author'] = 'Author:'; $lang['totalfound'] = 'Results found: %s'; diff --git a/lang/en/settings.php b/lang/en/settings.php index 3cdef46..14a14ba 100644 --- a/lang/en/settings.php +++ b/lang/en/settings.php @@ -11,4 +11,5 @@ $lang['snippets'] = 'Text to show in search result snippets'; $lang['searchSyntax'] = 'Search in wiki syntax in addition to page content'; $lang['perpage'] = 'How many hits to show per page'; +$lang['detectTranslation'] = 'Translation plugin support: search in current language namespace by default'; $lang['debug'] = 'Log messages to data/cache/debug.log - needs allowdebug enabled';