Skip to content

Instantly share code, notes, and snippets.

@Nullpo
Last active January 25, 2020 15:07
Show Gist options
  • Select an option

  • Save Nullpo/b52ba91bd2985c616b00 to your computer and use it in GitHub Desktop.

Select an option

Save Nullpo/b52ba91bd2985c616b00 to your computer and use it in GitHub Desktop.

TODO: English version... sorry!

Micro-gramatica para recetas (v0.1)

La idea de esta gramatica formal es estandarizar la definicion de recetas, para que sea facil a una computadora "entender" los requisitos para la misma.

El proyecto està muuuy verde, y por ahora divide los ingredientes, de los pasos a realizar. En siguientes versiones se agregaran:

[x] Pasos a realizar

[ ] Sinonimos de terminos (papa/patata por ej)

[x] Tecnicas utilizadas

[ ] Parseo de cantidades (3 Kg de papas, 2 atados de soja, 1 diente de ajo, etc)

[ ] Utencillos que se precisan.

[ ] Definicion de productos similares ("Si no tiene xxxxx puede utilizar yyyyy").

Definicion no-formal:

Toda receta debe ir en el siguiente formato:

(Titulo de la receta)
Ingredientes:
 - (ingrediente 1)
 - (ingrediente 2)
       ...
 - (ingrediente n)
 
Preparacion:
(texto de la preparaciòn)

Ejemplo:

Merengue.
Autor: Pablo Codeiro
Dificultad: facil
tiempo: 30 minutos
Ingredientes:
 - Huevos
 - Almibar
 - Pequeña sandia (2 Kg)

Preparacion:
 - Romper los huevos
 - Separar la clara
 - Batir la clara a punto de nieve
 - Mezclarla con el almibar.
 - Hornear la mezcla 20 minutos.
 - Colocarle una pequeña sandia, de 2 o 3 Kg.

Definicion de la gramatica (PEG):

Nota: La gramatica se muestra identada para una lectura mas facil.

receta ← nombre ingredientes preparacion
  nombre ← n:[^\n]+ "\n"
  ingredientes ← "Ingredientes"i ":"? "\s"* "\n"+ ingrediente+ 
    ingrediente ← " "* "-" [^\n]+ "\n"+
  preparacion ← "Preparacion"i ":"? "\n"+ (.+)
receta
= n:nombre inf:info* i:ingredientes p:preparacion {
return {
nombre: n,
info: inf,
ingredientes: i,
preparacion: p
}
}
/**** INFO ****/
info
= r:(autor / porciones / dificultad / tiempo / tecnicas)+ {
return r
}
autor = "Autor:"i r:untilEol eol+ { return {autor: r }; }
porciones = "Porciones:"i r:untilEol eol+ { return { porciones:r }; }
dificultad = "Dificultad:"i r:untilEol eol+ { return { dificultad: r } }
tiempo = "Tiempo:"i r:untilEol eol+ { return { tiempo: r } }
tecnicas
= "Tecnicas:" r:untilEol eol+ {
return {
tecnicas: r.split(",").map(function(e){
return e.trim();
})
}
}
/**************/
nombre = n:untilEol eol {
return n;
}
ingredientes
= "Ingredientes"i ":"? "\s"* eol+ i:ingrediente+ {
return i;
}
ingrediente
= " "* "-" "\s"* c1:number? i:[^\n\(]+ c2:( txt )? eol+ {
return {
elemento: i.join('').trim(),
cantidad: c1 || c2 || null
}
}
txt
= "\s"* "(" r:[^)]+ ")" { return r.join('').trim(); }
number
= r:[0-9]+ { return r.join('').trim(); }
preparacion
= "Preparacion"i ":"? eol+ prep:(paso)+ {
return prep;
}
paso
= " "* "-" s:untilEol eol* {
return s;
}
eol= "\n"
untilEol = r:[^\n]+ {
return r.join('').trim();
}
--------
Ejemplo respuesta:
{
"nombre": "Merengue.",
"info": [
[
{
"autor": "Pablo Codeiro"
},
{
"dificultad": "facil"
},
{
"tiempo": "30 minutos"
}
]
],
"ingredientes": [
{
"elemento": "Huevos",
"cantidad": null
},
{
"elemento": "Almibar",
"cantidad": null
},
{
"elemento": "Pequeña sandia",
"cantidad": "2 Kg"
}
],
"preparacion": [
"Romper los huevos",
"Separar la clara",
"Batir la clara a punto de nieve",
"Mezclarla con el almibar.",
"Hornear la mezcla 20 minutos.",
"Colocarle una pequeña sandia, de 2 o 3 Kg."
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment