[Git][debian-gis-team/josm][master] Drop missing-sources, JS files removed upstream.
Bas Couwenberg
gitlab at salsa.debian.org
Thu Aug 27 16:18:47 BST 2020
Bas Couwenberg pushed to branch master at Debian GIS Project / josm
Commits:
82bef25a by Bas Couwenberg at 2020-08-27T17:15:10+02:00
Drop missing-sources, JS files removed upstream.
- - - - -
3 changed files:
- debian/changelog
- − debian/missing-sources/opening_hours.js
- − debian/missing-sources/overpass-wizard.js
Changes:
=====================================
debian/changelog
=====================================
@@ -1,3 +1,9 @@
+josm (0.0.svn16812+dfsg-2) UNRELEASED; urgency=medium
+
+ * Drop missing-sources, JS files removed upstream.
+
+ -- Bas Couwenberg <sebastic at debian.org> Thu, 27 Aug 2020 17:14:52 +0200
+
josm (0.0.svn16812+dfsg-1) unstable; urgency=medium
* Move from experimental to unstable.
=====================================
debian/missing-sources/opening_hours.js deleted
=====================================
The diff for this file was not included because it is too large.
=====================================
debian/missing-sources/overpass-wizard.js deleted
=====================================
@@ -1,1358 +0,0 @@
-var parser = require("./parser.js");
-var freeFormQuery; // todo: refactor this!
-
-// todo: normalization -> node module?
-
-/* this converts a random boolean expression into a normalized form:
- * A∧B∧… ∨ C∧D∧… ∨ …
- * for example: A∧(B∨C) ⇔ (A∧B)∨(A∧C)
- */
-function normalize(query) {
- var normalized_query = {
- logical:"or",
- queries:[]
- };
- function normalize_recursive(rem_query) {
- if (!rem_query.logical) {
- return [{
- logical: "and",
- queries: [rem_query]
- }];
- } else if (rem_query.logical === "and") {
- var c1 = normalize_recursive( rem_query.queries[0] );
- var c2 = normalize_recursive( rem_query.queries[1] );
- // return cross product of c1 and c2
- var c = [];
- for (var i=0; i<c1.length; i++)
- for (var j=0; j<c2.length; j++) {
- c.push({
- logical: "and",
- queries: c1[i].queries.concat(c2[j].queries)
- });
- }
- return c;
- } else if (rem_query.logical === "or") {
- var c1 = normalize_recursive( rem_query.queries[0] );
- var c2 = normalize_recursive( rem_query.queries[1] );
- return [].concat(c1,c2);
-
- } else {
- console.error("unsupported boolean operator: "+rem_query.logical);
- }
- }
- normalized_query.queries = normalize_recursive(query);
- return normalized_query;
-}
-
-module.exports = function wizard(search, options) {
- var defaults = {
- comment: true,
- outputMode: "geom", // "recursive", "recursive_meta", out <*> ("geom", "ids", …)
- globalBbox: true,
- //todo: more fine grained controll, e.g. to deactivate "in X"
- timeout: 25,
- maxsize: undefined,
- outputFormat: "json", // "json", "xml"
- aroundRadius: 1000,
- freeFormPresets: undefined
- };
-
- for (var k in options) {
- defaults[k] = options[k];
- }
- options = defaults;
-
- // quote strings that are safe to be used within c-style comments
- // replace any comment-ending sequences in these strings that would break the resulting query
- function quote_comment_str(s) {
- return s.replace(/\*\//g,'[…]').replace(/\n/g,'\\n');
- }
-
- var parsedQuery;
-
- try {
- parsedQuery = parser.parse(search);
- } catch(e) {
- console.error("couldn't parse wizard input");
- return false;
- }
-
- var query_parts = [];
- var bounds_part;
-
- if (options.comment === true) {
- query_parts.push('/*');
- query_parts.push('This has been generated by the overpass-turbo wizard.');
- query_parts.push('The original search was:');
- query_parts.push('“'+quote_comment_str(search)+'”');
- query_parts.push('*/');
- } else if (typeof options.comment === "string") {
- query_parts.push('/*');
- query_parts.push(options.comment);
- query_parts.push('*/');
- comment = true;
- }
- query_parts.push(
- '[out:'+options.outputFormat+']'+
- '[timeout:'+options.timeout+']'+
- (options.maxsize !== undefined ? '[maxsize:'+options.maxsize+']' : '')+
- (options.globalBbox && parsedQuery.bounds === "bbox" ? '[bbox:{{bbox}}]' : '')+
- ';');
-
- switch(parsedQuery.bounds) {
- case "area":
- if (options.comment)
- query_parts.push('// fetch area “'+parsedQuery.area+'” to search in');
- query_parts.push('{{geocodeArea:'+parsedQuery.area+'}}->.searchArea;');
- bounds_part = '(area.searchArea)';
- break;
- case "around":
- if (options.comment)
- query_parts.push('// adjust the search radius (in meters) here');
- query_parts.push('{{radius='+options.aroundRadius+'}}');
- bounds_part = '(around:{{radius}},{{geocodeCoords:'+parsedQuery.area+'}})';
- break;
- case "bbox":
- bounds_part = options.globalBbox ? '' : '({{bbox}})';
- break;
- case "global":
- bounds_part = undefined;
- break;
- default:
- console.error("unknown bounds condition: "+parsedQuery.bounds);
- return false;
- break;
- }
-
- function get_query_clause(condition) {
- function escRegexp(str) {
- return str.replace(/([()[{*+.$^\\|?])/g, '\\$1');
- }
- function esc(str) {
- if (typeof str !== "string") return;
- // see http://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#Escaping
- return str.replace(/\\/g,"\\\\").replace(/"/g,"\\\"") // need to escape those
- .replace(/\t/g,"\\t").replace(/\n/g,"\\n"); // also escape newlines an tabs for better readability of the query
- }
- var key = esc(condition.key);
- var val = esc(condition.val);
- // convert substring searches into matching regexp ones
- if (condition.query === "substr") {
- condition.query = "like";
- condition.val={regex:escRegexp(condition.val)};
- }
- // special case for empty values
- // see https://github.com/drolbr/Overpass-API/issues/53
- if (val === '') {
- if (condition.query === "eq") {
- condition.query = "like";
- condition.val={regex:'^$'};
- } else if (condition.query === "neq") {
- condition.query = "notlike";
- condition.val={regex:'^$'};
- }
- }
- // special case for empty keys
- // see https://github.com/drolbr/Overpass-API/issues/53#issuecomment-26325122
- if (key === '') {
- if (condition.query === "key") {
- condition.query = "likelike";
- key='^$';
- condition.val={regex: '.*'};
- } else if (condition.query === "eq") {
- condition.query = "likelike";
- key='^$';
- condition.val={regex: '^'+escRegexp(condition.val)+'$'};
- } else if (condition.query === "like") {
- condition.query = "likelike";
- key='^$';
- }
- }
- // construct the query clause
- switch(condition.query) {
- case "key":
- return '["'+key+'"]';
- case "nokey":
- return '["'+key+'"!~".*"]';
- case "eq":
- return '["'+key+'"="'+val+'"]';
- case "neq":
- return '["'+key+'"!="'+val+'"]';
- case "like":
- return '["'+key+'"~"'+esc(condition.val.regex)+'"'
- +(condition.val.modifier==="i"?',i':'')
- +']';
- case "likelike":
- return '[~"'+key+'"~"'+esc(condition.val.regex)+'"'
- +(condition.val.modifier==="i"?',i':'')
- +']';
- case "notlike":
- return '["'+key+'"!~"'+esc(condition.val.regex)+'"'
- +(condition.val.modifier==="i"?',i':'')
- +']';
- case "meta":
- switch(condition.meta) {
- case "id":
- return '('+val+')';
- case "newer":
- if (condition.val.match(/^-?\d+ ?(seconds?|minutes?|hours?|days?|weeks?|months?|years?)?$/))
- return '(newer:"{{date:'+val+'}}")';
- return '(newer:"'+val+'")';
- case "user":
- return '(user:"'+val+'")';
- case "uid":
- return '(uid:'+val+')';
- default:
- console.error("unknown query type: meta/"+condition.meta);
- return false;
- }
- case "free form":
- // own module, special cased below
- default:
- console.error("unknown query type: "+condition.query);
- return false;
- }
- }
- function get_query_clause_str(condition) {
- function quotes(s) {
- if (s.match(/^[a-zA-Z0-9_]+$/) === null)
- return '"'+s.replace(/"/g,'\\"')+'"';
- return s;
- }
- function quoteRegex(s) {
- if (s.regex.match(/^[a-zA-Z0-9_]+$/) === null || s.modifier)
- return '/'+s.regex.replace(/\//g,'\\/')+'/'+(s.modifier||'');
- return s.regex;
- }
- switch(condition.query) {
- case "key":
- return quote_comment_str(quotes(condition.key)+'=*');
- case "nokey":
- return quote_comment_str(quotes(condition.key)+'!=*');
- case "eq":
- return quote_comment_str(quotes(condition.key)+'='+quotes(condition.val));
- case "neq":
- return quote_comment_str(quotes(condition.key)+'!='+quotes(condition.val));
- case "like":
- return quote_comment_str(quotes(condition.key)+'~'+quoteRegex(condition.val));
- case "likelike":
- return quote_comment_str('~'+quotes(condition.key)+'~'+quoteRegex(condition.val));
- case "notlike":
- return quote_comment_str(quotes(condition.key)+'!~'+quoteRegex(condition.val));
- case "substr":
- return quote_comment_str(quotes(condition.key)+':'+quotes(condition.val));
- case "meta":
- switch(condition.meta) {
- case "id":
- return quote_comment_str('id:'+quotes(condition.val));
- case "newer":
- return quote_comment_str('newer:'+quotes(condition.val));
- case "user":
- return quote_comment_str('user:'+quotes(condition.val));
- case "uid":
- return quote_comment_str('uid:'+quotes(condition.val));
- default:
- return '';
- }
- case "free form":
- return quote_comment_str(quotes(condition.free));
- default:
- return '';
- }
- }
-
- parsedQuery.query = normalize(parsedQuery.query);
-
- if (options.comment)
- query_parts.push('// gather results');
- query_parts.push('(');
- for (var i=0; i<parsedQuery.query.queries.length; i++) {
- var and_query = parsedQuery.query.queries[i];
-
- var types = ['node','way','relation'];
- var clauses = [];
- var clauses_str = [];
- for (var j=0; j<and_query.queries.length; j++) {
- var cond_query = and_query.queries[j];
- // todo: looks like some code duplication here could be reduced by refactoring
- if (cond_query.query === "free form") {
- // eventually load free form query module
- if (!freeFormQuery) freeFormQuery = require('./free')(options.freeFormPresets);
- var ffs_clause = freeFormQuery.get_query_clause(cond_query);
- if (ffs_clause === false) {
- console.error("Couldn't find preset for free form input: "+cond_query.free)
- return false;
- }
- // restrict possible data types
- types = types.filter(function(t) {
- return ffs_clause.types.indexOf(t) != -1;
- });
- // add clauses
- if (options.comment)
- clauses_str.push(get_query_clause_str(cond_query));
- clauses = clauses.concat(ffs_clause.conditions.map(function(condition) {
- return get_query_clause(condition);
- }));
- } else if (cond_query.query === "type") {
- // restrict possible data types
- types = types.indexOf(cond_query.type) != -1 ? [cond_query.type] : [];
- } else {
- // add another query clause
- if (options.comment)
- clauses_str.push(get_query_clause_str(cond_query));
- var clause = get_query_clause(cond_query);
- if (clause === false) return false;
- clauses.push(clause);
- }
- }
- clauses_str = clauses_str.join(' and ');
-
- // construct query
- if (options.comment)
- query_parts.push(' // query part for: “'+clauses_str+'”')
- for (var t=0; t<types.length; t++) {
- var buffer = ' '+types[t];
- for (var c=0; c<clauses.length; c++)
- buffer += clauses[c];
- if (bounds_part)
- buffer += bounds_part;
- buffer += ';';
- query_parts.push(buffer);
- }
- }
- query_parts.push(');');
-
- if (options.comment)
- query_parts.push('// print results');
- if (options.outputMode === "recursive") {
- query_parts.push('out body;');
- query_parts.push('>;');
- query_parts.push('out skel qt;');
- } else if (options.outputMode === "recursive_meta") {
- query_parts.push('(._;>;);');
- query_parts.push('out meta;');
- } else {
- query_parts.push('out ' + options.outputMode + ';');
- }
-
- return query_parts.join('\n');
-}
-
-module.exports = (function() {
- "use strict";
-
- /*
- * Generated by PEG.js 0.9.0.
- *
- * http://pegjs.org/
- */
-
- function peg$subclass(child, parent) {
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor();
- }
-
- function peg$SyntaxError(message, expected, found, location) {
- this.message = message;
- this.expected = expected;
- this.found = found;
- this.location = location;
- this.name = "SyntaxError";
-
- if (typeof Error.captureStackTrace === "function") {
- Error.captureStackTrace(this, peg$SyntaxError);
- }
- }
-
- peg$subclass(peg$SyntaxError, Error);
-
- function peg$parse(input) {
- var options = arguments.length > 1 ? arguments[1] : {},
- parser = this,
-
- peg$FAILED = {},
-
- peg$startRuleIndices = { start: 0 },
- peg$startRuleIndex = 0,
-
- peg$consts = [
- function(x) { return x },
- "in bbox",
- { type: "literal", value: "in bbox", description: "\"in bbox\"" },
- "IN BBOX",
- { type: "literal", value: "IN BBOX", description: "\"IN BBOX\"" },
- function(x) { return { bounds:"bbox", query:x } },
- "in",
- { type: "literal", value: "in", description: "\"in\"" },
- "IN",
- { type: "literal", value: "IN", description: "\"IN\"" },
- function(x, y) { return { bounds:"area", query:x, area:y } },
- "around",
- { type: "literal", value: "around", description: "\"around\"" },
- "AROUND",
- { type: "literal", value: "AROUND", description: "\"AROUND\"" },
- function(x, y) { return { bounds:"around", query:x, area:y } },
- "global",
- { type: "literal", value: "global", description: "\"global\"" },
- "GLOBAL",
- { type: "literal", value: "GLOBAL", description: "\"GLOBAL\"" },
- function(x) { return { bounds:"global", query:x } },
- "or",
- { type: "literal", value: "or", description: "\"or\"" },
- "OR",
- { type: "literal", value: "OR", description: "\"OR\"" },
- "||",
- { type: "literal", value: "||", description: "\"||\"" },
- "|",
- { type: "literal", value: "|", description: "\"|\"" },
- function(x, y) { return { logical:"or", queries:[x,y] } },
- "and",
- { type: "literal", value: "and", description: "\"and\"" },
- "AND",
- { type: "literal", value: "AND", description: "\"AND\"" },
- "&&",
- { type: "literal", value: "&&", description: "\"&&\"" },
- "&",
- { type: "literal", value: "&", description: "\"&\"" },
- function(x, y) { return { logical:"and", queries:[x,y] } },
- "(",
- { type: "literal", value: "(", description: "\"(\"" },
- ")",
- { type: "literal", value: ")", description: "\")\"" },
- function(x) { return x; },
- "=",
- { type: "literal", value: "=", description: "\"=\"" },
- "==",
- { type: "literal", value: "==", description: "\"==\"" },
- function(x, y) { return { query:"eq", key:x, val:y } },
- "!=",
- { type: "literal", value: "!=", description: "\"!=\"" },
- "<>",
- { type: "literal", value: "<>", description: "\"<>\"" },
- function(x, y) { return { query:"neq", key:x, val:y } },
- "*",
- { type: "literal", value: "*", description: "\"*\"" },
- function(x) { return { query:"key", key:x } },
- "is",
- { type: "literal", value: "is", description: "\"is\"" },
- "not",
- { type: "literal", value: "not", description: "\"not\"" },
- "null",
- { type: "literal", value: "null", description: "\"null\"" },
- "IS",
- { type: "literal", value: "IS", description: "\"IS\"" },
- "NOT",
- { type: "literal", value: "NOT", description: "\"NOT\"" },
- "NULL",
- { type: "literal", value: "NULL", description: "\"NULL\"" },
- function(x) { return { query:"nokey", key:x } },
- "~=",
- { type: "literal", value: "~=", description: "\"~=\"" },
- "~",
- { type: "literal", value: "~", description: "\"~\"" },
- "=~",
- { type: "literal", value: "=~", description: "\"=~\"" },
- function(x, y) { return { query:"like", key:x, val:y.regex?y:{regex:y} } },
- "like",
- { type: "literal", value: "like", description: "\"like\"" },
- "LIKE",
- { type: "literal", value: "LIKE", description: "\"LIKE\"" },
- function(x, y) { return { query:"likelike", key:x, val:y.regex?y:{regex:y} } },
- "!~",
- { type: "literal", value: "!~", description: "\"!~\"" },
- function(x, y) { return { query:"notlike", key:x, val:y.regex?y:{regex:y} } },
- ":",
- { type: "literal", value: ":", description: "\":\"" },
- function(x, y) { return { query:"substr", key:x, val:y } },
- "type",
- { type: "literal", value: "type", description: "\"type\"" },
- function(x) { return { query:"type", type:x } },
- "user",
- { type: "literal", value: "user", description: "\"user\"" },
- "uid",
- { type: "literal", value: "uid", description: "\"uid\"" },
- "newer",
- { type: "literal", value: "newer", description: "\"newer\"" },
- "id",
- { type: "literal", value: "id", description: "\"id\"" },
- function(x, y) { return { query:"meta", meta:x, val:y } },
- function(x) { return { query:"free form", free:x } },
- { type: "other", description: "Key" },
- /^[a-zA-Z0-9_:\-]/,
- { type: "class", value: "[a-zA-Z0-9_:-]", description: "[a-zA-Z0-9_:-]" },
- function(s) { return s.join(''); },
- "\"",
- { type: "literal", value: "\"", description: "\"\\\"\"" },
- "'",
- { type: "literal", value: "'", description: "\"'\"" },
- function(parts) {
- return parts[1];
- },
- { type: "other", description: "string" },
- /^[^'" ()~=!*\/:<>&|[\]{}#+@$%?\^.,]/,
- { type: "class", value: "[^'\" ()~=!*/:<>&|[\\]{}#+@$%?^.,]", description: "[^'\" ()~=!*/:<>&|[\\]{}#+@$%?^.,]" },
- function(chars) { return chars.join(""); },
- "\\",
- { type: "literal", value: "\\", description: "\"\\\\\"" },
- { type: "any", description: "any character" },
- function(char_) { return char_; },
- function(sequence) { return sequence; },
- /^['"\\bfnrtv]/,
- { type: "class", value: "['\"\\\\bfnrtv]", description: "['\"\\\\bfnrtv]" },
- function(char_) {
- return char_
- .replace("b", "\b")
- .replace("f", "\f")
- .replace("n", "\n")
- .replace("r", "\r")
- .replace("t", "\t")
- .replace("v", "\x0B") // IE does not recognize "\v".
- },
- "/",
- { type: "literal", value: "/", description: "\"/\"" },
- "i",
- { type: "literal", value: "i", description: "\"i\"" },
- "",
- function(parts) {
- return { regex: parts[1], modifier: parts[3] };
- },
- "\\/",
- { type: "literal", value: "\\/", description: "\"\\\\/\"" },
- function() { return "/"; },
- { type: "other", description: "whitespace" },
- /^[ \t\n\r]/,
- { type: "class", value: "[ \\t\\n\\r]", description: "[ \\t\\n\\r]" }
- ],
-
- peg$bytecode = [
- peg$decode("%;;/:#;!/1$;;/($8#: #!!)(#'#(\"'#&'#"),
- peg$decode("%;\"/Y#$;</�#*;<&&&#/C$2!\"\"6!7\".) &2#\"\"6#7$/($8#:%#!\")(#'#(\"'#&'#.\u0141 &%;\"/y#$;</�#*;<&&&#/c$2&\"\"6&7'.) &2(\"\"6(7)/H$$;</�#*;<&&&#/2$;2/)$8%:*%\"$ )(%'#($'#(#'#(\"'#&'#.\
-xDB &%;\"/y#$;</�#*;<&&&#/c$2+\"\"6+7,.) &2-\"\"6-7./H$$;</�#*;<&&&#/2$;2/)$8%:/%\"$ )(%'#($'#(#'#(\"'#&'#.u &%;\"/Y#$;</�#*;<&&&#/C$20\"\"6071.) &22\"\"6273/($8#:4#!\")(#'#(\"'#&'#./ &%;\"/' 8!:%!! )"),
- peg$decode("%;#/\x91#$;</�#*;<&&&#/{$25\"\"6576.A &27\"\"6778.5 &29\"\"697:.) &2;\"\"6;7</H$$;</�#*;<&&&#/2$;\"/)$8%:=%\"$ )(%'#($'#(#'#(\"'#&'#.# &;#"),
- peg$decode("%;$/\x91#$;</�#*;<&&&#/{$2>\"\"6>7?.A &2@\"\"6 at 7A.5 &2B\"\"6B7C.) &2D\"\"6D7E/H$$;</�#*;<&&&#/2$;#/)$8%:F%\"$ )(%'#($'#(#'#(\"'#&'#.# &;$"),
- peg$decode(";%.b &%2G\"\"6G7H/R#;;/I$;\"/@$;;/7$2I\"\"6I7J/($8%:K%!\")(%'#($'#(#'#(\"'#&'#"),
- peg$decode(";..Y &;/.S &;&.M &;'.G &;(.A &;).; &;*.5 &;+./ &;,.) &;-.# &;0"),
- peg$decode("%;1/_#;;/V$2L\"\"6L7M.) &2N\"\"6N7O/;$;;/2$;2/)$8%:P%\"$ )(%'#($'#(#'#(\"'#&'#"),
- peg$decode("%;1/_#;;/V$2Q\"\"6Q7R.) &2S\"\"6S7T/;$;;/2$;2/)$8%:U%\"$ )(%'#($'#(#'#(\"'#&'#"),
- peg$decode("%;1/d#;;/[$2L\"\"6L7M.) &2N\"\"6N7O/@$;;/7$2V\"\"6V7W/($8%:X%!$)(%'#($'#(#'#(\"'#&'#.\u010B &%;2/\u0101#$;</�#*;<&&&#/\xEB$%2Y\"\"6Y7Z/m#$;</�#*;<&&&#/W$2[\"\"6[7
-\\/H$$;</�#*;<&&&#/2$2]\"\"6]7^/#$+%)(%'#($'#(#'#(\"'#&'#.} &%2_\"\"6_7`/m#$;</�#*;<&&&#/W$2a\"\"6a7b/H$$;</�#*;<&&&#/2$2c\"\"6c7d/#$+%)(%'#($'#(#'#(\"'#&'#/($8#:X#!\")(#'#(\"'#&'#"),
- peg$decode("%;1/d#;;/[$2Q\"\"6Q7R.) &2S\"\"6S7T/@$;;/7$2V\"\"6V7W/($8%:e%!$)(%'#($'#(#'#(\"'#&'#.\xC1 &%;2/\xB7#$;</�#*;<&&&#/\xA1$%2Y
-\"\"6Y7Z/H#$;</�#*;<&&&#/2$2]\"\"6]7^/#$+#)(#'#(\"'#&'#.X &%2_\"\"6_7`/H#$;</�#*;<&&&#/2$2c\"\"6c7d/#$+#)(#'#(\"'#&'#/($8#:e#!\")(#'#(\"'#&'#"),
- peg$decode("%;1/q#;;/h$2f\"\"6f7g.5 &2h\"\"6h7i.) &2j\"\"6j7k/A$;;/8$;2.# &;8/)$8%:l%\"$ )(%'#($'#(#'#(\"'#&'#.
-\x89 &%;2/#$;</�#*;<&&&#/i$2m\"\"6m7n.) &2o\"\"6o7p/N$$;</�#*;<&&&#/8$;2.# &;8/)$8%:l%\"$ )(%'#($'#(#'#(\"'#&'#"),
- peg$decode("%2h\"\"6h7i/\x83#;;/z$;2/q$;;/h$2f\"\"6f7g.5 &2h\"\"6h7i.) &2j\"\"6j7k/A$;;/8$;2.# &;8/)$8':q'\"$ )(''#(&'#(%'#($'#(#'#(\"'#&'#"),
- peg$decode("%;1/Y#;;/P$2r\"\"6r7s/A$;;/8$;2.# &;8/)$8%:t%\"$ )(%'#($'#(#'#(\"'#&'#.\xE7 &%;2/\xDD#$;</�#*;<&&&#/\xC7$%2[\"\"6[7\\/H#$;</�#*;<&&&#/
-2$2m\"\"6m7n/#$+#)(#'#(\"'#&'#.X &%2a\"\"6a7b/H#$;</�#*;<&&&#/2$2o\"\"6o7p/#$+#)(#'#(\"'#&'#/N$$;</�#*;<&&&#/8$;2.# &;8/)$8%:t%\"$ )(%'#($'#(#'#(\"'#&'#"),
- peg$decode("%;2/S#;;/J$2u\"\"6u7v/;$;;/2$;2/)$8%:w%\"$ )(%'#($'#(#'#(\"'#&'#"),
- peg$decode("%2x\"\"6x7y/R#;;/I$2u\"\"6u7v/:$;;/1$;2/($8%:z%! )(%'#($'#(#'#(\"'#&'#"),
- peg$decode("%2{\"\"6{7|.A &2}\"\"6}7~.5 &2\"\"67\x80.) &2\x81\"\"6\x817\x82/S#;;/J$2u\"\"6u7v/;$;;/2$;2/)$8%:\x83%\"$ )(%'#($'#(#'#(\"'#&'#"),
- peg$decode("%;2/' 8!:\x84!! )"),
- peg$decode("<%$4\x86\"\"5!7\x87/,#0)*4\x86\"\"5!7\x87&&&#/' 8!:\x88!! ).\x85 &%%2\x89\"\"6\x897\x8A/;#;3/2$2\x89\"\"6
-\x897\x8A/#$+#)(#'#(\"'#&'#.K &%2\x8B\"\"6\x8B7\x8C/;#;4/2$2\x8B\"\"6\x8B7\x8C/#$+#)(#'#(\"'#&'#/' 8!:\x8D!! )=.\" 7\x85"),
- peg$decode("<%$4\x8F\"\"5!7\x90/,#0)*4\x8F\"\"5!7\x90&&&#/' 8!:\x88!! ).\x85 &%%2\x89\"\"6\x897\x8A/;#;3/2$2\x89\"\"6
-\x897\x8A/#$+#)(#'#(\"'#&'#.K &%2\x8B\"\"6\x8B7\x8C/;#;4/2$2\x8B\"\"6\x8B7\x8C/#$+#)(#'#(\"'#&'#/' 8!:\x8D!! )=.\" 7\x8E"),
- peg$decode("%$;50#*;5&/' 8!:\x91!! )"),
- peg$decode("%$;60#*;6&/' 8!:\x91!! )"),
- peg$decode("%%<2\x89\"\"6\x897\x8A.) &2\x92\"\"6\x927\x93=.##&&!&'#/6#1\"\"5!7\x94/($8\":\x95\"! )(\"'#&'#.A &%2\x92\"\"6\x927\x93/1#;7/($8\":\x96\"! )(\"'#&'#"),
- peg$decode("%%<2\x8B\"\"6\x8B7\x8C.) &2\x92\"\"6\x927\x93=.##&&!&'#/6#1\"\"5!7\x94/($8\":\x95\"! )(\"'#&'#.A &%2\x92\"\"6\x927\x93/1#;7/($8\":\x96\"! )(\"'#&'#"),
- peg$decode("%4\x97\"\"5!7\x98/' 8!:\x99!! )"),
- peg$decode("<%%2\x9A\"\"6\x9A7\x9B/U#;9/L$2\x9A\"\"6\x9A7\x9B/=$2\x9C\"\"6\x9C7\x9D.# & \x9E.\" &\"/#$+$)($'#(#'#(\"'#&'#/' 8!:\x9F!! )=.\" 7\x8E"),
- peg$decode("%$;:/�#*;:&&&#/' 8!:\x91!! )"),
- peg$decode("%%<2\x9A\"\"6\x9A7\x9B.) &2\xA0\"\"6\xA07\xA1=.##&&!&'#/6#1\"\"5!7\x94/($8\":\x95\"! )(\"'#&'#.4 &%2\xA0\"\"6\xA07\xA1/& 8!:\xA2! )"),
- peg$decode("<$;<0#*;<&=.\" 7\xA3"),
- peg$decode("<4\xA4\"\"5!7\xA5=.\" 7\xA3")
- ],
-
- peg$currPos = 0,
- peg$savedPos = 0,
- peg$posDetailsCache = [{ line: 1, column: 1, seenCR: false }],
- peg$maxFailPos = 0,
- peg$maxFailExpected = [],
- peg$silentFails = 0,
-
- peg$result;
-
- if ("startRule" in options) {
- if (!(options.startRule in peg$startRuleIndices)) {
- throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
- }
-
- peg$startRuleIndex = peg$startRuleIndices[options.startRule];
- }
-
- function text() {
- return input.substring(peg$savedPos, peg$currPos);
- }
-
- function location() {
- return peg$computeLocation(peg$savedPos, peg$currPos);
- }
-
- function expected(description) {
- throw peg$buildException(
- null,
- [{ type: "other", description: description }],
- input.substring(peg$savedPos, peg$currPos),
- peg$computeLocation(peg$savedPos, peg$currPos)
- );
- }
-
- function error(message) {
- throw peg$buildException(
- message,
- null,
- input.substring(peg$savedPos, peg$currPos),
- peg$computeLocation(peg$savedPos, peg$currPos)
- );
- }
-
- function peg$computePosDetails(pos) {
- var details = peg$posDetailsCache[pos],
- p, ch;
-
- if (details) {
- return details;
- } else {
- p = pos - 1;
- while (!peg$posDetailsCache[p]) {
- p--;
- }
-
- details = peg$posDetailsCache[p];
- details = {
- line: details.line,
- column: details.column,
- seenCR: details.seenCR
- };
-
- while (p < pos) {
- ch = input.charAt(p);
- if (ch === "\n") {
- if (!details.seenCR) { details.line++; }
- details.column = 1;
- details.seenCR = false;
- } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
- details.line++;
- details.column = 1;
- details.seenCR = true;
- } else {
- details.column++;
- details.seenCR = false;
- }
-
- p++;
- }
-
- peg$posDetailsCache[pos] = details;
- return details;
- }
- }
-
- function peg$computeLocation(startPos, endPos) {
- var startPosDetails = peg$computePosDetails(startPos),
- endPosDetails = peg$computePosDetails(endPos);
-
- return {
- start: {
- offset: startPos,
- line: startPosDetails.line,
- column: startPosDetails.column
- },
- end: {
- offset: endPos,
- line: endPosDetails.line,
- column: endPosDetails.column
- }
- };
- }
-
- function peg$fail(expected) {
- if (peg$currPos < peg$maxFailPos) { return; }
-
- if (peg$currPos > peg$maxFailPos) {
- peg$maxFailPos = peg$currPos;
- peg$maxFailExpected = [];
- }
-
- peg$maxFailExpected.push(expected);
- }
-
- function peg$buildException(message, expected, found, location) {
- function cleanupExpected(expected) {
- var i = 1;
-
- expected.sort(function(a, b) {
- if (a.description < b.description) {
- return -1;
- } else if (a.description > b.description) {
- return 1;
- } else {
- return 0;
- }
- });
-
- while (i < expected.length) {
- if (expected[i - 1] === expected[i]) {
- expected.splice(i, 1);
- } else {
- i++;
- }
- }
- }
-
- function buildMessage(expected, found) {
- function stringEscape(s) {
- function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }
-
- return s
- .replace(/\\/g, '\\\\')
- .replace(/"/g, '\\"')
- .replace(/\x08/g, '\\b')
- .replace(/\t/g, '\\t')
- .replace(/\n/g, '\\n')
- .replace(/\f/g, '\\f')
- .replace(/\r/g, '\\r')
- .replace(/[\x00-\x07\x0B\x0E\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
- .replace(/[\x10-\x1F\x80-\xFF]/g, function(ch) { return '\\x' + hex(ch); })
- .replace(/[\u0100-\u0FFF]/g, function(ch) { return '\\u0' + hex(ch); })
- .replace(/[\u1000-\uFFFF]/g, function(ch) { return '\\u' + hex(ch); });
- }
-
- var expectedDescs = new Array(expected.length),
- expectedDesc, foundDesc, i;
-
- for (i = 0; i < expected.length; i++) {
- expectedDescs[i] = expected[i].description;
- }
-
- expectedDesc = expected.length > 1
- ? expectedDescs.slice(0, -1).join(", ")
- + " or "
- + expectedDescs[expected.length - 1]
- : expectedDescs[0];
-
- foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input";
-
- return "Expected " + expectedDesc + " but " + foundDesc + " found.";
- }
-
- if (expected !== null) {
- cleanupExpected(expected);
- }
-
- return new peg$SyntaxError(
- message !== null ? message : buildMessage(expected, found),
- expected,
- found,
- location
- );
- }
-
- function peg$decode(s) {
- var bc = new Array(s.length), i;
-
- for (i = 0; i < s.length; i++) {
- bc[i] = s.charCodeAt(i) - 32;
- }
-
- return bc;
- }
-
- function peg$parseRule(index) {
- var bc = peg$bytecode[index],
- ip = 0,
- ips = [],
- end = bc.length,
- ends = [],
- stack = [],
- params, i;
-
- while (true) {
- while (ip < end) {
- switch (bc[ip]) {
- case 0:
- stack.push(peg$consts[bc[ip + 1]]);
- ip += 2;
- break;
-
- case 1:
- stack.push(void 0);
- ip++;
- break;
-
- case 2:
- stack.push(null);
- ip++;
- break;
-
- case 3:
- stack.push(peg$FAILED);
- ip++;
- break;
-
- case 4:
- stack.push([]);
- ip++;
- break;
-
- case 5:
- stack.push(peg$currPos);
- ip++;
- break;
-
- case 6:
- stack.pop();
- ip++;
- break;
-
- case 7:
- peg$currPos = stack.pop();
- ip++;
- break;
-
- case 8:
- stack.length -= bc[ip + 1];
- ip += 2;
- break;
-
- case 9:
- stack.splice(-2, 1);
- ip++;
- break;
-
- case 10:
- stack[stack.length - 2].push(stack.pop());
- ip++;
- break;
-
- case 11:
- stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1]));
- ip += 2;
- break;
-
- case 12:
- stack.push(input.substring(stack.pop(), peg$currPos));
- ip++;
- break;
-
- case 13:
- ends.push(end);
- ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]);
-
- if (stack[stack.length - 1]) {
- end = ip + 3 + bc[ip + 1];
- ip += 3;
- } else {
- end = ip + 3 + bc[ip + 1] + bc[ip + 2];
- ip += 3 + bc[ip + 1];
- }
-
- break;
-
- case 14:
- ends.push(end);
- ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]);
-
- if (stack[stack.length - 1] === peg$FAILED) {
- end = ip + 3 + bc[ip + 1];
- ip += 3;
- } else {
- end = ip + 3 + bc[ip + 1] + bc[ip + 2];
- ip += 3 + bc[ip + 1];
- }
-
- break;
-
- case 15:
- ends.push(end);
- ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]);
-
- if (stack[stack.length - 1] !== peg$FAILED) {
- end = ip + 3 + bc[ip + 1];
- ip += 3;
- } else {
- end = ip + 3 + bc[ip + 1] + bc[ip + 2];
- ip += 3 + bc[ip + 1];
- }
-
- break;
-
- case 16:
- if (stack[stack.length - 1] !== peg$FAILED) {
- ends.push(end);
- ips.push(ip);
-
- end = ip + 2 + bc[ip + 1];
- ip += 2;
- } else {
- ip += 2 + bc[ip + 1];
- }
-
- break;
-
- case 17:
- ends.push(end);
- ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]);
-
- if (input.length > peg$currPos) {
- end = ip + 3 + bc[ip + 1];
- ip += 3;
- } else {
- end = ip + 3 + bc[ip + 1] + bc[ip + 2];
- ip += 3 + bc[ip + 1];
- }
-
- break;
-
- case 18:
- ends.push(end);
- ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]);
-
- if (input.substr(peg$currPos, peg$consts[bc[ip + 1]].length) === peg$consts[bc[ip + 1]]) {
- end = ip + 4 + bc[ip + 2];
- ip += 4;
- } else {
- end = ip + 4 + bc[ip + 2] + bc[ip + 3];
- ip += 4 + bc[ip + 2];
- }
-
- break;
-
- case 19:
- ends.push(end);
- ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]);
-
- if (input.substr(peg$currPos, peg$consts[bc[ip + 1]].length).toLowerCase() === peg$consts[bc[ip + 1]]) {
- end = ip + 4 + bc[ip + 2];
- ip += 4;
- } else {
- end = ip + 4 + bc[ip + 2] + bc[ip + 3];
- ip += 4 + bc[ip + 2];
- }
-
- break;
-
- case 20:
- ends.push(end);
- ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]);
-
- if (peg$consts[bc[ip + 1]].test(input.charAt(peg$currPos))) {
- end = ip + 4 + bc[ip + 2];
- ip += 4;
- } else {
- end = ip + 4 + bc[ip + 2] + bc[ip + 3];
- ip += 4 + bc[ip + 2];
- }
-
- break;
-
- case 21:
- stack.push(input.substr(peg$currPos, bc[ip + 1]));
- peg$currPos += bc[ip + 1];
- ip += 2;
- break;
-
- case 22:
- stack.push(peg$consts[bc[ip + 1]]);
- peg$currPos += peg$consts[bc[ip + 1]].length;
- ip += 2;
- break;
-
- case 23:
- stack.push(peg$FAILED);
- if (peg$silentFails === 0) {
- peg$fail(peg$consts[bc[ip + 1]]);
- }
- ip += 2;
- break;
-
- case 24:
- peg$savedPos = stack[stack.length - 1 - bc[ip + 1]];
- ip += 2;
- break;
-
- case 25:
- peg$savedPos = peg$currPos;
- ip++;
- break;
-
- case 26:
- params = bc.slice(ip + 4, ip + 4 + bc[ip + 3]);
- for (i = 0; i < bc[ip + 3]; i++) {
- params[i] = stack[stack.length - 1 - params[i]];
- }
-
- stack.splice(
- stack.length - bc[ip + 2],
- bc[ip + 2],
- peg$consts[bc[ip + 1]].apply(null, params)
- );
-
- ip += 4 + bc[ip + 3];
- break;
-
- case 27:
- stack.push(peg$parseRule(bc[ip + 1]));
- ip += 2;
- break;
-
- case 28:
- peg$silentFails++;
- ip++;
- break;
-
- case 29:
- peg$silentFails--;
- ip++;
- break;
-
- default:
- throw new Error("Invalid opcode: " + bc[ip] + ".");
- }
- }
-
- if (ends.length > 0) {
- end = ends.pop();
- ip = ips.pop();
- } else {
- break;
- }
- }
-
- return stack[0];
- }
-
- peg$result = peg$parseRule(peg$startRuleIndex);
-
- if (peg$result !== peg$FAILED && peg$currPos === input.length) {
- return peg$result;
- } else {
- if (peg$result !== peg$FAILED && peg$currPos < input.length) {
- peg$fail({ type: "end", description: "end of input" });
- }
-
- throw peg$buildException(
- null,
- peg$maxFailExpected,
- peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
- peg$maxFailPos < input.length
- ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
- : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
- );
- }
- }
-
- return {
- SyntaxError: peg$SyntaxError,
- parse: peg$parse
- };
-})();
-
- // ffs/wizard module
-module.exports = function(presets) {
- var freeFormQuery = {};
- if (!presets) presets = {};
-
- if (!presets) {
- // browser: try to use jQuery to load presets now
- if (typeof $ === "undefined") return false;
- var presets_file = "data/iD_presets.json";
- try {
- $.ajax(presets_file,{async:false,dataType:"json"}).success(function(data){
- presets = data;
- }).error(function(){
- throw new Error();
- });
- } catch(e) {
- console.error("failed to load presets file", presets_file, e);
- }
- }
- Object.keys(presets).map(function(key) {
- var preset = presets[key];
- preset.nameCased = preset.name;
- preset.name = preset.name.toLowerCase();
- preset.terms = !preset.terms ? [] : preset.terms.map(function(term) {return term.toLowerCase();});
- });
- // load preset translations
- (function loadPresetTranslations() {
- // node: use external preset supplier? // todo
- // browser: use jQuery
- if (typeof $ === "undefined" || typeof i18n === "undefined") return;
- var language = i18n.getLanguage();
- if (language == "en") return;
- var translation_file = "data/iD_presets_"+language+".json";
- try {
- $.ajax(translation_file,{async:false,dataType:"json"}).success(function(data){
- // load translated names and terms into presets object
- Object.keys(data).map(function(preset) {
- var translation = data[preset];
- preset = presets[preset];
- preset.translated = true;
- // save original preset name under alternative terms
- var oriPresetName = preset.name;
- // save translated preset name
- preset.nameCased = translation.name;
- preset.name = translation.name.toLowerCase();
- // add new terms
- if (translation.terms)
- preset.terms = translation.terms.split(",")
- .map(function(term) { return term.trim().toLowerCase(); })
- .concat(preset.terms);
- // add this to the front to allow exact (english) preset names to match before terms
- preset.terms.unshift(oriPresetName);
- });
- }).error(function(){
- throw new Error();
- });
- } catch(e) {
- console.error("failed to load preset translations file: "+translation_file);
- }
- })();
-
- freeFormQuery.get_query_clause = function(condition) {
- // search presets for ffs term
- var search = condition.free.toLowerCase();
- var candidates = Object.keys(presets).map(function(key) {
- return presets[key];
- }).filter(function(preset) {
- if (preset.searchable===false) return false;
- if (preset.name === search) return true;
- preset._termsIndex = preset.terms.indexOf(search);
- return preset._termsIndex != -1;
- });
- if (candidates.length === 0)
- return false;
- // sort candidates
- candidates.sort(function(a,b) {
- // prefer exact name matches
- if (a.name === search) return -1;
- if (b.name === search) return 1;
- return a._termsIndex - b._termsIndex;
- });
- var preset = candidates[0];
- var types = [];
- preset.geometry.forEach(function(g) {
- switch (g) {
- case "point":
- case "vertex":
- types.push("node");
- break;
- case "line":
- types.push("way");
- break;
- case "area":
- types.push("way");
- types.push("relation"); // todo: additionally add type=multipolygon?
- break;
- case "relation":
- types.push("relation");
- break;
- default:
- console.error("unknown geometry type "+g+" of preset "+preset.name);
- }
- });
- function onlyUnique(value, index, self) {
- return self.indexOf(value) === index;
- }
- return {
- types: types.filter(onlyUnique),
- conditions: Object.keys(preset.tags).map(function(k) {
- var v = preset.tags[k];
- return {
- query: v==="*" ? "key" : "eq",
- key: k,
- val: v
- };
- })
- };
- }
-
- freeFormQuery.fuzzy_search = function(condition) {
- // search presets for ffs term
- var search = condition.free.toLowerCase();
- // fuzzyness: max lev.dist allowed to still match
- var fuzzyness = 2+Math.floor(search.length/7);
- function fuzzyMatch(term) {
- return levenshteinDistance(term, search) <= fuzzyness;
- }
- var candidates = Object.keys(presets).map(function(key) {
- return presets[key];
- }).filter(function(preset) {
- if (preset.searchable===false) return false;
- if (fuzzyMatch(preset.name)) return true;
- return preset.terms.some(fuzzyMatch);
- });
- if (candidates.length === 0)
- return false;
- // sort candidates
- function preset_weight(preset) {
- return [preset.name].concat(preset.terms).map(function(term, index) {
- return levenshteinDistance(term,search);
- }).reduce(function min(a, b) {
- return a <= b ? a : b;
- });
- };
- candidates.sort(function(a,b) {
- return preset_weight(a) - preset_weight(b);
- });
- var preset = candidates[0];
- return preset.nameCased;
- }
-
-
- return freeFormQuery;
-};
-
-/*
- * partial implementation of overpass turbo extended query syntax
- * (http://wiki.openstreetmap.org/wiki/Overpass_turbo/Extended_Overpass_Queries)
- */
-
-var Promise = require('promise'),
- request = require('request-promise');
-
-// converts relative time to ISO time string
-function relativeTime(instr, callback) {
- var now = Date.now();
- // very basic differential date
- instr = instr.toLowerCase().match(/(-?[0-9]+) ?(seconds?|minutes?|hours?|days?|weeks?|months?|years?)?/);
- if (instr === null) {
- return Promise.reject(new Error('unable to expand date shortcut.'));
- }
- var count = parseInt(instr[1]);
- var interval;
- switch (instr[2]) {
- case "second":
- case "seconds":
- interval=1; break;
- case "minute":
- case "minutes":
- interval=60; break;
- case "hour":
- case "hours":
- interval=3600; break;
- case "day":
- case "days":
- default:
- interval=86400; break;
- case "week":
- case "weeks":
- interval=604800; break;
- case "month":
- case "months":
- interval=2628000; break;
- case "year":
- case "years":
- interval=31536000; break;
- }
- var date = now - count*interval*1000;
- return Promise.resolve((new Date(date)).toISOString());
-}
-
-// Promise wrapper for browser XMLHttpRequest
-// from http://www.html5rocks.com/en/tutorials/es6/promises/
-function get(url) {
- return new Promise(function(resolve, reject) {
- var req = new XMLHttpRequest();
- req.open('GET', url);
-
- req.onload = function() {
- if (req.status == 200) {
- resolve(req.response);
- }
- else {
- reject(Error("XMLHttpRequest Error: "+req.statusText));
- }
- };
- req.onerror = function() {
- reject(Error("Network Error"));
- };
- req.send();
- });
-}
-// helper function to query nominatim for best fitting result
-function nominatimRequest(search,filter) {
- var requestUrl = "https://nominatim.openstreetmap.org/search?format=json&q="+encodeURIComponent(search);
- var _request;
- if (typeof XMLHttpRequest !== "undefined") {
- // browser
- _request = get(requestUrl).then(JSON.parse);
- } else {
- // node
- _request = request({
- url: requestUrl,
- method: "GET",
- headers: {"User-Agent": "overpass-wizard"},
- json: true
- });
- }
- return _request.then(function(data) {
- if (filter)
- data = data.filter(filter);
- if (data.length === 0)
- return Promise.reject(new Error("No result found for geocoding search: "+search));
- else
- return data[0];
- });
-}
-
-// geocoding shortcuts
-function geocodeArea(instr) {
- function filter(n) {
- return n.osm_type && n.osm_id && n.osm_type!=="node";
- }
- return nominatimRequest(instr,filter).then(function(res) {
- var area_ref = 1*res.osm_id;
- if (res.osm_type == "way")
- area_ref += 2400000000;
- if (res.osm_type == "relation")
- area_ref += 3600000000;
- res = "area("+area_ref+")";
- return res;
- });
-}
-function geocodeCoords(instr) {
- return nominatimRequest(instr).then(function(res) {
- res = res.lat+','+res.lon;
- return res;
- });
-}
-
-var expansions = {
- date: relativeTime,
- geocodeArea: geocodeArea,
- geocodeCoords: geocodeCoords
-};
-
-module.exports = function(overpassQuery, bbox, callback) {
- // 1. bbox
- if (bbox) overpassQuery = overpassQuery.replace(/{{bbox}}/g, bbox);
- // 2. constants
- var constantRegexp = "{{([a-zA-Z0-9_]+)=(.+?)}}";
- var constants = overpassQuery.match(new RegExp(constantRegexp, 'g')) || [];
- constants.forEach(function(constant) {
- var constantDefinition = constant.match(new RegExp(constantRegexp)),
- constantShortcut = "{{"+constantDefinition[1]+"}}",
- constantValue = constantDefinition[2];
- while (overpassQuery.indexOf(constantShortcut) >= 0) {
- overpassQuery = overpassQuery.replace(constantShortcut, constantValue);
- }
- });
- // 3. shortcuts
- var shortcutRegexp = "{{(date|geocodeArea|geocodeCoords):([\\s\\S]*?)}}";
- var shortcuts = overpassQuery.match(new RegExp(shortcutRegexp, 'g')) || [];
- return Promise.all(shortcuts.map(function(shortcut) {
- shortcut = shortcut.match(new RegExp(shortcutRegexp));
- return expansions[shortcut[1]](shortcut[2]);
- })).then(function(expansions) {
- expansions.forEach(function(expansion, index) {
- overpassQuery = overpassQuery.replace(shortcuts[index], expansion);
- });
- return overpassQuery;
- }).then(function(overpassQuery) {
- callback(undefined, overpassQuery)
- }).catch(function(err) {
- callback(err);
- });
-};
View it on GitLab: https://salsa.debian.org/debian-gis-team/josm/-/commit/82bef25a93d7bd14060af1b06e0a977e21dcf0c2
--
View it on GitLab: https://salsa.debian.org/debian-gis-team/josm/-/commit/82bef25a93d7bd14060af1b06e0a977e21dcf0c2
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20200827/f1a53466/attachment-0001.html>
More information about the Pkg-grass-devel
mailing list