diff --git a/build.js b/build.js index 2573558c6..5d1332aeb 100644 --- a/build.js +++ b/build.js @@ -137,11 +137,6 @@ function suggestionsToPresets(presets) { function generatePresets() { var presets = {}; - // A closed way is considered to be an area if it has a tag with one - // of the following keys, and the value is _not_ one of the associated - // values for the respective key. - var areaKeys = {}; - glob.sync(__dirname + '/data/presets/presets/**/*.json').forEach(function(file) { var preset = read(file), id = file.match(/presets\/presets\/([^.]*)\.json/)[1]; @@ -152,18 +147,6 @@ function generatePresets() { name: preset.name, terms: (preset.terms || []).join(',') }; - - for (var key in preset.tags) break; - var value = preset.tags[key]; - - if (['highway', 'footway', 'railway', 'type'].indexOf(key) === -1) { - if (preset.geometry.indexOf('area') >= 0) { - areaKeys[key] = areaKeys[key] || {}; - } else if (key in areaKeys && value !== '*') { - areaKeys[key][value] = true; - } - } - presets[id] = preset; }); @@ -176,7 +159,6 @@ function generatePresets() { return { presets: presets, - areaKeys: areaKeys, presetsYaml: presetsYaml }; } @@ -221,7 +203,6 @@ validatePresetFields(presets.presets, fields); fs.writeFileSync('data/presets/categories.json', stringify(categories)); fs.writeFileSync('data/presets/fields.json', stringify(fields)); fs.writeFileSync('data/presets/presets.json', stringify(presets.presets)); -fs.writeFileSync('js/id/core/area_keys.js', '/* jshint -W109 */\niD.areaKeys = ' + stringify(presets.areaKeys) + ';'); fs.writeFileSync('data/presets.yaml', YAML.dump({en: {presets: presets.presetsYaml}})); // Write taginfo data diff --git a/index.html b/index.html index de6a75035..ded7dcabf 100644 --- a/index.html +++ b/index.html @@ -212,7 +212,6 @@ - diff --git a/js/id/core/area_keys.js b/js/id/core/area_keys.js deleted file mode 100644 index 2d4ddabd0..000000000 --- a/js/id/core/area_keys.js +++ /dev/null @@ -1,92 +0,0 @@ -/* jshint -W109 */ -iD.areaKeys = { - "aeroway": { - "gate": true, - "taxiway": true - }, - "amenity": { - "atm": true, - "bbq": true, - "bench": true, - "bureau_de_change": true, - "clock": true, - "drinking_water": true, - "parking_entrance": true, - "post_box": true, - "telephone": true, - "vending_machine": true, - "waste_basket": true - }, - "area": {}, - "barrier": { - "block": true, - "bollard": true, - "cattle_grid": true, - "cycle_barrier": true, - "entrance": true, - "fence": true, - "gate": true, - "kissing_gate": true, - "lift_gate": true, - "stile": true, - "toll_booth": true - }, - "building": { - "entrance": true - }, - "craft": {}, - "emergency": { - "fire_hydrant": true, - "phone": true - }, - "golf": { - "hole": true - }, - "historic": { - "boundary_stone": true - }, - "landuse": {}, - "leisure": { - "picnic_table": true, - "track": true, - "slipway": true - }, - "man_made": { - "cutline": true, - "embankment": true, - "flagpole": true, - "pipeline": true, - "survey_point": true - }, - "military": {}, - "natural": { - "coastline": true, - "peak": true, - "spring": true, - "tree": true - }, - "office": {}, - "piste:type": {}, - "place": {}, - "power": { - "line": true, - "minor_line": true, - "pole": true, - "tower": true - }, - "public_transport": { - "stop_position": true - }, - "shop": {}, - "tourism": { - "viewpoint": true - }, - "waterway": { - "canal": true, - "ditch": true, - "drain": true, - "river": true, - "stream": true, - "weir": true - } -}; \ No newline at end of file diff --git a/js/id/id.js b/js/id/id.js index 59f7f77c0..3d1a05788 100644 --- a/js/id/id.js +++ b/js/id/id.js @@ -227,6 +227,7 @@ window.iD = function () { context.presets = function(_) { if (!arguments.length) return presets; presets.load(_); + iD.areaKeys = presets.areaKeys(); return context; }; diff --git a/js/id/presets.js b/js/id/presets.js index b9b318ea1..14462d996 100644 --- a/js/id/presets.js +++ b/js/id/presets.js @@ -40,6 +40,32 @@ iD.presets = function() { return match || all.item(geometry); }; + all.areaKeys = function() { + + // A closed way is considered to be an area if it has a tag with one + // of the following keys, and the value is _not_ one of the associated + // values for the respective key. + + var areaKeys = {}; + + all.collection.forEach(function(d) { + if (d.tags) { + for (var key in d.tags) break; + var value = d.tags[key]; + + if (['highway', 'footway', 'railway', 'type'].indexOf(key) === -1) { + if (d.geometry.indexOf('area') >= 0) { + areaKeys[key] = areaKeys[key] || {}; + } else if (key in areaKeys && value !== '*') { + areaKeys[key][value] = true; + } + } + } + }); + + return areaKeys; + }; + all.load = function(d) { if (d.fields) { diff --git a/test/index.html b/test/index.html index 81cc2ae67..1c473fdc4 100644 --- a/test/index.html +++ b/test/index.html @@ -190,7 +190,6 @@ - diff --git a/test/spec/actions/split.js b/test/spec/actions/split.js index 8d1535379..84a2a85f4 100644 --- a/test/spec/actions/split.js +++ b/test/spec/actions/split.js @@ -1,4 +1,9 @@ describe("iD.actions.Split", function () { + + beforeEach(function () { + iD.areaKeys = iD().presets(iD.data.presets).presets().areaKeys(); + }); + describe("#disabled", function () { it("returns falsy for a non-end node of a single way", function () { var graph = iD.Graph([ diff --git a/test/spec/presets.js b/test/spec/presets.js index c72982d42..01eb21a89 100644 --- a/test/spec/presets.js +++ b/test/spec/presets.js @@ -40,6 +40,33 @@ describe("iD.presets", function() { }); }); + describe("#areaKeys", function() { + var presets = iD.presets().load({ + presets: { + a: { + tags: { + a: '*' + }, + geometry: ['point', 'line', 'area'] + }, + ab: { + tags: { + a: 'b' + }, + geometry: ['line'] + } + } + }); + + it("whitelists keys from presets with area geometry", function() { + expect(presets.areaKeys()).to.have.key('a'); + }); + + it("blacklists key-values from presets without an area geometry", function() { + expect(presets.areaKeys().a.b).to.eq(true); + }); + }); + describe("expected matches", function() { var presets;