mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-05-31 20:25:14 -04:00
* Added custom scaling option * Allow custom scaling with no yield set * Made edit-scale translated * fixed merge conflict * Refactored scale editor to use menu * replaced vslot with # * linter issues * fixed linter issues * fixed one more linter issue * format files + minor UI changes * remove console.log * move buttons into component and setup v-model * drop servings text Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
47 lines
1.4 KiB
TypeScript
47 lines
1.4 KiB
TypeScript
import DOMPurify from "isomorphic-dompurify";
|
|
import { useFraction } from "./use-fraction";
|
|
import { RecipeIngredient } from "~/types/api-types/recipe";
|
|
const { frac } = useFraction();
|
|
|
|
function sanitizeIngredientHTML(rawHtml: string) {
|
|
return DOMPurify.sanitize(rawHtml, {
|
|
USE_PROFILES: { html: true },
|
|
ALLOWED_TAGS: ["b", "q", "i", "strong", "sup"],
|
|
});
|
|
}
|
|
|
|
export function parseIngredientText(ingredient: RecipeIngredient, disableAmount: boolean, scale = 1): string {
|
|
if (disableAmount) {
|
|
return ingredient.note || "";
|
|
}
|
|
|
|
const { quantity, food, unit, note } = ingredient;
|
|
|
|
let returnQty = "";
|
|
|
|
let unitDisplay = unit?.name;
|
|
|
|
// casting to number is required as sometimes quantity is a string
|
|
if (quantity && Number(quantity) !== 0) {
|
|
if (unit?.fraction) {
|
|
const fraction = frac(quantity * scale, 10, true);
|
|
if (fraction[0] !== undefined && fraction[0] > 0) {
|
|
returnQty += fraction[0];
|
|
}
|
|
|
|
if (fraction[1] > 0) {
|
|
returnQty += ` <sup>${fraction[1]}</sup>⁄<sub>${fraction[2]}</sub>`;
|
|
}
|
|
} else {
|
|
returnQty = (quantity * scale).toString();
|
|
}
|
|
|
|
if (unit?.useAbbreviation && unit.abbreviation) {
|
|
unitDisplay = unit.abbreviation;
|
|
}
|
|
}
|
|
|
|
const text = `${returnQty} ${unitDisplay || " "} ${food?.name || " "} ${note || " "}`.replace(/ {2,}/g, " ");
|
|
return sanitizeIngredientHTML(text);
|
|
}
|