UNPKG

@gouvfr/dsfr-roller

Version:

Le module `dsfr-roller` permet de publier le site de documentation du Système de Design de l’État - DSFR

54 lines (43 loc) 1.61 kB
import MiniSearch from 'minisearch'; import { normalizeTerm } from '@gouvfr/dsfr-forge/src/html/normalize.js'; const LOAD_OPTIONS = { fields: ['title', 'keywords', 'summary', 'excerpt', 'text'], storeFields: ['title', 'url', 'boost', 'summary', 'excerpt', 'cover', 'section'], }; const SEARCH_OPTIONS = { boost: { title: 2.5, keywords: 2, summary: 1.5, text: 1 }, boostDocument: (documentId, query, storedFields) => storedFields?.boost ?? 1, } const getOptions = (type) => { const options = { prefix: true, fuzzy: 0.2, processTerm: (term) => normalizeTerm(term.toLowerCase()) }; switch (type) { case 'search': return { ...options, ...SEARCH_OPTIONS }; default: return { ...options, ...LOAD_OPTIONS }; } } const ROOT_REGEX = /^(?<root>\/(?<version>v\d+\.\d+|[\w-]+)\/(?<locale>[a-zA-Z-]+))/; const CURRENT_VERSION_REGEX = /^(?<root>\/(?<version>v\d+\.\d+|[\w-]+)\/(?<locale>\w+)\/(?<search>v\d+\.\d+|[\w-]+))/ const getSearchIndex = (type) => { const searchIndexRegex = type === 'searchPage' ? CURRENT_VERSION_REGEX : ROOT_REGEX; const { groups: { root, version, locale } } = window.location.pathname.match(searchIndexRegex); return `${root}/index.json`; } class SearchEngine { async init (type) { const response = await fetch(getSearchIndex(type)); const json = JSON.stringify(await response.json()); const options = getOptions('load'); this._miniSearch = MiniSearch.loadJSON(json, options); } search (query) { return this._miniSearch.search(query, getOptions('search')); } } window.searchEngine = new SearchEngine();