refraction almost completed
This commit is contained in:
173
app/ui-alphabet-kabbalah.js
Normal file
173
app/ui-alphabet-kabbalah.js
Normal file
@@ -0,0 +1,173 @@
|
||||
/* ui-alphabet-kabbalah.js — Shared Kabbalah and cube helpers for the alphabet section */
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
function normalizeId(value) {
|
||||
return String(value || "").trim().toLowerCase();
|
||||
}
|
||||
|
||||
function normalizeLetterId(value) {
|
||||
return String(value || "")
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.replace(/[^a-z]/g, "");
|
||||
}
|
||||
|
||||
function titleCase(value) {
|
||||
return String(value || "")
|
||||
.split(/[\s_-]+/)
|
||||
.filter(Boolean)
|
||||
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
||||
.join(" ");
|
||||
}
|
||||
|
||||
function normalizeSoulId(value) {
|
||||
return String(value || "")
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.replace(/[^a-z]/g, "");
|
||||
}
|
||||
|
||||
function buildFourWorldLayersFromDataset(magickDataset) {
|
||||
const worlds = magickDataset?.grouped?.kabbalah?.fourWorlds;
|
||||
const souls = magickDataset?.grouped?.kabbalah?.souls;
|
||||
const paths = Array.isArray(magickDataset?.grouped?.kabbalah?.["kabbalah-tree"]?.paths)
|
||||
? magickDataset.grouped.kabbalah["kabbalah-tree"].paths
|
||||
: [];
|
||||
|
||||
if (!worlds || typeof worlds !== "object") {
|
||||
return [];
|
||||
}
|
||||
|
||||
const soulAliases = {
|
||||
chiah: "chaya",
|
||||
chaya: "chaya",
|
||||
neshamah: "neshama",
|
||||
neshama: "neshama",
|
||||
ruach: "ruach",
|
||||
nephesh: "nephesh"
|
||||
};
|
||||
|
||||
const pathByLetterId = new Map();
|
||||
paths.forEach((path) => {
|
||||
const letterId = normalizeLetterId(path?.hebrewLetter?.transliteration || path?.hebrewLetter?.char);
|
||||
const pathNo = Number(path?.pathNumber);
|
||||
if (!letterId || !Number.isFinite(pathNo) || pathByLetterId.has(letterId)) {
|
||||
return;
|
||||
}
|
||||
pathByLetterId.set(letterId, pathNo);
|
||||
});
|
||||
|
||||
const worldOrder = ["atzilut", "briah", "yetzirah", "assiah"];
|
||||
|
||||
return worldOrder
|
||||
.map((worldId) => {
|
||||
const world = worlds?.[worldId];
|
||||
if (!world || typeof world !== "object") {
|
||||
return null;
|
||||
}
|
||||
|
||||
const tetragrammaton = world?.tetragrammaton && typeof world.tetragrammaton === "object"
|
||||
? world.tetragrammaton
|
||||
: {};
|
||||
|
||||
const letterId = normalizeLetterId(tetragrammaton?.hebrewLetterId);
|
||||
const rawSoulId = normalizeSoulId(world?.soulId);
|
||||
const soulId = soulAliases[rawSoulId] || rawSoulId;
|
||||
const soul = souls?.[soulId] && typeof souls[soulId] === "object"
|
||||
? souls[soulId]
|
||||
: null;
|
||||
|
||||
const slot = tetragrammaton?.isFinal
|
||||
? `${String(tetragrammaton?.slot || "Heh")} (final)`
|
||||
: String(tetragrammaton?.slot || "");
|
||||
|
||||
return {
|
||||
slot,
|
||||
letterChar: String(tetragrammaton?.letterChar || ""),
|
||||
hebrewLetterId: letterId,
|
||||
world: String(world?.name?.roman || titleCase(worldId)),
|
||||
worldLayer: String(world?.worldLayer?.en || world?.desc?.en || ""),
|
||||
worldDescription: String(world?.worldDescription?.en || ""),
|
||||
soulLayer: String(soul?.name?.roman || titleCase(rawSoulId || soulId)),
|
||||
soulTitle: String(soul?.title?.en || titleCase(soul?.name?.en || "")),
|
||||
soulDescription: String(soul?.desc?.en || ""),
|
||||
pathNumber: pathByLetterId.get(letterId) || null
|
||||
};
|
||||
})
|
||||
.filter(Boolean);
|
||||
}
|
||||
|
||||
function createEmptyCubeRefs() {
|
||||
return {
|
||||
hebrewPlacementById: new Map(),
|
||||
signPlacementById: new Map(),
|
||||
planetPlacementById: new Map(),
|
||||
pathPlacementByNo: new Map()
|
||||
};
|
||||
}
|
||||
|
||||
function getCubePlacementForHebrewLetter(cubeRefs, hebrewLetterId, pathNo = null) {
|
||||
const normalizedLetterId = normalizeId(hebrewLetterId);
|
||||
if (normalizedLetterId && cubeRefs?.hebrewPlacementById?.has(normalizedLetterId)) {
|
||||
return cubeRefs.hebrewPlacementById.get(normalizedLetterId);
|
||||
}
|
||||
|
||||
const numericPath = Number(pathNo);
|
||||
if (Number.isFinite(numericPath) && cubeRefs?.pathPlacementByNo?.has(numericPath)) {
|
||||
return cubeRefs.pathPlacementByNo.get(numericPath);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function getCubePlacementForPlanet(cubeRefs, planetId) {
|
||||
const normalizedPlanetId = normalizeId(planetId);
|
||||
return normalizedPlanetId ? cubeRefs?.planetPlacementById?.get(normalizedPlanetId) || null : null;
|
||||
}
|
||||
|
||||
function getCubePlacementForSign(cubeRefs, signId) {
|
||||
const normalizedSignId = normalizeId(signId);
|
||||
return normalizedSignId ? cubeRefs?.signPlacementById?.get(normalizedSignId) || null : null;
|
||||
}
|
||||
|
||||
function cubePlacementLabel(placement) {
|
||||
const wallName = placement?.wallName || "Wall";
|
||||
const edgeName = placement?.edgeName || "Direction";
|
||||
return `Cube: ${wallName} Wall - ${edgeName}`;
|
||||
}
|
||||
|
||||
function buildCubePlacementButton(placement, navBtn, fallbackDetail = null) {
|
||||
if (!placement || typeof navBtn !== "function") {
|
||||
return "";
|
||||
}
|
||||
|
||||
const detail = {
|
||||
"wall-id": placement.wallId,
|
||||
"edge-id": placement.edgeId
|
||||
};
|
||||
|
||||
if (fallbackDetail && typeof fallbackDetail === "object") {
|
||||
Object.entries(fallbackDetail).forEach(([key, value]) => {
|
||||
if (value !== undefined && value !== null && value !== "") {
|
||||
detail[key] = value;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return navBtn(cubePlacementLabel(placement), "nav:cube", detail);
|
||||
}
|
||||
|
||||
window.AlphabetKabbalahUi = {
|
||||
buildCubePlacementButton,
|
||||
buildFourWorldLayersFromDataset,
|
||||
createEmptyCubeRefs,
|
||||
cubePlacementLabel,
|
||||
getCubePlacementForHebrewLetter,
|
||||
getCubePlacementForPlanet,
|
||||
getCubePlacementForSign,
|
||||
normalizeId,
|
||||
normalizeLetterId,
|
||||
titleCase
|
||||
};
|
||||
})();
|
||||
Reference in New Issue
Block a user