Files
iD/modules/presets/category.js
2022-06-24 19:11:00 +02:00

66 lines
2.0 KiB
JavaScript

import { t } from '../core/localizer';
import { presetCollection } from './collection';
//
// `presetCategory` builds a `presetCollection` of member presets,
// decorated with some extra methods for searching and matching geometry
//
export function presetCategory(categoryID, category, allPresets) {
let _this = Object.assign({}, category); // shallow copy
let _searchName; // cache
let _searchNameStripped; // cache
_this.id = categoryID;
_this.members = presetCollection(
(category.members || []).map(presetID => allPresets[presetID]).filter(Boolean)
);
_this.geometry = _this.members.collection
.reduce((acc, preset) => {
for (let i in preset.geometry) {
const geometry = preset.geometry[i];
if (acc.indexOf(geometry) === -1) {
acc.push(geometry);
}
}
return acc;
}, []);
_this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0;
_this.matchAllGeometry = (geometries) => _this.members.collection
.some(preset => preset.matchAllGeometry(geometries));
_this.matchScore = () => -1;
_this.name = () => t(`_tagging.presets.categories.${categoryID}.name`, { 'default': categoryID });
_this.nameLabel = () => t.append(`_tagging.presets.categories.${categoryID}.name`, { 'default': categoryID });
_this.terms = () => [];
_this.searchName = () => {
if (!_searchName) {
_searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
}
return _searchName;
};
_this.searchNameStripped = () => {
if (!_searchNameStripped) {
_searchNameStripped = _this.searchName();
// split combined diacritical characters into their parts
if (_searchNameStripped.normalize) _searchNameStripped = _searchNameStripped.normalize('NFD');
// remove diacritics
_searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, '');
}
return _searchNameStripped;
};
_this.searchAliases = () => [];
_this.searchAliasesStripped = () => [];
return _this;
}