Um analisador simples para sintaxe de consulta de pesquisa avançada.
Ele analisa uma string assim:
from:[email protected],[email protected] to:me subject:vacations date:1/10/2013-15/04/2014 photos
E transforma isso em um objeto como este:
{
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'
Você pode configurar quais palavras-chave e intervalos o analisador deve aceitar com o argumento options. Aceita 5 valores:
keywords
, que podem ser separadas por vírgulas (,). Aceita uma matriz de strings.ranges
, que podem ser separados por um hífen (-). Aceita uma matriz de strings.tokenize
, que controla o comportamento dos termos de pesquisa de texto. Se definido como true
, os termos de texto sem palavras-chave serão retornados como uma matriz de strings em que cada termo da matriz é uma palavra separada por espaços em branco ou um termo com várias palavras entre aspas simples ou duplas.alwaysArray
, um booleano que controla o comportamento da consulta retornada. Se definido como true
, todas as palavras-chave correspondentes serão sempre matrizes em vez de strings. Se definidos como false
serão strings se corresponderem a um único valor. O padrão é false
.offsets
, um booleano que controla o comportamento da consulta retornada. Se definido como true
, a consulta conterá o objeto offsets. Se definido como false
, a consulta não conterá o objeto offsets. O padrão é true
. Se nenhuma palavra-chave ou intervalo for especificado, ou se nenhum estiver presente na consulta de pesquisa fornecida, então searchQuery.parse
retornará uma string se tokenize
for falso, ou uma matriz de strings sob o text
-chave se tokenize
for verdadeiro.
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']
Você também pode usar sintaxe de exclusão, como -from:[email protected] name:hello,world
. Isso também funciona com termos de texto sem palavras-chave quando tokenize
está definido como true
.
{
name : [ 'hello' , 'world' ] ,
exclude : {
from : [ '[email protected]' ]
}
}
Às vezes, verificar se uma palavra-chave contém string ou não pode ser excessivo e sujeito a erros; muitas vezes é mais fácil simplesmente esperar que tudo seja um array, mesmo que isso signifique fazer loops de 1 iteração com frequência.
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']
// }
O objeto offsets pode se tornar muito grande com longas consultas de pesquisa, o que pode ser um uso desnecessário de espaço se nenhuma funcionalidade depender dele. Ele pode simplesmente ser desligado usando a opção offsets: false
.
A qualquer momento, você pode voltar e restringir a consulta de pesquisa analisada. Isso pode ser útil se você quiser manipular o objeto de consulta de pesquisa analisado.
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
Os tipos TypeScript estão disponíveis para esta biblioteca no diretório docs
. Procure a documentação do tipo aqui.
A documentação é gerada usando node_modules/.bin/typedoc index.d.ts
Os 29 testes são escritos usando a estrutura de testes BDD should.js e executados com mocha.
Execute npm install should
e npm install -g mocha
para instalar os dois.
Execute testes com make test
.
A Licença MIT (MIT)
Direitos autorais (c) 2014
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para negociar o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar , publicar, distribuir, sublicenciar e/ou vender cópias do Software e permitir que as pessoas a quem o Software seja fornecido o façam, sujeito às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão serão incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM HIPÓTESE ALGUMA OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.