feat: added support for adding plurality to ingredients

This commit is contained in:
Leyla Becker 2026-02-22 19:53:18 -06:00
parent 750bfb912f
commit 8855d6ba19
9 changed files with 468 additions and 8 deletions

View file

@ -152,6 +152,42 @@
return null;
}
// ─── Noun Plurality ─────────────────────────────────────
function getScaledCountValue(scalableRaw, scaleFactor) {
if (!scalableRaw) return null;
try {
var data = JSON.parse(scalableRaw);
if (data.type !== 'count') return null;
var baseVal = data.base;
if (Array.isArray(baseVal)) return baseVal[1] * scaleFactor;
return baseVal * scaleFactor;
} catch (e) { return null; }
}
function updateNoun(span, countValue) {
if (span.getAttribute('data-has-noun') !== 'true') return;
var nounSpan = span.previousElementSibling;
// Walk back past whitespace text nodes
if (!nounSpan || !nounSpan.classList || !nounSpan.classList.contains('count-noun')) {
// Try the sibling before the space text node
var prev = span.previousSibling;
while (prev && prev.nodeType === 3) prev = prev.previousSibling;
if (prev && prev.classList && prev.classList.contains('count-noun')) nounSpan = prev;
else return;
}
var singular = nounSpan.getAttribute('data-singular');
var plural = nounSpan.getAttribute('data-plural');
if (!singular || !plural) return;
var form = countValue === 1 ? singular : plural;
// Preserve casing from current text
var current = nounSpan.textContent;
if (current && current[0] === current[0].toUpperCase() && current[0] !== current[0].toLowerCase()) {
form = form[0].toUpperCase() + form.slice(1);
}
nounSpan.textContent = form;
}
// ─── Update All Measurements ────────────────────────────
function updateAll() {
@ -191,7 +227,15 @@
try {
var data = JSON.parse(scalableRaw);
var text = computeScaledText(data, scale, imperial);
if (text) { span.textContent = text; return; }
if (text) {
span.textContent = text;
// Update adjacent noun span for count measurements
if (type === 'count') {
var countVal = getScaledCountValue(scalableRaw, scale);
if (countVal !== null) updateNoun(span, countVal);
}
return;
}
} catch (e) {}
}
@ -200,6 +244,12 @@
? span.getAttribute(altAttr)
: span.getAttribute(defaultAttr);
if (text) span.textContent = text;
// At 1x scale, restore noun to build-time form
if (type === 'count') {
var countVal = getScaledCountValue(span.getAttribute('data-scalable'), scale);
if (countVal !== null) updateNoun(span, countVal);
}
});
}