55 lines
1.5 KiB
JavaScript
55 lines
1.5 KiB
JavaScript
globalThis.Wegwichtel ??= {};
|
|
|
|
(function (ns) {
|
|
'use strict';
|
|
|
|
const entries = Object.freeze([
|
|
['🪵', "group-symbols.holz"],
|
|
['🪨', "group-symbols.felsen"],
|
|
['🏮', "group-symbols.laterne"],
|
|
['🌼', "group-symbols.blume"],
|
|
['🚬', "group-symbols.pfeife"],
|
|
['🐦', "group-symbols.vogel"],
|
|
['🍄', "group-symbols.pilz"],
|
|
['🍓', "group-symbols.erdbeere"],
|
|
['🎃', "group-symbols.kurbis"]
|
|
].map(([unicode, labelKey]) => Object.freeze({
|
|
unicode,
|
|
get label() { return ns.I18n.t(labelKey); },
|
|
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));
|