Merge pull request #3533 from chiizujin/help_search
Improve help search matching
This commit is contained in:
commit
de7542a498
1 changed files with 25 additions and 0 deletions
|
|
@ -477,6 +477,11 @@ class CmdHelp(COMMAND_DEFAULT_CLASS):
|
||||||
tuple: A tuple (match, suggestions).
|
tuple: A tuple (match, suggestions).
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
def strip_prefix(query):
|
||||||
|
if query and query[0] in settings.CMD_IGNORE_PREFIXES:
|
||||||
|
return query[1:]
|
||||||
|
return query
|
||||||
|
|
||||||
if not search_fields:
|
if not search_fields:
|
||||||
# lunr search fields/boosts
|
# lunr search fields/boosts
|
||||||
search_fields = [
|
search_fields = [
|
||||||
|
|
@ -487,6 +492,7 @@ class CmdHelp(COMMAND_DEFAULT_CLASS):
|
||||||
{"field_name": "tags", "boost": 1}, # tags are not used by default
|
{"field_name": "tags", "boost": 1}, # tags are not used by default
|
||||||
]
|
]
|
||||||
match, suggestions = None, None
|
match, suggestions = None, None
|
||||||
|
base_query = strip_prefix(query)
|
||||||
for match_query in (query, f"{query}*"):
|
for match_query in (query, f"{query}*"):
|
||||||
# We first do an exact word-match followed by a start-by query. The
|
# We first do an exact word-match followed by a start-by query. The
|
||||||
# return of this will either be a HelpCategory, a Command or a
|
# return of this will either be a HelpCategory, a Command or a
|
||||||
|
|
@ -494,9 +500,28 @@ class CmdHelp(COMMAND_DEFAULT_CLASS):
|
||||||
matches, suggestions = help_search_with_index(
|
matches, suggestions = help_search_with_index(
|
||||||
match_query, entries, suggestion_maxnum=self.suggestion_maxnum, fields=search_fields
|
match_query, entries, suggestion_maxnum=self.suggestion_maxnum, fields=search_fields
|
||||||
)
|
)
|
||||||
|
# Move an exact match (including aliases) to the front of the list, treating a prefixed
|
||||||
|
# and non-prefixed command as the same thing
|
||||||
|
for m in matches[:]:
|
||||||
|
aliases = [m.key]
|
||||||
|
if not isinstance(m, HelpCategory):
|
||||||
|
# Aliases for help created with 'sethelp' is an AliasHandler
|
||||||
|
aliases += m.aliases if isinstance(m.aliases, list) else m.aliases.all()
|
||||||
|
if base_query in [strip_prefix(alias) for alias in aliases]:
|
||||||
|
matches.remove(m)
|
||||||
|
matches.insert(0, m)
|
||||||
|
break
|
||||||
if matches:
|
if matches:
|
||||||
match = matches[0]
|
match = matches[0]
|
||||||
break
|
break
|
||||||
|
if match:
|
||||||
|
# Move an exact suggestion match to the front of the list
|
||||||
|
for s in suggestions[:]:
|
||||||
|
if base_query == strip_prefix(s):
|
||||||
|
suggestions.remove(s)
|
||||||
|
suggestions.insert(0, s)
|
||||||
|
break
|
||||||
|
|
||||||
return match, suggestions
|
return match, suggestions
|
||||||
|
|
||||||
def parse(self):
|
def parse(self):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue