44 lines
1.1 KiB
TypeScript
44 lines
1.1 KiB
TypeScript
import { ROUTES, type EachRoute } from "../routes"
|
|
|
|
export type SearchResult = {
|
|
title: string
|
|
href: string
|
|
noLink?: boolean
|
|
items?: undefined
|
|
score?: number
|
|
}
|
|
|
|
function helperSearch(
|
|
query: string,
|
|
node: EachRoute,
|
|
prefix: string,
|
|
currenLevel: number,
|
|
maxLevel?: number
|
|
) {
|
|
const res: EachRoute[] = []
|
|
let parentHas = false
|
|
|
|
const nextLink = `${prefix}${node.href}`
|
|
if (!node.noLink && node.title.toLowerCase().includes(query.toLowerCase())) {
|
|
res.push({ ...node, items: undefined, href: nextLink })
|
|
parentHas = true
|
|
}
|
|
const goNext = maxLevel ? currenLevel < maxLevel : true
|
|
if (goNext)
|
|
node.items?.forEach((item) => {
|
|
const innerRes = helperSearch(query, item, nextLink, currenLevel + 1, maxLevel)
|
|
if (!!innerRes.length && !parentHas && !node.noLink) {
|
|
res.push({ ...node, items: undefined, href: nextLink })
|
|
parentHas = true
|
|
}
|
|
res.push(...innerRes)
|
|
})
|
|
return res
|
|
}
|
|
|
|
export function advanceSearch(query: string) {
|
|
return ROUTES.map((node) =>
|
|
helperSearch(query, node, "", 1, query.length == 0 ? 2 : undefined)
|
|
).flat()
|
|
}
|