WhereParser
simple Javascript parser for where clauses
by khrome
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/mootools/1.4.5/mootools-core-full-compat.js"></script>
<h1>Check the console</h1>
JavaScript
var WhereParser = new Class({
blockOpen : '(',
blockClose : ')',
escapeOpen : '\'',
escapeClose : '\'',
sentinels : ['and', 'or', '&&', '||'],
operators : ['=', '<', '>', '!'],
textEscape : ['\''],
parse : function(query){
return this.parse_where(query);
},
parse_where : function(clause){
var blocks = this.parse_blocks(clause);
var phrases = this.parse_compound_phrases(blocks, []);
var object = this;
var mapFunction = function(value){
if(typeOf(value) == 'array'){
return value.map(mapFunction);
}else{
if(object.sentinels.contains(value.toLowerCase())){
return {
type : 'conjunction',
value : value
}
}else{
return object.parse_discriminant(value);
}
}
};
var parsed = phrases.map(mapFunction);
return parsed;
},
parse_discriminant : function(text){
var key = '';
var operator = '';
var value = '';
var inQuote = false;
var openQuote = '';
for(var lcv=0; lcv < text.length; lcv++){
ch = text[lcv];
if(inQuote && ch === inQuote){
inQuote = false;
continue;
}
if( (!inQuote) && this.textEscape.contains(ch)){
inQuote = ch;
continue;
}
if(this.operators.contains(ch)){
operator += ch;
continue;
}
if(operator !== '') value += ch;
else key += ch;
}
return {
type : 'expression',
key : key,
operator : operator,
value : value
};
},
parse_blocks : function(parseableText){
var ch;
var env = [];
var stack = [];
var...