mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-10-01 01:43:41 +08:00
ui: fuzzy search helper
This commit is contained in:
@@ -0,0 +1,34 @@
|
|||||||
|
import re
|
||||||
|
import unicodedata
|
||||||
|
|
||||||
|
|
||||||
|
def normalize(text: str) -> str:
|
||||||
|
return unicodedata.normalize('NFKD', text).encode('ascii', 'ignore').decode('utf-8').lower()
|
||||||
|
|
||||||
|
|
||||||
|
def search_from_list(query: str, items: list[str]) -> list[str]:
|
||||||
|
if not query:
|
||||||
|
return items
|
||||||
|
|
||||||
|
normalized_query = normalize(query)
|
||||||
|
search_terms = [re.sub(r'[^a-z0-9]', '', term) for term in normalized_query.split() if term.strip()]
|
||||||
|
|
||||||
|
results = []
|
||||||
|
for item in items:
|
||||||
|
normalized_item = normalize(item)
|
||||||
|
item_with_spaces = re.sub(r'[^a-z0-9\s]', ' ', normalized_item)
|
||||||
|
item_stripped = re.sub(r'[^a-z0-9]', '', normalized_item)
|
||||||
|
|
||||||
|
all_terms_match = True
|
||||||
|
for term in search_terms:
|
||||||
|
if not term:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if term not in item_with_spaces and term not in item_stripped:
|
||||||
|
all_terms_match = False
|
||||||
|
break
|
||||||
|
|
||||||
|
if all_terms_match:
|
||||||
|
results.append(item)
|
||||||
|
|
||||||
|
return results
|
||||||
Reference in New Issue
Block a user