55 lines
1.4 KiB
JavaScript
55 lines
1.4 KiB
JavaScript
globalThis.Wegwichtel ??= {};
|
|
|
|
(function (ns) {
|
|
'use strict';
|
|
|
|
const entries = Object.freeze([
|
|
['🪵', 'Holz'],
|
|
['🪨', 'Felsen'],
|
|
['🏮', 'Laterne'],
|
|
['🌼', 'Blume'],
|
|
['🚬', 'Pfeife'],
|
|
['🐦', 'Vogel'],
|
|
['🍄', 'Pilz'],
|
|
['🍓', 'Erdbeere'],
|
|
['🎃', 'Kürbis']
|
|
].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 nine group-code motifs.
|
|
* 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));
|