52 lines
1.4 KiB
JavaScript
52 lines
1.4 KiB
JavaScript
(function (ns) {
|
|
'use strict';
|
|
|
|
const entries = Object.freeze([
|
|
['🍎', 'Apfel'],
|
|
['🔑', 'Schlüssel'],
|
|
['🔔', 'Glocke'],
|
|
['📘', 'Buch'],
|
|
['🌻', 'Sonnenblume'],
|
|
['☂️', 'Regenschirm'],
|
|
['⚽', 'Fußball'],
|
|
['☕', 'Tasse']
|
|
].map(([unicode, label]) => Object.freeze({
|
|
unicode,
|
|
label,
|
|
imageUrl: `/images/group-symbols/${unicode}.png`
|
|
})));
|
|
|
|
// Presentation selectors must not create different symbols for the same object.
|
|
function normalizeUnicode(value) {
|
|
if (typeof value !== 'string') return null;
|
|
return value.normalize('NFC').replaceAll(/[\uFE0E\uFE0F]/g, '');
|
|
}
|
|
|
|
const byUnicode = new Map(entries.map(entry => [normalizeUnicode(entry.unicode), entry]));
|
|
|
|
/**
|
|
* Read-only catalogue of the eight approved group-code illustrations.
|
|
* Loading this file only registers the class; it does not create UI or sessions.
|
|
*/
|
|
class GroupSymbols {
|
|
static list() {
|
|
return entries;
|
|
}
|
|
|
|
/** Returns the immutable motif descriptor, or null for an unknown symbol. */
|
|
static get(unicode) {
|
|
return byUnicode.get(normalizeUnicode(unicode)) ?? null;
|
|
}
|
|
|
|
static has(unicode) {
|
|
return this.get(unicode) !== null;
|
|
}
|
|
|
|
static imageUrl(unicode) {
|
|
return this.get(unicode)?.imageUrl ?? null;
|
|
}
|
|
}
|
|
|
|
ns.GroupSymbols = GroupSymbols;
|
|
}(globalThis.Wegwichtel ??= {}));
|