diff options
| author | anatawa12 <anatawa12@icloud.com> | 2025-04-07 14:35:32 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-07 14:35:32 +0900 |
| commit | 85a7b10fcde1d461b138c0e0ad5507df66959162 (patch) | |
| tree | d07f85a954e34faa35e1ca80cdcfaf8538451491 /packages/frontend/src | |
| parent | 🎨 (diff) | |
| download | misskey-85a7b10fcde1d461b138c0e0ad5507df66959162.tar.gz misskey-85a7b10fcde1d461b138c0e0ad5507df66959162.tar.bz2 misskey-85a7b10fcde1d461b138c0e0ad5507df66959162.zip | |
refactor serach index generator code (#15772)
* refactor: flatten search index
* chore: use Function() to simplify parsing attribute
* chore: remove comment handling
* chore: simplify processing SearchLabel and SearchKeyword element
* chore: use SearchLabel in mutedUsers
* chore: small improvements
* chore: remove a fallback path and simplify the entire code
* fix: result path is not correct
* chore: inline function
Diffstat (limited to 'packages/frontend/src')
| -rw-r--r-- | packages/frontend/src/components/MkSuperMenu.vue | 56 | ||||
| -rw-r--r-- | packages/frontend/src/pages/settings/mute-block.vue | 3 | ||||
| -rw-r--r-- | packages/frontend/src/utility/settings-search-index.ts | 16 | ||||
| -rw-r--r-- | packages/frontend/src/utility/virtual.d.ts | 2 |
4 files changed, 39 insertions, 38 deletions
diff --git a/packages/frontend/src/components/MkSuperMenu.vue b/packages/frontend/src/components/MkSuperMenu.vue index 4156fa2732..3f8d92a61d 100644 --- a/packages/frontend/src/components/MkSuperMenu.vue +++ b/packages/frontend/src/components/MkSuperMenu.vue @@ -93,11 +93,11 @@ export type SuperMenuDef = { </script> <script lang="ts" setup> -import { useTemplateRef, ref, watch, nextTick } from 'vue'; +import { useTemplateRef, ref, watch, nextTick, computed } from 'vue'; +import { getScrollContainer } from '@@/js/scroll.js'; import type { SearchIndexItem } from '@/utility/settings-search-index.js'; import MkInput from '@/components/MkInput.vue'; import { i18n } from '@/i18n.js'; -import { getScrollContainer } from '@@/js/scroll.js'; import { useRouter } from '@/router.js'; import { initIntlString, compareStringIncludes } from '@/utility/intl-string.js'; @@ -124,6 +124,7 @@ const searchResult = ref<{ isRoot: boolean; parentLabels: string[]; }[]>([]); +const searchIndexItemByIdComputed = computed(() => props.searchIndex && new Map<string, SearchIndexItem>(props.searchIndex.map(i => [i.id, i]))); watch(searchQuery, (value) => { rawSearchQuery.value = value; @@ -137,32 +138,41 @@ watch(rawSearchQuery, (value) => { return; } - const dive = (items: SearchIndexItem[], parents: SearchIndexItem[] = []) => { - for (const item of items) { - const matched = ( - compareStringIncludes(item.label, value) || - item.keywords.some((x) => compareStringIncludes(x, value)) - ); + const searchIndexItemById = searchIndexItemByIdComputed.value; + if (searchIndexItemById != null) { + const addSearchResult = (item: SearchIndexItem) => { + let path: string | undefined = item.path; + let icon: string | undefined = item.icon; + const parentLabels: string[] = []; - if (matched) { - searchResult.value.push({ - id: item.id, - path: item.path ?? parents.find((x) => x.path != null)?.path ?? '/', // never gets `/` - label: item.label, - parentLabels: parents.map((x) => x.label).toReversed(), - icon: item.icon ?? parents.find((x) => x.icon != null)?.icon, - isRoot: parents.length === 0, - }); + for (let current = searchIndexItemById.get(item.parentId ?? ''); + current != null; + current = searchIndexItemById.get(current.parentId ?? '')) { + path ??= current.path; + icon ??= current.icon; + parentLabels.push(current.label); } - if (item.children) { - dive(item.children, [item, ...parents]); + if (_DEV_ && path == null) throw new Error('path is null for ' + item.id); + + searchResult.value.push({ + id: item.id, + path: path ?? '/', // never gets `/` + label: item.label, + parentLabels: parentLabels.toReversed(), + icon, + isRoot: item.parentId == null, + }); + }; + + for (const item of searchIndexItemById.values()) { + if ( + compareStringIncludes(item.label, value) || + item.keywords.some((x) => compareStringIncludes(x, value)) + ) { + addSearchResult(item); } } - }; - - if (props.searchIndex) { - dive(props.searchIndex); } }); diff --git a/packages/frontend/src/pages/settings/mute-block.vue b/packages/frontend/src/pages/settings/mute-block.vue index 0a02f1b1ec..fc9cd8f892 100644 --- a/packages/frontend/src/pages/settings/mute-block.vue +++ b/packages/frontend/src/pages/settings/mute-block.vue @@ -62,12 +62,11 @@ SPDX-License-Identifier: AGPL-3.0-only </SearchMarker> <SearchMarker - :label="`${i18n.ts.mutedUsers} (${ i18n.ts.renote })`" :keywords="['renote', 'mute', 'hide', 'user']" > <MkFolder> <template #icon><i class="ti ti-repeat-off"></i></template> - <template #label>{{ i18n.ts.mutedUsers }} ({{ i18n.ts.renote }})</template> + <template #label><SearchLabel>{{ i18n.ts.mutedUsers }} ({{ i18n.ts.renote }})</SearchLabel></template> <MkPagination :pagination="renoteMutingPagination"> <template #empty> diff --git a/packages/frontend/src/utility/settings-search-index.ts b/packages/frontend/src/utility/settings-search-index.ts index 22e2407b15..7ed97ed34f 100644 --- a/packages/frontend/src/utility/settings-search-index.ts +++ b/packages/frontend/src/utility/settings-search-index.ts @@ -8,35 +8,27 @@ import type { GeneratedSearchIndexItem } from 'search-index:settings'; export type SearchIndexItem = { id: string; + parentId?: string; path?: string; label: string; keywords: string[]; icon?: string; - children?: SearchIndexItem[]; }; const rootMods = new Map(generated.map(item => [item.id, item])); -function walk(item: GeneratedSearchIndexItem) { +// link inlining here +for (const item of generated) { if (item.inlining) { for (const id of item.inlining) { const inline = rootMods.get(id); if (inline) { - (item.children ??= []).push(inline); - rootMods.delete(id); + inline.parentId = item.id; } else { console.log('[Settings Search Index] Failed to inline', id); } } } - - for (const child of item.children ?? []) { - walk(child); - } -} - -for (const item of generated) { - walk(item); } export const searchIndexes: SearchIndexItem[] = generated; diff --git a/packages/frontend/src/utility/virtual.d.ts b/packages/frontend/src/utility/virtual.d.ts index 59470a1f5e..63dc4372b7 100644 --- a/packages/frontend/src/utility/virtual.d.ts +++ b/packages/frontend/src/utility/virtual.d.ts @@ -6,12 +6,12 @@ declare module 'search-index:settings' { export type GeneratedSearchIndexItem = { id: string; + parentId?: string; path?: string; label: string; keywords: string[]; icon?: string; inlining?: string[]; - children?: GeneratedSearchIndexItem[]; }; export const searchIndexes: GeneratedSearchIndexItem[]; |