Cooking Chart — Especificación v0.2
Un modelo formal de receta, un lenguaje textual para escribirlo (CCL, Cooking Chart Language) y una notación visual estándar para dibujarlo (Cooking Chart).
El estándar tiene tres capas, como BPMN o UML:
| Capa | Qué es | Dónde vive |
|---|---|---|
| Metamodelo | Qué es una receta: entidades, relaciones y reglas | §1 |
| Lenguaje (CCL) | Cómo se escribe una receta sin ambigüedad, en español o en inglés | §2–§5 |
| Notación (Cooking Chart) | Cómo se dibuja, de forma determinista, a partir del modelo, y cómo se lee como texto (plan de trabajo y modo de elaboración) | §6 |
Además: validación (§7), distribución e incrustación (§8), extensiones y conformidad (§9), decisiones abiertas (§10) y trabajo relacionado (§11).
Implementación de referencia: cooking-lang.js (parser), recipe-model.js (semántica y planificación), recipe-chart.js (notación), recipe-text.js (vistas de texto), embed-element.js (componente incrustable).
0. Principios
- La receta la decide su autor. El lenguaje no impone decisiones culinarias: cuánto aguanta un intermedio, cuántos cocineros hay o cómo se planifica se declara, no se deduce.
- Formalización progresiva. Todo lo que va más allá de ingredientes → procesos → plato es opcional. Una receta doméstica no dice nada de cocineros ni de fuegos; una cocina profesional los declara y el mismo texto pasa a ser un plan de producción factible.
- El dibujo no se decide a mano. El gráfico se deriva del modelo sin coordenadas, carriles ni horas de inicio escritas por nadie.
- Bilingüe desde el núcleo. Cada palabra clave, verbo y unidad tiene una forma canónica y sus formas en español y en inglés.
1. Metamodelo
1.1 Entidades
| Entidad | Definición | Atributos |
|---|---|---|
| Ingrediente | Materia inicial; no la produce ningún proceso de la receta | nombre, cantidad, unidad |
| Herramienta | Recurso con el que se aplica un proceso. No se consume. | nombre, capacidad |
| Proceso | Aplicación de un verbo a una o varias materias, con unas herramientas, durante un tiempo | verbo, entradas, herramientas, parámetros, duración, condición de fin, atención, tolerancia a la espera |
| Intermedio | Materia producida por un proceso y consumida por otro ("verduras pochadas") | nombre, proceso que lo produce, cuánto aguanta |
| Plato | El intermedio final que se sirve | nombre |
| Cocinero (opcional) | Recurso humano. Los procesos atendidos lo ocupan; los desatendidos, no. | número |
| Fuego (opcional) | Recurso de la cocina. Todo proceso de tipo Fuego ocupa uno, atendido o no. | número |
1.2 Reglas
- Cada proceso produce exactamente un resultado, con nombre.
- Una materia se consume entera salvo que se indique una fracción (
salsa[1/2]). Las fracciones de una materia deberían sumar 1. - El grafo de procesos es acíclico.
- Todo converge en el plato.
- Las herramientas tienen estado. Un proceso aplicado solo a herramientas (
precalentar(horno)) produce la herramienta en otro estado. Usarla después crea una dependencia y ocupa la herramienta base. - Una entrada puede incorporarse a mitad de un proceso (
+ vino a los 5min). - El paralelismo no se declara: se deduce de las dependencias y de los recursos disponibles.
- Un recurso solo restringe si se declara (principio 2).
- Un intermedio puede esperar indefinidamente salvo que el autor diga cuánto aguanta (
aguanta 30min,sin espera).
1.3 Semántica formal
Una receta es una red de Petri temporizada con recursos: lugares = ingredientes, intermedios y estados de herramienta; transiciones = procesos con duración; recursos = cocineros, fuegos y herramientas con capacidad. Planificarla es un problema RCPSP con desfases máximos (RCPSP/max): aguanta es un desfase máximo entre el fin de un proceso y el inicio de su consumidor. El Cooking Chart es una vista de una solución concreta.
2. CCL por ejemplo
receta "Lasaña boloñesa"
raciones 6
cocineros 1
ingredientes
cebolla 1 ud
carne 500 g "Carne picada"
tomate 800 g "Tomate triturado"
vino 100 ml "Vino tinto"
mantequilla 50 g
harina 50 g
leche 500 ml
placas 250 g "Placas de lasaña"
queso 200 g "Queso rallado"
herramientas
sartén, cazo, fuente, horno
bloque "Boloñesa"
sofrito = pochar(cebolla) en sartén @fuego:bajo 10min
carne_dorada = dorar(sofrito, carne) en sartén @fuego:alto 15min
boloñesa "Salsa boloñesa" = guisar(carne_dorada, tomate) en sartén 45min
+ vino a los 5min
fin
bloque "Bechamel"
roux = cocinar(mantequilla, harina) en cazo 5min
bechamel = cocinar(roux, leche) en cazo 8-10min hasta "espese" aguanta 30min
fin
horno_caliente = precalentar(horno) @180ºC 15min
lasaña_cruda = montar(boloñesa, bechamel, placas, queso) en fuente 15min
lasaña = hornear(lasaña_cruda) en horno_caliente @180ºC 40min
servir lasaña "Lasaña boloñesa"
La misma receta en inglés usa recipe, ingredients, tools, block/end, in, until, keeps, at, serve y verbos como sweat, brown, simmer, bake. Las dos versiones producen exactamente el mismo modelo.
- Cada paso es una asignación:
resultado = verbo(entradas). Las dependencias salen de los nombres. - El orden de las líneas no importa para la semántica.
3. Sintaxis
3.1 Léxico
- Identificadores: letras Unicode, dígitos y
_; no empiezan por dígito. Nombre visible por defecto:_→ espacio y mayúscula inicial. Un"texto"tras el identificador lo sustituye. - Género gramatical (opcional):
(m),(f),(m pl)o(f pl)tras el nombre de un ingrediente, una herramienta o un resultado. Solo lo usa el modo de elaboración para poner bien los artículos (§6.1); no cambia el modelo ni el plan. - Comentarios:
#,//o%%hasta el final de la línea. - Números:
500,1,5,1.5,1/2. Una cantidad de ingrediente puede ser un rango:3-4 cda,2-3 dientes. - Palabras clave y verbos no distinguen mayúsculas. La sangría es libre.
3.2 Palabras clave
| Canónica | Español | English |
|---|---|---|
| recipe | receta |
recipe |
| description | descripcion, descripción |
description |
| cuisine | cocina |
cuisine |
| language | idioma |
language, lang |
| servings | raciones |
servings, serves |
| cooks | cocineros |
cooks |
| burners | fuegos |
burners |
| plan | plan, planificación |
schedule |
| ingredients | ingredientes |
ingredients |
| tools | herramientas, utensilios |
tools, equipment |
| block / end | bloque / fin |
block / end |
| serve | servir |
serve |
| in | en, con |
in, with, on |
| until | hasta |
until |
| attended / unattended | atendido / desatendido |
attended / unattended |
| keeps | aguanta |
keeps |
| use (paquetes) | usa, usar |
use |
| no wait | sin espera, inmediato |
no wait, immediately |
| at (añadidos) | a los, al, a las |
at, after |
| plan: asap | lo_antes_posible |
asap, as_soon_as_possible |
| plan: alap | justo_a_tiempo |
just_in_time, jit, alap |
Idioma de la receta: el declarado con idioma es|en o, si no, el de la mayoría de sus palabras clave y verbos. Determina cómo se muestran las unidades y los textos del gráfico. Mezclar idiomas es válido.
3.3 Gramática (EBNF)
receta = { linea } ;
linea = ( cabecera | seccion | entrada_seccion | paso | añadido
| bloque | fin | servir ) , [ comentario ] , NL
| [ comentario ] , NL ;
cabecera = RECIPE , cadena
| DESCRIPTION , cadena
| CUISINE , cadena (* metadato, no afecta a la planificación *)
| LANGUAGE , ( "es" | "en" )
| SERVINGS , numero
| COOKS , ( entero | "ilimitados" | "unlimited" )
| BURNERS , entero
| PLAN , ( ASAP | ALAP )
| USE , cadena ; (* paquete de vocabulario, §9.2 *)
seccion = INGREDIENTS | TOOLS , [ lista_herr ] ;
entrada_seccion = ingrediente | lista_herr ; (* según la sección abierta *)
ingrediente = ident , [ cantidad , [ unidad ] ] , [ AL_GUSTO | CS ] , [ cadena ] , [ genero ] ;
lista_herr = herramienta , { "," , herramienta } ;
herramienta = ident , [ genero ] , [ ( "x" | "×" ) , entero ] ;
paso = ident , [ cadena ] , [ genero ] , "=" , ( verbo | "x-" , ident ) , "(" , [ entradas ] , ")" , { modificador } ;
entradas = entrada , { "," , entrada } ;
entrada = ident , [ "[" , ( fraccion | porcentaje ) , "]" ] ;
modificador = IN , ident , { "," , ident } (* herramientas *)
| "@" , numero , [ "º" | "°" ] , ( "C" | "F" ) (* temperatura *)
| "@" , [ "x-" ] , ident , [ ":" , valor ] (* parámetro; @tipo:… fija el tipo *)
| duracion
| UNTIL , cadena (* condición de fin *)
| ATTENDED | UNATTENDED
| KEEPS , duracion (* tolerancia a la espera *)
| NO_WAIT ;
añadido = "+" , entrada , { "," , entrada } , AT , duracion ;
bloque = BLOCK , cadena ;
fin = END ;
servir = SERVE , ident , [ cadena ] ;
duracion = [ "~" ] , numero , [ "-" , numero ] , unidad_t ;
unidad_t = "h" , [ entero , [ "min" ] ] | "min" | "m" | "s" | "seg" | "sec" ;
cantidad = numero | fraccion | numero , "-" , numero ; (* 3-4 cda *)
fraccion = entero , "/" , entero ;
porcentaje = numero , "%" ;
cadena = '"' , { caracter - '"' } , '"' ;
genero = "(" , ( "m" | "f" ) , [ "pl" ] , ")" ; (* §6.1 *)
Las palabras en MAYÚSCULAS son las palabras clave de §3.2, en cualquiera de sus formas.
3.4 Unidades
Cada unidad tiene una forma canónica y se muestra según el idioma de la receta, en plural si la cantidad es un número distinto de 1 (2 dientes, 1/2 taza):
| Canónica | Se muestra (es / en) | Acepta |
|---|---|---|
g kg mg oz lb |
igual | gr, gramo(s), gram(s), kilo(s), onza(s), ounce(s), libra(s), pound(s) |
ml cl dl l |
igual | mililitro(s), milliliter(s), lt, litro(s), liter(s), litre(s) |
unit |
ud / pc | un, unidad(es), pieza(s), unit(s), pc(s), piece(s) |
tbsp / tsp |
cda / tbsp · cdta / tsp | cucharada(s), cdas, cd, tablespoon(s), tbsps · cucharadita(s), cdtas, ct, teaspoon(s), tsps |
cup glass pinch splash handful bunch clove leaf sprig stalk can sachet slice rasher |
taza / cup, vaso / glass, pizca / pinch, chorrito / splash, puñado / handful, manojo / bunch, diente / clove, rebanada / slice, loncha / slice… | singular y plural en ambos idiomas |
| especiales | al gusto / to taste · c.s. / as needed |
4. Semántica
4.1 Resolución de nombres
Cada identificador de las entradas se resuelve como: 1) ingrediente declarado; 2) resultado de otro paso (dependencia); 3) herramienta declarada (si el paso solo tiene herramientas como entradas, su resultado es la herramienta en otro estado). En en X, X puede ser una herramienta o un estado de herramienta. Si no se resuelve, es un error.
4.2 Duración
| Forma | Significado | Para planificar |
|---|---|---|
10min, 1h30, 90s |
fija | el valor |
8-10min |
rango | el máximo |
~10min |
aproximada | el valor |
hasta "espese" |
condición de fin | la duración estimada que la acompaña |
4.3 Atención
Cada verbo trae un modo por defecto (§5); atendido / desatendido lo sustituyen. Atendido = el cocinero está ocupado todo el paso.
4.4 Añadidos a mitad de proceso
+ x a los t en el paso p: si x es un resultado, p.inicio ≥ x.fin − t.
4.5 Tolerancia a la espera (opcional)
Por defecto un intermedio puede esperar lo que haga falta. El autor puede limitarlo:
aguanta D: entre el fin del paso y su uso pasan como muchoD.sin espera: equivale aaguanta 0; se usa en cuanto está.
Restricción: consumidor.inicio + at − productor.fin ≤ D. El planificador retrasa el productor hasta cumplirla si hay recursos libres; si no es posible, no cambia la receta: lo informa como violación (aviso en el editor y espera en rojo en el gráfico). Que el autor decida qué hacer forma parte del principio 1.
4.6 Planificación
Recursos (solo si se declaran): cocineros N (lo ocupan los pasos atendidos), fuegos N (los pasos de tipo Fuego), y cada herramienta declarada con su capacidad (horno x2; 1 por defecto).
- Plan por generación en serie (serial SGS), por prioridad de camino restante. Como el SGS es una heurística, se prueban varias prioridades (por ejemplo, colocar lo que no puede esperar junto a quien lo usa) y se elige el plan con menos espera excesiva (§4.5) y, a igualdad, el más corto: - lo antes posible: desde el inicio; - justo a tiempo: desde el plato hacia atrás, en tiempo invertido.
- Reparación de las tolerancias a la espera (§4.5).
- Análisis: se fija el orden en que cada recurso atiende a los pasos del plan y, sobre ese grafo aumentado, se calculan inicio temprano y tardío, holgura (ventana
[temprano, tardío]) y ruta crítica. Mover un paso dentro de su ventana nunca crea solapes nuevos (propiedad de Helly en intervalos).
Sin recursos limitados ni tolerancias, todo se reduce al método de la ruta crítica (CPM).
Modo por defecto: el que declare la receta con plan (si no, lo antes posible). Un visor puede ofrecer el otro modo, pero un gráfico incrustado siempre usa el declarado salvo que la página indique otro.
5. Vocabulario controlado de verbos
Cada verbo tiene un identificador canónico (en inglés, para ser estable entre idiomas), un tipo que fija su color y un modo de atención por defecto. Un verbo fuera del vocabulario se admite con un aviso. El nombre que se muestra es el que escribió el autor; en el modo de elaboración va en imperativo (§6.1).
| Id canónico | Tipo | Atención | Español | English |
|---|---|---|---|---|
chop |
Preparación | atendido | picar | chop, mince |
cut |
Preparación | atendido | cortar, trocear | cut, dice, cube |
slice |
Preparación | atendido | laminar, filetear | slice, fillet |
grate |
Preparación | atendido | rallar | grate |
peel |
Preparación | atendido | pelar | peel |
beat |
Preparación | atendido | batir | beat, whisk, whip |
blend |
Preparación | atendido | triturar | blend, purée, puree |
mash |
Preparación | atendido | majar, aplastar | mash, crush |
knead |
Preparación | atendido | amasar | knead |
sift |
Preparación | atendido | tamizar | sift |
drain |
Preparación | atendido | escurrir, colar | drain, strain |
wash |
Preparación | atendido | lavar | wash, rinse |
weigh |
Preparación | atendido | pesar | weigh, measure |
squeeze |
Preparación | atendido | exprimir | squeeze, juice |
crumble |
Preparación | atendido | desmigar | crumble, shred |
debone |
Preparación | atendido | deshuesar | debone, pit |
dry |
Preparación | atendido | secar | dry, pat_dry |
stir |
Preparación | atendido | remover | stir |
divide |
Preparación | atendido | dividir, porcionar | divide, portion |
mix |
Montaje | atendido | mezclar, combinar | mix, combine |
add |
Montaje | atendido | añadir, incorporar | add, fold, incorporate |
assemble |
Montaje | atendido | montar | assemble, layer |
plate |
Montaje | atendido | emplatar, servir | plate |
fill |
Montaje | atendido | rellenar | fill, stuff |
shape |
Montaje | atendido | formar, bolear | shape, form |
wrap |
Montaje | atendido | envolver | wrap |
coat |
Montaje | atendido | rebozar, empanar | coat, bread, dredge |
glaze |
Montaje | atendido | napar | glaze, nap |
roll |
Montaje | atendido | estirar | roll |
garnish |
Montaje | atendido | decorar | garnish, decorate |
finish |
Montaje | atendido | mantecar | finish |
bind |
Montaje | atendido | ligar | bind, thicken |
emulsify |
Montaje | atendido | emulsionar | emulsify |
season |
Montaje | atendido | sazonar, salpimentar, salar | season |
dissolve |
Montaje | atendido | disolver, diluir | dissolve, dilute |
pour |
Montaje | atendido | verter | pour |
sprinkle |
Montaje | atendido | espolvorear | sprinkle, dust |
brush |
Montaje | atendido | pincelar, pintar | brush |
arrange |
Montaje | atendido | colocar, disponer | arrange, place |
saute |
Fuego | atendido | saltear | sauté, saute, stir_fry |
sweat |
Fuego | atendido | pochar, rehogar, sofreír | sweat, soften |
brown |
Fuego | atendido | dorar, marcar | brown, sear |
fry |
Fuego | atendido | freír | fry, deep_fry |
toast |
Fuego | atendido | tostar, nacarar | toast |
caramelize |
Fuego | atendido | caramelizar | caramelize, caramelise |
melt |
Fuego | atendido | fundir, derretir | melt |
cook |
Fuego | atendido | cocinar | cook |
flambe |
Fuego | atendido | flambear | flambé, flambe |
heat |
Fuego | atendido | calentar | heat, warm |
blanch |
Fuego | atendido | escaldar, blanquear | blanch, scald |
grill |
Fuego | atendido | asar_a_la_plancha, asar_a_la_parrilla, planchear | grill, griddle |
boil |
Fuego | desatendido | cocer, hervir | boil |
simmer |
Fuego | desatendido | guisar, estofar | simmer, stew |
reduce |
Fuego | desatendido | reducir | reduce |
confit |
Fuego | desatendido | confitar | confit |
poach |
Fuego | desatendido | escalfar | poach |
braise |
Fuego | desatendido | brasear | braise |
steam |
Fuego | desatendido | cocer_al_vapor | steam |
bake |
Horno | desatendido | hornear | bake |
gratin |
Horno | desatendido | gratinar | gratin, gratinate, broil |
roast |
Horno | desatendido | asar | roast |
preheat |
Horno | desatendido | precalentar | preheat |
rest |
Reposo | desatendido | reposar | rest |
proof |
Reposo | desatendido | levar, fermentar | proof, prove, rise, ferment |
cool |
Reposo | desatendido | enfriar, templar | cool |
chill |
Reposo | desatendido | refrigerar | chill, refrigerate |
freeze |
Reposo | desatendido | congelar | freeze |
marinate |
Reposo | desatendido | marinar, macerar | marinate, macerate |
soak |
Reposo | desatendido | hidratar, remojar | soak, hydrate |
thaw |
Reposo | desatendido | descongelar | thaw, defrost |
infuse |
Reposo | desatendido | infusionar | infuse, steep |
Parámetros recomendados (se acepta cualquiera): Fuego @fuego:bajo|medio|alto / @heat:low|medium|high, @tapado / @covered; Horno @180ºC, @modo:ventilador|grill; Preparación @intensidad:…, @velocidad:N; Reposo @4ºC.
6. Notación visual: el Cooking Chart
| Elemento | Codificación |
|---|---|
| Tiempo | Eje X lineal y proporcional |
| Proceso | Barra de inicio a fin. Color = tipo de verbo. Rayado = desatendido. Línea blanca inferior = ruta crítica. |
| Ingrediente | Punto verde con nombre y cantidad, encima del proceso que lo consume, en el minuto en que entra |
| Intermedio | Banda que sale del proceso; nombre en cursiva (→ Sofrito) |
| Cantidad de materia | Grosor de banda ∝ √(ingredientes acumulados) |
| Dependencia en el carril | La banda continúa |
| Dependencia entre carriles | Afluente que desemboca por arriba o abajo en la barra consumidora, en el minuto at |
| Espera | Banda discontinua atenuada; en rojo la parte que excede lo que aguanta |
| Plato | Círculo dorado con el tiempo total |
| Recursos | Una franja por recurso bajo el gráfico ("Manos" siempre; "Fuegos" si se declaran). Altura = ocupación; rojo = exceso |
| Idioma | Los textos del gráfico usan el idioma de la receta |
Carriles. Desde el plato hacia atrás, el carril sigue por el afluente que llega más tarde. El resto forma sub-bloques alternando arriba y abajo, los que desembocan antes más cerca. Cada subárbol ocupa un bloque contiguo, así que no hay cruces por construcción.
Firma visual. El mismo gráfico sin texto y a escala común, para comparar recetas.
6.1 Vistas de texto (informativo)
La misma receta planificada se lee también como texto. Junto al gráfico forman una tríada:
| Vista | Para qué | Contenido |
|---|---|---|
| Gráfico | Ver el tiempo y el paralelismo | §6 |
| Plan de trabajo | Organizarse | Una fila por paso, por orden de inicio: minutos de inicio y fin, tipo, duración, atención, herramientas, parámetros, condición, tolerancia, entradas → salida y margen (o "crítico", o la espera que excede lo que aguanta) |
| Modo de elaboración | Cocinar leyendo | Ingredientes con cantidad, utensilios y frases en el orden en que se cocina, con enlaces |
Las tres salen del mismo modelo y del mismo plan: si cambia la planificación (plan justo_a_tiempo o el selector), cambian las tres. Nadie las escribe a mano.
Modo de elaboración.
- Momentos. Los pasos se agrupan por su minuto de inicio. Cada momento empieza con ese minuto (
0′,5′…) y el último dice el tiempo total y el plato. - Una frase por paso: verbo en imperativo, entradas, lugar, temperatura, fuego, duración, condición y resto de parámetros, "(sin vigilar)" si es desatendido,
→ resultadoy su tolerancia. Por ejemplo: Pocha las verduras picadas en la sartén a fuego bajo durante 10 min → sofrito. - Verbo. El imperativo (tú) de la forma que escribió el autor; si la escribió en otro idioma, el de la forma principal en el idioma de la receta. Los verbos de reposo (
rest,proof,cool,marinate,soak,infuse,thaw) se leen deja reposar….addcon varias entradas se lee añade X a Y, donde Y es la primera entrada. - Entradas. Los ingredientes con su cantidad (120 g de azúcar, ½ cdta de esencia), proporcional si se usa una parte; los intermedios con artículo (los huevos batidos); las partes de un intermedio en palabras (la mitad de la cebolla picada). Lo que entra a mitad de paso va en una frase aparte: A los 5 min, añade 100 ml de vino tinto.
- Lugar. Las herramientas con la preposición que escribió el autor (
en,con). Si una herramienta está en otro estado (horno_caliente), se nombra el estado: hornea … en el horno caliente. - Conectores. Mientras tanto cuando se cambia de tarea con otro paso aún en marcha; A la vez para los siguientes pasos de un mismo momento.
- Enlaces. Cada intermedio citado enlaza con la frase que lo produce; cada
→ resultado, con la frase que lo usa; cada ingrediente, con la lista. Al pasar por encima de una frase se resalta su paso en el gráfico, y al revés.
Artículos en español. Para escribir el horno o las tortillas hace falta el género y el número. El autor puede declararlos tras el nombre (§3.1):
herramientas
sartén (f), wok
masa "Masa de bizcocho" (f) = añadir(mezcla, harina) 5min
Si no los declara, se deducen del primer sustantivo con un léxico de cocina y las terminaciones habituales; si no hay certeza, la frase va sin artículo. En inglés no hacen falta.
Buscadores. Una implementación puede publicar la receta como schema.org/Recipe: recipeIngredient es la lista de ingredientes; recipeInstructions, una HowToStep por frase; totalTime, el tiempo total del plan; prepTime, el tiempo con las manos; además tool, recipeCuisine y recipeYield.
La redacción exacta no es normativa. Otra implementación puede escribir las frases a su manera, siempre que salgan del mismo plan y conserven el orden, las cantidades y los tiempos.
7. Validación
Cada diagnóstico tiene un código estable (undefinedName, cycle, unknownVerb…), que es lo normativo, y un mensaje en el idioma de la interfaz.
| Severidad | Casos |
|---|---|
| Error | nombre no definido · resultado producido dos veces · resultado con nombre de ingrediente · dependencia circular · falta la duración · sintaxis no reconocida · idioma o plan desconocidos · receta sin pasos |
| Aviso | paquete desconocido · tipo desconocido en @tipo · ingrediente sin usar · intermedio que ni se usa ni se sirve · verbo fuera del vocabulario · herramienta sin declarar · unidad desconocida · fracciones que no suman el total · condición sin duración · añadido tras el final del paso · falta servir · aguanta en el plato final |
| Aviso del plan | un intermedio espera más de lo que aguanta (§4.5) |
8. Distribución e incrustación
Un único fichero, cooking-chart.js (generado con python tools/build_embed.py), contiene el parser, el planificador, el dibujo y sus estilos. Carga d3 desde un CDN si la página no lo tiene. Expone el componente <cooking-chart> (Shadow DOM: los estilos de la web anfitriona no le afectan) y window.CookingChart.
<script src="https://HOST/static/embed/cooking-chart.js" defer></script>
<!-- 1. Receta en línea -->
<cooking-chart controls>
receta "Tortilla francesa"
...
</cooking-chart>
<!-- 2. Desde un fichero -->
<cooking-chart src="/recetas/lasaña.ccl" mode="jit"></cooking-chart>
<!-- 3. Markdown: cualquier bloque ```ccl se convierte solo -->
| Atributo | Valores |
|---|---|
src |
URL de un .ccl |
mode |
asap | jit (por defecto, el plan de la receta) |
lang |
es | en (por defecto, el idioma de la receta) |
controls |
muestra el selector de planificación |
variant |
signature: miniatura sin texto |
view |
chart (por defecto), method (modo de elaboración), plan (plan de trabajo); varias separadas por espacios, en el orden de sus pestañas, o all |
schema |
publica la receta como JSON-LD de schema.org/Recipe junto al elemento (§6.1) |
window.CookingChart ofrece parse, prepare, method (el modo de elaboración como datos) y schema (el JSON-LD) para quien quiera montar su propia vista.
Para plataformas sin scripts: <iframe src="https://HOST/e#ccl=…"> (la receta viaja en el hash y nunca llega al servidor) o exportar el SVG desde el editor.
9. Extensiones y conformidad
El estándar crece de tres formas, de más privada a más oficial.
9.1 Extensiones privadas: prefijo x-
Cualquiera puede usar parámetros y verbos propios con el prefijo x-, sin avisos y sin riesgo de chocar con versiones futuras del estándar:
crema = fundir(chocolate) @x-termometro:31ºC 15min
relleno = x-zarandear(crema) @tipo:montaje 2min
Un verbo x- (o cualquier verbo fuera del vocabulario) puede clasificarse con @tipo: / @kind: (preparación, montaje, fuego, horno, reposo). Así lo decide el autor y no el sistema por aproximación.
9.2 Paquetes de vocabulario
Un paquete amplía el vocabulario para un dominio: pastelería, cocina asiática, un robot de cocina concreto… La receta lo activa con usa "pastelería" / use "pastry".
- Los verbos de un paquete tienen identificadores con su prefijo (
pastry:temper) y formas en cada idioma. - Dentro de una receta que lo usa, el paquete tiene prioridad sobre el vocabulario base: en pastelería,
laminares hojaldrar (pastry:laminate), no cortar en láminas. - Un paquete desconocido produce un aviso, no un error: la receta sigue siendo legible.
Un tercero publica un paquete registrándolo en la implementación de referencia:
CookingLang.registerPack({
id: 'pastry', version: '0.1',
names: { es: 'pastelería', en: 'pastry' },
verbs: [
// [id, tipo, atención, formas en español, formas en inglés]
['temper', 'heat', 'active', 'atemperar', 'temper'],
['laminate', 'prep', 'active', 'laminar hojaldrar', 'laminate']
]
});
cooking-packs.js contiene el paquete pastry como ejemplo.
9.3 Propuestas a la especificación
Los cambios al núcleo (palabras clave, vocabulario base, semántica, notación) se proponen como CEP (CCL Enhancement Proposal), numeradas y discutidas en público. Una CEP aceptada entra en la siguiente versión menor de la especificación. Un paquete muy usado puede promocionarse al vocabulario base mediante una CEP.
9.4 Conformidad
Una implementación es conforme con CCL v0.2 si, para cada caso de conformance/cases/, produce el mismo modelo normalizado que el .json esperado: idioma, plan, recursos, ingredientes con unidad canónica mostrada, pasos (verbo canónico, tipo, atención, duraciones, tolerancia, herramientas, entradas con at y fracción, salida), género gramatical si se declara, plato final y diagnósticos (severidad, línea y código).
- La planificación es normativa cuando no hay recursos limitados (CPM: el resultado es único). Con recursos, el resultado de referencia es informativo: otra implementación puede usar otra heurística siempre que su plan sea factible y respete las tolerancias.
- Los mensajes de los diagnósticos no son normativos; sus códigos sí.
node conformance/run.js # comprobar
node conformance/run.js --update # regenerar los esperados tras un cambio aprobado
9.5 Licencias
La especificación y los casos de conformidad: CC BY 4.0 (LICENSE-SPEC). La implementación de referencia: Apache 2.0 (LICENSE). Los nombres "Cooking Chart" y "CCL": política de marca.
10. Decisiones abiertas (v0.3)
- Excepciones al fuego (microondas, Thermomix): marcarlo en la herramienta o en el paso.
- Ocupación de la herramienta durante la espera: un intermedio que espera en el cazo lo sigue ocupando.
- Atención parcial: "remover de vez en cuando" (
atendido:20%). - Escalado de raciones: cantidades proporcionales; duraciones que no escalan o escalan por tramos.
- Más idiomas: italiano y francés sobre los mismos identificadores canónicos.
- Salidas múltiples:
yemas, claras = separar(huevos). - Recursos con nombre para cocina profesional: partidas, roles, asignación de pasos a personas.
11. Trabajo relacionado
- Cooklang: marcado de recetas sobre prosa (
@ingrediente{cantidad},#utensilio,~{tiempo}). Es lineal: no modela intermedios, dependencias, paralelismo ni recursos. - Recipe flow graphs (Mori et al., LREC 2014): corpus de recetas anotadas como grafos de flujo. Valida la idea del grafo, pero no propone lenguaje ni notación.
- schema.org/Recipe: metadatos; las instrucciones son texto libre.
- Mermaid / PlantUML: el modelo de distribución (texto → diagrama incrustable).
- Gantt, Sankey, BPMN, redes de Petri, RCPSP/max: eje temporal y carriles; grosor de flujo; separación entre modelo y notación; semántica; planificación con recursos y desfases máximos.
Lo que aporta este trabajo: modelo, lenguaje bilingüe y notación forman un único estándar, el dibujo se obtiene sin intervención manual y se incrusta en cualquier web.