118 lines
3.2 KiB
JavaScript
118 lines
3.2 KiB
JavaScript
/**
|
||
* Catégories recettes Ben-to (alignées produit : familles & variantes typiques).
|
||
* Utilisé par `build-recipes.mjs` pour associer chaque recette à une « base » du catalogue.
|
||
*/
|
||
|
||
/** @typedef {'sweet' | 'savory'} BaseFlavor */
|
||
|
||
/** Ordre d’affichage dans le builder (étape « base »). */
|
||
export const RECIPE_BASE_DISPLAY_ORDER = [
|
||
"base:onigiri",
|
||
"base:gimbap",
|
||
"base:mandu",
|
||
"base:empanadas-savory",
|
||
"base:empanadas-sweet",
|
||
"base:galettes",
|
||
"base:bao",
|
||
"base:muffin",
|
||
"base:mini-cakes",
|
||
"base:biscuits-secs",
|
||
"base:fluffy-cakes",
|
||
"base:cakes",
|
||
"base:carnet"
|
||
];
|
||
|
||
/** Flavour du bandeau salé / sucré pour la carte « base » (une valeur par catégorie). */
|
||
export const RECIPE_BASE_FLAVOR = /** @type {Readonly<Record<string, BaseFlavor>>} */ ({
|
||
"base:onigiri": "savory",
|
||
"base:gimbap": "savory",
|
||
"base:mandu": "savory",
|
||
"base:empanadas-savory": "savory",
|
||
"base:empanadas-sweet": "sweet",
|
||
"base:galettes": "savory",
|
||
"base:bao": "savory",
|
||
"base:muffin": "sweet",
|
||
"base:mini-cakes": "sweet",
|
||
"base:biscuits-secs": "sweet",
|
||
"base:fluffy-cakes": "sweet",
|
||
"base:cakes": "sweet",
|
||
"base:carnet": "savory"
|
||
});
|
||
|
||
const normSlug = (slug) => slug.toLowerCase();
|
||
const normTags = (tags) => tags.map((t) => t.trim().toLowerCase()).filter(Boolean);
|
||
|
||
/**
|
||
* Associe une recette à un identifiant de base catalogue.
|
||
* Règles évaluées du plus spécifique au plus général ; la première correspondance l’emporte.
|
||
*
|
||
* @param {string} slug
|
||
* @param {ReadonlyArray<string>} tags Tags bentext (section tags), déjà en minuscules possible
|
||
* @returns {string}
|
||
*/
|
||
export const resolveRecipeBaseId = (slug, tags) => {
|
||
const s = normSlug(slug);
|
||
const tg = normTags([...tags]);
|
||
|
||
if (
|
||
tg.includes("carnet") ||
|
||
tg.includes('cheesecake') ||
|
||
tg.includes('carrot-cake')
|
||
) return "base:carnet";
|
||
|
||
if (s.includes("inarizushi") || s.includes("musubi") || s.includes("onigiri")) return "base:onigiri";
|
||
|
||
if (
|
||
s.includes("gimbap") ||
|
||
s.includes("kimbap") ||
|
||
(s.includes("maki") && !s.includes("makisu"))
|
||
) {
|
||
return "base:gimbap";
|
||
}
|
||
|
||
if (s.includes("mandu") || s.includes("gyoza") || s.includes("jiaozi") || s.includes("mandoo")) {
|
||
return "base:mandu";
|
||
}
|
||
|
||
if (s.includes("empanadas-citron") || s.includes("empanada-citron")) return "base:empanadas-sweet";
|
||
if (s.includes("empanad")) return "base:empanadas-savory";
|
||
|
||
if (
|
||
s.includes("dan-bing") ||
|
||
s.includes("danbing") ||
|
||
s.includes("blini") ||
|
||
s.includes("naan") ||
|
||
s.includes("jeon") ||
|
||
s.includes("paratha") ||
|
||
s.includes("cong-you") ||
|
||
s.includes("congyou")
|
||
) {
|
||
return "base:galettes";
|
||
}
|
||
|
||
if (/\b(mantou|baozi)\b/i.test(slug) || /\bbao\b/i.test(slug)) return "base:bao";
|
||
|
||
if (s.includes("muffin")) return "base:muffin";
|
||
|
||
if (s.includes("madeleine") || s.includes("financier")) return "base:mini-cakes";
|
||
|
||
if (s.includes("biscuit")) return "base:biscuits-secs";
|
||
|
||
if (
|
||
s.includes("savoie") ||
|
||
s.includes("fluffy") ||
|
||
s.includes("gateau") ||
|
||
s.includes("gâteau")
|
||
) {
|
||
return "base:fluffy-cakes";
|
||
}
|
||
|
||
if (s.includes("cake") || s.includes("banana") ||
|
||
s.includes("cremeux") ||
|
||
s.includes("crémeux")) {
|
||
return "base:cakes";
|
||
}
|
||
|
||
return "base:carnet";
|
||
};
|