mirror of
https://gitlab.com/PronounsPage/PronounsPage.git
synced 2025-09-24 05:05:20 -04:00
(search)(links) add search for links
This commit is contained in:
parent
c9378e9659
commit
a88807875d
17
components/search/SearchItemLink.vue
Normal file
17
components/search/SearchItemLink.vue
Normal 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>
|
@ -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>
|
||||
|
@ -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]),
|
||||
);
|
||||
|
Loading…
x
Reference in New Issue
Block a user