diff --git a/css/80_app.css b/css/80_app.css index 81f46f468..206e48218 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -2572,7 +2572,7 @@ input.key-trap { .kr_error_type_41, .kr_error_type_42, .kr_error_type_43 { - color: #894668; + color: #fd007f; } .kr_error_type_50 { @@ -2618,7 +2618,7 @@ input.key-trap { } .kr_error_type_180 { - color: #09ef12; + color: #01ff0a; } .kr_error_type_190, @@ -2642,7 +2642,7 @@ input.key-trap { .kr_error_type_206, .kr_error_type_207, .kr_error_type_208 { - color: #71f264; + color: #fdbf6f; } .kr_error_type_210, @@ -2659,7 +2659,7 @@ input.key-trap { .kr_error_type_230, .kr_error_type_231, .kr_error_type_232 { - color: #5f775c; + color: #b15928; } .kr_error_type_270 { @@ -2684,7 +2684,7 @@ input.key-trap { .kr_error_type_296, .kr_error_type_297, .kr_error_type_298 { - color: #d1dce7; + color: #a6cee3; } .kr_error_type_310, @@ -2699,7 +2699,7 @@ input.key-trap { } .kr_error_type_350 { - color: #4d719c; + color: #ffff99; } .kr_error_type_370 { @@ -2713,7 +2713,7 @@ input.key-trap { .kr_error_type_400, .kr_error_type_401, .kr_error_type_402 { - color: #b20e36; + color: #b64f69; } .kr_error_type_410, diff --git a/data/core.yaml b/data/core.yaml index 0e4416504..63f48dfe9 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -1163,7 +1163,7 @@ en: description: 'This bridge doesn''t have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: {var1}.' _370: title: 'doubled places' - description: 'This node has tags in common with the surrounding way #{var1} {var2}and seems to be redundant' + description: 'This node has tags in common with the surrounding way #{var1} {var2}and seems to be redundant.' _380: title: 'non-physical use of sport-tag' description: 'This way is tagged "sport"="{var1}" but has no physical tag like e.g. leisure, building, amenity or highway.' @@ -1173,6 +1173,7 @@ en: _401: title: 'missing turn restriction' description: 'ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning from way {var3} to {var4}.' + addition: ' from way {var3} to {var4}.' _402: title: 'impossible angles' description: 'this way bends in a very sharp angle here.' diff --git a/dist/locales/en.json b/dist/locales/en.json index 9a7e04efb..fcae6ba4b 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1440,7 +1440,7 @@ }, "_370": { "title": "doubled places", - "description": "This node has tags in common with the surrounding way #{var1} {var2}and seems to be redundant" + "description": "This node has tags in common with the surrounding way #{var1} {var2}and seems to be redundant." }, "_380": { "title": "non-physical use of sport-tag", @@ -1452,7 +1452,8 @@ }, "_401": { "title": "missing turn restriction", - "description": "ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning from way {var3} to {var4}." + "description": "ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning from way {var3} to {var4}.", + "addition": " from way {var3} to {var4}." }, "_402": { "title": "impossible angles", diff --git a/modules/services/keepRight.js b/modules/services/keepRight.js index 2889c8ec5..76f799fd9 100644 --- a/modules/services/keepRight.js +++ b/modules/services/keepRight.js @@ -8,7 +8,7 @@ import rbush from 'rbush'; import { dispatch as d3_dispatch } from 'd3-dispatch'; import { request as d3_request } from 'd3-request'; -import { geoExtent } from '../geo'; +import { geoExtent, geoVecAdd } from '../geo'; import { krError } from '../osm'; @@ -158,6 +158,19 @@ export default { var features = data.features.map(function(feature) { var loc = feature.geometry.coordinates; var props = feature.properties; + + // TODO: finish implementing overlapping error offset + // // if errors are coincident, move them apart slightly + // var coincident = false; + // var epsilon = 0.00001; + // do { + // if (coincident) { + // loc = geoVecAdd(loc, [epsilon, epsilon]); + // } + // var bbox = geoExtent(loc).bbox(); + // coincident = cache.rtree.search(bbox).length; + // } while (coincident); + var d = new krError ({ loc: loc, id: props.error_id, diff --git a/modules/util/keepRight/errorSchema.json b/modules/util/keepRight/errorSchema.json index 11c008312..447a37037 100644 --- a/modules/util/keepRight/errorSchema.json +++ b/modules/util/keepRight/errorSchema.json @@ -217,7 +217,7 @@ }, "_220": { "title": "misspelled tags", - "description": "This (node|way|relation) is tagged '([\\w:]+)=(.+)' where "(\\2|\\3)" looks like "([\\w\\s]+)"", + "description": "This (node|way|relation) is tagged '([\\w]+)(:([\\w]+))?=(.+)' where "(\\2|\\3|\\4|\\5)" looks like "([\\w\\s]+)"", "regex": true }, "_221": { @@ -340,7 +340,7 @@ }, "_320": { "title": "*_link connections", - "description": "This way is tagged as highway=(\\w+)_link but doesn''t have a connection to any other \\1 or \\1_link", + "description": "This way is tagged as highway=(\\w+)_link but doesn't have a connection to any other \\1 or \\1_link", "regex": true }, "_350": { @@ -362,11 +362,11 @@ }, "_400": { "title": "geometry glitches", - "description": "Impossible sharp angles on highways and junctions. These may be caused by missing turn restrictions on junctions or glitches along the linestring of ways" + "description": "" }, "_401": { "title": "missing turn restriction", - "description": "ways (\\d+) and (\\d+) join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning from way (\\1|\\2) to (\\1|\\2)", + "description": "ways (\\d+) and (\\d+) join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning( from way (\\1|\\2) to (\\1|\\2))?", "IDs": ["w", "w", "w", "w"], "regex": true }, diff --git a/modules/util/keepRight/index.js b/modules/util/keepRight/index.js index 8bd2ca9a6..0f95dc9a7 100644 --- a/modules/util/keepRight/index.js +++ b/modules/util/keepRight/index.js @@ -1,2 +1,3 @@ -export { parseErrorDescriptions, clickLink } from './keepRight_error'; -export { errorTypes } from './errorSchema.json'; \ No newline at end of file +export { errorTypes } from './errorSchema.json'; +export { parseError } from './parse_error'; +export { parseErrorDescriptions, clickLink } from './keepRight_error'; \ No newline at end of file diff --git a/modules/util/keepRight/keepRight_error.js b/modules/util/keepRight/keepRight_error.js index 7074db963..f74a49ae1 100644 --- a/modules/util/keepRight/keepRight_error.js +++ b/modules/util/keepRight/keepRight_error.js @@ -4,8 +4,9 @@ import { t } from '../locale'; import { krError } from '../../osm'; import { errorTypes } from './errorSchema.json'; +import { parseError } from './parse_error'; -// TODO: remove these objects, here for reference +// TODO: for reference; remove var keepRightSchema = { 'schema': '', 'id': 0, @@ -38,7 +39,7 @@ var keepRightSchema = { 'txt4': '', 'txt5': '' }; - +// TODO: for reference; remove var keepRightSchemaFromWeb = { 'error_type': '192', 'object_type': 'way', @@ -69,92 +70,6 @@ export function parseErrorDescriptions(entity) { var errorRegex; var errorMatch; - function fillPlaceholder(d) { return '' + d + ''; } - - // arbitrary node list of form: #ID, #ID, #ID... - function parseError211(list) { - var newList = []; - var items = list.split(', '); - - items.forEach(function(item) { - // ID has # at the front - var id = fillPlaceholder('n' + item.slice(1)); - newList.push(id); - }); - - return newList.join(', '); - } - - // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)... - function parseError231(list) { - var newList = []; - var items = list.split(','); - - items.forEach(function(item) { - var id; - var layer; - - // item of form "#ID(layer)" - item = item.split('('); - - // ID has # at the front - id = item[0].slice(1); - id = fillPlaceholder('w' + id); - - // layer has trailing ) - layer = item[1].slice(0,-1); - - // TODO: translation - newList.push(id + ' (layer: ' + layer + ')'); - }); - - return newList.join(', '); - } - - // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID... - function parseError294(list) { - var newList = []; - var items = list.split(','); - - items.forEach(function(item) { - var role; - var idType; - var id; - - // item of form "from/to node/relation #ID" - item = item.split(' '); - - // to/from role is more clear in quotes - role = '"' + item[0] + '"'; - - // first letter of node/relation provides the type - idType = item[1].slice(0,1); - - // ID has # at the front - id = item[2].slice(1); - id = fillPlaceholder(idType + id); - - item = [role, item[1], id].join(' '); - newList.push(item); - }); - - return newList.join(', '); - } - - // arbitrary node list of form: #ID,#ID,#ID... - function parseWarning20(list) { - var newList = []; - var items = list.split(','); - - items.forEach(function(item) { - // ID has # at the front - var id = fillPlaceholder('n' + item.slice(1)); - newList.push(id); - }); - - return newList.join(', '); - } - if (!(entity instanceof krError)) return; // find the matching template from the error schema @@ -183,27 +98,8 @@ export function parseErrorDescriptions(entity) { // link IDs if present in the group idType = 'IDs' in errorTemplate ? errorTemplate.IDs[index-1] : ''; - if (idType) { - switch (idType) { - // simple case just needs a linking span - case 'n': - case 'w': - case 'r': - group = fillPlaceholder(idType + group); - break; - // some errors have more complex ID lists/variance - case '211': - group = parseError211(group); - break; - case '231': - group = parseError231(group); - break; - case '294': - group = parseError294(group); - break; - case '20': - group = parseWarning20(group); - } + if (idType && group) { + group = parseError(group, idType); } else if (html_re.test(group)) { // escape any html in non-IDs group = '\\' + group + '\\'; diff --git a/modules/util/keepRight/parse_error.js b/modules/util/keepRight/parse_error.js new file mode 100644 index 000000000..37eed18dc --- /dev/null +++ b/modules/util/keepRight/parse_error.js @@ -0,0 +1,113 @@ +export function parseError(group, idType) { + + function fillPlaceholder(d) { return '' + d + ''; } + + // arbitrary node list of form: #ID, #ID, #ID... + function parseError211(list) { + var newList = []; + var items = list.split(', '); + + items.forEach(function(item) { + // ID has # at the front + var id = fillPlaceholder('n' + item.slice(1)); + newList.push(id); + }); + + return newList.join(', '); + } + + // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)... + function parseError231(list) { + var newList = []; + var items = list.split(','); + + items.forEach(function(item) { + var id; + var layer; + + // item of form "#ID(layer)" + item = item.split('('); + + // ID has # at the front + id = item[0].slice(1); + id = fillPlaceholder('w' + id); + + // layer has trailing ) + layer = item[1].slice(0,-1); + + // TODO: translation + newList.push(id + ' (layer: ' + layer + ')'); + }); + + return newList.join(', '); + } + + // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID... + function parseError294(list) { + var newList = []; + var items = list.split(','); + + items.forEach(function(item) { + var role; + var idType; + var id; + + // item of form "from/to node/relation #ID" + item = item.split(' '); + + // to/from role is more clear in quotes + role = '"' + item[0] + '"'; + + // first letter of node/relation provides the type + idType = item[1].slice(0,1); + + // ID has # at the front + id = item[2].slice(1); + id = fillPlaceholder(idType + id); + + item = [role, item[1], id].join(' '); + newList.push(item); + }); + + return newList.join(', '); + } + + // TODO: Handle error 401 template addition + + // arbitrary node list of form: #ID,#ID,#ID... + function parseWarning20(list) { + var newList = []; + var items = list.split(','); + + items.forEach(function(item) { + // ID has # at the front + var id = fillPlaceholder('n' + item.slice(1)); + newList.push(id); + }); + + return newList.join(', '); + } + + switch (idType) { + // simple case just needs a linking span + case 'n': + case 'w': + case 'r': + group = fillPlaceholder(idType + group); + break; + // some errors have more complex ID lists/variance + case '211': + group = parseError211(group); + break; + case '231': + group = parseError231(group); + break; + case '294': + group = parseError294(group); + break; + case '20': + group = parseWarning20(group); + } + + return group; +} \ No newline at end of file