2019-12-04 23:54:44 +00:00
|
|
|
|
/**
|
|
|
|
|
* @module
|
|
|
|
|
* Fonctions permettant la recherche approximative de termes.
|
|
|
|
|
*/
|
|
|
|
|
|
2019-12-04 22:59:52 +00:00
|
|
|
|
import * as diacritics from 'diacritics';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Motifs de désuffixation des mots français.
|
|
|
|
|
*/
|
|
|
|
|
const stemPatterns = [
|
|
|
|
|
[/aux$/, 'al'],
|
|
|
|
|
[/(.)s$/, '$1'],
|
|
|
|
|
[/(.)e$/, '$1'],
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Motif de séparation des mots.
|
|
|
|
|
*/
|
|
|
|
|
const splitPattern = /[\s-]+/g;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Désuffixe un mot français.
|
|
|
|
|
*
|
|
|
|
|
* @param word Mot originel.
|
|
|
|
|
* @return Mot désuffixé.
|
|
|
|
|
*/
|
|
|
|
|
const stemWord = word =>
|
|
|
|
|
{
|
|
|
|
|
let result = word;
|
|
|
|
|
|
|
|
|
|
for (let [pattern, replacement] of stemPatterns)
|
|
|
|
|
{
|
|
|
|
|
result = result.replace(pattern, replacement);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Met le nom d’un terme sous forme normalisée pour la recherche approximative.
|
|
|
|
|
*
|
|
|
|
|
* Dans la forme normalisée, tous les accents sont ôtés, la casse est réduite
|
|
|
|
|
* en minuscules et les mots sont désuffixés.
|
|
|
|
|
*
|
|
|
|
|
* @param name Nom à normaliser.
|
|
|
|
|
* @return Liste des mots du nom de terme normalisé.
|
|
|
|
|
*/
|
|
|
|
|
const normalizeName = name =>
|
2019-12-04 23:16:27 +00:00
|
|
|
|
name.toLowerCase()
|
2019-12-04 22:59:52 +00:00
|
|
|
|
.split(splitPattern)
|
2019-12-04 23:16:27 +00:00
|
|
|
|
.map(stemWord)
|
|
|
|
|
.map(word => diacritics.remove(word));
|
2019-12-04 22:59:52 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Filtre une liste de termes pour ne garder que ceux qui sont similaires à une
|
|
|
|
|
* saisie.
|
|
|
|
|
*
|
|
|
|
|
* @param search Contenu de la saisie.
|
|
|
|
|
* @param term Terme à vérifier.
|
|
|
|
|
* @return Ensemble des termes sélectionnés.
|
|
|
|
|
*/
|
|
|
|
|
export const filterTerms = (search, terms) =>
|
|
|
|
|
{
|
|
|
|
|
// Normalisation des mots recherchés
|
|
|
|
|
const needle = normalizeName(search);
|
|
|
|
|
|
|
|
|
|
console.log(needle);
|
|
|
|
|
|
|
|
|
|
return terms.filter(term =>
|
|
|
|
|
{
|
|
|
|
|
// Normalisation du nom et des alias du terme
|
|
|
|
|
const haystack = [term.name].concat(term.alias)
|
|
|
|
|
.map(normalizeName)
|
|
|
|
|
.reduce((prev, next) => prev.concat(next), []);
|
|
|
|
|
|
|
|
|
|
return needle.every(item =>
|
|
|
|
|
haystack.some(word =>
|
|
|
|
|
word.startsWith(item)
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
};
|