Files
Wegwichtel/public/js/group-symbols.js
T
Florian Zumpe aff88eba1b
Sonarqube Scanner / Prepare environment (push) Successful in 20s
Sonarqube Scanner / Build and test (push) Failing after 36s
Sonarqube Scanner / SonarQube analysis (push) Skipped
Sonarqube Scanner / Deploy to Server (push) Successful in 9s
Internationalization
2026-10-01 09:41:01 +02:00

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));