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;