Un analyseur simple pour la syntaxe des requêtes de recherche avancées.
Il analyse une chaîne comme ceci :
from:[email protected],[email protected] to:me subject:vacations date:1/10/2013-15/04/2014 photos
Et le transforme en un objet comme ceci :
{
from : [ '[email protected]' , '[email protected]' ] ,
to : 'me' ,
subject : 'vacations' ,
date : {
from : '1/10/2013' ,
to : '15/04/2014'
} ,
text : 'photos' ,
offsets :
[ { keyword : 'from' , value : '[email protected],[email protected]' , offsetStart : 0 , offsetEnd : 32 } ,
{ keyword : 'to' , value : 'me' , offsetStart : 33 , offsetEnd : 38 } ,
{ keyword : 'subject' , value : 'vacations' , offsetStart : 39 , offsetEnd : 56 } ,
{ keyword : 'date' , value : '1/10/2013-15/04/2014' , offsetStart : 57 , offsetEnd : 82 } ,
{ text : 'photos' , offsetStart : 83 , offsetEnd : 89 } ]
}
$ npm install search-query-parser
var searchQuery = require ( 'search-query-parser' ) ;
var query = 'from:[email protected],[email protected] to:me subject:vacations date:1/10/2013-15/04/2014 photos' ;
var options = { keywords : [ 'from' , 'to' , 'subject' ] , ranges : [ 'date' ] }
var searchQueryObj = searchQuery . parse ( query , options ) ;
// searchQueryObj.from is now ['[email protected]', '[email protected]']
// searchQueryObj.to is now 'me'
// searchQueryObj.date is now {from: '1/10/2013', to: '15/04/2014'}
// searchQueryObj.text is now 'photos'
Vous pouvez configurer les mots-clés et les plages que l'analyseur doit accepter avec l'argument options. Il accepte 5 valeurs :
keywords
, qui peuvent être séparés par des virgules (,). Accepte un tableau de chaînes.ranges
, qui peuvent être séparées par un trait d’union (-). Accepte un tableau de chaînes.tokenize
, qui contrôle le comportement des termes de recherche de texte. S'ils sont définis sur true
, les termes textuels autres que des mots-clés sont renvoyés sous la forme d'un tableau de chaînes où chaque terme du tableau est un mot séparé par des espaces ou un terme de plusieurs mots entouré de guillemets simples ou doubles.alwaysArray
, un booléen qui contrôle le comportement de la requête renvoyée. S'il est défini sur true
, tous les mots-clés correspondants seront toujours des tableaux au lieu de chaînes. Si la valeur est false
ce seront des chaînes si elles correspondent à une seule valeur. La valeur par défaut est false
.offsets
, un booléen qui contrôle le comportement de la requête renvoyée. Si la valeur est true
, la requête contiendra l'objet offsets. Si la valeur est false
, la requête ne contiendra pas l'objet offsets. La valeur par défaut est true
. Si aucun mot-clé ou plage n'est spécifié, ou si aucun n'est présent dans la requête de recherche donnée, alors searchQuery.parse
renverra une chaîne si tokenize
est faux, ou un tableau de chaînes sous le text
clé si tokenize
est vrai.
var searchQuery = require ( 'search-query-parser' ) ;
var query = 'a query with "just text"' ;
var parsedQuery = searchQuery . parse ( query ) ;
// parsedQuery is now 'a query with "just text"'
var options = { keywords : [ 'unused' ] } ;
var parsedQueryWithOptions = searchQuery . parse ( query , options ) ;
// parsedQueryWithOptions is now 'a query with "just text"'
var options2 = { tokenize : true } ;
var parsedQueryWithTokens = searchQuery . parse ( query , options2 ) ;
// parsedQueryWithTokens is now: ['a', 'query', 'with', 'just text']
Vous pouvez également utiliser une syntaxe d'exclusion, comme -from:[email protected] name:hello,world
. Cela fonctionne également avec des termes textuels autres que des mots-clés lorsque tokenize
est défini sur true
.
{
name : [ 'hello' , 'world' ] ,
exclude : {
from : [ '[email protected]' ]
}
}
Parfois, vérifier si un mot-clé contient ou non une chaîne peut être excessif et sujet à des erreurs ; il est souvent plus facile de s'attendre simplement à ce que tout soit un tableau, même si cela signifie faire souvent des boucles à 1 itération.
var searchQuery = require ( 'search-query-parser' ) ;
var query = 'test:helloworld fun:yay,happy' ;
var options = { keywords : [ 'test' , 'fun' ] } ;
var parsedQueryWithOptions = searchQuery . parse ( query , options ) ;
// parsedQueryWithOptions is now:
// {
// test: 'helloworld',
// fun: ['yay', 'happy']
// }
var optionsAlwaysArray = { keywords : [ 'test' , 'fun' ] , alwaysArray : true } ;
var parsedQueryWithOptions = searchQuery . parse ( query , options ) ;
// parsedQueryWithOptions is now:
// {
// test: ['helloworld'], //No need to check whether test is a string or not!
// fun: ['yay', 'happy']
// }
L'objet offsets pourrait devenir assez énorme avec de longues requêtes de recherche, ce qui pourrait constituer une utilisation inutile de l'espace si aucune fonctionnalité n'en dépend. Il peut simplement être désactivé à l'aide de l'option offsets: false
.
À tout moment, vous pouvez revenir en arrière et chaîner la requête de recherche analysée. Cela peut être pratique si vous souhaitez manipuler l'objet de requête de recherche analysé.
var searchQuery = require ( 'search-query-parser' ) ;
var query = 'from:[email protected],[email protected] to:me subject:vacations date:1/10/2013-15/04/2014 photos' ;
var options = { keywords : [ 'from' , 'to' , 'subject' ] , ranges : [ 'date' ] }
var searchQueryObj = searchQuery . parse ( query , options ) ;
searchQueryObj . to = 'you' ;
var newQuery = searchQuery . stringify ( query , options ) ;
// newQuery is now: photos from:[email protected],[email protected] to:you subject:vacations date:1/10/2013-15/04/2014
Les types Typescript sont disponibles pour cette bibliothèque dans le répertoire docs
. Parcourez la documentation sur les types ici.
La documentation est générée à l'aide de node_modules/.bin/typedoc index.d.ts
Les 29 tests sont écrits à l'aide du framework de test BDD Should.js et exécutés avec Mocha.
Exécutez npm install should
et npm install -g mocha
pour les installer tous les deux.
Exécutez des tests avec make test
.
La licence MIT (MIT)
Droit d'auteur (c) 2014
L'autorisation est accordée par la présente, gratuitement, à toute personne obtenant une copie de ce logiciel et des fichiers de documentation associés (le « Logiciel »), d'utiliser le Logiciel sans restriction, y compris, sans limitation, les droits d'utilisation, de copie, de modification, de fusion. , publier, distribuer, accorder des sous-licences et/ou vendre des copies du Logiciel, et permettre aux personnes à qui le Logiciel est fourni de le faire, sous réserve des conditions suivantes :
L'avis de droit d'auteur ci-dessus et cet avis d'autorisation doivent être inclus dans toutes les copies ou parties substantielles du logiciel.
LE LOGICIEL EST FOURNI « TEL QUEL », SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS MAIS SANS LIMITATION LES GARANTIES DE QUALITÉ MARCHANDE, D'ADAPTATION À UN USAGE PARTICULIER ET DE NON-VIOLATION. EN AUCUN CAS LES AUTEURS OU LES TITULAIRES DES DROITS D'AUTEUR NE SERONT RESPONSABLES DE TOUTE RÉCLAMATION, DOMMAGES OU AUTRE RESPONSABILITÉ, QUE CE SOIT DANS UNE ACTION CONTRACTUELLE, DÉLIT OU AUTRE, DÉCOULANT DE, DE OU EN RELATION AVEC LE LOGICIEL OU L'UTILISATION OU D'AUTRES TRANSACTIONS DANS LE LOGICIEL.