(search)(links) add search for links

This commit is contained in:
Valentyne Stigloher 2024-12-16 23:48:57 +01:00
parent c9378e9659
commit a88807875d
3 changed files with 66 additions and 0 deletions

View File

@ -0,0 +1,17 @@
<script setup lang="ts">
import type { SearchResultLink } from '~/server/api/search.get.ts';
defineProps<{
result: SearchResultLink;
}>();
</script>
<template>
<nuxt-link :to="result.url" class="text-dark">
<div class="h3">
<Icon v="bookmark" />
<Spelling :text="result.title" />
</div>
<Spelling :text="result.content" />
</nuxt-link>
</template>

View File

@ -35,6 +35,7 @@ const searchInput = useTemplateRef('searchInput');
<SearchItemPronoun v-if="result.type === 'pronoun'" :result="result" />
<SearchItemNoun v-else-if="result.type === 'noun'" :result="result" />
<SearchItemSource v-else-if="result.type === 'source'" :result="result" />
<SearchItemLink v-else-if="result.type === 'link'" :result="result" />
<SearchItemBlog v-else-if="result.type === 'blog'" :result="result" />
</li>
</ul>

View File

@ -275,6 +275,53 @@ class SearchIndexSource extends SearchIndex<SearchDocumentSource, SearchResultSo
}
}
interface SearchDocumentLink {
id: number;
type: SearchIndexLink['TYPE'];
url: string;
title: string;
content: string;
}
export type SearchResultLink = SearchDocumentLink;
class SearchIndexLink extends SearchIndex<SearchDocumentLink, SearchResultLink> {
TYPE = 'link' as const;
constructor() {
super(['url', 'title', 'content']);
}
async getDocuments(config: Config): Promise<SearchDocumentLink[]> {
if (!config.links.enabled) {
return [];
}
const base = config.links.route;
return config.links.links.map((link, id) => {
return {
id,
type: this.TYPE,
url: link.url ?? base,
title: link.headline ?? '',
content: `${link.extra ?? ''} ${link.quote ?? ''} ${link.response ?? ''}`,
};
});
}
override transform(result: SearchResult): SearchResultLink {
const document = this.documents[result.id];
const termsByField = getTermsByField(result.match);
return {
id: document.id,
type: document.type,
url: document.url,
title: highlightMatches(document.title, termsByField.title),
content: highlightMatches(document.content, termsByField.content, true),
};
}
}
interface SearchDocumentBlog extends PostMetadata {
id: number;
type: SearchIndexBlog['TYPE'];
@ -342,6 +389,7 @@ export default defineEventHandler(async (event) => {
new SearchIndexPronoun(),
new SearchIndexNoun(),
new SearchIndexSource(),
new SearchIndexLink(),
new SearchIndexBlog(),
].map((index) => [index.TYPE, index]),
);