mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 10:20:08 +00:00
added string query support...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
e54ce63dff
commit
c061f834f0
@ -106,6 +106,94 @@ var TagsClassPrototype = {
|
|||||||
res.pop()
|
res.pop()
|
||||||
: res
|
: res
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Query parser...
|
||||||
|
//
|
||||||
|
// NOTE: this is loosely based on Slang's parser...
|
||||||
|
// ...see for details: https://github.com/flynx/Slang
|
||||||
|
__query_lexer: RegExp([
|
||||||
|
/* XXX there are two ways to deal with comments:
|
||||||
|
// 1) lexer-based -- this section commented, next uncommented...
|
||||||
|
// 2) macro-based -- this section uncommented, next commented...
|
||||||
|
// #2 is a bit buggy...
|
||||||
|
// terms to keep in the stream...
|
||||||
|
'\\s*('+[
|
||||||
|
'\\n',
|
||||||
|
'--',
|
||||||
|
].join('|')+')',
|
||||||
|
//*/
|
||||||
|
|
||||||
|
// lexer comments...
|
||||||
|
'\\s*\\(\\*[^\\)]*\\*\\)\\s*',
|
||||||
|
'\\s*--.*[\\n$]',
|
||||||
|
//*/
|
||||||
|
|
||||||
|
// quoted strings...
|
||||||
|
// NOTE: we do not support escaped quotes...
|
||||||
|
'\\s*"([^"]*)"\\s*',
|
||||||
|
"\\s*'([^']*)'\\s*",
|
||||||
|
|
||||||
|
// quote...
|
||||||
|
'\\s*(\\\\)',
|
||||||
|
|
||||||
|
// braces...
|
||||||
|
'\([\\[\\]()]\)',
|
||||||
|
|
||||||
|
// whitespace...
|
||||||
|
'\\s+',
|
||||||
|
].join('|'),
|
||||||
|
'm'),
|
||||||
|
parseQuery: function(query){
|
||||||
|
// lex the input...
|
||||||
|
query = query instanceof Array ?
|
||||||
|
query
|
||||||
|
: query
|
||||||
|
// split by strings whitespace and block comments...
|
||||||
|
.split(this.__query_lexer || this.constructor.__query_lexer)
|
||||||
|
// parse numbers...
|
||||||
|
// XXX do we need number parsing???
|
||||||
|
.map(function(e){
|
||||||
|
// numbers...
|
||||||
|
if(/^[-+]?[0-9]+\.[0-9]+$/.test(e)){
|
||||||
|
e = parseFloat(e)
|
||||||
|
} else if(/^[-+]?[0-9]+$/.test(e)){
|
||||||
|
e = parseInt(e)
|
||||||
|
}
|
||||||
|
return e
|
||||||
|
})
|
||||||
|
// remove undefined groups...
|
||||||
|
.filter(function(e){
|
||||||
|
// NOTE: in JS 0 == '' is true ;)
|
||||||
|
return e !== undefined && e !== '' })
|
||||||
|
|
||||||
|
var brace = function(code, b){
|
||||||
|
var res = []
|
||||||
|
|
||||||
|
while(code.length > 0){
|
||||||
|
c = code.shift()
|
||||||
|
if(c == '[' || c == '('){
|
||||||
|
res.push( brace(code, c == '[' ? ']' : ')') )
|
||||||
|
|
||||||
|
} else if(c == b){
|
||||||
|
return res
|
||||||
|
|
||||||
|
} else if(c == ']' || c == ')'){
|
||||||
|
throw new SyntaxError(`Tag Query: Unexpected "${c}".`)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
res.push(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(b != null){
|
||||||
|
throw new SyntaxError(`Tag Query: Expecting "${b}" got end of query.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
return brace(query)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -487,9 +575,10 @@ var TagsPrototype = {
|
|||||||
// values...
|
// values...
|
||||||
//
|
//
|
||||||
// Example:
|
// Example:
|
||||||
// .query(['and',
|
// .query(`
|
||||||
// ['values', 'a', 'b', 'c'],
|
// (and
|
||||||
// ['values', 'b', 'c', 'd']])
|
// (values a b c),
|
||||||
|
// (values b c d))`)
|
||||||
// -> ['b', 'c']
|
// -> ['b', 'c']
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@ -518,11 +607,11 @@ var TagsPrototype = {
|
|||||||
values: function(...args){ return args },
|
values: function(...args){ return args },
|
||||||
flat: function(...args){ return args.flat() },
|
flat: function(...args){ return args.flat() },
|
||||||
},
|
},
|
||||||
// XXX add support for string queries...
|
// NOTE: the query parser is generic and thus is implemented in the
|
||||||
|
// constructor...
|
||||||
parseQuery: function(query){
|
parseQuery: function(query){
|
||||||
// XXX
|
return this.constructor.parseQuery.call(this, query) },
|
||||||
},
|
query: function(query, raw){
|
||||||
query: function(query){
|
|
||||||
var that = this
|
var that = this
|
||||||
var ns = this.__query_ns
|
var ns = this.__query_ns
|
||||||
var sns = this.__query_ns_special
|
var sns = this.__query_ns_special
|
||||||
@ -545,9 +634,14 @@ var TagsPrototype = {
|
|||||||
|
|
||||||
return QL(query instanceof Array ?
|
return QL(query instanceof Array ?
|
||||||
query
|
query
|
||||||
: [query] )
|
: this.parseQuery(query) )
|
||||||
// XXX should this be here???
|
.run(function(){
|
||||||
//.flat(1)
|
return raw ?
|
||||||
|
this
|
||||||
|
: (this
|
||||||
|
// XXX should these be here???
|
||||||
|
.flat(1)
|
||||||
|
.unique()) })
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user