From 6ff745eacf60d597d418175405bd7099394e8f88 Mon Sep 17 00:00:00 2001 From: caleblee789 Date: Sun, 26 Apr 2026 13:35:51 -0500 Subject: [PATCH] Preserve shuffled cloze order on back --- Note Types/AnKing MCAT/Back Template.html | 2 +- Note Types/AnKing MCAT/Front Template.html | 2 +- Note Types/AnKing/Back Template.html | 2 +- Note Types/AnKing/Front Template.html | 2 +- .../AnKingAnkisthesia/Back Template.html | 2 +- .../AnKingAnkisthesia/Front Template.html | 2 +- Note Types/AnKingDerm/Back Template.html | 45 ++++++++++++++----- Note Types/AnKingDerm/Front Template.html | 44 ++++++++++++++---- Note Types/AnKingDermPath/Back Template.html | 45 ++++++++++++++----- Note Types/AnKingDermPath/Front Template.html | 44 ++++++++++++++---- Note Types/AnKingOverhaul/Back Template.html | 44 ++++++++++++++---- Note Types/AnKingOverhaul/Front Template.html | 44 ++++++++++++++---- .../AnKingOverlapping/Back Template.html | 2 +- .../AnKingOverlapping/Front Template.html | 2 +- Note Types/Basic-AnKing/Back Template.html | 2 +- Note Types/Basic-AnKing/Front Template.html | 2 +- .../Basic-AnKingLanguage/Back Template.html | 2 +- .../Basic-AnKingLanguage/Front Template.html | 2 +- Note Types/IO-one by one/Back Template.html | 2 +- Note Types/IO-one by one/Front Template.html | 2 +- Note Types/Physeo-Cloze/Back Template.html | 2 +- Note Types/Physeo-Cloze/Front Template.html | 2 +- .../Physeo-IO one by one/Back Template.html | 2 +- .../Physeo-IO one by one/Front Template.html | 2 +- Note Types/Sketchy-Cloze/Back Template.html | 2 +- Note Types/Sketchy-Cloze/Front Template.html | 2 +- src/components/shuffleItems.ejs | 42 +++++++++++++---- src/notetypes/AnKingDerm/back.ejs | 2 +- src/notetypes/AnKingDermPath/back.ejs | 2 +- 29 files changed, 266 insertions(+), 86 deletions(-) diff --git a/Note Types/AnKing MCAT/Back Template.html b/Note Types/AnKing MCAT/Back Template.html index de445342..044d2de1 100644 --- a/Note Types/AnKing MCAT/Back Template.html +++ b/Note Types/AnKing MCAT/Back Template.html @@ -1,4 +1,4 @@ - + - diff --git a/Note Types/AnKingDerm/Front Template.html b/Note Types/AnKingDerm/Front Template.html index 1cf85788..dbb70395 100644 --- a/Note Types/AnKingDerm/Front Template.html +++ b/Note Types/AnKingDerm/Front Template.html @@ -1,4 +1,4 @@ - +
{{cloze:Text}}
@@ -300,7 +300,7 @@ (() => { const selectors = [".shuffle"]; const shuffleMap = Persistence.getItem("shuffle") || {}; - const shuffledWordClass = "shuffled-word"; + const containerSelector = selectors.join(", "); function isFront() { const hasHrMarker = document.querySelector("hr[id=answer]"); @@ -321,14 +321,39 @@ } } - function shuffleElements(elements) { + function getNearestIdElement(element) { + let current = element; + while (current && current !== document.body) { + if (current.id) { + return current; + } + current = current.parentElement; + } + return null; + } + + function getScopedIndex(element, selector) { + const scope = getNearestIdElement(element); + const candidates = scope + ? Array.from(scope.querySelectorAll(selector)) + : Array.from(document.querySelectorAll(selector)); + const index = candidates.indexOf(element); + return index === -1 ? 0 : index; + } + + function shuffleKey(element, groupType, selector) { + const scope = getNearestIdElement(element); + const scopeKey = scope ? `${scope.tagName.toLowerCase()}#${scope.id}` : "document"; + const index = selector ? getScopedIndex(element, selector) : 0; + return `${scopeKey}:${groupType}:${index}`; + } + + function shuffleElements(elements, mapKey) { elements = elements.filter(e => !e.matches(".no-shuffle *")); if (elements.length === 0) { return; } const shuffledElements = Array.from(elements); - // Assuming elements[0] is not also the first element in a different list to shuffle - const mapKey = shuffledElements[0]; const indexMap = shuffleMap[mapKey] || {}; elements = elements.map(el => { const placeholder = document.createTextNode(''); @@ -344,7 +369,7 @@ function shuffleList(listElement) { const items = Array.from(listElement.querySelectorAll("li")); - shuffleElements(items); + shuffleElements(items, shuffleKey(listElement, "list", "ol, ul")); } /** @@ -405,11 +430,12 @@ return item.replace(/,\s*(?=<\/|$)/g, ''); }); - const indexMap = shuffleMap[element] || {}; + const mapKey = shuffleKey(element, "sentence", ".shuffle-sentence"); + const indexMap = shuffleMap[mapKey] || {}; const itemsToShuffle = [...cleanedItems]; shuffle(itemsToShuffle, indexMap); - shuffleMap[element] = indexMap; + shuffleMap[mapKey] = indexMap; let newHTML; if (itemsToShuffle.length === 2) { @@ -434,7 +460,7 @@ shuffleList(parentElement); } const images = Array.from(container.querySelectorAll("img")); - shuffleElements(images); + shuffleElements(images, shuffleKey(container, "images", containerSelector)); } } for (const element of document.querySelectorAll(".shuffle-sentence")) { diff --git a/Note Types/AnKingDermPath/Back Template.html b/Note Types/AnKingDermPath/Back Template.html index c4d8113d..d1637426 100644 --- a/Note Types/AnKingDermPath/Back Template.html +++ b/Note Types/AnKingDermPath/Back Template.html @@ -1,4 +1,4 @@ - + - diff --git a/Note Types/AnKingDermPath/Front Template.html b/Note Types/AnKingDermPath/Front Template.html index cdd89dbd..1210217e 100644 --- a/Note Types/AnKingDermPath/Front Template.html +++ b/Note Types/AnKingDermPath/Front Template.html @@ -1,4 +1,4 @@ - +
{{edit:Front}}
Above Image(s) provided courtesy of Tammie Ferringer, MD
@@ -361,7 +361,7 @@ (() => { const selectors = [".shuffle", "#front"]; const shuffleMap = Persistence.getItem("shuffle") || {}; - const shuffledWordClass = "shuffled-word"; + const containerSelector = selectors.join(", "); function isFront() { const hasHrMarker = document.querySelector("hr[id=answer]"); @@ -382,14 +382,39 @@ } } - function shuffleElements(elements) { + function getNearestIdElement(element) { + let current = element; + while (current && current !== document.body) { + if (current.id) { + return current; + } + current = current.parentElement; + } + return null; + } + + function getScopedIndex(element, selector) { + const scope = getNearestIdElement(element); + const candidates = scope + ? Array.from(scope.querySelectorAll(selector)) + : Array.from(document.querySelectorAll(selector)); + const index = candidates.indexOf(element); + return index === -1 ? 0 : index; + } + + function shuffleKey(element, groupType, selector) { + const scope = getNearestIdElement(element); + const scopeKey = scope ? `${scope.tagName.toLowerCase()}#${scope.id}` : "document"; + const index = selector ? getScopedIndex(element, selector) : 0; + return `${scopeKey}:${groupType}:${index}`; + } + + function shuffleElements(elements, mapKey) { elements = elements.filter(e => !e.matches(".no-shuffle *")); if (elements.length === 0) { return; } const shuffledElements = Array.from(elements); - // Assuming elements[0] is not also the first element in a different list to shuffle - const mapKey = shuffledElements[0]; const indexMap = shuffleMap[mapKey] || {}; elements = elements.map(el => { const placeholder = document.createTextNode(''); @@ -405,7 +430,7 @@ function shuffleList(listElement) { const items = Array.from(listElement.querySelectorAll("li")); - shuffleElements(items); + shuffleElements(items, shuffleKey(listElement, "list", "ol, ul")); } /** @@ -466,11 +491,12 @@ return item.replace(/,\s*(?=<\/|$)/g, ''); }); - const indexMap = shuffleMap[element] || {}; + const mapKey = shuffleKey(element, "sentence", ".shuffle-sentence"); + const indexMap = shuffleMap[mapKey] || {}; const itemsToShuffle = [...cleanedItems]; shuffle(itemsToShuffle, indexMap); - shuffleMap[element] = indexMap; + shuffleMap[mapKey] = indexMap; let newHTML; if (itemsToShuffle.length === 2) { @@ -495,7 +521,7 @@ shuffleList(parentElement); } const images = Array.from(container.querySelectorAll("img")); - shuffleElements(images); + shuffleElements(images, shuffleKey(container, "images", containerSelector)); } } for (const element of document.querySelectorAll(".shuffle-sentence")) { diff --git a/Note Types/AnKingOverhaul/Back Template.html b/Note Types/AnKingOverhaul/Back Template.html index d5f85fe1..b5941c8a 100644 --- a/Note Types/AnKingOverhaul/Back Template.html +++ b/Note Types/AnKingOverhaul/Back Template.html @@ -1,4 +1,4 @@ - +