import _clone from 'lodash-es/clone'; import _keys from 'lodash-es/keys'; import _omit from 'lodash-es/omit'; import { t } from '../util/locale'; import { areaKeys } from '../core/context'; export function presetPreset(id, preset, fields) { preset = _clone(preset); preset.id = id; preset.fields = (preset.fields || []).map(getFields); preset.geometry = (preset.geometry || []); function getFields(f) { return fields[f]; } preset.matchGeometry = function(geometry) { return preset.geometry.indexOf(geometry) >= 0; }; preset.originalScore = preset.matchScore || 1; preset.matchScore = function(entity) { var tags = preset.tags, score = 0; for (var t in tags) { if (entity.tags[t] === tags[t]) { score += preset.originalScore; } else if (tags[t] === '*' && t in entity.tags) { score += preset.originalScore / 2; } else { return -1; } } return score; }; preset.t = function(scope, options) { return t('presets.presets.' + id + '.' + scope, options); }; var origName = preset.name || ''; preset.name = function() { if (preset.suggestion) { id = id.split('/'); id = id[0] + '/' + id[1]; return origName + ' - ' + t('presets.presets.' + id + '.name'); } return preset.t('name', { 'default': origName }); }; var origTerms = (preset.terms || []).join(); preset.terms = function() { return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/); }; preset.isFallback = function() { var tagCount = Object.keys(preset.tags).length; return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area')); }; var reference = preset.reference || {}; preset.reference = function(geometry) { var key = reference.key || Object.keys(_omit(preset.tags, 'name'))[0], value = reference.value || preset.tags[key]; if (geometry === 'relation' && key === 'type') { if (value in preset.tags) { key = value; value = preset.tags[key]; } else { return { rtype: value }; } } if (value === '*') { return { key: key }; } else { return { key: key, value: value }; } }; var removeTags = preset.removeTags || preset.tags || {}; preset.removeTags = function(tags, geometry) { tags = _omit(tags, _keys(removeTags)); for (var f in preset.fields) { var field = preset.fields[f]; if (field.matchGeometry(geometry) && field.default === tags[field.key]) { delete tags[field.key]; } } delete tags.area; return tags; }; var applyTags = preset.addTags || preset.tags || {}; preset.applyTags = function(tags, geometry) { var k; tags = _clone(tags); for (k in applyTags) { if (applyTags[k] === '*') { tags[k] = 'yes'; } else { tags[k] = applyTags[k]; } } // Add area=yes if necessary. // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of: // 1. chosen preset could be either an area or a line (`barrier=city_wall`) // 2. chosen preset doesn't have a key in areaKeys (`railway=station`) if (!applyTags.hasOwnProperty('area')) { delete tags.area; if (geometry === 'area') { var needsAreaTag = true; if (preset.geometry.indexOf('line') === -1) { for (k in applyTags) { if (k in areaKeys) { needsAreaTag = false; break; } } } if (needsAreaTag) { tags.area = 'yes'; } } } for (var f in preset.fields) { var field = preset.fields[f]; if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) { tags[field.key] = field.default; } } return tags; }; return preset; }