Dette scriptet burde ikke installeres direkte. Det er et bibliotek for andre script å inkludere med det nye metadirektivet // @require https://update.greatest.deepsurf.us/scripts/17641/111339/RSel-ExprEditor-%28Library%29.js
- // ==UserScript==
- // @name RSel-ExprEditor-(Library)
- // @namespace https://greatest.deepsurf.us/users/11629-TheLastTaterTot
- // @version 0.2.5
- // @description Allows easier editing of the selection criteria by converting the expressions into editable text
- // @author TheLastTaterTot
- // @include https://editor-beta.waze.com/*editor/*
- // @include https://www.waze.com/*editor/*
- // @exclude https://www.waze.com/*user/editor/*
- // @grant none
- // @run-at document-end
- // ==/UserScript==
-
- var _rsel = {
- getSelectionIndex: function(selector, selText) {
- return selector.map(function(i) {
- if (new RegExp(selText, 'i').test(this.innerText)) return this.value
- }).get(0);
- },
- getSelectOptions: function(selector) {
- var opts = [];
- selector.map(function(i, a) {
- opts.push(a.innerText.toLowerCase());
- });
- return opts;
- },
- getNewExprBuild: function() {
- return {
- cond: null,
- op: null,
- op2: null,
- val: null,
- val2: null,
- condmod: null
- }
- }
- },
- /*Using RSel DOM elements rather than requesting dev to provide direct modifiction of RSel's expr object.
- This is so the RSel dev can feel free to significantly change his object storage structure if needed. */
- rselBtns = {
- lfParens: function() {
- try {
- $('#btnRSLBkt').click();
- } catch (err) {}
- },
- rtParens: function() {
- try {
- $('#btnRSRBkt').click();
- } catch (err) {}
- },
- and: function() {
- try {
- $('#btnRSAnd').click()
- } catch (err) {}
- },
- or: function() {
- try {
- $('#btnRSOr').click()
- } catch (err) {}
- },
- not: function() {
- try {
- $('#btnRSNot').click()
- } catch (err) {}
- },
- clear: function() {
- try {
- $('#btnRSClear').click()
- } catch (err) {}
- }
- },
- rselCond = {
- country: {
- op: function(selText) {
- $('#opRSCountry').val(_rsel.getSelectionIndex($('#opRSCountry option'), selText));
- },
- val: function(selText) {
- $('#selRSCountry').val(_rsel.getSelectionIndex($('#selRSCountry option'), selText));
- },
- add: function() {
- $('#btnRSAddCountry').click();
- }
- },
- state: {
- op: function(selText) {
- $('#opRSState').val(_rsel.getSelectionIndex($('#opRSState option'), selText));
- },
- val: function(val) {
- $('#inRSState').val(val);
- },
- add: function() {
- $('#btnRSAddState').click();
- }
- },
- city: {
- op: function(selText) {
- $('#opRSCity').val(_rsel.getSelectionIndex($('#opRSCity option'), selText));
- },
- val: function(val) {
- $('#inRSCity').val(val);
- },
- condmod: function(val) {
- $('#selRSAltCity').val(val);
- },
- add: function() {
- $('#btnRSAddCity').click();
- }
- },
- street: {
- op: function(selText) {
- $('#opRSStreet').val(_rsel.getSelectionIndex($('#opRSStreet option'), selText));
- },
- val: function(val) {
- $('#inRSStreet').val(val);
- },
- condmod: function(val) {
- $('#selRSAlttStreet').val(val);
- },
- add: function() {
- $('#btnRSAddStreet').click();
- }
- },
- unnamed: {
- op: function(chkVal) {
- $('#cbRSNoName').prop('checked', chkVal);
- }, //checked - has no name
- opAlt: function(chkVal) {
- $('#cbRSAltNoName').prop('checked', chkVal);
- }, //checked - alt name
- add: function() {
- $('#btnRSAddNoName').click();
- }
- },
- road: {
- op: function(selText) {
- $('#opRSRoadType').val(_rsel.getSelectionIndex($('#opRSRoadType option'), selText));
- },
- val: function(selText) {
- $('#selRSRoadType').val(_rsel.getSelectionIndex($('#selRSRoadType option'), selText));
- },
- add: function() {
- $('#btnRSAddRoadType').click();
- }
- },
- direction: {
- op: function(selText) {
- $('#opRSDirection').val(_rsel.getSelectionIndex($('#opRSDirection option'), selText));
- },
- val: function(selText) {
- $('#selRSDirection').val(_rsel.getSelectionIndex($('#selRSDirection option'), selText));
- },
- add: function() {
- $('#btnRSAddDirection').click();
- }
- },
- elevation: {
- op: function(selText) {
- $('#opRSElevation').val(_rsel.getSelectionIndex($('#opRSElevation option'), selText));
- },
- val: function(selText) {
- $('#selRSElevation').val(_rsel.getSelectionIndex($('#selRSElevation option'), selText));
- },
- add: function() {
- $('#btnRSAddElevation').click();
- }
- },
- manual: {
- op: function(selText) {
- $('#opRSManLock').val(_rsel.getSelectionIndex($('#opRSManLock option'), selText));
- },
- val: function(val) {
- $('#selRSManLock').val(val);
- },
- add: function() {
- $('#btnRSAddManLock').click();
- }
- },
- trafic: {
- op: function(selText) {
- $('#opRSTrLock').val(_rsel.getSelectionIndex($('#opRSTrLock option'), selText));
- },
- val: function(val) {
- $('#selRSTrLock').val(val);
- },
- add: function() {
- $('#btnRSAddTrLock').click();
- }
- },
- speed: {
- opOptNodes: $('#opRSSpeed option'),
- op: function(selText) {
- $('#opRSSpeed').val(_rsel.getSelectionIndex($('#opRSSpeed option'), selText));
- },
- val: function(val) {
- $('#inRSSpeed').val(val);
- },
- add: function() {
- $('#btnRSAddSpeed').click();
- }
- },
- closure: {
- op: function(checked) {
- $('#cbRSClsr').prop('checked', checked);
- },
- op2: function(selText) {
- $('#opRSClsrStrtEnd').val(_rsel.getSelectionIndex($('#opRSClsrStrtEnd option'), selText));
- },
- val: function(val) {
- $('#inRSClsrDays').val(val);
- },
- condmod: function(selText) {
- $('#opRSClsrBeforeAter').val(_rsel.getSelectionIndex($('#opRSClsrBeforeAter option'), selText));
- },
- add: function() {
- $('#btnRSAddClsr').click();
- }
- },
- updated: {
- op: function(selText) {
- $('#opRSUpdtd').val(_rsel.getSelectionIndex($('#opRSUpdtd option'), selText));
- },
- val: function(val) {
- $('#inRSUpdtd').val(val);
- },
- add: function() {
- $('#btnRSAddUpdtd').click();
- }
- },
- created: {
- op: function(selText) {
- $('#opRSCrtd').val(_rsel.getSelectionIndex($('#opRSCrtd option'), selText));
- },
- val: function(val) {
- $('#inRSCrtd').val(val);
- },
- add: function() {
- $('#btnRSAddCrtd').click();
- }
- },
- last: {
- op: function(selText) {
- $('#opRSLastU').val(_rsel.getSelectionIndex($('#opRSLastU option'), selText));
- },
- val: function(val) {
- $('#inRSLastU').val(val);
- },
- add: function() {
- $('#btnRSAddLastU').click();
- }
- },
- length: {
- op: function(selText) {
- $('#opRSLength').val(_rsel.getSelectionIndex($('#opRSLength option'), selText));
- },
- val: function(val) {
- $('#inRSLength').val(val);
- },
- condmod: function(selText) {
- $('#unitRSLength').val(_rsel.getSelectionIndex($('#unitRSLength option'), selText));
- },
- add: function() {
- $('#btnRSAddLength').click();
- }
- },
- id: {
- op: function(selText) {
- $('#opRSSegId').val(_rsel.getSelectionIndex($('#opRSSegId option'), selText));
- },
- val: function(val) {
- $('#inRSSegId').val(val);
- },
- add: function() {
- $('#btnRSAddSegId').click();
- }
- },
- roundabout: {
- op: function(checked) {
- $('#cbRSIsRound').prop('checked', checked);
- },
- add: function() {
- $('#btnRSAddIsRound').click();
- }
- },
- toll: {
- op: function(checked) {
- $('#cbRSIsToll').prop('checked', checked);
- },
- add: function() {
- $('#btnRSAddIsToll').click();
- }
- },
- tunnel: {
- op: function(checked) {
- $('#cbRSTunnel').prop('checked', checked);
- },
- add: function() {
- $('#btnRSAddTunnel').click();
- }
- },
- new: {
- op: function(checked) {
- $('#cbRSIsNew').prop('checked', checked);
- },
- add: function() {
- $('#btnRSAddIsNew').click();
- }
- },
- changed: {
- op: function(checked) {
- $('#cbRSIsChngd').prop('checked', checked);
- },
- add: function() {
- $('#btnRSAddIsChngd').click();
- }
- },
- screen: {
- op: function(checked) {
- $('#cbRSOnScr').prop('checked', checked);
- },
- add: function() {
- $('#btnRSAddOnScr').click();
- }
- },
- restriction: {
- op: function(checked) {
- $('#cbRSRestr').prop('checked', checked);
- },
- add: function() {
- $('#btnRSAddRestr').click();
- }
- },
- editable: {
- op: function(checked) {
- $('#cbRSEdtbl').prop('checked', checked);
- },
- add: function() {
- $('#btnRSAddEdtbl').click();
- }
- }
- };
-
- //=============================================================================
- function updateExpr(parseThis) {
- var __EXPR_DEBUGINFO;
-
- console.info('*** Begin parsing expression... ***');
- rselBtns.clear();
-
- //---------------------------------------------------------------
- var addExpr = function(eb) {
- var checkKeys = false;
- Object.keys(rselCond).map(function(a, i) {
- if (a === eb.cond) checkKeys = true;
- });
- if (checkKeys) {
- try {
- rselCond[eb.cond].op(eb.op);
- if (eb.op2 !== null) rselCond[eb.cond].op2(eb.op2);
- if (eb.condmod !== null) rselCond[eb.cond].condmod(eb.condmod);
-
- if (eb.val2 === null) {
- if (eb.val !== null) rselCond[eb.cond].val(eb.val);
- rselCond[eb.cond].add();
- } else {
- rselBtns.lfParens();
- rselCond[eb.cond].val(eb.val);
- rselCond[eb.cond].add();
- rselBtns.or();
- rselCond[eb.cond].val(eb.val2);
- rselCond[eb.cond].add();
- rselBtns.rtParens();
- }
-
- } catch (err) {
- __EXPR_DEBUGINFO.eb = eb;
- return {
- errdebug: __EXPR_DEBUGINFO,
- err: err
- };
- }
- } else {
- __EXPR_DEBUGINFO.eb = eb;
- return {
- errdebug: __EXPR_DEBUGINFO,
- err: 'Selector condition was not recognized'
- };
- }
-
- return true;
- };
- //---------------------------------------------------------------
- //parseThis = '(((Country="United States" AND State="Oregon") AND !(Prim name!="Somewhere") AND Name contains ("Somewhere")) OR (Alt name !contains ("Somewhere"))) AND Primary City ~("Some City") AND City="Big City" AND Alt. City!= "Big City" AND Prim. or Alt. City contains ("Big City") AND ((Has name OR Unnamed) AND (NO Alt. names OR Has Alt name(s))) AND Road Type = "Runway/Taxiway" AND !Roundabout AND Is NOT Toll Road AND != Unnamed & (Direction != "One way (A->B)" OR Direction = "Unknown") AND (Elevation != "Ground" AND Elevation > 1 AND Elevation <= 1) AND Is NOT Tunnel AND On Screen & OUT of Screen && Has restriction | Has NO restriction AND Has closure || Has NO closure AND Closure starts before 1 day AND Closure ends before 1 day AND Closure starts after 1 day AND Closure ends after 1 day AND Closure starts in 1 day AND Closure ends in 1 day AND Closure doesn\'t start in 1 day AND Closure doesn\'t end in 1 day';
- //parseThis.replace(/\bis(?:\s?n[o']t)\b/ig,'!=')
-
- if (parseThis === undefined) parseThis = $('#cmEditExprBox').val();
-
- var parseExprArray = parseThis.match(
- /\("(.*?)"\)|\('(.*?)'\)|"(.*?)"|'(.*?)'|\bpri?m?(?:ary|\.)?\s?(?:or|and|\|\||\||&|&&|\/)\s?alt(?:ern|s)?(?:\.)?|\bno[\s-]alt|\b(?:street[\s-]?)?name\(s\)|\bstreet(?:\snames?)\b|\b(?:un)?name[ds]?(?:[-\s]?seg[a-z]*)?\b|\b(?:road)(?:.?(?:type))?\b|\btoll(?:[-\s]?ro?a?d)?\b|\b(?:speed[\s-]?(?:limits?)?|sl)\b|\bman[ually]*[\s-]?(?:lock[eds]*)?\b|\btraf[fic]*[\s-]?(?:lock[eds]*)?\b|\bauto-?(?:matic[ally]*)?[\s-]?(?:lock[eds]*)?\b|\bcreated(?:[\s-]?by)?\b|\blast(?:[\s-]?(?:update[ds]?|edite?d?s?))?\b|\b(?:update[ds]?|edite?d?s?)(?:[\s-]?by)?\b|\b(?:in|on|off|out|outside)(?: of)?[- ]?screen\b|\bdoes(?:\s?n[o']t)\b|(?:!\s?)?contains?\b|!=|>=|<=|A->B|B->A|\w+(\(s\))?|&&|\|\||!=|[|&<>=()!~]/gi
- ),
- exprHistory = [],
- condMatches = [],
- condMatchPhrases = [],
- exprMatches = [],
- exprMatchPhrases = [],
- exprBuild, exprFragment, exprFragPhrase, exprFragPhraseStr, unwantedWordsSearch,
- closeParens, e, f, b, fLength, m, mLength,
- success = false;
-
- // The following parses the expression text into unique chunks within separate array elements
- e = parseExprArray.length;
- while (e-- > 0) {
- try {
- exprFragment = parseExprArray.shift();
- //console.info(exprFragment);
-
- // Find operators that join individual expressions (AND|OR|!|parenthesis)
- if (/^(?:and|or|&&|\|\||!=|[=&|()!])$/i.test(exprFragment)) {
- exprMatches.push(exprFragment.toLowerCase());
- exprMatchPhrases.push(exprFragment.toLowerCase());
- }
-
- // Identify elements that contain selection condition names
- if (
- /^country|^state|^city|^street|^(?:un|street[\s-]?)?name.*|^(?:road)(?:.?(?:type))?|^type|^round[a-z]*|^rotary|^ra|^toll(?:[-\s]?ro?a?d)?|^(?:speed[\s-]?(?:limits?)?|sl)|^dir[a-z]*|^elevation|^tun[a-z]*|^man[ually]*[\s-]?(?:lock[eds]*)?|^traf[fic]*[\s-]?(?:lock[eds]*)?|^auto-?(?:matic[ally]*)?[\s-]?(?:lock[eds]*)?|^speed|^sls?|^new|^changed|^chg[a-z]*|^(?:in|on|off|out|outside)(?: of)?[- ]?screen|^restrict[a-z]*|^clos[a-z]+|^created(?:[\s-]?by)?|^last(?:[\s-]?(?:update[ds]?|edite?d?s?)[\s-]?(?:by)?)?|^(?:update[ds]?|edite?d?s?)(?:[\s-]?by)?|^length|^id|^editable/i
- .test(exprFragment)) {
- condMatches.push(exprFragment.toLowerCase()); // lists specific selection conditions
- exprMatches.push(exprFragment.toLowerCase()); //same as condMatches, but includes operations as separate array elements
-
- try {
- //search phrase fowards
- fLength = parseExprArray.length;
- f = 0;
- while (!(/^(and|or|&&|\|\||[&|)])$/i.test(parseExprArray[f])) && (++f < fLength)) {}
- //search phrase backwards
- b = exprHistory.length;
- while (!(/^(and|or|&&|\|\||[&|(])$/i.test(exprHistory[b - 1])) && (--b > 0)) {}
-
- condMatchPhrases.push(exprHistory.slice(b).concat(exprFragment, parseExprArray.slice(0, f))); //list specific selection conditions and its criteria
-
- unwantedWordsSearch = exprHistory.slice(b);
- if (unwantedWordsSearch && unwantedWordsSearch.length) {
- spliceOut = [];
- for (m = unwantedWordsSearch.length; m--;) {
- if (/\b(has|have|is|=|are|does)\b/i.test(unwantedWordsSearch[m])) {
- unwantedWordsSearch.splice(m, 1);
- }
- }
- }
- if (/!|!=/.test(unwantedWordsSearch[0])) unwantedWordsSearch.splice(0, 1);
-
- exprMatchPhrases.push(unwantedWordsSearch.concat(parseExprArray.slice(0, f))); //excludes the match cond
-
- //exprHistory.push(exprFragment);
- exprHistory = exprHistory.concat(exprFragment, parseExprArray.slice(0, f));
- parseExprArray = parseExprArray.slice(f);
- e -= f;
- } catch (err) {
- return {
- errdebug: 'Error parsing expression at ' + exprFragment,
- err: err
- };
- }
- } else {
- exprHistory.push(exprFragment);
- }
- } catch (err) {
- return {
- errdebug: 'Error parsing expression at ' + exprFragment,
- err: err
- };
- }
- } //while
-
-
- //---------------------------------------------------------------
- // Quick crude check for unmatched parentheses
- var nOpenParens = exprMatches.toString().match(/\(/g),
- nCloseParens = exprMatches.toString().match(/\)/g);
- if (!nOpenParens) nOpenParens = [];
- if (!nCloseParens) nCloseParens = [];
- if (nOpenParens.length !== nCloseParens.length) return 1;
- //---------------------------------------------------------------
-
- closeParens = 0;
- mLength = exprMatchPhrases.length;
- for (m = 0; m < mLength; m++) {
- __EXPR_DEBUGINFO = {
- m: m,
- exprMatches: exprMatches[m],
- exprMatchPhrases: exprMatchPhrases[m]
- }; //reset for error debugging
-
- exprFragment = exprMatches[m];
- exprFragPhrase = exprMatchPhrases[m];
- if (exprFragPhrase.constructor !== Array) exprFragPhrase = [exprFragPhrase];
-
- exprBuild = _rsel.getNewExprBuild();
- exprBuild.cond = exprFragment;
-
- //if (m===10) debugger;
-
- if (closeParens === 1) closeParens = 2;
-
- //============================================================
- // Where the magic happens... sort of.
- //============================================================
- switch (true) {
- case (exprFragment === '('):
- rselBtns.lfParens();
- break;
- case (exprFragment === ')'):
- rselBtns.rtParens();
- break;
- case /^(&|&&|and)$/.test(exprFragment):
- rselBtns.and();
- //console.info(exprFragment.toLowerCase());
- break;
- case /^(\||\|\||or)$/.test(exprFragment):
- //console.info(exprFragment.toLowerCase());
- rselBtns.or();
- break;
- case /no[\s-]alt/i.test(exprFragPhrase):
- rselCond.unnamed.op(true);
- rselCond.unnamed.opAlt(true);
- rselCond.unnamed.add();
- success = true;
- break;
- case /^(!|!=|not)$/.test(exprFragment):
- rselBtns.not();
- if (exprMatches[m + 1] !== '(') {
- rselBtns.lfParens();
- closeParens = 1;
- }
- break;
- case /^unnamed/.test(exprBuild.cond):
- rselCond.unnamed.op(true);
- rselCond.unnamed.opAlt(false);
- rselCond.unnamed.add();
- success = true;
- break;
-
- // SPEED LIMITS
- case /^speed.*|^sls?/.test(exprBuild.cond):
- exprBuild.cond = exprBuild.cond.replace(/^sls?|^speed.*/, 'speed');
-
- try {
- if (exprFragPhrase.length < 2 && /\bnot?\b|!|!=/i.test(exprFragPhrase[0])) {
- exprBuild.op = 'none';
- } else {
- exprFragPhrase = exprFragPhrase.join(' ');
-
- if (/\bnot?\b|!|!=/i.test(exprFragPhrase)) rselBtns.not();
-
- var optionText = _rsel.getSelectOptions(rselCond.speed.opOptNodes);
- optionText = RegExp(optionText.join('|'), 'i').exec(exprFragPhrase);
- if (optionText) exprBuild.op = optionText[0];
- else exprBuild.op = 'any';
- }
-
- var speedVal = exprFragPhrase.match(/(\d+)\s?mph|(\d+)\s?km/i);
- if (speedVal && speedVal.length === 2) exprBuild.val = speedVal[1];
- } catch (err) {
- __EXPR_DEBUGINFO.exprBuild = exprBuild;
- return {
- errdebug: __EXPR_DEBUGINFO,
- err: err
- };
- }
- success = addExpr(exprBuild);
- break;
-
-
- // BINARY CONDITIONS:
- case exprFragPhrase.length === 0 || //suggests binary
- /^(?:screen|roundabout|ra|toll|tun|new|changed|restr|editable)/.test(exprBuild.cond) || //binary selection conditions
- (/^(?:street[\s-]?)?name.*|^clos.*/i.test(exprBuild.cond) && exprFragPhrase.length <= 1): //selection conditions that have both binary and multiple options
-
- exprFragPhrase = exprFragPhrase.join(' ');
-
- exprBuild.cond = exprBuild.cond.replace(/^(?:street[\s-]?)?name.*/, 'name');
- exprBuild.cond = exprBuild.cond.replace(/^ra|^rotary|^round.*/, 'roundabout');
- exprBuild.cond = exprBuild.cond.replace(/^toll.*/, 'toll');
- exprBuild.cond = exprBuild.cond.replace(/^tun.*/, 'tunnel');
- exprBuild.cond = exprBuild.cond.replace(/^restr.*/, 'restriction');
- exprBuild.cond = exprBuild.cond.replace(/^(?:in|on)[- ]?screen/, 'onscreen');
- exprBuild.cond = exprBuild.cond.replace(/^(?:off|out|outside)(?: of)?[- ]?screen/, 'offscreen');
-
- if (/\bnot?\b|!|!=/i.test(exprFragPhrase)) {
- exprBuild.op = false;
- } else {
- exprBuild.op = true;
- }
- try {
- switch (exprBuild.cond) {
- case 'name':
- try {
- if (/alt/i.test(exprFragPhrase)) {
- rselCond.unnamed.op(false);
- rselCond.unnamed.opAlt(true);
- rselCond.unnamed.add();
- } else {
- rselCond.unnamed.op(false);
- rselCond.unnamed.opAlt(false);
- rselCond.unnamed.add();
- }
- success = true;
- } catch (err) {
- return {
- errdebug: __EXPR_DEBUGINFO,
- err: err
- };
- }
- break;
- case 'closure':
- exprBuild.op2 = '---';
- success = addExpr(exprBuild);
- break;
- case 'onscreen':
- exprBuild.cond = 'screen';
- exprBuild.op = true;
- success = addExpr(exprBuild);
- break;
- case 'offscreen':
- exprBuild.cond = 'screen';
- exprBuild.op = false;
- success = addExpr(exprBuild);
- break;
- case 'roundabout':
- case 'toll':
- case 'tunnel':
- case 'new':
- case 'changed':
- case 'restriction':
- case 'editable':
- success = addExpr(exprBuild);
- break;
- } //switch
-
- } catch (err) {
- __EXPR_DEBUGINFO.exprBuild = exprBuild;
- return {
- errdebug: __EXPR_DEBUGINFO,
- err: err
- };
- }
- break;
- //--------------------------------------------------------------------
-
- case /^closure/.test(exprBuild.cond):
- try {
- exprFragPhrase = exprFragPhrase.join().toLowerCase();
- exprBuild.op = !(/does\s?n['o]t|!|!=/.test(exprFragPhrase)); //checkbox
- exprBuild.op2 = /start|end/.exec(exprFragPhrase) + 's'; //starts/ends
- exprBuild.condmod = /before|after|\bin\b/.exec(exprFragPhrase) + ''; //in/before/after
- exprBuild.val = /\d+/.exec(exprFragPhrase) + ''; //days ago
- } catch (err) {
- __EXPR_DEBUGINFO.exprBuild = exprBuild;
- return {
- errdebug: __EXPR_DEBUGINFO,
- err: err
- };
- }
- success = addExpr(exprBuild);
- break;
-
- default:
- // CONDITION NAME MATCHING (TYPE OF SELECTION)
- try {
- if (/^(?:name.*|^str.*|^cit.*)/.test(exprBuild.cond)) {
- exprBuild.cond = exprBuild.cond.replace(/^name.*/, 'street');
- exprBuild.cond = exprBuild.cond.replace(/^str.*/, 'street');
- exprBuild.cond = exprBuild.cond.replace(/^cit.*/, 'city');
- var exprStart = exprFragPhrase.slice(0, -1), //don't include last element bc it should be the name itself
- prim, alt;
- if (exprStart) {
- exprStart = exprStart.toString().toLowerCase();
- prim = /\bpri?m?(?:ary|\.)?\b/i.test(exprStart);
- alt = /\balt(?:ern\w*|\.)?\b/i.test(exprStart);
- } else {
- prim = false;
- alt = false;
- }
- if (prim && alt) exprBuild.condmod = 2;
- else if (prim) exprBuild.condmod = 0;
- else if (alt) exprBuild.condmod = 1;
- else exprBuild.condmod = 0;
- } else {
- exprBuild.cond = exprBuild.cond.replace(/^traf.*|^auto.*/, 'trafic');
- exprBuild.cond = exprBuild.cond.replace(/^man.*/, 'manual');
- exprBuild.cond = exprBuild.cond.replace(/^dir.*/, 'direction');
- exprBuild.cond = exprBuild.cond.replace(/^(?:road)(?:.?(?:type))?|^type/, 'road');
- exprBuild.cond = exprBuild.cond.replace(/^last\s.*/, 'last');
- exprBuild.cond = exprBuild.cond.replace(/^create.*/, 'created');
- exprBuild.cond = exprBuild.cond.replace(/^update.*/, 'updated');
- }
- } catch (err) {
- __EXPR_DEBUGINFO.exprBuild = exprBuild;
- return {
- errdebug: __EXPR_DEBUGINFO,
- err: err
- };
- }
-
- // COMPARATOR OPERATION MATCHING
- try {
- // Convert natural lang representation to standard comparator operations
- exprFragPhraseStr = exprFragPhrase.join(' ').replace(/is less than|is fewer than/i, '<');
- exprFragPhraseStr = exprFragPhraseStr.replace(/is greater than/i, '>');
- exprFragPhraseStr = exprFragPhraseStr.replace(/is less or equal to|is less than or equal to|is fewer than or equal to|is fewer or equal to/i, '<=');
- exprFragPhraseStr = exprFragPhraseStr.replace(/is greater than or equal to|is greater or equal to/i, '>=');
- exprFragPhraseStr = exprFragPhraseStr.replace(/(?:does|has|is|was|were|are)(?:\s?n[o']t)(?:\sequal)?/i, '!=');
- exprFragPhraseStr = exprFragPhraseStr.replace(/(?:has|have|is|was|were|are)(?:\sequal)?|==/i, '=');
- exprFragPhraseStr = exprFragPhraseStr.replace(/(?:do(?:es)?\s?n[o']t\s|!\s?)contains?/i, '! contains');
- exprFragPhraseStr = exprFragPhraseStr.replace(/contains?/i, 'contains');
-
- // Comparator operations with standard representation
- exprBuild.op = /(?:! )?contains|[!<>=~]{1,2}/i.exec(exprFragPhraseStr) + '';
- //console.info(exprBuild.op);
- } catch (err) {
- __EXPR_DEBUGINFO.exprBuild = exprBuild;
- return {
- errdebug: __EXPR_DEBUGINFO,
- err: err
- };
- }
-
- // SELECTION VALUE MATCHING
- try {
- if (/^length|^last/.test(exprBuild.cond)) {
- exprFragPhraseStr = exprFragPhraseStr.replace(/\btoday\b/, 0);
- exprFragPhraseStr = exprFragPhraseStr.replace(/\byesterday\b/, 1);
- exprBuild.val = exprFragPhraseStr.match(/\b\d+/) + ''
- } else {
- var exprCondVal = exprFragPhrase.slice(-1)[0];
- // Remove surrounding paretheses and quotations
- if (/^[('"]+(.*?)['")]+$/.test(exprCondVal)) {
- exprBuild.val = exprCondVal.replace(/^[('"\s]+(.*?)[\s'")]+$/, '$1'); //.replace(/["()]/g,'').replace(/^'(.*)'$/,'$1');
- } else {
- try {
- exprBuild.val = exprFragPhraseStr.replace(new RegExp('(?:' + exprBuild.op + ')\\s(\\b(?:\\w\\s?)*\\b)', 'i'), '$1');
- } catch (err) {
- __EXPR_DEBUGINFO.exprBuild = exprBuild;
- return {
- errdebug: 2,
- err: __EXPR_DEBUGINFO
- };
- }
- }
-
-
- // Add flexility to value specification for direction selection
- // Also allow user to specify 'oneway' without direction and auto add expr for both directions
- if (/^direction/.test(exprBuild.cond)) {
- exprBuild.val = exprBuild.val.match(/A[<>-\s]*B|B[<>-\s]*A|^one[\s-]?ways?$|unknown/i) + ''; //reduce to unique key words... last option will automatically input both one ways
- exprBuild.val = exprBuild.val.replace(/B[\s<-]*A/, 'A->B');
- exprBuild.val = exprBuild.val.replace(/A[\s<-]*B/, 'B->A');
- if (/^one[\s-]?ways?$/.test(exprBuild.val)) {
- exprBuild.val = 'A->B';
- exprBuild.val2 = 'B->A';
- }
- } else if (/^road/.test(exprBuild.cond)) {
- exprBuild.val = exprBuild.val.replace(/^fwy$/i, '^freeway');
- exprBuild.val = exprBuild.val.replace(/hwy/i, ''); //not important bc not a unique keyword
- exprBuild.val = exprBuild.val.replace(/^MH$/, '^major');
- exprBuild.val = exprBuild.val.replace(/^mH$/, '^minor');
- exprBuild.val = exprBuild.val.replace(/^ps$|^prim.*/i, '^primary');
- exprBuild.val = exprBuild.val.replace(/^st.*/i, '^street');
- exprBuild.val = exprBuild.val.replace(/^dirt.*|.*4[\s-]?x[\s-]?4.*/i, '^dirt');
- exprBuild.val = exprBuild.val.replace(/^plr$|^pl$|^park.*/i, '^parking');
- exprBuild.val = exprBuild.val.replace(/^pr$|^pvtr$|^pvr$|^priv.*/i, '^private');
- exprBuild.val = exprBuild.val.replace(/^wt$|^walk.*|.*trl/i, '^walking');
- exprBuild.val = exprBuild.val.replace(/^pb$|^ped.*|.*b(?:oard)?w(?:alk)?/i, '^pedestrian');
- exprBuild.val = exprBuild.val.replace(/^sw$|^stair.*/i, '^stairway');
- exprBuild.val = exprBuild.val.replace(/^rr$|^rail.*/i, '^railroad');
- exprBuild.val = exprBuild.val.replace(/^rw$|^tw$|.*run.*|.*taxi.*/i, '^runway');
- }
- }
- success = addExpr(exprBuild);
-
- } catch (err) {
- __EXPR_DEBUGINFO.exprBuild = exprBuild;
- return {
- errdebug: __EXPR_DEBUGINFO,
- err: err
- };
- }
- } //switch
-
- if (closeParens === 2) {
- rselBtns.rtParens();
- closeParens = 0;
- }
-
- } //for each condition matched
- __EXPR_DEBUGINFO.exprBuild = exprBuild;
- if (!success) {
- return {
- errdebug: __EXPR_DEBUGINFO
- }
- }
- } //updateExpr()
-