HTML Preparation code:
x
 
1
<script>
2
const response = `[
3
  {
4
    "id": 1,
5
    "name": "Limonade de Coco",
6
    "servings": 1,
7
    "ingredients": [
8
      {
9
        "ingredient": "Lait de coco",
10
        "quantity": 400,
11
        "unit": "ml"
12
      },
13
      {
14
        "ingredient": "Jus de citron",
15
        "quantity": 2
16
      },
17
      {
18
        "ingredient": "Crème de coco",
19
        "quantity": 2,
20
        "unit": "cuillères à soupe"
21
      },
22
      {
23
        "ingredient": "Sucre",
24
        "quantity": 30,
25
        "unit": "g"
26
      },
27
      {
28
        "ingredient": "Glaçons"
29
      }
30
    ],
31
    "time": 10,
32
    "description": "Mettre les glaçons à votre goût dans le blender, ajouter le lait, la crème de coco, le jus de 2 citrons et le sucre. Mixer jusqu'à avoir la consistence désirée",
33
    "appliance": "blender",
34
    "ustensils": ["cuillère à soupe", "verres", "presse citron"]
35
  },
36
  {
37
    "id": 2,
38
    "name": "Poisson Cru à la tahitienne",
39
    "servings": 2,
40
    "ingredients": [
41
      {
42
        "ingredient": "Thon Rouge (ou blanc)",
43
        "quantity": 200,
44
        "unit": "g"
45
      },
46
      {
47
        "ingredient": "Concombre",
48
        "quantity": 1
49
      },
50
      {
51
        "ingredient": "Tomate",
52
        "quantity": 2
53
      },
54
      {
55
        "ingredient": "Carotte",
56
        "quantity": 1
57
      },
58
      {
59
        "ingredient": "Citron Vert",
60
        "quantity": 5
61
      },
62
      {
63
        "ingredient": "Lait de coco",
64
        "quantity": 100,
65
        "unit": "ml"
66
      }
67
    ],
68
    "time": 60,
69
    "description": "Découper le thon en dés, mettre dans un plat et recouvrir de jus de citron vert (mieux vaut prendre un plat large et peu profond). Laisser reposer au réfrigérateur au moins 2 heures. (Si possible faites-le le soir pour le lendemain. Après avoir laissé mariner le poisson, coupez le concombre en fines rondelles sans la peau et les tomates en prenant soin de retirer les pépins. Rayer la carotte. Ajouter les légumes au poissons avec le citron cette fois ci dans un Saladier. Ajouter le lait de coco. Pour ajouter un peu plus de saveur vous pouver ajouter 1 à 2 cuillères à soupe de Crème de coco",
70
    "appliance": "saladier",
71
    "ustensils": ["presse citron"]
72
  }, {
73
    "id": 3,
74
    "name": "Poulet coco réunionnais",
75
    "servings": 4,
76
    "ingredients": [
77
      {
78
        "ingredient": "Poulet",
79
        "quantity": 1
80
      },
81
      {
82
        "ingredient": "Lait de coco",
83
        "quantity": 400,
84
        "unit": "ml"
85
      },
86
      {
87
        "ingredient": "Coulis de tomate",
88
        "quantity": 25,
89
        "unit": "cl"
90
      },
91
      {
92
        "ingredient": "Oignon",
93
        "quantity": 1
94
      },
95
      {
96
        "ingredient": "Poivron rouge",
97
        "quantity": 1
98
      },
99
      {
100
        "ingredient": "Huile d'olive"
101
      }
102
    ],
103
    "time": 80,
104
    "description": "Découper le poulet en morceaux, les faire dorer dans une cocotte avec de l'huile d'olive. Salez et poivrez. Une fois doré, laisser cuire en ajoutant de l'eau. Au bout de 30 minutes, ajouter le coulis de tomate, le lait de coco ainsi que le poivron et l'oignon découpés en morceaux. Laisser cuisiner 30 minutes de plus. Servir avec du riz",
105
    "appliance": "cocotte",
106
    "ustensils": ["couteau"]
107
  }, {
108
    "id": 4,
109
    "name": "Salade de riz",
110
    "servings": 4,
111
    "ingredients": [
112
      {
113
        "ingredient": "Riz blanc",
114
        "quantity": 500,
115
        "unit": "g"
116
      },
117
      {
118
        "ingredient": "Thon en miettes",
119
        "quantity": 200,
120
        "unit": "g"
121
      }, {
122
        "ingredient": "Tomate",
123
        "quantity": 2
124
      },
125
      {
126
        "ingredient": "Oeuf dur",
127
        "quantity": 2
128
      },
129
      {
130
        "ingredient": "Maïs",
131
        "quantity": 300,
132
        "unit": "g"
133
      },
134
      {
135
        "ingredient": "Vinaigrette",
136
        "quantity": 5,
137
        "unit": "cl"
138
      }
139
    ],
140
    "time": 50,
141
    "description": "Faire cuire le riz. Une fois le riz cuit, le laisser refroidir. Couper les oeufs dur en quarts ou en lamelle au choix, coupez le tomates en dés, ajouter au riz les oeufs, les tomates, le poisson, le maïs et la vinaigrette. Ajouter au gout de chacun des corniches, olives etc..",
142
    "appliance": "cuiseur de riz",
143
    "ustensils": ["saladier", "passoire"]
144
  },
145
  {
146
    "id": 5,
147
    "name": "Tarte au thon",
148
    "servings": 4,
149
    "ingredients": [
150
      {
151
        "ingredient": "Pâte feuilletée",
152
        "quantity": 1
153
      },
154
      {
155
        "ingredient": "Thon en miettes",
156
        "quantity": 130,
157
        "unit": "g"
158
      },
159
      {
160
        "ingredient": "Tomate",
161
        "quantity": 2
162
      },
163
      {
164
        "ingredient": "Crème fraîche",
165
        "quantity": 2,
166
        "unit": "cuillères à soupe"
167
      },
168
      {
169
        "ingredient": "Gruyère râpé",
170
        "quantity": 100,
171
        "unit": "g"
172
      },
173
      {
174
        "ingredient": "Moutarde de Dijon",
175
        "quantity": 1,
176
        "unite": "cuillères à soupe"
177
      }
178
    ],
179
    "time": 45,
180
    "description": "Etaler la pâte feuilleté aux dimensions du moule, étaler la moutarde sur la pâte feuilleté, ajouter le thon. Découper les tomates en rondelles et les poser sur le poisson, ajouter un peu de crème fraiche sur toute la tarte et recouvrez de gruyère râpé. Cuire au four 30 minutes",
181
    "appliance": "four",
182
    "ustensils": ["moule à tarte", "râpe à fromage", "couteau"]
183
  },
184
  {
185
    "id": 6,
186
    "name": "Tarte aux pommes",
187
    "servings": 6,
188
    "ingredients": [
189
      {
190
        "ingredient": "Pâte brisée",
191
        "quantity": 1
192
      },
193
      {
194
        "ingredient": "Pomme",
195
        "quantity": 3
196
      },
197
      {
198
        "ingredient": "Oeuf",
199
        "quantity": "2"
200
      },
201
      {
202
        "ingredient": "Crème fraîche",
203
        "quantity": 25,
204
        "unit": "cl"
205
      },
206
      {
207
        "ingredient": "Sucre en poudre",
208
        "quantity": 100,
209
        "unit": "g"
210
      },
211
      {
212
        "ingredient": "Sucre vanillé",
213
        "quantity": 1,
214
        "unit": "sachets"
215
216
      }
217
    ],
218
    "time": 50,
219
    "description": "Commencez par mélanger les oeufs le sucre et le sucre vanillé dans un saladier, découper les pommes en tranches, ajouter la crème fraiche aux oeufs. Une fois que tout est pret, étalez la tarte dans le moule. N'oubliez pas de piquer le fond avec une fourchette avant depositionner les pommes sur la tarte. Finalement verser la préparation à base d'oeufs et de crême fraiche. Laisser cuire au four pendant 30 minutes",
220
    "appliance": "four",
221
    "ustensils": ["moule à tarte", "saladier", "fourchette"]
222
  }, {
223
    "id": 7,
224
    "name": "Tartelettes au chocolat et aux fraises",
225
    "servings": 6,
226
    "ingredients": [
227
      {
228
        "ingredient": "Pâte sablée",
229
        "quantity": 1
230
      },
231
      {
232
        "ingredient": "Chocolat au lait",
233
        "quantity": 300,
234
        "unit": "g"
235
      },
236
      {
237
        "ingredient": "Crème liquide",
238
        "quantity": 80,
239
        "unit": "cl"
240
      },
241
      {
242
        "ingredient": "Beurre",
243
        "quantity": "30",
244
        "unit": "g"
245
      },
246
      {
247
        "ingredient": "Fraise",
248
        "quantity": 6
249
      }
250
    ],
251
    "time": 50,
252
    "description": "Etaler la pate dans les moules à tartelette. Faire cuire la pate 30 minutes. Découper le chocolat en morceau et le faire chauffer, y ajouter la crême liquide, ajouter le beurre et remuer jusqu'à avoir une pâte homogène. Verser la pate sur les tartelettes. Couper les fraises en 2 et les positionner sur ",
253
    "appliance": "four",
254
    "ustensils": ["moule à tartelettes (6)", "casserole"]
255
  }, {
256
    "id": 8,
257
    "name": "Brownie",
258
    "servings": 10,
259
    "ingredients": [
260
      {
261
        "ingredient": "Noix",
262
        "quantity": "180",
263
        "unit": "g"
264
      },
265
      {
266
        "ingredient": "Chocolat noir",
267
        "quantity": 150,
268
        "unit": "g"
269
      },
270
      {
271
        "ingredient": "Beurre",
272
        "quantity": 120,
273
        "unit": "g"
274
      },
275
      {
276
        "ingredient": "Oeuf",
277
        "quantity": 2
278
      },
279
      {
280
        "ingredient": "Sucre en poudre",
281
        "quantity": "110",
282
        "unit": "g"
283
      },
284
      {
285
        "ingredient": "Farine",
286
        "quantity": 90,
287
        "unit": "g"
288
      }
289
290
    ],
291
    "time": 60,
292
    "description": "Hachez les noix grossièrement. Faire fondre le chocolat avec le beurre. Mélanger les oeuf et le sucre et mélanger au chocolat. Ajouter la farine. Mélanger afin d'avoir quelque chose d'homogène puis incorporer les noix. Verser la préparation dans un moule de préférence rectangulaire. Cuire 2O à 25 minutes à 180°. Sortez du four et attendez quelques minutes pour démouler. Servir avec une boule de glace pour plus de gourmandise.",
293
    "appliance": "four",
294
    "ustensils": ["moule à gateaux", "casserole"]
295
  },
296
  {
297
    "id": 9,
298
    "name": "Salade Méditerannéene fraiche au chèvre",
299
    "servings": 4,
300
    "ingredients": [
301
      {
302
        "ingredient": "Concombre",
303
        "quantity": 1
304
      },
305
      {
306
        "ingredient": "Olives"
307
      },
308
      {
309
        "ingredient": "Fromage de chèvre",
310
        "quantity": 150,
311
        "unit": "g"
312
      },
313
      {
314
        "ingredient": "Vinaigre Balsamic"
315
      },
316
      {
317
        "ingredient": "Huile d'olive"
318
      },
319
      {
320
        "ingredient": "Basilic"
321
      }
322
    ],
323
    "time": 15,
324
    "description": "Peler le concombre le couper 2, retirer les pépins. Couper les olives en morceaux, ainsi que le fromage de chèvre. Ajouter le basilic ainsi que le vinaigre balsamic et l'huile d'olives à votre gout.",
325
    "appliance": "saladier",
326
    "ustensils": ["cuillère en bois", "couteau"]
327
  },
328
  {
329
    "id": 10,
330
    "name": "Tartiflette",
331
    "servings": 4,
332
    "ingredients": [
333
      {
334
        "ingredient": "Roblochon",
335
        "quantity": "1"
336
      },
337
      {
338
        "ingredient": "Pomme de terre",
339
        "quantity": 4.5,
340
        "unit": "kg"
341
      },
342
      {
343
        "ingredient": "Jambon fumé",
344
        "quantity": 2,
345
        "unit": "tranches"
346
      },
347
      {
348
        "ingredient": "Oignon",
349
        "quantity": 300,
350
        "unit": "g"
351
      },
352
      {
353
        "ingredient": "Vin blanc sec",
354
        "quantity": 30,
355
        "unit": "cl"
356
      }
357
    ],
358
    "time": 60,
359
    "description": "Commencer par cuire les pommes de terre dans l'eau bouillante. Puis epluchez les et coupez les en rondelles. Emincer les oignons puis les faire dorer dans du beurre. Ajouter le jambon fumé coupé en en morceaux ainsi que les pommes de terres. Salez, poivrez à votre gout ( et celui de vos convives ) Laissez cuisiner durant environ 10 minutes puis ajouter le vin blanc. Après 5 minutes, mettre le tout dans un plat à gratin. Coupez le rebelochon, soit en tranches, soit le couper en 2 dans le sens de l'épaisseur et recouvrir les pommes de terre. Cuire au four (environ 220°) durant 25 minutes. C'est prêt !",
360
    "appliance": "four",
361
    "ustensils": ["plat à gratin", "couteau", "économe"]
362
  }, {
363
    "id": 11,
364
    "name": "Salade tomate, mozzarella et pommes",
365
    "servings": 4,
366
    "ingredients": [
367
      {
368
        "ingredient": "Tomates cerises",
369
        "quantity": 250,
370
        "unit": "g"
371
      },
372
      {
373
        "ingredient": "Mozzarella",
374
        "quantity": 150,
375
        "unit": "g"
376
      },
377
      {
378
        "ingredient": "Jambon de parme",
379
        "quantity": 4,
380
        "unit": "tranches"
381
      },
382
      {
383
        "ingredient": "Pomme",
384
        "quantity": 1
385
      },
386
      {
387
        "ingredient": "Salade Verte",
388
        "quantity": 1
389
      },
390
      {
391
        "ingredient": "Vinaigrette",
392
        "quantity": 5,
393
        "unit": "cl"
394
      }
395
    ],
396
    "time": 10,
397
    "description": "Commencer par couper les feuilles de salade, ajouter les tomates cerises et le fromage découpé en cubes ou en boules avec la cuillère à melon. Découper le jambon de parme en fines lamelles. Ajouter la pomme elle aussi découpée en petit morceaux. Assaisonnez à votre gout. ",
398
    "appliance": "saladier",
399
    "ustensils": ["couteau", "cuillère à melon"]
400
  }, {
401
    "id": 12,
402
    "name": "Compote pomme rhubarbe",
403
    "servings": 4,
404
    "ingredients": [
405
      {
406
        "ingredient": "Rhubarbe",
407
        "quantity": 160,
408
        "unit": "g"
409
      },
410
      {
411
        "ingredient": "Pomme",
412
        "quantity": 8
413
      },
414
      {
415
        "ingredient": "Sucre vanillé",
416
        "quantity": 6,
417
        "unit": "sachets"
418
      },
419
      {
420
        "ingredient": "Eau",
421
        "quantity": "0.5",
422
        "unit": "tasses"
423
      }
424
    ],
425
    "time": 40,
426
    "description": "Éplucher les fruits et les couper en morceaux, les mettre dans une casserole en ajoutant l'eau et le sucre vanillé. Laisser cuire 15 minutes en remuant régulièrement.",
427
    "appliance": "casserole",
428
    "ustensils": ["couteau", "économe"]
429
  },
430
  {
431
    "id": 13,
432
    "name": "Salade mâchée de patates",
433
    "servings": 2,
434
    "ingredients": [
435
      {
436
        "ingredient": "Mâche",
437
        "quantity": 60,
438
        "unit": "g"
439
      },
440
      {
441
        "ingredient": "Pomme de terre",
442
        "quantity": 200,
443
        "unit": "g"
444
      },
445
      {
446
        "ingredient": "Échalote",
447
        "quantity": 2
448
449
      },
450
      {
451
        "ingredient": "Vinaigre de cidre",
452
        "quantity": 1,
453
        "unit": "cuillère à soupe"
454
      },
455
      {
456
        "ingredient": "Huile d'olive",
457
        "quantity": 2,
458
        "unit": "cuillère à soupe"
459
      }
460
    ],
461
    "time": 40,
462
    "description": "Cuire les pommes de terre environ 30 minutes. Découper les échalottes finement. Durant la cuisson des pommes de terre. Préparez la vinaigrette avec l'huile d'olive et le vinaigre de cidre. Salez poivrez à discrétion. Dans un saladier, mettre le mâche. Ajouter",
463
    "appliance": "casserole",
464
    "ustensils": ["couteau", "saladier", "cuillère en bois"]
465
  },
466
  {
467
    "id": 14,
468
    "name": "Galette Bretonne Saucisse et Fromage à raclette",
469
    "servings": 2,
470
    "ingredients": [
471
      {
472
        "ingredient": "Saucisse bretonne ou de toulouse",
473
        "quantity": 2
474
      },
475
      {
476
        "ingredient": "Farine de blé noir",
477
        "quantity": 130,
478
        "unit": "g"
479
      },
480
      {
481
        "ingredient": "Oeuf",
482
        "quantity": 1
483
484
      },
485
      {
486
        "ingredient": "Fromage à raclette",
487
        "quantity": 300,
488
        "unit": "g"
489
      },
490
      {
491
        "ingredient": "Oignon",
492
        "quantity": 1
493
      },
494
      {
495
        "ingredient": "Beurre",
496
        "quantity": 75,
497
        "unit": "g"
498
      }
499
500
    ],
501
    "time": 100,
502
    "description": "Mélanger la farine et les oeufs, faire fondre 25 grammes de beurre et ajouter à la pâte. Ajouter du sel. Laisser reposer 1 heure. Faire les galettes et laisser refroidire. Faire chauffer les saucisses avec du beurre et l'oignon. Enrouler les saucisses dans les crêpes avec une partie du fromage. Mettre le reste du fromage à raclette par dessus les crêpes. Passer four pendant 20 minutes",
503
    "appliance": "four",
504
    "ustensils": ["poêle à frire", "couteau"]
505
  },
506
  {
507
    "id": 15,
508
    "name": "Crêpes Chocolat Banane",
509
    "servings": 10,
510
    "ingredients": [
511
      {
512
        "ingredient": "Oeuf",
513
        "quantity": 3
514
      },
515
      {
516
        "ingredient": "Farine",
517
        "quantity": 250,
518
        "unit": "g"
519
      },
520
      {
521
        "ingredient": "Lait",
522
        "quantity": 600,
523
        "unit": "ml"
524
      },
525
      {
526
        "ingredient": "Beurre salé",
527
        "quantity": 30,
528
        "unit": "g"
529
      },
530
      {
531
        "ingredient": "Chocolat au lait",
532
        "quantity": 100,
533
        "unit": "g"
534
      },
535
      {
536
        "ingredient": "Banane",
537
        "quantity": 4
538
      }
539
    ],
540
    "time": 60,
541
    "description": "Mélangez dans un saladier, la farine, les oeufs, et le lait. Battez jusqu'à avoir une masse homogène. Pendant ce temps faites fondre le beurre et ajoutez en une partie à la pâte à crêpes. Faire fondre le chocolat ( avec le reste du beurre salé ). Lorsque vous chauffez les crêpes. Ajouter le chocolat fondu et les bananes coupées en rondelles. Ajoutez une touche de chantilly pour les gourmands",
542
    "appliance": "poële à crêpe",
543
    "ustensils": ["saladier", "louche", "cuillère en bois"]
544
  },
545
  {
546
    "id": 16,
547
    "name": "Gratin de pâtes à la tomate",
548
    "servings": 2,
549
    "ingredients": [
550
      {
551
        "ingredient": "Tomate",
552
        "quantity": 500,
553
        "unit": "g"
554
      },
555
      {
556
        "ingredient": "Mozzarella",
557
        "quantity": 250,
558
        "unit": "g"
559
      },
560
      {
561
        "ingredient": "Pennes",
562
        "quantity": 500,
563
        "unit": "g"
564
      },
565
      {
566
        "ingredient": "Basilic",
567
        "quantity": 1,
568
        "unit": "tiges"
569
      },
570
      {
571
        "ingredient": "Huile d'olive",
572
        "quantity": 2,
573
        "unit": "cuillère à soupe"
574
      }
575
    ],
576
    "time": 45,
577
    "description": "Faire cuire les pâtes si vous n'avez pas de pennes des coquillettes peuvent faire l'affaire. Découper les tomates en petits morceaux, soit en tranches soit en dés. Coupez le basilic en petites morceaux et mélangez le aux tomates.  Coupez la mozzarella en tranche. Préchauffez le four à 200°. Alternez entre couches de pattes et couches de tomates, terminez par une couche de pates et recouvrir du fromage. Laisser au four 30 minutes et régalez vous ! Une recette simple qui fera plaisir au petits comme aux grands.",
578
    "appliance": "four",
579
    "ustensils": ["plat à gratin", "couteau", "râpe à fromage"]
580
  },
581
  {
582
    "id": 17,
583
    "name": "Smoothie à la fraise",
584
    "servings": 6,
585
    "ingredients": [
586
      {
587
        "ingredient": "Fraise",
588
        "quantity": 500,
589
        "unit": "g"
590
      },
591
      {
592
        "ingredient": "Pastèque",
593
        "quantity": 0.5
594
      },
595
      {
596
        "ingredient": "Jus de citron",
597
        "quantity": 1,
598
        "unit": "cuillères à soupe"
599
      },
600
      {
601
        "ingredient": "Glaçons",
602
        "quantity": 8
603
      },
604
      {
605
        "ingredient": "Menthe"
606
      }
607
    ],
608
    "time": 15,
609
    "description": "Coupez les fraises en morceaux, découpez la chaire de la pastèque en retirant les pépins. Mettre le tout dans le blender. Ajouter un cuillère à soupe de juste de citron ainsi que les glaçons. Ajoutez quelques fueilles de menthe pour plus de fraicheur. Mixez le tout. Servir et déguster.",
610
    "appliance": "blender",
611
    "ustensils": ["verres", "couteau", "presse citron"]
612
  },
613
  {
614
    "id": 18,
615
    "name": "Smoothie ananas et vanille",
616
    "servings": 5,
617
    "ingredients": [
618
      {
619
        "ingredient": "Ananas",
620
        "quantity": 1
621
      },
622
      {
623
        "ingredient": "Glace à la vanille",
624
        "quantity": 500,
625
        "unit": "ml"
626
      },
627
      {
628
        "ingredient": "Lait",
629
        "quantity": 50,
630
        "unit": "cl"
631
      }
632
    ],
633
    "time": 10,
634
    "description": "Séparez 1/5ème d'Ananas ( une belle tranche qui servira pour la décoration des verres ), mettre le reste coupé en cubes au blender, ajouter la glace à la vanille et le lait. Mixez. Servir et décorer avec l'ananas restant. C'est prêt",
635
    "appliance": "blender",
636
    "ustensils": ["verres", "couteau"]
637
  },
638
  {
639
    "id": 19,
640
    "name": "Shake Banane Kiwi",
641
    "servings": 4,
642
    "ingredients": [
643
      {
644
        "ingredient": "Kiwi",
645
        "quantity": 4
646
      },
647
      {
648
        "ingredient": "Citron",
649
        "quantity": 1
650
      },
651
      {
652
        "ingredient": "Lait",
653
        "quantity": 1,
654
        "unit": "litres"
655
      },
656
      {
657
        "ingredient": "Sucre glace",
658
        "quantity": 30,
659
        "unit": "g"
660
      },
661
      {
662
        "ingredient": "Banane",
663
        "quantity": 1
664
      }
665
    ],
666
    "time": 0,
667
    "description": "Coupez les fruits en morceaux, ajouter le jus de citron et le lait ainsi que le sucre glace. Mixez. Ajoutez des glaçons si le lait n'a pas été mis au frais.",
668
    "appliance": "blender",
669
    "ustensils": ["couteau", "verres", "presse citron"]
670
  },
671
  {
672
    "id": 20,
673
    "name": "Pates Carbonara",
674
    "servings": 5,
675
    "ingredients": [
676
      {
677
        "ingredient": "Tagliatelles",
678
        "quantity": 500,
679
        "unit": "g"
680
      },
681
      {
682
        "ingredient": "Lardons",
683
        "quantity": 150,
684
        "unit": "g"
685
      },
686
      {
687
        "ingredient": "Crème fraîche",
688
        "quantity": 200,
689
        "unit": "g"
690
      },
691
      {
692
        "ingredient": "Parmesan",
693
        "quantity": 100,
694
        "unit": "g"
695
      },
696
      {
697
        "ingredient": "Huile d'olive",
698
        "quantity": 1,
699
        "unit": "cuillères à soupe"
700
      }
701
    ],
702
    "time": 30,
703
    "description": "Faire cuire les pates comme indiqué sur le paquet. Dorer les lardons dans une sauteuse avec l'huile d'olive. Ajouter la crême fraiche et baisser le feu au minimum. Quand les Tagliatelles sont prêtes les mettre dans la sauteuse et bien mélanger le tout en ajoutant le jaune d'oeuf. Servir et ajouter le parmesan râpé.",
704
    "appliance": "sauteuse",
705
    "ustensils": ["râpe à fromage", "cuillère en bois"]
706
  },
707
  {
708
    "id": 21,
709
    "name": "Spaghettis à la bolognaise",
710
    "servings": 4,
711
    "ingredients": [
712
      {
713
        "ingredient": "Spaghettis",
714
        "quantity": 400,
715
        "unit": "g"
716
      },
717
      {
718
        "ingredient": "Oignon",
719
        "quantity": 2
720
      },
721
      {
722
        "ingredient": "Coulis de tomate",
723
        "quantity": 300,
724
        "unit": "g"
725
      },
726
      {
727
        "ingredient": "Viande hachée 1% de matière grasse",
728
        "quantity": 400,
729
        "unit": "g"
730
      },
731
      {
732
        "ingredient": "Vin rouge",
733
        "quantity": 20,
734
        "unit": "cl"
735
      },
736
      {
737
        "ingredient": "Crème fraîche",
738
        "quantity": 1,
739
        "unit": "cuillères à soupe"
740
      }
741
    ],
742
    "time": 30,
743
    "description": "Cuisiner la viande hachée dans une poêle à frire. Dans une autre faire cuire les oignons découpés en fins dés avec un peu de beurre. Ajouter du vin rouge. Mélanger les oigons avec la viande hachée. Faire cuire les pates le temps indiqué sur le paquet. Ajouter le coulis de tomates à la viande hachée. Une fois que les pates sont cuites, ajouter la crème fraiche à la viande hachée. Serivir.",
744
    "appliance": "casserole",
745
    "ustensils": ["cuillère en bois", "louche", "couteau"]
746
  },
747
  {
748
    "id": 22,
749
    "name": "Fondant au chocolat",
750
    "servings": 4,
751
    "ingredients": [
752
      {
753
        "ingredient": "Beurre",
754
        "quantity": 160,
755
        "unit": "g"
756
      },
757
      {
758
        "ingredient": "Chocolat noir",
759
        "quantity": 200,
760
        "unit": "g"
761
      },
762
      {
763
        "ingredient": "Farine",
764
        "quantity": 50,
765
        "unit": "g"
766
      },
767
      {
768
        "ingredient": "Oeuf",
769
        "quantity": 4
770
      },
771
      {
772
        "ingredient": "Sucre",
773
        "quantity": 150,
774
        "unit": "g"
775
      }
776
    ],
777
    "time": 30,
778
    "description": "Faire fondre le chocolat et le beurre au bain marie. Dans un saladier battre les oeufs avec le sucre jusqu'à obtenir une texture de type mousse. Ajouter la farine ainsi que le mélange de beurre et chocolat fondu. Beurrez le moule à gateaux. Mettre au four préchauffé à 200° puis faites chauffer pendant 15 minutes. C'est prêt. Servir avec une boule de glace ou une crême dessert.",
779
    "appliance": "four",
780
    "ustensils": ["moule à gateaux", "fouet", "casserole"]
781
  },
782
  {
783
    "id": 23,
784
    "name": "Quiche lorraine",
785
    "servings": 4,
786
    "ingredients": [
787
      {
788
        "ingredient": "Pâte brisée",
789
        "quantity": 200,
790
        "unit": "g"
791
      },
792
      {
793
        "ingredient": "Lardons",
794
        "quantity": 200,
795
        "unit": "g"
796
      },
797
      {
798
        "ingredient": "Beurre",
799
        "quantity": 30,
800
        "unit": "g"
801
      },
802
      {
803
        "ingredient": "Oeuf",
804
        "quantity": 3
805
      },
806
      {
807
        "ingredient": "Crème fraîche",
808
        "quantity": 20,
809
        "unit": "cl"
810
      },
811
      {
812
        "ingredient": "Lait",
813
        "quantity": 20,
814
        "unit": "cl"
815
      }
816
    ],
817
    "time": 60,
818
    "description": "Etaler la pate dans un moule et la piquer.Parsemer de beurre. Faire chauffer les lardon dans une poêle. Battre les oeufs en ajoutant la crème fraîche et le lait. Finalement ajouter les lardons, salez poivrez à votre gout. Verser l'ensemble sur la pâte. Cuire environ 50 minutes.",
819
    "appliance": "four",
820
    "ustensils": ["moule à gateaux", "rouleau à patisserie", "fouet"]
821
  },
822
  {
823
    "id": 24,
824
    "name": "Salade de pâtes",
825
    "servings": 4,
826
    "ingredients": [
827
      {
828
        "ingredient": "Thon en miettes",
829
        "quantity": 160,
830
        "unit": "g"
831
      },
832
      {
833
        "ingredient": "Maïs",
834
        "quantity": 60,
835
        "unit": "g"
836
      },
837
      {
838
        "ingredient": "Tomate",
839
        "quantity": 1
840
      },
841
      {
842
        "ingredient": "Concombre",
843
        "quantity": 0.5
844
      },
845
      {
846
        "ingredient": "Macaronis",
847
        "quantity": 300,
848
        "unit": "g"
849
      },
850
      {
851
        "ingredient": "Mayonnaise",
852
        "quantity": 2,
853
        "unit": "cuillères à soupe"
854
      }
855
    ],
856
    "time": 40,
857
    "description": "Découper le concombre et les tomates en dés, les mettre dans un saladier avec le mais et les miettes de poisson, ajouter les pates. Ajouter la mayonnaise. Mélanger le tout et servir frais.",
858
    "appliance": "saladier",
859
    "ustensils": ["couteau", "cuillère en bois"]
860
  },
861
  {
862
    "id": 25,
863
    "name": "Cookies",
864
    "servings": 4,
865
    "ingredients": [
866
      {
867
        "ingredient": "Sucre",
868
        "quantity": 100,
869
        "unit": "g"
870
      },
871
      {
872
        "ingredient": "Beurre",
873
        "quantity": 100,
874
        "unit": "g"
875
      },
876
      {
877
        "ingredient": "Farine",
878
        "quantity": 100,
879
        "unit": "g"
880
      },
881
      {
882
        "ingredient": "Chocolat noir en pepites",
883
        "quantity": 100,
884
        "unit": "g"
885
      },
886
      {
887
        "ingredient": "Oeuf",
888
        "quantity": 1
889
      }
890
    ],
891
    "time": 30,
892
    "description": "Faire fondre le beurre et le mélanger avec le sucre. Finalement ajouter l'oeuf. Ajouter la farine tout en mélangeant peu pa peu pour avoir une masse sans grumaux. Ajouter les pépites de chocolat. Faire, une plaque de cuisson de petites boules pour les cookies. Mettre au four à 180° pour 10 minutes.",
893
    "appliance": "four",
894
    "ustensils": ["fouet", "saladier", "plaque de cuisson"]
895
  },
896
  {
897
    "id": 26,
898
    "name": "Soupe de tomates",
899
    "servings": 2,
900
    "ingredients": [
901
      {
902
        "ingredient": "Tomate",
903
        "quantity": 6
904
      },
905
      {
906
        "ingredient": "Pomme de terre",
907
        "quantity": 1
908
      },
909
      {
910
        "ingredient": "Huile d'olive"
911
      },
912
      {
913
        "ingredient": "Oignon",
914
        "quantity": 1
915
      },
916
      {
917
        "ingredient": "Ail",
918
        "quantity": 1,
919
        "unit": "gousses"
920
      }
921
    ],
922
    "time": 25,
923
    "description": "Verser de l'huile dans une cocotte minute couper les légumes et les verser dans l'huile chaude. Laisser cuire et remuer pendant 10 minutes. Passer aux mixer. Servir.",
924
    "appliance": "mixer",
925
    "ustensils": ["cocotte minute", "couteau"]
926
  },
927
  {
928
    "id": 27,
929
    "name": "Soupe à l'oseille",
930
    "servings": 4,
931
    "ingredients": [
932
      {
933
        "ingredient": "Oseille",
934
        "quantity": 2
935
      },
936
      {
937
        "ingredient": "Oeuf",
938
        "quantity": 1
939
      },
940
      {
941
        "ingredient": "Crème fraîche",
942
        "quantity": 4,
943
        "unit": "cuillère à soupe"
944
      },
945
      {
946
        "ingredient": "Vermicelles",
947
        "quantity": 1,
948
        "unit": "verres"
949
      },
950
      {
951
        "ingredient": "Beurre salé",
952
        "quantity": 50,
953
        "unit": "g"
954
      }
955
    ],
956
    "time": 15,
957
    "description": "Faire fondre l'oseille avec du beurre demi sel, ajouter un litre d'eau. Ajouter les vermicelles. Laisser cuire. une fois prêt, sortir du feu et après 5 minutes ajouter le jaune d'oeuf et la crême fraîche",
958
    "appliance": "casserole",
959
    "ustensils": ["couteau", "cuillère en bois"]
960
  },
961
  {
962
    "id": 28,
963
    "name": "Soupe de poireaux",
964
    "servings": 4,
965
    "ingredients": [
966
      {
967
        "ingredient": "Poireau",
968
        "quantity": 3
969
      },
970
      {
971
        "ingredient": "Pomme de terre",
972
        "quantity": 400,
973
        "unit": "g"
974
      },
975
      {
976
        "ingredient": "Oseille",
977
        "quantity": 75,
978
        "unit": "g"
979
      },
980
      {
981
        "ingredient": "Beurre",
982
        "quantity": 50,
983
        "unit": "g"
984
      },
985
      {
986
        "ingredient": "Crème fraîche",
987
        "quantity": 10,
988
        "unit": "cl"
989
      }
990
    ],
991
    "time": 80,
992
    "description": "Emincer les blanc de poireaux et les faire chauffer dans 25 grammes de beurre. AJouter les pommes de terres coupées en morceaux. Ajouter l'eau et laisser mijoter pour 45 minutes. Chauffer l'oseille avec le beurre restant puis incorporer le tout. Mixez. Ajoutez la crème. Bon appetit.",
993
    "appliance": "mixer",
994
    "ustensils": ["casserole", "couteau"]
995
  },
996
  {
997
    "id": 29,
998
    "name": "Houmous Express",
999
    "servings": 2,
1000
    "ingredients": [
1001
      {
1002
        "ingredient": "Pois chiches",
1003
        "quantity": 1,
1004
        "unit": "boites"
1005
      },
1006
      {
1007
        "ingredient": "Ail",
1008
        "quantity": 1,
1009
        "unit": "gousses"
1010
      },
1011
      {
1012
        "ingredient": "Citron",
1013
        "quantity": 2
1014
      },
1015
      {
1016
        "ingredient": "Huile d'olive"
1017
      },
1018
      {
1019
        "ingredient": "Paprika"
1020
      }
1021
    ],
1022
    "time": 30,
1023
    "description": "Prendre les pois chiches, les mettre dans le mixer avec de l'huile d'olive, ajouter le jus des 2 citrons et du paprika selon le gout.",
1024
    "appliance": "mixer",
1025
    "ustensils": ["cuillère en bois", "presse citron"]
1026
  },
1027
  {
1028
    "id": 30,
1029
    "name": "Purée de pois cassés",
1030
    "servings": 4,
1031
    "ingredients": [
1032
      {
1033
        "ingredient": "Pois Cassé",
1034
        "quantity": 500,
1035
        "unit": "g"
1036
      },
1037
      {
1038
        "ingredient": "Oignon",
1039
        "quantity": 1
1040
      },
1041
      {
1042
        "ingredient": "Ail",
1043
        "quantity": 2,
1044
        "unit": "gousses"
1045
      }
1046
    ],
1047
    "time": 60,
1048
    "description": "Mettre tous les ingrédients dans une cocotte. ajouter de l'eau pour recouvrir l'ensemble et laisser cuire à petit feu pour 1 heure. Passer au mixer. Salez, poivrez. C'est prêt",
1049
    "appliance": "mixer",
1050
    "ustensils": ["casserole", "cuillère en bois"]
1051
  },
1052
  {
1053
    "id": 31,
1054
    "name": "Jardinière de légumes",
1055
    "servings": 4,
1056
    "ingredients": [
1057
      {
1058
        "ingredient": "Carotte",
1059
        "quantity": 2
1060
      },
1061
      {
1062
        "ingredient": "Pomme de terre",
1063
        "quantity": 2
1064
      },
1065
      {
1066
        "ingredient": "Haricots verts",
1067
        "quantity": 150,
1068
        "unit": "g"
1069
      },
1070
      {
1071
        "ingredient": "Petits poids",
1072
        "quantity": 100,
1073
        "unit": "g"
1074
      },
1075
      {
1076
        "ingredient": "Lardons",
1077
        "quantity": 150,
1078
        "unit": "g"
1079
      }
1080
    ],
1081
    "time": 60,
1082
    "description": "Découper en cubes les carottes et pommes de terre. Faire revenir dans du beurre. Ajouter les lardons, une fois les lardons dorés, ajouter un grand verre d'eau. Ajouter les petit poids et les haricots verts ( tous deux pré cuits ). Ajouter Sel, poivre, thyms et laurier",
1083
    "appliance": "poële",
1084
    "ustensils": ["couteau", "économe"]
1085
  },
1086
  {
1087
    "id": 32,
1088
    "name": "Croque Monsieur à la dinde",
1089
    "servings": 4,
1090
    "ingredients": [
1091
      {
1092
        "ingredient": "Pain de mie",
1093
        "quantity": 8,
1094
        "unit": "tranches"
1095
      },
1096
      {
1097
        "ingredient": "Blanc de dinde",
1098
        "quantity": 4,
1099
        "unit": "tranches"
1100
      },
1101
      {
1102
        "ingredient": "Emmental",
1103
        "quantity": 8,
1104
        "unit": "tranches"
1105
      },
1106
      {
1107
        "ingredient": "Gruyère",
1108
        "quantity": 100,
1109
        "unit": "g"
1110
      },
1111
      {
1112
        "ingredient": "Lait",
1113
        "quantity": 5,
1114
        "unit": "cl"
1115
      },
1116
      {
1117
        "ingredient": "Noix de muscade",
1118
        "quantity": 1,
1119
        "unit": "pincées"
1120
      }
1121
    ],
1122
    "time": 20,
1123
    "description": "Beurrer les tranches de pain, ajouter entre 2 tranches de pain de mie 1 tranche d'émental, une de blanc de dinde, et une autre d'emmental. Dans un récipient, mélanger le gruyère rappé avec le lait et la noix de muscade. Mettre sur les croque monsieux. Placer au four durant 10 minutes.",
1124
    "appliance": "four",
1125
    "ustensils": ["râpe à fromage", "cuillère à soupe", "couteau"]
1126
  },
1127
  {
1128
    "id": 33,
1129
    "name": "Sandwich au saumon fumé",
1130
    "servings": 4,
1131
    "ingredients": [
1132
      {
1133
        "ingredient": "Pain de mie",
1134
        "quantity": 8,
1135
        "unit": "tranches"
1136
      },
1137
      {
1138
        "ingredient": "Saumon Fumé",
1139
        "quantity": 4,
1140
        "unit": "tranches"
1141
      },
1142
      {
1143
        "ingredient": "Feuilles de laitue",
1144
        "quantity": 4
1145
      },
1146
      {
1147
        "ingredient": "Fromage blanc",
1148
        "quantity": 4,
1149
        "unit": "cuillères à soupe"
1150
      },
1151
      {
1152
        "ingredient": "Jus de citron",
1153
        "quantity": 1,
1154
        "unit": "cuillères à soupe"
1155
      }
1156
    ],
1157
    "time": 5,
1158
    "description": "Mélanger le fromage blanc avec le citron. Ajouter un peu de sel et poivre à votre gout. Faire dorer le pain de mie. Puis étaler le mélange. Ajouter une feuille de salade puis le saumon fumé. C'est prêt.",
1159
    "appliance": "four",
1160
    "ustensils": ["couteau", "cuillère en bois"]
1161
  },
1162
  {
1163
    "id": 34,
1164
    "name": "Purée de patate douce",
1165
    "servings": 4,
1166
    "ingredients": [
1167
      {
1168
        "ingredient": "Patate douce",
1169
        "quantity": 800,
1170
        "unit": "g"
1171
      },
1172
      {
1173
        "ingredient": "Crème fraîche",
1174
        "quantity": 20,
1175
        "unit": "cl"
1176
      },
1177
      {
1178
        "ingredient": "Huile d'olive"
1179
      },
1180
      {
1181
        "ingredient": "Orange",
1182
        "quantity": 1
1183
      }
1184
    ],
1185
    "time": 25,
1186
    "description": "Eplucher les patates douces et coupez les en morceaux. Les faire cuire durant 20 minute dans une casserole d'eau bouillante. Passer au mixer en ajoutant la crème et l'huile d'olive à son gout. Salez, poivrez. Pressez l'orange et ajouter le jus à l'ensemble. Servir.",
1187
    "appliance": "mixer",
1188
    "ustensils": ["couteau", "économe", "cuillère en bois"]
1189
  },
1190
  {
1191
    "id": 35,
1192
    "name": "Purée de carottes",
1193
    "servings": 2,
1194
    "ingredients": [
1195
      {
1196
        "ingredient": "Carotte",
1197
        "quantity": 6
1198
      },
1199
      {
1200
        "ingredient": "Pomme de terre",
1201
        "quantity": 1
1202
      },
1203
      {
1204
        "ingredient": "Beurre",
1205
        "quantity": 20,
1206
        "unit": "g"
1207
      },
1208
      {
1209
        "ingredient": "Crème fraîche",
1210
        "quantity": 2,
1211
        "unit": "cuillères à soupe"
1212
      },
1213
      {
1214
        "ingredient": "Cumin",
1215
        "quantity": 1,
1216
        "unit": "cuillères à café"
1217
      },
1218
      {
1219
        "ingredient": "Noix de muscade",
1220
        "quantity": 1,
1221
        "unit": "pincées"
1222
      }
1223
    ],
1224
    "time": 25,
1225
    "description": "Éplucher les légumes, les couper en morceaux et les mettre à cuire dans une cocotte minute environ 15 minutes. Mixer en ajoutant le beurre, la crème. Ajouter le cumin et la noix de muscade.",
1226
    "appliance": "mixer",
1227
    "ustensils": ["cocotte minute", "couteau", "cuillère en bois"]
1228
  },
1229
  {
1230
    "id": 36,
1231
    "name": "Lasagne Courgettes et Chèvre",
1232
    "servings": 2,
1233
    "ingredients": [
1234
      {
1235
        "ingredient": "Courgette",
1236
        "quantity": 2
1237
      },
1238
      {
1239
        "ingredient": "Fromage de chèvre",
1240
        "quantity": 4
1241
      },
1242
      {
1243
        "ingredient": "Lait",
1244
        "quantity": 25,
1245
        "unit": "cl"
1246
      },
1247
      {
1248
        "ingredient": "Lasagnes",
1249
        "quantity": 5,
1250
        "unit": "feuilles"
1251
      },
1252
      {
1253
        "ingredient": "Gruyère",
1254
        "quantity": 40,
1255
        "unit": "g"
1256
      },
1257
      {
1258
        "ingredient": "Maïzena",
1259
        "quantity": 1,
1260
        "unit": "cuillères à soupe"
1261
      }
1262
    ],
1263
    "time": 35,
1264
    "description": "Raper les courgette et les faire revenir durant 15 minutes. Ajouter les fromages de chèvre frais. Préparer la béchamelle avec le lait et la maizena. Salez poivrez, ajouter de la noix de muscade selon les gouts. Dans un plat, mettre un peu de sauces au fond, puis des lasagnes, puis des courgettes etc... terminer par de la sauces et ajouter le gruiyère. Passer au four à 180° durant 20 à 25 minutes.",
1265
    "appliance": "four",
1266
    "ustensils": ["plat à gratin", "râpe à fromage", "fouet"]
1267
  },
1268
  {
1269
    "id": 37,
1270
    "name": "Courgettes farcies au boeuf",
1271
    "servings": 2,
1272
    "ingredients": [
1273
      {
1274
        "ingredient": "Courgette",
1275
        "quantity": 2
1276
      },
1277
      {
1278
        "ingredient": "Viande hachée",
1279
        "quantity": 600,
1280
        "unit": "g"
1281
      },
1282
      {
1283
        "ingredient": "Huile d'olive",
1284
        "quantity": 25,
1285
        "unit": "cl"
1286
      },
1287
      {
1288
        "ingredient": "Oignon",
1289
        "quantity": 1
1290
      },
1291
      {
1292
        "ingredient": "Coulis de tomate",
1293
        "quantity": 20,
1294
        "unit": "cl"
1295
      },
1296
      {
1297
        "ingredient": "Gruyère",
1298
        "quantity": 50,
1299
        "unit": "g"
1300
      }
1301
1302
    ],
1303
    "time": 60,
1304
    "description": "Couper les courgettes dans le sens de la longueur. Vider les courgette dans un saladier. Réserver.Faire revenir la chair des courgettes dans 25cl d'huile d'olive. Ajouter l'oignon puis la viande hachée. Mettre la farce dans les courgettes. Ajouter le coulis de tomates. Mettre au four pendant 30 minutes. Avant la fin de la cuisson ajouter le fromage rapé",
1305
    "appliance": "four",
1306
    "ustensils": ["couteau", "cuillère en bois", "poêle à frire"]
1307
  },
1308
  {
1309
    "id": 38,
1310
    "name": "Pain Perdu",
1311
    "servings": 4,
1312
    "ingredients": [
1313
      {
1314
        "ingredient": "Pain",
1315
        "quantity": 6,
1316
        "unit": "tranches"
1317
      },
1318
      {
1319
        "ingredient": "Lait",
1320
        "quantity": 25,
1321
        "unit": "cl"
1322
      },
1323
      {
1324
        "ingredient": "Oeuf",
1325
        "quantity": 3
1326
      },
1327
      {
1328
        "ingredient": "Sucre roux",
1329
        "quantity": 75,
1330
        "unit": "g"
1331
      }
1332
    ],
1333
    "time": 20,
1334
    "description": "Fouettez les oeufs, le sucre et le lait. tremper les tranches de pain. Le cuire au four pendant environ 10 minutes à 180°. Servir",
1335
    "appliance": "four",
1336
    "ustensils": ["fouet", "bol", "cuillère à soupe"]
1337
  },
1338
  {
1339
    "id": 39,
1340
    "name": "Crumble aux pommes",
1341
    "servings": 40,
1342
    "ingredients": [
1343
      {
1344
        "ingredient": "Pomme",
1345
        "quantity": 2
1346
      },
1347
      {
1348
        "ingredient": "Farine",
1349
        "quantity": 100,
1350
        "unit": "g"
1351
      },
1352
      {
1353
        "ingredient": "Beurre",
1354
        "quantity": 50,
1355
        "unit": "g"
1356
      },
1357
      {
1358
        "ingredient": "Sucre roux",
1359
        "quantity": 80,
1360
        "unit": "g"
1361
      }
1362
    ],
1363
    "time": 40,
1364
    "description": "Découper les pommes en dé. Mélanger dans un saladier la farine, le sucre et le beurre. Bien mélanger. Beurrer le moule et ajouter les pommes. Par dessus placez la pate que vous avez obtenu. Cuire 20 minutes au four",
1365
    "appliance": "four",
1366
    "ustensils": ["saladier", "couteau", "fouet"]
1367
  },
1368
  {
1369
    "id": 40,
1370
    "name": "Limonade",
1371
    "servings": 4,
1372
    "ingredients": [
1373
      {
1374
        "ingredient": "Eau",
1375
        "quantity": 1,
1376
        "unit": "Litres"
1377
      },
1378
      {
1379
        "ingredient": "Citron Vert",
1380
        "quantity": 3
1381
      },
1382
      {
1383
        "ingredient": "Sucre en poudre",
1384
        "quantity": 4,
1385
        "unit": "cuillères à café"
1386
      },
1387
      {
1388
        "ingredient": "Bicarbonate",
1389
        "quantity": 1,
1390
        "unit": "cuillères à café"
1391
      }
1392
    ],
1393
    "time": 10,
1394
    "description": "Dans un saladier mettre l'eau, le jus des cirtons et le sucre. Bien mélanger. Ajouter le bicarbonate. Servir. Ajouter des glaçon et une feuille de menthe pour la déco.",
1395
    "appliance": "saladier",
1396
    "ustensils": ["cuillère en bois"]
1397
  },
1398
  {
1399
    "id": 41,
1400
    "name": "Mousse au chocolat",
1401
    "servings": 4,
1402
    "ingredients": [
1403
      {
1404
        "ingredient": "Oeuf",
1405
        "quantity": 3
1406
      },
1407
      {
1408
        "ingredient": "Chocolat noir",
1409
        "quantity": 100,
1410
        "unit": "g"
1411
      },
1412
      {
1413
        "ingredient": "Sucre vanillé",
1414
        "quantity": 1,
1415
        "unit": "sachets"
1416
      }
1417
    ],
1418
    "time": 20,
1419
    "description": "Séparer les blancs d'oeufs. Faire fondre le chocolat au bain marie. Ajouter les jaunes et le sucre au chocolat hors du feu. Battre les blancs en neige. Ajouter les blancs au mélange de chocolat. Mélangez délicatement avec une spatule. Servir dans un plat ou dans des verres. Mettre au frais",
1420
    "appliance": "casserole",
1421
    "ustensils": ["fouet", "spatule", "verres"]
1422
  },
1423
  {
1424
    "id": 42,
1425
    "name": "Charlotte au poires",
1426
    "servings": 3,
1427
    "ingredients": [
1428
      {
1429
        "ingredient": "Chocolat",
1430
        "quantity": 200,
1431
        "unit": "g"
1432
      },
1433
      {
1434
        "ingredient": "Oeuf",
1435
        "quantity": 3
1436
      },
1437
      {
1438
        "ingredient": "Poires au jus",
1439
        "quantity": 0.5,
1440
        "unit": "boites"
1441
      },
1442
      {
1443
        "ingredient": "Boudoirs",
1444
        "quantity": 15
1445
      }
1446
    ],
1447
    "time": 60,
1448
    "description": "Commencez par préparer la mousse au chocolat au moins 2 heures avant. Quand la mousse est prête et a reposée. Alors mouiller les boudoirs dans le jus des poires. Disposer. Alterner : mousse au chocolat, boudoirs et poires. Mettre au frais.",
1449
    "appliance": "moule à charlotte",
1450
    "ustensils": ["saladier", "couteau", "fouet"]
1451
  },
1452
  {
1453
    "id": 43,
1454
    "name": "Tarte au citron",
1455
    "servings": 6,
1456
    "ingredients": [
1457
      {
1458
        "ingredient": "Pâte brisée",
1459
        "quantity": 200,
1460
        "unit": "g"
1461
      },
1462
      {
1463
        "ingredient": "Sucre",
1464
        "quantity": 150,
1465
        "unit": "g"
1466
      },
1467
      {
1468
        "ingredient": "Beurre fondu",
1469
        "quantity": 100,
1470
        "unit": "g"
1471
      },
1472
      {
1473
        "ingredient": "Oeuf",
1474
        "quantity": 3
1475
      },
1476
      {
1477
        "ingredient": "Citron"
1478
      }
1479
    ],
1480
    "time": 50,
1481
    "description": "Préchauffez le fours à 200°. Etaler la pate. La mettre dans un moule. Battre les oeufs avec le sucre. Ajouter le jus de citron et le beurre. Verser le tout sur la pate. Au four 30 minutes. Bon appetit ",
1482
    "appliance": "four",
1483
    "ustensils": ["rouleau à patisserie", "moule à tarte", "presse citron"]
1484
  },
1485
  {
1486
    "id": 44,
1487
    "name": "Crème dessert au chocolat",
1488
    "servings": 6,
1489
    "ingredients": [
1490
      {
1491
        "ingredient": "Lait",
1492
        "quantity": 1,
1493
        "unit": "litres"
1494
      },
1495
      {
1496
        "ingredient": "Chocolat",
1497
        "quantity": 200,
1498
        "unit": "g"
1499
      },
1500
      {
1501
        "ingredient": "Sucre",
1502
        "quantity": 100,
1503
        "unit": "g"
1504
      },
1505
      {
1506
        "ingredient": "Beurre",
1507
        "quantity": 50,
1508
        "unit": "g"
1509
      },
1510
      {
1511
        "ingredient": "Farine",
1512
        "quantity": 40,
1513
        "unit": "g"
1514
      }
1515
    ],
1516
    "time": 15,
1517
    "description": "Mélanger la farine et le beurre fondu en ajoutant le lait peu à peu. Ajouter du sucre après la cuisson. Bien mélanger. Ajouter le chocolat en morceaux et laisser chauffer 8 minutes en mélangeant avec une cuillère en bois. Mettre dans des verres",
1518
    "appliance": "casserole",
1519
    "ustensils": ["cuillère en bois"]
1520
  },
1521
  {
1522
    "id": 45,
1523
    "name": "Crème pâtissière",
1524
    "servings": 8,
1525
    "ingredients": [
1526
      {
1527
        "ingredient": "Lait",
1528
        "quantity": 50,
1529
        "unit": "cl"
1530
      },
1531
      {
1532
        "ingredient": "Oeuf",
1533
        "quantity": 2
1534
      },
1535
      {
1536
        "ingredient": "Farine",
1537
        "quantity": 30,
1538
        "unit": "g"
1539
      },
1540
      {
1541
        "ingredient": "Sucre",
1542
        "quantity": 80,
1543
        "unit": "g"
1544
      }
1545
    ],
1546
    "time": 30,
1547
    "description": "Faire bouillir le lait ( on peut y ajouter de l'essence de vanille. Battre les oeufs et le sucre, ajouter la farine puis finalement ajouter le lait chaud. Remettre à feu doux pour faire épaissir en remuant pendant 5 à 10 minutes.",
1548
    "appliance": "casserole",
1549
    "ustensils": ["fouet", "saladier"]
1550
  },
1551
  {
1552
    "id": 46,
1553
    "name": "Far breton",
1554
    "servings": 6,
1555
    "ingredients": [
1556
      {
1557
        "ingredient": "Farine",
1558
        "quantity": 250,
1559
        "unit": "g"
1560
      },
1561
      {
1562
        "ingredient": "Sucre",
1563
        "quantity": 150,
1564
        "unit": "g"
1565
      },
1566
      {
1567
        "ingredient": "Sucre vanillé",
1568
        "quantity": 1,
1569
        "unit": "sachets"
1570
      },
1571
      {
1572
        "ingredient": "Oeuf",
1573
        "quantity": 4
1574
      },
1575
      {
1576
        "ingredient": "Lait",
1577
        "quantity": 1,
1578
        "unit": "litre"
1579
      },
1580
      {
1581
        "ingredient": "Pruneaux",
1582
        "quantity": 100,
1583
        "unit": "g"
1584
      }
1585
    ],
1586
    "time": 60,
1587
    "description": "Mélanger la farine avec le sucre et les oeufs en ajoutant du sucre vanillé. Ajouter le lait petit à petit. Ajouter un petit verre de rhum. Verser la masse dans un plat beurré y placer les pruneaux et faire cuire à 200° pendant 45 minutes",
1588
    "appliance": "four",
1589
    "ustensils": ["fouet", "moule", "verres"]
1590
  },
1591
  {
1592
    "id": 47,
1593
    "name": "Mousse au citron",
1594
    "servings": 6,
1595
    "ingredients": [
1596
      {
1597
        "ingredient": "Jus de citron",
1598
        "quantity": 100,
1599
        "unit": "g"
1600
      },
1601
      {
1602
        "ingredient": "Mascarpone",
1603
        "quantity": 250,
1604
        "unit": "g"
1605
      },
1606
      {
1607
        "ingredient": "Sucre",
1608
        "quantity": 100,
1609
        "unit": "g"
1610
      },
1611
      {
1612
        "ingredient": "Crème fraîche",
1613
        "quantity": 20,
1614
        "unit": "cl"
1615
      }
1616
    ],
1617
    "time": 5,
1618
    "description": "Mélanger le jus de citron avec le sucre et la mascarpone. Ajouter la crème fraiche. Mélanger le tout et mettre au congélateur pendant 1 heure. Servir",
1619
    "appliance": "saladier",
1620
    "ustensils": ["fouet", "verres", "cuillère en bois"]
1621
  },
1622
  {
1623
    "id": 48,
1624
    "name": "Pizza",
1625
    "servings": 4,
1626
    "ingredients": [
1627
      {
1628
        "ingredient": "Pâte à pizza",
1629
        "quantity": 1
1630
      },
1631
      {
1632
        "ingredient": "Tomates pelées",
1633
        "quantity": 1,
1634
        "unit": "boites"
1635
      },
1636
      {
1637
        "ingredient": "Lardons",
1638
        "quantity": 1,
1639
        "unit": "barquettes"
1640
      },
1641
      {
1642
        "ingredient": "Champignons de paris",
1643
        "quantity": 1,
1644
        "unit": "boites"
1645
      },
1646
      {
1647
        "ingredient": "Gruyère",
1648
        "quantity": 200,
1649
        "unit": "g"
1650
      }
1651
    ],
1652
    "time": 40,
1653
    "description": "Étaler la pate a pizza. Ecraser les tomates pelées, les étaler sur la pâte, ajouter les lardons et les champignons. Ajouter le gruyère et passer au four à 220° durant 20 minutes",
1654
    "appliance": "four",
1655
    "ustensils": ["rouleau à patisserie", "râpe à fromage", "couteau"]
1656
  },
1657
  {
1658
    "id": 49,
1659
    "name": "Smoothie tropical",
1660
    "servings": 4,
1661
    "ingredients": [
1662
      {
1663
        "ingredient": "Banane",
1664
        "quantity": 2
1665
      },
1666
      {
1667
        "ingredient": "Kiwi",
1668
        "quantity": 3
1669
      },
1670
      {
1671
        "ingredient": "Mangue",
1672
        "quantity": 1
1673
      },
1674
      {
1675
        "ingredient": "Ananas",
1676
        "quantity": 4,
1677
        "unit": "tranches"
1678
      },
1679
      {
1680
        "ingredient": "Miel",
1681
        "quantity": 2,
1682
        "unit": "cuillères à soupe"
1683
      }
1684
    ],
1685
    "time": 0,
1686
    "description": "Découper les fruits. Le passer au blender jusqu'à obtenir une texture liquide. Mettre au frais. Servir",
1687
    "appliance": "blender",
1688
    "ustensils": ["couteau", "verres"]
1689
  },
1690
  {
1691
    "id": 50,
1692
    "name": "Frangipane",
1693
    "servings": 2,
1694
    "ingredients": [
1695
      {
1696
        "ingredient": "Pâte feuilletée",
1697
        "quantity": 400,
1698
        "unit": "g"
1699
      },
1700
      {
1701
        "ingredient": "Oeuf",
1702
        "quantity": 6
1703
      },
1704
      {
1705
        "ingredient": "Poudre d'amande",
1706
        "quantity": 500,
1707
        "unit": "g"
1708
      },
1709
      {
1710
        "ingredient": "Beurre",
1711
        "quantity": 500,
1712
        "unit": "g"
1713
      },
1714
      {
1715
        "ingredient": "Sucre glace",
1716
        "quantity": 500,
1717
        "unit": "g"
1718
      }
1719
    ],
1720
    "time": 60,
1721
    "description": "Préparer la frangipane : Mélanger le sucre la poudre d'amande, le beurre et les oeufs. Etaler la moitier de la pate feuilleté et mettre dans un moule à tarte. Garnir de frangipane et recouvrir du reste de pate feuilletée. Mettre au four 30 minutes",
1722
    "appliance": "four",
1723
    "ustensils": ["rouleau à patisserie", "fouet"]
1724
  }
1725
]`;
1726
const recipes = JSON.parse(response);
1727
1728
function removeDuplicate(arr) {
1729
  return [...new Set(arr)];
1730
}
1731
1732
function fastQuicksort(array) {
1733
  const stack = [];
1734
  let entry = [0, array.length, 2 * Math.floor(Math.log(array.length) / Math.log(2))];
1735
  stack.push(entry);
1736
1737
  while(stack.length > 0) {
1738
    entry = stack.pop();
1739
    const start = entry[0];
1740
    const end = entry[1];
1741
    let depth = entry[2];
1742
1743
    if(depth === 0) {
1744
      array = shellSortBound(array, start, end);
1745
      continue;
1746
    }
1747
1748
    depth--;
1749
    const pivot = Math.round((start + end) / 2);
1750
    const pivotNewIndex = inplaceQuicksortPartition(array, start, end, pivot);
1751
1752
    if(end - pivotNewIndex > 16) {
1753
      entry = [pivotNewIndex, end, depth];
1754
      stack.push(entry);
1755
    }
1756
1757
    if(pivotNewIndex - start > 16) {
1758
      entry = [start, pivotNewIndex, depth];
1759
      stack.push(entry);
1760
    }
1761
  }
1762
1763
  array = insertionSort(array);
1764
  return array;
1765
}
1766
1767
function shellSortBound(array, start, end) {
1768
  let inc = Math.round((start + end) / 2),
1769
    i, j, t;
1770
  while (inc >= start) {
1771
    for (i = inc; i < end; i++) {
1772
      t = array[i];
1773
      j = i;
1774
      while (j >= inc && array[j - inc][0] > t[0]) {
1775
        array[j] = array[j - inc];
1776
        j -= inc;
1777
      }
1778
      array[j] = t;
1779
    }
1780
    inc = Math.round(inc / 2.2);
1781
  }
1782
  return array;
1783
}
1784
1785
// In place quicksort
1786
function inplaceQuicksortPartition(array, start, end, pivotIndex) {
1787
  let i = start, j = end;
1788
  const pivot = array[pivotIndex][0];
1789
  while(true) {
1790
    while(array[i][0] < pivot) { i++ }
1791
    j--;
1792
    while(pivot < array[j][0]) { j-- }
1793
    if(!(i < j)) {
1794
      return i;
1795
    }
1796
    swap(array, i, j);
1797
    i++;
1798
  }
1799
}
1800
1801
//Insertion sort
1802
function insertionSort(array) {
1803
  for(let i = 1, l = array.length; i < l; i++) {
1804
    const value = array[i];
1805
    for(var j = i - 1; j >= 0; j--) {
1806
      if(array[j][0] <= value[0])
1807
        break;
1808
      array[j + 1] = array[j];
1809
    }
1810
    array[j + 1] = value;
1811
  }
1812
  return array;
1813
}
1814
1815
function swap(array, a, b) {
1816
  const temp = array[a];
1817
  array[a] = array[b];
1818
  array[b] = temp;
1819
}
1820
1821
function Recipe({ id, name, servings, ingredients, time, description, appliance, ustensils }) {
1822
  this.id = id;
1823
  this.name = name;
1824
  this.servings = servings;
1825
  this.ingredients = ingredients;
1826
  this.time = time;
1827
  this.description = description;
1828
  this.appliance = appliance;
1829
  this.ustensils = ustensils;
1830
}
1831
1832
Recipe.prototype.getRecipeCardTemplate = function () {
1833
  return `
1834
  <div class="card card--recipe" data-id="${this.id}">
1835
    <div class="card__img"></div>
1836
    <div class="card__infos">
1837
      <div class="card__infos__header">
1838
        <h2 class="card__infos__title">${this.name}</h2>
1839
      </div>
1840
      <div class="card__infos__text">
1841
        <ul class="card__infos__ingredients">
1842
          ${this.ingredients.map(ingredient => `
1843
          <li>
1844
            <strong>${ingredient.ingredient}</strong> ${ingredient.quantity ? ': ' + ingredient.quantity : ''}${
1845
    ingredient?.unit?.length ? (ingredient?.unit?.length > 2 ? ' ' + ingredient.unit : ingredient.unit) : ''}
1846
          </li>`).join('')}
1847
        </ul>
1848
        <p class="card__infos__instructions">
1849
          ${this.description}
1850
        </p>
1851
      </div>
1852
    </div>
1853
  </div>`
1854
}
1855
1856
const defaultDiacriticsRemovalMap = [
1857
  {
1858
    'base': 'A',
1859
    'letters': '\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'
1860
  },
1861
  { 'base': 'AA', 'letters': '\uA732' },
1862
  { 'base': 'AE', 'letters': '\u00C6\u01FC\u01E2' },
1863
  { 'base': 'AO', 'letters': '\uA734' },
1864
  { 'base': 'AU', 'letters': '\uA736' },
1865
  { 'base': 'AV', 'letters': '\uA738\uA73A' },
1866
  { 'base': 'AY', 'letters': '\uA73C' },
1867
  { 'base': 'B', 'letters': '\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181' },
1868
  { 'base': 'C', 'letters': '\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E' },
1869
  {
1870
    'base': 'D',
1871
    'letters': '\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779\u00D0'
1872
  },
1873
  { 'base': 'DZ', 'letters': '\u01F1\u01C4' },
1874
  { 'base': 'Dz', 'letters': '\u01F2\u01C5' },
1875
  {
1876
    'base': 'E',
1877
    'letters': '\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'
1878
  },
1879
  { 'base': 'F', 'letters': '\u0046\u24BB\uFF26\u1E1E\u0191\uA77B' },
1880
  {
1881
    'base': 'G',
1882
    'letters': '\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E'
1883
  },
1884
  { 'base': 'H', 'letters': '\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D' },
1885
  {
1886
    'base': 'I',
1887
    'letters': '\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'
1888
  },
1889
  { 'base': 'J', 'letters': '\u004A\u24BF\uFF2A\u0134\u0248' },
1890
  { 'base': 'K', 'letters': '\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2' },
1891
  {
1892
    'base': 'L',
1893
    'letters': '\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'
1894
  },
1895
  { 'base': 'LJ', 'letters': '\u01C7' },
1896
  { 'base': 'Lj', 'letters': '\u01C8' },
1897
  { 'base': 'M', 'letters': '\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C' },
1898
  {
1899
    'base': 'N',
1900
    'letters': '\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'
1901
  },
1902
  { 'base': 'NJ', 'letters': '\u01CA' },
1903
  { 'base': 'Nj', 'letters': '\u01CB' },
1904
  {
1905
    'base': 'O',
1906
    'letters': '\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'
1907
  },
1908
  { 'base': 'OI', 'letters': '\u01A2' },
1909
  { 'base': 'OO', 'letters': '\uA74E' },
1910
  { 'base': 'OU', 'letters': '\u0222' },
1911
  { 'base': 'OE', 'letters': '\u008C\u0152' },
1912
  { 'base': 'oe', 'letters': '\u009C\u0153' },
1913
  { 'base': 'P', 'letters': '\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754' },
1914
  { 'base': 'Q', 'letters': '\u0051\u24C6\uFF31\uA756\uA758\u024A' },
1915
  {
1916
    'base': 'R',
1917
    'letters': '\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'
1918
  },
1919
  {
1920
    'base': 'S',
1921
    'letters': '\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'
1922
  },
1923
  {
1924
    'base': 'T',
1925
    'letters': '\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786'
1926
  },
1927
  { 'base': 'TZ', 'letters': '\uA728' },
1928
  {
1929
    'base': 'U',
1930
    'letters': '\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'
1931
  },
1932
  { 'base': 'V', 'letters': '\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245' },
1933
  { 'base': 'VY', 'letters': '\uA760' },
1934
  { 'base': 'W', 'letters': '\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72' },
1935
  { 'base': 'X', 'letters': '\u0058\u24CD\uFF38\u1E8A\u1E8C' },
1936
  {
1937
    'base': 'Y',
1938
    'letters': '\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'
1939
  },
1940
  { 'base': 'Z', 'letters': '\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762' },
1941
  {
1942
    'base': 'a',
1943
    'letters': '\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'
1944
  },
1945
  { 'base': 'aa', 'letters': '\uA733' },
1946
  { 'base': 'ae', 'letters': '\u00E6\u01FD\u01E3' },
1947
  { 'base': 'ao', 'letters': '\uA735' },
1948
  { 'base': 'au', 'letters': '\uA737' },
1949
  { 'base': 'av', 'letters': '\uA739\uA73B' },
1950
  { 'base': 'ay', 'letters': '\uA73D' },
1951
  { 'base': 'b', 'letters': '\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253' },
1952
  { 'base': 'c', 'letters': '\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184' },
1953
  { 'base': 'd', 'letters': '\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A' },
1954
  { 'base': 'dz', 'letters': '\u01F3\u01C6' },
1955
  {
1956
    'base': 'e',
1957
    'letters': '\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'
1958
  },
1959
  { 'base': 'f', 'letters': '\u0066\u24D5\uFF46\u1E1F\u0192\uA77C' },
1960
  {
1961
    'base': 'g',
1962
    'letters': '\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F'
1963
  },
1964
  {
1965
    'base': 'h',
1966
    'letters': '\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265'
1967
  },
1968
  { 'base': 'hv', 'letters': '\u0195' },
1969
  {
1970
    'base': 'i',
1971
    'letters': '\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'
1972
  },
1973
  { 'base': 'j', 'letters': '\u006A\u24D9\uFF4A\u0135\u01F0\u0249' },
1974
  { 'base': 'k', 'letters': '\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3' },
1975
  {
1976
    'base': 'l',
1977
    'letters': '\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'
1978
  },
1979
  { 'base': 'lj', 'letters': '\u01C9' },
1980
  { 'base': 'm', 'letters': '\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F' },
1981
  {
1982
    'base': 'n',
1983
    'letters': '\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'
1984
  },
1985
  { 'base': 'nj', 'letters': '\u01CC' },
1986
  {
1987
    'base': 'o',
1988
    'letters': '\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'
1989
  },
1990
  { 'base': 'oi', 'letters': '\u01A3' },
1991
  { 'base': 'ou', 'letters': '\u0223' },
1992
  { 'base': 'oo', 'letters': '\uA74F' },
1993
  { 'base': 'p', 'letters': '\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755' },
1994
  { 'base': 'q', 'letters': '\u0071\u24E0\uFF51\u024B\uA757\uA759' },
1995
  {
1996
    'base': 'r',
1997
    'letters': '\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'
1998
  },
1999
  {
2000
    'base': 's',
2001
    'letters': '\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'
2002
  },
2003
  {
2004
    'base': 't',
2005
    'letters': '\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'
2006
  },
2007
  { 'base': 'tz', 'letters': '\uA729' },
2008
  {
2009
    'base': 'u',
2010
    'letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'
2011
  },
2012
  { 'base': 'v', 'letters': '\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C' },
2013
  { 'base': 'vy', 'letters': '\uA761' },
2014
  { 'base': 'w', 'letters': '\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73' },
2015
  { 'base': 'x', 'letters': '\u0078\u24E7\uFF58\u1E8B\u1E8D' },
2016
  {
2017
    'base': 'y',
2018
    'letters': '\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'
2019
  },
2020
  { 'base': 'z', 'letters': '\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763' }
2021
];
2022
2023
const diacriticsMap = {};
2024
for (let i = 0; i < defaultDiacriticsRemovalMap .length; i++){
2025
  const letters = defaultDiacriticsRemovalMap [i].letters;
2026
  for (let j=0; j < letters.length ; j++){
2027
    diacriticsMap[letters[j]] = defaultDiacriticsRemovalMap [i].base;
2028
  }
2029
}
2030
2031
function removeDiacritics(str) {
2032
  return str.replace(/[^\u0000-\u007E]/g, function(a){
2033
    return diacriticsMap[a] || a;
2034
  });
2035
}
2036
2037
const gallery = document.querySelector('body');
2038
2039
/*****************************************************************************************************/
2040
2041
function Data(recipes, gallery = false, currentTags) {
2042
  const result = { state : [], tags: { ingredients: {}, ustensils: {}, appliances: {} }, glossaries: []};
2043
  !currentTags ? currentTags = { ingredientsTags: [], ustensilsTags: [], appliancesTags: [] } : '';
2044
  const { ingredientsTags, ustensilsTags, appliancesTags } = currentTags;
2045
2046
  recipes.forEach(recipe => {
2047
2048
    // Destructure recipe
2049
    const { id, name, ingredients, appliance, ustensils, description } = recipe;
2050
2051
    // Initialize State
2052
    if (gallery) {
2053
      const instance = new Recipe(recipe);
2054
      result.state.push(instance);
2055
      gallery.insertAdjacentHTML('beforeend', instance.getRecipeCardTemplate());
2056
    }
2057
2058
    // Create Tags Data
2059
    ingredients.forEach(({ ingredient }) => {
2060
      if (ingredientsTags.indexOf(ingredient.toLowerCase()) < 0 || !ingredientsTags) {
2061
        !result.tags.ingredients[ingredient.toLowerCase()]
2062
          ? result.tags.ingredients[ingredient.toLowerCase()] = [id]
2063
          : result.tags.ingredients[ingredient.toLowerCase()].push(id);
2064
      }
2065
    });
2066
2067
    ustensils.forEach(ustensil  => {
2068
      if (ustensilsTags.indexOf(ustensil) < 0 || !ustensilsTags) {
2069
        !result.tags.ustensils[ustensil]
2070
          ? result.tags.ustensils[ustensil] = [id]
2071
          : result.tags.ustensils[ustensil].push(id);
2072
      }
2073
    });
2074
2075
    if (appliancesTags.indexOf(appliance) < 0 || !appliancesTags) {
2076
      !result.tags.appliances[appliance]
2077
        ? result.tags.appliances[appliance] = [id]
2078
        : result.tags.appliances[appliance].push(id);
2079
    }
2080
2081
    // Create Glossary for each recipes
2082
    const template = `${name} ${ingredients.map(item => item.ingredient).join(' ')} ${description}`;
2083
    const terms = removeDiacritics(template.toLowerCase());
2084
    result.glossaries.push({ id: id, terms: terms });
2085
2086
  });
2087
2088
  this.state = result.state;
2089
  this.glossaries = result.glossaries;
2090
  this.ingredients = Object.entries(result.tags.ingredients);
2091
  this.appliances = Object.entries(result.tags.appliances);
2092
  this.ustensils = Object.entries(result.tags.ustensils);
2093
}
2094
2095
function linearSearch(query, data) {
2096
  return data
2097
    .filter(glossary => glossary.terms.includes(query))
2098
    .map(glossary => glossary.id);
2099
}
2100
2101
function Data1(recipes, gallery = false, currentTags) {
2102
  const result = { state : [], tags: { ingredients: {}, ustensils: {}, appliances: {} }, dictionnary: {}};
2103
  !currentTags ? currentTags = { ingredientsTags: [], ustensilsTags: [], appliancesTags: [] } : '';
2104
  const { ingredientsTags, ustensilsTags, appliancesTags } = currentTags;
2105
2106
  recipes.forEach(recipe => {
2107
2108
    // Destructure recipe
2109
    const { id, name, ingredients, appliance, ustensils, description } = recipe;
2110
2111
    // Initialize State & Dictionnary
2112
    if (gallery) {
2113
2114
      // State & Dom recipe template cards insertion
2115
      const instance = new Recipe(recipe);
2116
      result.state.push(instance);
2117
      gallery.insertAdjacentHTML('beforeend', instance.getRecipeCardTemplate());
2118
2119
      // Add entries to dictionnary
2120
      const ingredientsArray = ingredients.map(item => removeDiacritics(item.ingredient.toLowerCase()));
2121
      const normalizedName = removeDiacritics(name.toLowerCase());
2122
      const template = `${name} ${ingredientsArray.join(' ')} ${description}`;
2123
      const string = removeDiacritics(template).toLowerCase();
2124
      let terms = string.match(/[\p{L}]{3,}/ug);
2125
      terms.push(ingredientsArray, normalizedName);
2126
      terms = removeDuplicate(terms.flat());
2127
      terms.forEach(term => {
2128
        !result.dictionnary[term] ? result.dictionnary[term] = [id] : result.dictionnary[term].push(id);
2129
      });
2130
    }
2131
2132
    // Create Tags Data
2133
    ingredients.forEach(({ ingredient }) => {
2134
      if (ingredientsTags.indexOf(ingredient.toLowerCase()) < 0 || !ingredientsTags) {
2135
        !result.tags.ingredients[ingredient.toLowerCase()]
2136
          ? result.tags.ingredients[ingredient.toLowerCase()] = [id]
2137
          : result.tags.ingredients[ingredient.toLowerCase()].push(id);
2138
      }
2139
    });
2140
2141
    ustensils.forEach(ustensil  => {
2142
      if (ustensilsTags.indexOf(ustensil) < 0 || !ustensilsTags) {
2143
        !result.tags.ustensils[ustensil]
2144
          ? result.tags.ustensils[ustensil] = [id]
2145
          : result.tags.ustensils[ustensil].push(id);
2146
      }
2147
    });
2148
2149
    if (appliancesTags.indexOf(appliance) < 0 || !appliancesTags) {
2150
      !result.tags.appliances[appliance]
2151
        ? result.tags.appliances[appliance] = [id]
2152
        : result.tags.appliances[appliance].push(id);
2153
    }
2154
2155
  });
2156
2157
  if (gallery) {
2158
    this.state = result.state;
2159
    this.dictionnary = fastQuicksort(Object.entries(result.dictionnary));
2160
  }
2161
2162
  this.ingredients = Object.entries(result.tags.ingredients);
2163
  this.appliances = Object.entries(result.tags.appliances);
2164
  this.ustensils = Object.entries(result.tags.ustensils);
2165
}
2166
2167
function rangedBinarySearch(query, data, low = 0, high = data.length - 1, RANGE = 5) {
2168
  const results = [];
2169
  while (high >= low) {
2170
    const mid = Math.floor(low + (high - low) / 2);
2171
    if (data[mid][0].startsWith(query)) {
2172
      const start = mid - RANGE < 0 ? 0 : mid - RANGE;
2173
      const end = mid + RANGE > data.length - 1 ? data.length - 1 : mid + RANGE;
2174
      for (let i = start; i <= end; i++) {
2175
        data[i][0].startsWith(query) ? results.push(data[i][1]) : '';
2176
      }
2177
      return results.flat();
2178
    }
2179
    if (query < data[mid][0]) {
2180
      high = mid - 1;
2181
    } else {
2182
      low = mid + 1;
2183
    }
2184
  }
2185
  return results;
2186
}
2187
</script>
Tests:
  • Linear Search

     
    const { glossaries } = new Data(recipes, gallery);
    linearSearch('creme', glossaries);
    linearSearch('ail', glossaries);
    linearSearch('sucre', glossaries);
    linearSearch('tom', glossaries);
    linearSearch('tomate', glossaries);
    linearSearch('tomates', glossaries);
    linearSearch('tart', glossaries);
    linearSearch('pomme', glossaries);
    linearSearch('terr', glossaries);
    linearSearch('basilic', glossaries);
  • Binary Search

     
    const { dictionnary } = new Data1(recipes, gallery);
    rangedBinarySearch('creme', dictionnary);
    rangedBinarySearch('ail', dictionnary);
    rangedBinarySearch('sucre', dictionnary);
    rangedBinarySearch('tom', dictionnary);
    rangedBinarySearch('tomate', dictionnary);
    rangedBinarySearch('tomates', dictionnary);
    rangedBinarySearch('tart', dictionnary);
    rangedBinarySearch('pomme', dictionnary);
    rangedBinarySearch('terr', dictionnary);
    rangedBinarySearch('basilic', dictionnary);
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    Linear Search
    Binary Search

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 3 years ago)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36
Chrome 94 on Windows
View result in a separate tab
Test name Executions per second
Linear Search 410.7 Ops/sec
Binary Search 316.4 Ops/sec