var parser = function(){ var offset =0; var expr =""; var keys = []; var values = []; var bbox= {}; var object = ""; var check = function(char){ if (expr.charAt(offset) != char) { throw "Unexpected char " + expr[offset] + " at " + offset + " expected: " + char; } offset ++; } var parsePredicate = function(){ check('['); parseInnerPredicate(); check(']'); } var parseInnerPredicate = function(){ tmpKeys=[]; parseKeyValue(tmpKeys,'='); check('='); if(tmpKeys.length==1 && tmpKeys[0] == "bbox"){ parseBboxValues(); } else { keys = tmpKeys; parseKeyValue(values,']'); } } var parseBboxValues = function(){ bbox.left = parseBboxFloat(); check(','); bbox.bottom = parseBboxFloat(); check(','); bbox.right = parseBboxFloat(); check(','); bbox.top = parseBboxFloat(); } var parseBboxFloat = function(){ var floatStr = ""; while(expr[offset]!=',' && expr[offset]!=']' && offset < expr.length){ floatStr += expr[offset]; offset ++; } return parseFloat(floatStr); } var parseKeyValue = function(list,delim){ var word = ""; while(expr[offset]!=delim && offset < expr.length){ if(expr[offset]=='|'){ list.push(word); word=""; offset ++; continue; } // jump escaped chars if(expr[offset]=='\\'){ word += expr[offset]; offset ++; } word += expr[offset]; offset ++; } list.push(word); } this.parse = function(exprLocal){ expr = exprLocal; offset = 0; object = ""; check('/'); for(;expr[offset]!='[' && offset 0){ result.tag = { key : keys, value : values } } return result; } } exports.urlToXpathObj = function urlToXpathObj(url){ var parse = new parser(); return parse.parse(url); }