Skip to content

Commit fec9474

Browse files
Merge pull request #54 from DHBern/53-search-small-fixes
53 search small fixes
2 parents 87641d6 + 6062437 commit fec9474

File tree

5 files changed

+72
-20
lines changed

5 files changed

+72
-20
lines changed

src/lib/minisearch.svelte.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export function processTerm(term) {
99

1010
const miniSearchConfig = {
1111
fields: ['content_all', 'content', 'terms'],
12-
storeFields: ['content', 'verse', 'd', 'sigla'],
12+
storeFields: ['content', 'content_all', 'verse', 'd', 'sigla'],
1313
processTerm
1414
};
1515

src/routes/projektpraesentationen[[rest]]/+page.svelte

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
>. Profile der Parzival–Überlieferung am Beispiel von fünf Handschriften des 13. bis 15.
1515
Jahrhunderts. Mit einem Beitrag von Richard F. Fasching, Basel 2020 [419 S.] [<a
1616
href="/4086_8_Titelflyer_Stolz_Parzival.pdf"
17-
title="Flyer Parzival im Mansukript"
17+
title="Flyer Parzival im Manuskript"
1818
target="_blank">Flyer</a
1919
>]
2020
</p>

src/routes/suche/+page.svelte

+59-13
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import { minisearches, processTerm } from '$lib/minisearch.svelte';
33
import siglaFromHandle from '$lib/functions/siglaFromHandle';
44
import Datatable from './Datatable.svelte';
5-
import { RadioGroup, RadioItem, SlideToggle } from '@skeletonlabs/skeleton';
5+
import { RadioGroup, RadioItem } from '@skeletonlabs/skeleton';
66
let hasDocuments = $state(!!minisearches[0].documentCount);
77
let searchtext = $state('');
88
let useExactSearch = $state(true);
@@ -50,6 +50,28 @@
5050
*/
5151
let searchResults = $state(new Promise((resolve) => resolve([])));
5252
53+
/**
54+
* @param {string} base
55+
* @param {string} compareTo
56+
*/
57+
function highlightDifferences(base, compareTo) {
58+
let result = '';
59+
let i = 0,
60+
j = 0;
61+
62+
while (i < base.length) {
63+
if (j < compareTo.length && base[i] === compareTo[j]) {
64+
result += base[i];
65+
j++; // Move both pointers when characters match
66+
} else {
67+
result += `<span>${base[i]}</span>`; // Highlight extra characters
68+
}
69+
i++; // Always move pointer for base
70+
}
71+
72+
return result;
73+
}
74+
5375
const handleSearch = async (/** @type {import("minisearch").Query} */ query) => {
5476
let results = activeMinisearch.search(query, { fuzzy: useExactSearch ? 0 : 0.3 });
5577
results = await Promise.all(
@@ -61,12 +83,24 @@
6183
results.map((r) => {
6284
r.humanReadableSigil = siglaFromHandle(r.sigla);
6385
const matches = Object.keys(r.match);
86+
if (r.content_all !== r.content) {
87+
r.content_all = highlightDifferences(r.content_all, r.content);
88+
}
6489
//Mark all matches in the content
65-
r.content = r.content
90+
r.content_all = r.content_all
6691
.split(' ')
6792
.map((/** @type {string} */ c) => {
6893
//if the matches include the processed term without punctuation, mark it
69-
if (matches.includes(processTerm(c.replaceAll(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, '')))) {
94+
if (
95+
matches.includes(
96+
processTerm(
97+
c
98+
.replaceAll('<span>', '')
99+
.replaceAll('</span>', '')
100+
.replaceAll(/[<>.,\/#!$%\^&\*;:{}=\-_`~()]/g, '')
101+
)
102+
)
103+
) {
70104
return `<mark>${c}</mark>`;
71105
}
72106
return c;
@@ -94,23 +128,32 @@
94128
};
95129
</script>
96130

97-
<section class="container mx-auto typography grid grid-cols-2 my-4 gap-8">
131+
<section class="container mx-auto typography grid sm:grid-cols-2 my-4 gap-8">
98132
<div>
99133
<h1>Suche</h1>
100134
<p>
101-
Durchsuchen Sie hier den kompletten Textkopus des Parzival. Standardmässig durchsuchen Sie die
102-
Fassungsverse und Ihnen werden nur genaue Treffer gezeigt. Dabei wurden einige
103-
Normalisierungen durchgeführt, so dass Ligaturen und andere Sonderformen auch in den Suchen
104-
gefunden werden. Die Suche nach Spigel enthält so zum Beispiel auch Treffer mit Schaft-S
105-
(ſpigel).
135+
Durchsuchen Sie hier das komplette Textkorpus des ›Parzival‹. Standardmäßig durchsuchen Sie
136+
die Fassungsverse, und Ihnen werden nur genaue Treffer gezeigt. Dabei werden einige
137+
Normalisierungen berücksichtigt, so dass Ligaturen und andere Sonderformen auch gefunden
138+
werden. Die Suche nach <i>spigel</i> enthält so zum Beispiel auch Treffer mit Schaft-<i>s</i>
139+
(<i>ſpigel</i>). Für die Textzeugensuche empfiehlt sich eine unscharfe Suche.
140+
</p>
141+
<p>
142+
Klicken Sie auf das jeweilige Ergebnis, um direkt in die Transkription zu gelangen (aus
143+
technischen Gründen kann das Suchresultat mitunter von der Transkription leicht abweichen).
106144
</p>
107145
</div>
108146
<div>
109147
<h2 class="h2">Suchoptionen</h2>
110-
<div class="flex gap-2 items-center">
111-
<SlideToggle active="bg-primary-500" name="exact" bind:checked={useExactSearch}
112-
>{useExactSearch ? 'exakte' : 'fuzzy'} Suche</SlideToggle
113-
>
148+
<div class="flex flex-col w-fit gap-2">
149+
<RadioGroup active="variant-filled-primary">
150+
<RadioItem bind:group={useExactSearch} name="Suchvariante" value={true}
151+
>exakte Suche</RadioItem
152+
>
153+
<RadioItem bind:group={useExactSearch} name="Suchvariante" value={false}>
154+
unscharfe Suche
155+
</RadioItem>
156+
</RadioGroup>
114157
<RadioGroup active="variant-filled-primary">
115158
<RadioItem bind:group={corpus} name="korpus" value={'fassungen'} disabled={!hasDocuments}>
116159
Fassungen (1.67MB)
@@ -147,6 +190,9 @@
147190
>Lade Suche <i class="ml-1 fa-solid fa-spinner fa-spin"></i></button
148191
>
149192
{/if}
193+
{#await searchResults then r}
194+
<p>{r.length === 1 ? '1 Ergebnis' : `${r.length} Ergebnisse`}</p>
195+
{/await}
150196
</form>
151197
</section>
152198
<section class="container mx-auto mt-4">

src/routes/suche/Datatable.svelte

+10-4
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,17 @@
4444
<tbody>
4545
{#each table?.rows as row (row.id)}
4646
<tr>
47-
<td class="table-cell-fit">{row?.humanReadableSigil}</td>
47+
<td class="table-cell-fit">{@html row?.humanReadableSigil}</td>
4848
<td class="table-cell-fit">{row?.d}</td>
4949
<td class="table-cell-fit">{row?.verse}</td>
50-
<td>
50+
<td class="content">
5151
{#if korpus === 'textzeugen'}
5252
<a href={`${base}/textzeugen/${row.sigla}/${row.d}/${row.verse}`}>
53-
{@html row?.content}
53+
{@html row?.content_all}
5454
</a>
5555
{:else}
5656
<a href={`${base}/fassungen/${row.d}`}>
57-
{@html row?.content}
57+
{@html row?.content_all}
5858
</a>
5959
{/if}
6060
</td>
@@ -80,3 +80,9 @@
8080
{/if}
8181
{/each}
8282
</div>
83+
84+
<style lang="postcss">
85+
.content :global(span) {
86+
@apply text-surface-400;
87+
}
88+
</style>

src/routes/textzeugen/[[sigla]]/[[thirties]]/[[verse]]/+page.svelte

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@
191191
<a
192192
class="btn btn-icon"
193193
href={generateCloseLink(content.sigla)}
194-
aria-label="Ansicht schliessen"
194+
aria-label="Ansicht schließen"
195195
>
196196
<i class="fa-solid fa-x"></i>
197197
</a>

0 commit comments

Comments
 (0)