Moved area-keys to data, and process it during runtime

This commit is contained in:
Sajjad Anwar
2014-10-22 18:24:09 -04:00
committed by John Firebaugh
parent 90b0f1c5bf
commit dffeedffc9
8 changed files with 59 additions and 113 deletions

View File

@@ -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

View File

@@ -212,7 +212,6 @@
<script src='js/id/core/relation.js'></script>
<script src='js/id/core/way.js'></script>
<script src='js/id/core/tree.js'></script>
<script src='js/id/core/area_keys.js'></script>
<script src='js/id/core/oneway_tags.js'></script>
<script src='js/id/presets.js'></script>

View File

@@ -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
}
};

View File

@@ -227,6 +227,7 @@ window.iD = function () {
context.presets = function(_) {
if (!arguments.length) return presets;
presets.load(_);
iD.areaKeys = presets.areaKeys();
return context;
};

View File

@@ -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) {

View File

@@ -190,7 +190,6 @@
<script src='../js/id/core/relation.js'></script>
<script src='../js/id/core/way.js'></script>
<script src='../js/id/core/tree.js'></script>
<script src='../js/id/core/area_keys.js'></script>
<script src='../js/id/core/oneway_tags.js'></script>
<script src='../js/id/presets.js'></script>

View File

@@ -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([

View File

@@ -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;