commit: b777e699bc5694147dd9ba1862f655bc34a8c1b1
parent 1b5233cda74ca8083aac13082991476031b6c0c0
Author: microlith57 <microlith57@gmail.com>
Date: Sun, 8 Dec 2019 11:36:08 +1300
Merge remote-tracking branch 'hundredrabbits/master'
Diffstat:
57 files changed, 1034 insertions(+), 456 deletions(-)
diff --git a/index.html b/index.html
@@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="utf-8">
- <meta name="description" content="Grim Grains is an illustrated food blog, it features plant-based (vegan) recipes with a strong attention to colour and form.">
+ <meta name="description" content="Grim Grains is an illustrated food blog, it features plant-based (vegan) recipes.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Twitter -->
<meta name="twitter:card" content="summary">
@@ -19,28 +19,28 @@
<meta property="og:description" content="An illustrated food blog." />
<meta property="og:site_name" content="Grimgrains" />
- <script src="scripts/lib/riven.js"></script>
- <script src="scripts/graph.js"></script>
- <script src="scripts/lib/runic.js"></script>
+ <script type="text/javascript" src="scripts/lib/riven.js"></script>
+ <script type="text/javascript" src="scripts/graph.js"></script>
+ <script type="text/javascript" src="scripts/lib/runic.js"></script>
- <script src="scripts/nodes/query.js"></script>
- <script src="scripts/nodes/router.js"></script>
- <script src="scripts/nodes/database.js"></script>
- <script src="scripts/nodes/indental.js"></script>
- <script src="scripts/nodes/template.js"></script>
- <script src="scripts/nodes/dom.js"></script>
- <script src="scripts/nodes/document.js"></script>
+ <script type="text/javascript" src="scripts/nodes/query.js"></script>
+ <script type="text/javascript" src="scripts/nodes/router.js"></script>
+ <script type="text/javascript" src="scripts/nodes/database.js"></script>
+ <script type="text/javascript" src="scripts/nodes/indental.js"></script>
+ <script type="text/javascript" src="scripts/nodes/template.js"></script>
+ <script type="text/javascript" src="scripts/nodes/dom.js"></script>
+ <script type="text/javascript" src="scripts/nodes/document.js"></script>
- <script src="scripts/database/ingredients.ndtl"></script>
- <script src="scripts/database/recipes.ndtl"></script>
- <script src="scripts/database/pages.ndtl"></script>
+ <script type="text/javascript" src="scripts/database/ingredients.ndtl"></script>
+ <script type="text/javascript" src="scripts/database/recipes.ndtl"></script>
+ <script type="text/javascript" src="scripts/database/pages.ndtl"></script>
- <script src="scripts/templates/recipe.js"></script>
- <script src="scripts/templates/ingredient.js"></script>
- <script src="scripts/templates/page.js"></script>
- <script src="scripts/templates/home.js"></script>
- <script src="scripts/templates/search.js"></script>
- <script src="scripts/templates/service.js"></script>
+ <script type="text/javascript" src="scripts/templates/recipe.js"></script>
+ <script type="text/javascript" src="scripts/templates/ingredient.js"></script>
+ <script type="text/javascript" src="scripts/templates/page.js"></script>
+ <script type="text/javascript" src="scripts/templates/home.js"></script>
+ <script type="text/javascript" src="scripts/templates/search.js"></script>
+ <script type="text/javascript" src="scripts/templates/service.js"></script>
<link rel="stylesheet" type="text/css" href="links/reset.css"/>
<link rel="stylesheet" type="text/css" href="links/main.css"/>
diff --git a/links/main.css b/links/main.css
@@ -65,21 +65,29 @@ h1,h2,h3,h4 { font-weight: normal; font-family: 'alte_haas_grotesk_bold'; margin
#view #core #content #instructions i { background: #eee;font-size: 12px;text-transform: uppercase;padding: 5px 7.5px;display: inline-block;font-weight: bold;border-radius: 3px;color: #333;line-height: 15px }
#view #core #content #instructions code { font-size: 12px;text-transform: uppercase;padding: 3px 5.5px;display: inline-block;font-weight: bold;border-radius: 3px;border: 2px solid black;line-height: 15px}
+#view #core #content #warn p { border-left: 3px solid orangered; padding-left: 7px; }
+#view #core #content #warn p::before { content: 'Warning: '; font-weight: bold; }
+
#view #core #content ul.ingredients { display: inline-block; margin-right:15px; font-size:0; padding-left:20px; margin-bottom:30px; }
#view #core #content ul.ingredients h3 { margin-left:-20px; }
#view #core #content ul.ingredients li.ingredient { width: 100px;margin-left:-20px;min-height: 210px;display: inline-block;text-align: center;vertical-align: top;border: 2px dashed transparent;border-radius: 10px; }
-#view #core #content ul.ingredients li.ingredient:hover t.name { text-decoration: underline; }
-#view #core #content ul.ingredients li.ingredient.missing t.name { font-style: italic }
+#view #core #content ul.ingredients li.ingredient:hover span.name { text-decoration: underline; }
+#view #core #content ul.ingredients li.ingredient.missing span.name { font-style: italic }
#view #core #content ul.ingredients li.ingredient img { max-width: 100%; display: block }
-#view #core #content ul.ingredients li.ingredient t.name { display: block; font-family: 'alte_haas_grotesk_bold'; font-size:14px; margin-bottom: 5px;padding:0px 10px }
-#view #core #content ul.ingredients li.ingredient t.quantity { display: block; font-size:12px; }
+#view #core #content ul.ingredients li.ingredient span.name { display: block; font-family: 'alte_haas_grotesk_bold'; font-size:14px; margin-bottom: 5px;padding:0px 10px }
+#view #core #content ul.ingredients li.ingredient span.quantity { display: block; font-size:12px; }
+
+#view #core #content .page ul { margin:0px 0px 30px;}
+#view #core #content .page ul li { line-height: 24px; position: relative; padding-left:15px;}
+#view #core #content .page ul li:before { content:"•"; position: absolute; left:0px; }
+#view #core #content .page ul li b { font-weight: bold; }
#view #core #related { width:100%;}
#view #core #related li { width: calc((100% / 3) - 10px); float:left; overflow: hidden;}
#view #core #related li:nth-child(1), #view #core #related li:nth-child(2) { margin-right:15px;}
#view #core #related li a.photo { border-radius: 2px; display: block; height:160px; background-size:cover; margin-bottom:15px; background-position: center }
-#view #core #related li t.name { display: block; font-family: 'alte_haas_grotesk_bold'; font-size:16px; margin-bottom: 5px; text-transform: capitalize; line-height: 30px }
-#view #core #related li t.details { display: block; font-family: 'alte_haas_grotesk_regular'; font-size:14px; text-transform: capitalize; line-height: 30px; line-height: 18px }
+#view #core #related li span.name { display: block; font-family: 'alte_haas_grotesk_bold'; font-size:16px; margin-bottom: 5px; text-transform: capitalize; line-height: 30px }
+#view #core #related li span.details { display: block; font-family: 'alte_haas_grotesk_regular'; font-size:14px; text-transform: capitalize; line-height: 30px; line-height: 18px }
#view #core #content #recipes { columns:3; font-size:14px; font-weight: bold}
#view #core #content #recipes li { display: block }
diff --git a/media/ingredients/arame.png b/media/ingredients/arame.png
Binary files differ.
diff --git a/media/ingredients/barlett.pear.png b/media/ingredients/barlett.pear.png
Binary files differ.
diff --git a/media/ingredients/breadfruit.png b/media/ingredients/breadfruit.png
Binary files differ.
diff --git a/media/ingredients/brussel.sprouts.png b/media/ingredients/brussel.sprouts.png
Binary files differ.
diff --git a/media/ingredients/yuca.png b/media/ingredients/cassava.png
Binary files differ.
diff --git a/media/ingredients/fresh.dill.png b/media/ingredients/fresh.dill.png
Binary files differ.
diff --git a/media/ingredients/japanese.rice.vinegar.png b/media/ingredients/japanese.rice.vinegar.png
Binary files differ.
diff --git a/media/ingredients/mushrooms.png b/media/ingredients/mushroom.png
Binary files differ.
diff --git a/media/ingredients/pears.png b/media/ingredients/pears.png
Binary files differ.
diff --git a/media/ingredients/persian.cucumbers.png b/media/ingredients/persian.cucumbers.png
Binary files differ.
diff --git a/media/ingredients/red.pepper.png b/media/ingredients/red.bell.pepper.png
Binary files differ.
diff --git a/media/ingredients/red.peppers.png b/media/ingredients/red.bell.peppers.png
Binary files differ.
diff --git a/media/ingredients/shelled.hemp.seeds.png b/media/ingredients/shelled.hemp.seeds.png
Binary files differ.
diff --git a/media/ingredients/heirloom.tomatoes.png b/media/ingredients/small.heirloom.tomatoes.png
Binary files differ.
diff --git a/media/ingredients/silken.tofu.png b/media/ingredients/soft.tofu.png
Binary files differ.
diff --git a/media/ingredients/tofu.mayo.png b/media/ingredients/veganaise.png
Binary files differ.
diff --git a/media/pages/calcium.jpg b/media/pages/calcium.jpg
Binary files differ.
diff --git a/media/pages/iodine.jpg b/media/pages/iodine.jpg
Binary files differ.
diff --git a/media/pages/iron.jpg b/media/pages/iron.jpg
Binary files differ.
diff --git a/media/pages/nutrition.jpg b/media/pages/nutrition.jpg
Binary files differ.
diff --git a/media/pages/omega3.jpg b/media/pages/omega3.jpg
Binary files differ.
diff --git a/media/pages/protein.jpg b/media/pages/protein.jpg
Binary files differ.
diff --git a/media/pages/vitamina.jpg b/media/pages/vitamina.jpg
Binary files differ.
diff --git a/media/pages/vitaminb12.jpg b/media/pages/vitaminb12.jpg
Binary files differ.
diff --git a/media/pages/vitamind.jpg b/media/pages/vitamind.jpg
Binary files differ.
diff --git a/media/pages/zinc.jpg b/media/pages/zinc.jpg
Binary files differ.
diff --git a/media/recipes/hijiki.soba.2.jpg b/media/recipes/arame.soba.2.jpg
Binary files differ.
diff --git a/media/recipes/hijiki.soba.jpg b/media/recipes/arame.soba.jpg
Binary files differ.
diff --git a/media/recipes/basic.toothpaste.jpg b/media/recipes/basic.toothpaste.jpg
Binary files differ.
diff --git a/media/recipes/chickpea.kelp.sandwich.jpg b/media/recipes/chickpea.salad.sandwich.jpg
Binary files differ.
diff --git a/media/recipes/homemade.veganaise.jpg b/media/recipes/homemade.veganaise.jpg
Binary files differ.
diff --git a/media/recipes/spicy.stirfry.chickpeas.2.jpg b/media/recipes/spicy.stirfry.chickpeas.2.jpg
Binary files differ.
diff --git a/media/recipes/spicy.stirfry.chickpeas.3.jpg b/media/recipes/spicy.stirfry.chickpeas.3.jpg
Binary files differ.
diff --git a/media/recipes/spicy.stirfry.chickpeas.jpg b/media/recipes/spicy.stirfry.chickpeas.jpg
Binary files differ.
diff --git a/media/recipes/stovetop.popcorn.jpg b/media/recipes/stovetop.popcorn.jpg
Binary files differ.
diff --git a/media/recipes/tzaziki.jpg b/media/recipes/tzaziki.jpg
Binary files differ.
diff --git a/scripts/database/ingredients.ndtl b/scripts/database/ingredients.ndtl
@@ -23,36 +23,53 @@ Coffee
~ LEGUMES
Lentils
- BREF : Lentils are considered to be one of the best foods because their chemical structures are not altered by cooking. Lens is the latin name for lentil.
+ BREF : Lentils are considered to be one of the best foods because their chemical structures are not altered by cooking. Lens is the latin name for lentil. Lentils can be soaked, germinated, boiled, fried and baked, the most common being boiled. They require a cooking time of 10-40 minutes, depending on variety. The cooking time is shorter for varieties with the husk removed, like red lentils. Lentils without husks tend to soften into purees, while the husked variety remain whole.
TAGS
Legume
Lentil
Beluga Lentils
PARENT : Lentils
+ BREF : Beluga lentils are black, bead-like, lens-shaped, almost spherical. They have a delicate flavor and a firm texture that doesn't disintegrate when cooked.
+ LONG
+ & Beluga lentils are a rich source of numerous essential nutrients like {{protein|#nutrition}}, iron and zinc. Lentils have the second-highest ratio of protein per calorie of any legume, after {{soy beans}}.
COLOR : #000000
TAGS
Legume
Lentil
Brown Lentils
PARENT : Lentils
- BREF : The most common variety of lentils, found in most grocery stores. They have a mild, earthy-flavor.
+ BREF : The most common variety of lentils, found in most grocery stores. They have a mild, earthy-flavor, with a firm texture that doesn't disintegrate when cooked.
+ LONG
+ & Lentils are a rich source of numerous essential nutrients like {{protein|#nutrition}}, iron and zinc. Lentils have the second-highest ratio of protein per calorie of any legume, after {{soy beans}}.
TAGS
Legume
Lentil
+Shelled hemp seeds
+ BREF : Hemp seeds are produced from the hemp plant {*Cannabis sativa L*}. Hemp seeds contain the perfect balance of essential amino acids for sustaining good health. They are a rich source of {*protein*}, {*zinc*} and {*iron*}.
+ LONG
+ & Hemp belongs to the same family as marijuana, but both are different. Hemp contains less than 1% of the psychoactive drug present in marijuana. The plant thrives a variety of growing conditions, make it a very hardy plant. The oil in hemp seeds can go rancid quickly, they should be used up quickly and should be stored in a cool environment. Cooking hemp seeds destoys their nutritional benefits, it's better to eat them raw or to add them to foods after cooking {{ref|http://www.seedguides.info/hemp-seeds/}}.
+ & Hemp has many other uses, it is used to make paper, textiles, plastics and fuel.
Tempeh
COLOR : #875A2C
+ BREF : Tempeh is a soy product, made from fermented {{soy beans}}. Tempeh is a source of protein, Omega-3's and zinc, and has a firm texture and earthy flavor.
+ LONG
+ & Tempeh is made by controlled fermentation that binds soybeans into a 'paddy'. The fungus {*Rhizopus Oligosporus*} is used as a starter to make tempeh. Fermented soyfoods like tempeh increased iron absorption.
Peanut Butter
- BREF : A spread made from dry-roasted {{peanuts}}, kinds without added sugar or oils are preferable. The US consumes $800 million of this stuff annually. Peanut butter's flavor combines well with other flavors, such as oatmeal, savory sauces, and various types of breads and crackers.
+ BREF : A spread made from dry-roasted {{peanuts}}, kinds without added sugar or oils are preferable. Peanut butter is a rich source of {{protein|nutrition}}.
+ LONG
+ & The US consumes $800 million of this stuff annually. The flavor of peanut butter combines well with other flavors, such as oatmeal, savory sauces, and various types of breads and crackers.
Peanuts
BREF : A crop grown mainly for its edible seeds! Peanuts are similar in taste and nutritional profile to tree nuts, and can be made into {{peanut butter}}.
+ LONG
+ & Peanuts are are rich source of {{protein|nutrition}}, 1/4 cup of peanuts equals one serving of the 3-4 servings of protein required for good health.
Soy beans
PARENT : Beans
COLOR : #EFEFEF
+ BREF : Soy beans are a species of legumes, widely grown for its edible bean. 1/2 cup of dried soybeans equals one serving of the 3-4 servings of protein required for good health. It is also a good source of {{Omega 3's (ALA)|nutrition}}.
LONG
- & A staple in Eastern Asia, soy beans are used as a base for many vegan faux-meat dishes. If you produce your own {{soy milk}}, know that there won't be any waste. The pulp can be used to make okara, which you can use to make baked goods.
- & Soy beans can be made into {{milk|soy milk}}, {{yoghurt|soy yogurt}}, {{soy sauce}}, and {{protein|soy protein}}.
+ & Unfermented food uses of soybeans include {{soy milk}} and {{tofu}}, while fermented soy foods include {{soy sauce}}, {{miso}}, natto and {{tempeh}}. A staple in Eastern Asia, soy beans are used as a base for many vegan faux-meat dishes.
Beans
LONG
& Fun fact: there are over 130 varieties of {{green beans}}.
@@ -64,9 +81,24 @@ Green beans
Kidney beans
PARENT : Beans
Edamame
+ PARENT : soy beans
+ BREF : Edamame are immature {{soy beans}}, still in their pods. {*Eda 枝*} means 'stem' and {*mame 豆*} means 'beans', literally 'steam beans.' Edamame, like all soyfoods, are rich in {*protein*}.
+ LONG
+ & Edamame can be boiled or steamed, and served with salts of other condiments. Fresh edamame last for 3 days in the refrigerator, wrapped in a material that traps moisture to prevent discoloration and wilting. Fresh edamame can be frozen, but should be blanched first. Frozen edamame lasts for many months.
Chickpeas
+ BREF : Chickpeas are the earliest cultivated legumes in history, and a staple in many countries. Chickpeas are also very rich in {*protein*}, and a good source of {*iron*}.
+ LONG
+ & Chickpeas can be made into flour, it can be roasted, pureed, candied etc. It's a very versatile and inexpensive legume. The soaking liquid of chickpeas — {*aquafaba*} — can be used as an egg replacer in recipes.
+ & Dry chickpeas keep a long, long time. If you keep them in air-tight containers they will last even longer, because moisture and oxygen is the enemy of all beans. Oxygen makes the bean oils rancid overtime. You can store them for 5+ yrs if you add oxygen absorbers (packet consisting of powdered iron oxide) to the containers.
+ & {*How to cook dried chickpeas*}
+ & Dried chickpeas triple in size when cooked (if not a little bit more). So 1 cup of dried chickpeas will make about 3 cups of cooked chickpeas. Dried chickpeas have a tough outer skin, and {*should be soaked overnight*}. Soaking them cuts down on cooking time, and in turn, saves energy. It also helps the beans cook more evenly and become completely tender all the way through. Another advantage to presoaking beans is that most of the gas-causing sugars are leached out into the soaking water. So when you drain off the soaking water, you are also getting rid of this unpleasant side effect to eating beans. Next morning, drain and cook them in a pot or pressure cooker.
+ & {*Stove top Pot:*} Bring chickpeas to a boil, then lower to gentle simmer. Add salt when beans are almost cooked. In a pot, cooking them varies from 1-3 hours.
+ & {*Pressure cooker:*} Because beans cook differently depending on the kind, age, and whether or not they’ve been presoaked, quick-soaked or not soaked at all, there is no single all-encompasssing rule for pressure cooking beans. Having a good chart with all the variables to consult is important so that you can adjust to your circumstances. A good resource for this is {{Hip Pressure Cooking’s bean chart|https://www.hippressurecooking.com/pressure-cooking-times/#beans}}. It’s a good idea to add 1 tbsp of neutral oil to the pot. Beans produce foam when cooking which can clog the pressure valve, and the oil will help to keep that down.
Chickpea Flour
PARENT : chickpeas, flour
+ BREF : Chickpea flour — also known as {*besan*} or {*gram*} flour — is made from ground chickpeas.
+ LONG
+ & Chickpea flour has a long shelf life due to the low-moisture and low-fat content. Chickpea flour has a texture and taste that is ideal for savoury pancakes or faux-omelettes.
Peas
Green Peas
PARENT : Peas
@@ -80,207 +112,372 @@ Broccoli
Green Cabbage
TAGS
Cruciferous
+ BREF : Green cabbage is a vegetable with dense-leaved heads, closely related to {{broccoli}}, {{brussel sprouts}} and {{cauliflower}}. Cabbage can be pickled, fermented, steamed, stewed, sauteed, braised or consumed raw. Cabbage is a source of vitamin C.
+ LONG
+ & There are winter and summer cabbages, winter cabbages are more dense while summer cabbages are lighter and sweet.
~ sauerkraut #C820B3
Red Cabbage
COLOR : #6620B3
- BREF : Red cabbage can be used as a natural colorant - it needs to be boiled and mixed with vinegar to keep its colour.
+ PARENT : green cabbage
+ BREF : Red cabbage is a good source of Vitamin C. It
+ LONG
+ & It can be used as a natural colorant - it needs to be boiled and mixed with vinegar to keep its colour. The plant changes its color according to the pH value of the soil, due to a pigment belonging to anthocyanins. Red cabbage keeps better than other varieties, and does not need to be converted to sauerkraut to last the winter.
TAGS
Cruciferous
Kale
COLOR : #006633
- BREF : Some people grow kale for their ornamental leaves, in colours varying in red, pink and even lavender. They are beautiful and eatable!
+ BREF : Some people grow kale for their ornamental leaves, in colours varying in red, pink and even lavender. They are beautiful and eatable! Kale is a rich source of vitamin A, C, B6, folate and manganese, and a good source of vitamin E, Iron and calcium (boiling kale diminishes these last nutrients). It is better to steam or stir-fry kale.
+ & Kale is a source of well-absorbed calcium.
Arugula
COLOR : #006633
+ BREF : Arugula, or "rocket" is a plant grown for its leaves, which are fresh, taste and bitter. Arugula is rich in vitamin C and potassium. Its flowers, young seed pods and mature seeds are also edible.
Cauliflower
- BREF : The oldest record of cauliflower dates back to the 6th century BC. They come in {{white|white cauliflower}} and {{purple|purple cauliflower}} varieties.
+ BREF : The oldest record of cauliflower dates back to the 6th century BC. They come in {{white|white cauliflower}} and {{purple|purple cauliflower}} varieties. Cauliflower is high in vitamin C. Eating ½ cup of cauliflower has been shown to {{increase iron absorption|https://www.theveganrd.com/vegan-nutrition-101/vegan-nutrition-primers/iron-a-vegan-nutrition-primer/}} from plant foods by as much as four to six times.
White Cauliflower
COLOR : #EFEFEF
- BREF : A type of {{cauliflower}}.
+ PARENT : cauliflower
+ BREF : A type of {{cauliflower}}, high in vitamin C. Eating ½ cup of cauliflower has been shown to {{increase iron absorption|https://www.theveganrd.com/vegan-nutrition-101/vegan-nutrition-primers/iron-a-vegan-nutrition-primer/}} from plant foods by as much as four to six times.
Purple Cauliflower
COLOR : #6620B3
- BREF : A type of {{cauliflower}}.
+ PARENT : cauliflower
+ BREF : A type of {{cauliflower}}, the purple color in this cauliflower is caused by the presence anthocyanins, water-soluble pigments that are found in many other plants and plant-based products, such as red cabbage and red wine. Cauliflower is high in vitamin C. Eating ½ cup of cauliflower has been shown to {{increase iron absorption|https://www.theveganrd.com/vegan-nutrition-101/vegan-nutrition-primers/iron-a-vegan-nutrition-primer/}} from plant foods by as much as four to six times.
Brussel sprouts
+ PARENT : green cabbage
+ BREF : Brussel sprouts are leafy vegetables that are high in vitamin C. To prepare them, cut the buds from the stalk and cut the surplus of stems away, as well as any loose surface leaves. Once they are cut and clean, they can be boiled, steamed, stir-fried, grilled or roasted! Making a cross at the center of the stem can help it cook better.
Daikon
+ BREF : Daikon is a mild-flavored winter radish, originating from southeast asia. Daikon is low in food energy, but is a good source of {*vitamin C*}.
+ LONG
+ & There are many varieties of daikon, with differences in color, taste and shape.
Bok choy
+ BREF : Bok Choy is a winter-hardy vegetable, a type of Chinese cabbage. Bok Choy is a rich source of vitamin A and C, and provides some folate, vitamin B6 and calcium.
Radish
-
+ BREF : The radish is an edible root vegetable, domesticated in Europe in pre-Roman times. There are many varieties, varying in color, size and flavor. Radishes have a moderate amount of {*vitamin C*}.
+ LONG
+ & Radish are often grown as companion plants for pest control, they are easy to grow and quick to harvest.
~ ALGEA FUNGI
+Arame
+ BREF : Arame is a species of kelp, of the Brown Algae, and is very popular in Japanese cuisine. It is indigenous to the temperate Pacific Ocean waters around Japan.
Seaweed
Mushroom
+ BREF : Mushrooms are the fleshy fruiting body of a fungus. They grow above ground, soil or from a food source. UV ray-treated (due to both sunlight and articial UV light tech) mushrooms are a source of {*vitamin d2*}. Many mushrooms are poisonous, resembling certain edible species. Gathering mushrooms in the wild is risky for the inexperienced and should only be undertaken by persons knowledgeable in mushroom identification.
Wakame
PARENT : Seaweed
COLOR : #006633
- BREF : Wakame is a very invasive plant - it's even banned in Australia.
+ BREF : Wakame is an edible seaweed, subtly sweet with a strong flavour and texture. Wakame is a source of iodine, although isn't a dependable source because the amount in seaweed varies greatly.
+ LONG
+ & Wakame is often served in soups, or in salads. Wakame is often sold dried (can be re-constituted in water) or salted.
Dried Hijiki
PARENT : Seaweed
+ WARN
+ & Consumption of only a small amount of hijiki seaweed could result in an intake of inorganic arsenic that exceeds the tolerable daily intake for this substance. Therefore, consumption of this type of seaweed is to be avoided. See also the {{Canadian Food Inspection Agency|http://www.inspection.gc.ca/food/information-for-consumers/fact-sheets-and-infographics/products-and-risks/chemical-hazards/inorganic-arsenic/eng/1332268146718/1332268231124}}.
Bull kelp powder
PARENT : Seaweed
Nori
PARENT : Seaweed
COLOR : #000000
- BREF : Fun fact: seaweed takes about 45 days to grow.
+ BREF : Nori is an edible species of red algea. It has a strong flavor, and is often used in dried sheets to wrap sushi.
+ LONG
+ & Dried sheets of seaweed are made by a shredding and rack-drying process that resembled papermaking. Nori sheets should be kept in an air-tight container because they can easily absorb water from the air.
Nori Sheets
PARENT : Nori, Seaweed
+ BREF : Nori is an edible species of red algea. It has a strong flavor, and is often used in dried sheets to wrap sushi.
+ LONG
+ & Dried sheets of seaweed are made by a shredding and rack-drying process that resembled papermaking. Nori sheets should be kept in an air-tight container because they can easily absorb water from the air.
Shiitake
PARENT : Mushroom
COLOR : #875A2C
+ BREF : Shiitake is an edible mushroom, used as a base in vegan dashi, to flavor simmered and steamed dishes.
Crimini
PARENT : Mushroom
COLOR : #875A2C
- BREF : Mature crimini mushrooms are actually {{portobello}} mushrooms.
+ BREF : Crimini mushrooms, or {*agaricus bisporus*}, are immature {{portobello mushrooms}}. They are brown and known under a variety of other names, like swiss brown, roman brown, italian brown and chestnut.
Portobello
PARENT : Mushroom
COLOR : #875A2C
- BREF : Portobello are mature {{crimini}} (or common) mushrooms. They can be used in plant-based recipes as hamburger steaks, you can even use them as buns.
+ BREF : Portobello are mature brown or white {*agaricus bisporus*} mushrooms. They can be used in plant-based recipes as hamburger patties, you can even use them as buns.
Shimeji
PARENT : Mushroom
+ BREF : Shimeji {*占地*} are a group of edible mushrooms native to East Asia. Shimejis are rich in 'umami', they have a distint nutty flavor.
+ LONG
+ & Shimeji mushrooms should always be cooked, because of its bitter taste which disappears upon cooking. It has a firm texture with a bit of a crunch. They are used in soups, stews and sauces, or stir-fried with vegetables.
Button Mushrooms
PARENT : Mushroom
-Black mushrooms
- PARENT : Mushroom
-Straw mushrooms
- PARENT : Mushroom
+ BREF : Button mushrooms, or {*agaricus bisporus*}, are small immature {{portobello mushrooms}}. They are white in color.
+ LONG
+ & Most button mushrooms are picked and sold when they are young, with their caps closed. The whole mushrooms is often used is recipes, stem included. To prepare button mushrooms, wipe them gently to remove dirt. They can be found in the wild, butcan easily be confused with A. Californicus, a look-alike that is mildly toxic.
~ SEEDS
Flax seeds
- BREF : Flax is the national flower of Belarus.
+ BREF : Flax seeds, or {*linseed*}, are harvested from the flax plant. Flax seeds are a source of Omega-3's, and can be used whole in breads, or ground as an egg-replacer in recipes.
+ LONG
+ & Flax seeds are used to make textiles, and are also made into oil (flaxseed oil).
Sunflower seeds
+ BREF : Sunflower seeds are the fruit of the sunflower. There are 3 types, {*linoleic*} being the most common. Sunflower seeds are a rich source of {*protein*}, {*iron*} and {*zinc*}.
+ LONG
+ & Sunflower seeds are commonly eaten as snacks, but can be used in recipes as garnishes or bases for {{vegan faux-cheese sauces|Sunflower heirloom carrot pasta}}. Seeds are sold in-shell or dehulled, both salted and unsalted.
Pumpkin seeds
+ PARENT : Pumpkin, Squash
+ BREF : Pumpkin seeds is the edible seed of a {*pumpkin*} and certain {*squashes*}. The seeds are flat, with a white outer husk. The inner seed is a dark green color. Pumpkin seeds are righ in {*protein*}, {*iron*} and {*zinc*}.
+ LONG
+ & Pumpkin seeds can be consumed raw, {{roasted|Roasted pumpkin seeds}}, or pureed into a nut butter. They can also be added to {{crackers|Crackers}}, {{cakes|Halloween pumpkin cookies}} and breads.
Sesame seeds
- BREF : Tahini is made by grinding toasted hulled sesame seeds. It is used in baba ghanoush, halva, hummus and in many other recipes. Because of its high oil content, it needs to be refrigerated to prevent spoilage. Tahini has high levels of calcium and protein, making it a must ingredient in any plantbased pantry.
+ BREF : Sesame seeds has many other species, coming in a variety of colors ranging from light to dark. It has the highest oil content of any seed, with a nutty flavor. Sesame seeds are high in {*protein*}, {*iron*} and {*zinc*}.
+ LONG
+ & Sesame seeds are added to breads, or over the top of baked goods, they are also baked into {{crackers|crackers}} or sprinkled onto a variety of foods. Popular uses of sesame seeds also include {{tahini}} and {{sesame oil}}. The seeds need stored at 6% moisture or less. If the seed is too moist, it can quickly heat up and become rancid.
White sesame seeds
+ PARENT : sesame seeds
+ BREF : White sesame is the seed of a flowering plant of the genus {*Sesamum*}. It has the highest oil content of any seed, with a nutty flavor. White sesame seeds are high in {*protein*}, {*iron*} and {*zinc*}.
+ LONG
+ & Sesame seeds are added to breads, or over the top of baked goods, they are also baked into {{crackers|crackers}} or sprinkled onto a variety of foods. Popular uses of white sesame seeds also include {{tahini}} and {{sesame oil}}. The seeds need stored at 6% moisture or less. If the seed is too moist, it can quickly heat up and become rancid.
Black sesame seeds
+ PARENT : sesame seeds
+ BREF : Black sesame is the seed of a flowering plant of the genus {*Sesamum*}. It has the highest oil content of any seed, with a nutty flavor. Black sesame seeds are high in {*protein*}, {*iron*} and {*zinc*}.
+ LONG
+ & Sesame seeds are added to breads, or over the top of baked goods, they are also baked into {{crackers|crackers}} or sprinkled onto a variety of foods. Popular uses of black sesame seeds also include {*gomashio*} (Japanese sesame salt) and {*chikki*} (Indian sweet brittle). The seeds need stored at 6% moisture or less. If the seed is too moist, it can quickly heat up and become rancid.
Tahini
+ PARENT : Sesame seeds
+ BREF : Tahini is a condiment made from toasted and ground hulled white sesame seeds. It is a rich source of {*protein*} and {*calcium*}.
+ LONG
+ & It is used in {*baba ghanoush*} (roasted eggplant dip), {*pekmez*} (sweet turkish dip), {{hummus|uzumaki hummus bites}} and in many other recipes. Because of its high oil content, it needs to be refrigerated to prevent spoilage. Tahini has high levels of calcium and protein, making it a must ingredient in any plantbased pantry.
Pomegranate seeds
Chia seeds
+ BREF : Chia seeds are the edible seeds of {*Salvia hispanica*}, a flowering plant belonging to the mint family. They are small, oval, grey/white/black seeds. Chia seeds are a source of {*Omega-3's*}.
+ LONG
+ & Chia seeds are {*hydrophilic*}, meaning that they can absorb up to 12x their weight in liquid. Soaking the seeds creates a thick, gluey coating that gives it a gel-like texture.
~ ROOT VEGETABLES
Nagaimo
+ BREF : Nagaimo is a Chinese yam, the only species that can be consumed raw. It has a bland flavor, and is primarily consumed due to the resulting {*mucilaginous*} texture when sliced or grated.
+ LONG
+ & When preparing nagaimo for consumption, gloves should be used because it can cause skin irritation. Nagaimo should be peeled and brieftly soaked in a vinegar-water solution to neutralize the {*oxalate crystals*} found in their skin, then, it can be cut into slices or grated. Grated nagaimo develops a {*mucilaginous*} texture, which can be added to dips for soba noodles, or to {{okonomiyaki|okonomiyaki}}.
Carrots
- BREF : Overconsumming carrots can cause what is reffered to as "Carotenosis", a condition in which the skin turns orange.
+ BREF : Carrots contain high quantities of vitamin A.
+ LONG
+ & Carrot cultivars can be grouped into two broad classes, {*eastern carrots*} (purple, yellow, often with branched roots) and {*western carrots*} (with an abundance of carotene). Carrots benefit from companion plants. Onions, leeks and chives for instance help repel the carrot root fly. Carrots can be stored for many months in a refrigerator, or in moist, cool places in winter. For long-term storage, carrots can be stashed in a bucket between layers of sand. A storage temperature of 0 to 5 °C is ideal.
+Small heirloom tomatoes
Heirloom Carrots
+ PARENT : Carrots
+ BREF : Heirloom carrots are a root vegetable, that comes in a variety of colors (orange, purple, black, red white and yellow). It is cultivated for its leaves and taproot. Carrots contain high quantities of vitamin A.
+ LONG
+ & Heirloom carrots are an old cultivar grown and maintained by a minority of gardeners and farmers. They were commonly grown during earlier periods in human history, but are not used in modern large-scale agriculture. Many heirloom carrots kept their traits through {*open pollination*}, plants pollinated naturally by birds, insects, wind, or human hands.
Ginger
+ BREF : Ginger root is the rhizome of the Ginger plant, used to flavor dishes. It is pickled, steeped (for hot beverages), candied, brewed into beer, powdered and used in an incredible range of recipes.
+ LONG
+ & Dried and powdered ginger can be used as a substitute for fresh at a ratio of 6 to 1, but the flavor differs greatly. Ginger root should be peeled before consumption, and can be refrigerated or frozen for long-term storage.
Ginger Root
+ BREF : Ginger root is the rhizome of the Ginger plant, used to flavor dishes. It is pickled, steeped (for hot beverages), candied, brewed into beer, powdered and used in an incredible range of recipes.
+ LONG
+ & Dried and powdered ginger can be used as a substitute for fresh at a ratio of 6 to 1, but the flavor differs greatly. Ginger root should be peeled before consumption, and can be refrigerated or frozen for long-term storage.
PARENT : Ginger
Potatoes
- BREF : Since vitamin A deficiency is a common problem in Africa, people are encouraged to eat {{sweet potatoes}}.
+ BREF : The potato is a root vegetable, of the plant {*solanum tuberosum*}. They are a staple throughout the world, and the 4th largest food crop after corn, wheat and rice. After years of selective breeding, there are now 1,000 different types of potatoes. Potatoes should not be eaten raw, because we don't digest it well.
+
Russet Potatoes
PARENT : Potatoes
+ BREF : Russet potatoes are large with a dark brown skin. Their flesh is white, dry and mealy. Russet potatoes are a good source of {*vitamin C*} and {*iron*}.
+ LONG
+ & Russet potatoes can be baked, mashed, and are often made into fries. Russet potatoes keep for up to a month if stored in a cool, dry and dark place.
Sweet Potatoes
PARENT : Potatoes
+ BREF : Sweet potatoes are big, starchy, sweet-tasting, root vegetables. They come in a variety of colors, with their skin ranging from yellow, orange, brown, red purple and beige. The flesh ranges from beinge through white, red, purple, yellow, orange and violet. Light-skinned sweet potatoes have flesh that is firm, while orange-fleshed varieties are softer. Sweet potatoes are a good source of {*vitamin A*}, {*vitamin C*} and {*iron*}.
+ LONG
+ & Sweet potatoes are used in both sweet and savory recipes, they can be served cooked, mashed, they can also be baked, roasted, steamed, simmered or fried. Sweet potatoes keep well if stored loose in a cool dry place, away from direct sunlight. Their leaves are edible and can be prepared like {{spinach}} or turnip greens.
Beets
+ BREF : Beets, or {*beetroots*}, are the taproot portion of the beet plant. There are many cultivated varieties, like red beets, golden beats, table beet etc.
LONG
- & {{Golden beets}} are rich in b-xanthin pigment, so they cannot replace {{red beets}} (which contain betalain pigment). Both pigments offer different health benefits!
- & The root of the beet plant is called a beetroot. Don't be alarmed, beetroot juice will make your urine red for a day.
+ & Beetroot is used as a red food colorant in desserts, candies and a variety of other {{baked goods|raisin beet bread}}, {{soups|borscht with tofu sour cream}} and desserts, it's also used to make {{sauces|roasted beet lentils}}. Don't be alarmed, red beetroot juice will make your stools and urine red for a day.
Golden Beets
PARENT : Beets
- BREF : A type of {{beet|beets}} containing b-xanthin pigment.
+ BREF : Golden or yellow beets, or {*beetroots*}, are the taproot portion of the beet plant and have a golden/yellow fleshy interior. This cultivar is sweeter and milder than their red counterparts.
+ LONG
+ & Golden beets keep in the refrigerator up to two weeks, but the beet tops should be eaten shortly after harvest.
Red Beets
PARENT : Beets
- BREF : A type of {{beet|beets}} containing betalain pigment.
-Yuka
- BREF : Tapioca is actually a starch extracted from Yuca roots.
+ BREF : Red beets, or {*beetroots*}, are the taproot portion of the beet plant and have a red fleshy interior. Underneath the surface, the flesh is a deep crimson and is dense, aqueous, and crunchy. When cooked, Red beets develop a tender, soft texture with a mildly sweet, earthy flavor. The beet plant also grows leafy stalks that are edible and have a taste similar to swiss chard.
+ LONG
+ & It is consumed raw in salads, they can also be roasted, steamed, fried and boiled. Beetroot is used as a red food colorant in desserts, candies and a variety of other {{baked goods|raisin beet bread}}, {{soups|borscht with tofu sour cream}} and desserts, it's also used to make {{sauces|roasted beet lentils}} and {{dips|uzumaki hummus bites}}. Don't be alarmed, beetroot juice will make your stools and urine red for a day.
+Cassava
+ BREF : Cassava
Garlic
- BREF : Garlic has been used in many cultures around the world for thousands of years, dating all the way back to the time the pyramids were built!
+ BREF : Garlic bulbs range from medium to large, consisting of gloves encased in individual wrappers. It has a mild allium scent and taste. Crushing or pressing the cloves releases enzyme compounds that produce a sulfur-based molecule called {*acilin*}, which is responsible for giving garlic its pungent aroma and taste.
+ LONG
+ & Garlic can be consumed both raw or cooked, with raw having a stronger flavor. Garlic pairs well with acidic fruits and vegetables like {{tomatoes}} and citrus, herbs like {{basil}}, {{thyme}} and {{oregano}} and vegetables like broccoli, {{brussel sprouts}}, {{snap peas}} and {{artichokes}}.
Garlic Powder
PARENT : Garlic
+ BREF : Garlic powder is dehydrated garlic. It is used in recipes where moisture content is key. 1/8 of a teaspoon of garlic powder equals one fresh {{garlic}} clove.
+ LONG
+ & To make garlic powder, the cloves are peeled and sliced, and then heated to a temperature of between 150-160C to remove all moisture. The dehydrated garlic is then sliced, chopped and ground into a powder.
Onion
Red Onion
PARENT : Onion
COLOR : #C820B3
- BREF : There is a variety of red onion in Italy that has a stronger and sweeter taste, and is sometimes made into marmalade.
+ BREF : Red onions have a purplish-red skin, and flesh that is white and tinged with red. They are crunchy, pungent, sweet and a bit spicy when raw. When cooked, they become milder. They contain {*vitamin C*}, {*iron*} and {*calcium*}.
+ LONG
+ & Red onions can be grilled, roasted, braised, caramelized and pickled. The bulbs will keep for 1-2 months when stored in a cool, dark and dry place with good air circulation.
Onion Powder
PARENT : Onion
Yellow Onion
PARENT : Onion
+ BREF : Yellow onions are encased in a light-yellow to copper papery skin, while the inner flesh is white. They are crunchy, with a pungent flavor when raw. If cooked, yellow onions develop a milder flavor, that is both nutty and sweet. Yellow onions are a good source of {*vitamin C*}.
+ LONG
+ & Yellow onions can be sauteed, braised, caramelized, grilled or dry-roasted. They are used to add flavor to broths, soups and stews. The bulbs will keep for 1-2 months if stored in a cool, dry and dark place with good air circulation.
~ OTHER VEGETABLES
Cucumber
- BREF : Cucumbers are usually more than 90% water.
+ BREF : There are many varieties of cucumbers, but the 3 main are: slicing, pickling and seedless. Cucumbers are 95% water, making them a low-energy food.
+Persian cucumbers
+ PARENT : Cucumber
+ BREF : Persian cucumbers are of the Burpless variety, meaning they are easy to digest and have a pleasant taste. They are crisp, sweet and void of developed seeds. It is harvested when 4-6" in length, when they are at peak sweetness. They absorb flavors quickly, unlike garden cucumbers.
+ LONG
+ & They are sometimes marketed as seedless or burpless, because the seeds and skin of other varieties of cucumbers are said to give some people {{gas|https://www.livestrong.com/article/471722-why-do-cucumbers-upset-my-digestion/}}.
Eggplant
Zucchini
+ BREF : Zucchini squash, or {*courgette*}, are summer squashes. They can be dark or light green. Botanically they are treated as vegetables, but they are fruits. Zucchini squah can be harvested when young, or later once it has grown to 6-8" long. Immature squashes have better flavor, with a spongy yet firm texture. Zucchini are a low energy food, being 94% water, and are a source of {*vitamin A*}, {*vitamin C*} and {*iron*}.
+ LONG
+ & Zucchinis have a mild flavor which makes them ideal in both sweet and savory recipes. They can be grated, steamed, sauteed, battered, fried, baked, julienned for pasta, eaten raw etc. Zucchini will keep for 1-2 weeks if kept dry and refrigerated.
Chives
- BREF : Chinese chives or "nira" in Japanese, are full of vitamins and add a lot of flavor to a dish. Nira is often found in gyoza, it shares the same pungent smell as garlic.
+ BREF : Chives grow in clusters, with hollow leaves that come to a point. They have a mild onion flavor, which doesn't linger. They are a good source of {*calcium*} and {*iron*}.
+ LONG
+ & Chives are used as a garnish, and as an aromatic herb. In cooking, it is best to add them at the end of the cooking process because they lose their flavor when heated. They have insect-repelling properties that can be ued in gardens to control pests. Chives can be stored in a bag in the refrigerator, if kept dry they will last up to a week.
Peppers
- BREF : The misleading name 'pepper' was given by Christopher Columbus when he brought back a plant to Europe. The word pepper was given to all spices in Europe that had a hot and pungent taste.
-Green Peppers
+ BREF : Peppers, or the fruit (botanically berries) of the {*capsicum plants*}, have a variety of names depending on place and type. The more spicy varieties are commonly called {*chili peppers*}. The large, mild form is called bell pepper, or by color {{green pepper}}, green bell pepper, {{red bell pepper}}.
+ LONG
+ & The misleading name 'pepper' was given by Christopher Columbus when he brought back a plant to Europe. The word pepper was given to all spices in Europe that had a hot and pungent taste.
+Green Bell Peppers
PARENT : Peppers
-Red Peppers
+ BREF : Green bell peppers, or {*capsicum*}, are medium to large in size, with a firm skin that is crisp and juicy. They are an aromatic 'green', almost biter flavor. They are a good source of {*vitamin C*} and {*vitamin A*}.
+ LONG
+ & They can be served raw, or baked, sauteed, roasted and grilled. Green bell peppers keep 1-2 weeks when stored unwashed in the refrigerator.
+Red Bell Peppers
PARENT : Peppers
-Yellow Peppers
+ BREF : Red bell peppers, or {*capsicum*}, are medium to large in size, with a firm skin that is crisp and juicy. They have a sweet and fruity flavor. Red bell peppers are simply ripened {{green bell peppers}}, and are a good source of {*vitamin C*} and {*vitamin A*}.
+ LONG
+ & They can be served raw, or baked, sauteed, roasted and grilled. Red bell peppers keep 1-2 weeks when stored unwashed in the refrigerator.
+Yellow Bell Peppers
PARENT : Peppers
+ BREF : Yellow bell peppers, or {*capsicum*}, are medium to large in size. The smooth skin is firm, glossy, and pale green when young, transforming to bright yellow with age. They have a mild, sweet flavor, and are a good source of {*vitamin C*}, {*iron*}, {*calcium*} and {*vitamin A*}.
+ LONG
+ & They can be served raw, or baked, sauteed, roasted and grilled. Red bell peppers keep 1-2 weeks when stored unwashed in the refrigerator.
Tomato
Tomato Paste
PARENT : Tomato
- BREF : The tomatoes can also be dried with an oven.
+ BREF :
Avocado
- BREF : Avocados are botanically 'berries', they may be pear-shaped, round or egg-shaped. They are a good source of fat. Fun fact: Avocado trees don't self-pollinate, they need another avocado tree nearby to bear fruit.
+ BREF : Avocados are botanically 'berries', they may be pear-shaped, round or egg-shaped. They are a good source of {*vitamin C*}, 75% of its energy comes from fat. Its flesh is thick, yellow/green and oily. It has a rich, creamy flavor with a nutty, yet clean, grassy finish.
+ LONG
+ & Avocado can be pureed, spooned out its shell and eaten as is (when ripe), or added to salads. The flesh is prone to enzymatic browning, quickly turning brown after exposure to air. To prevent browning, add lime or lemon juice to avocados after peeling.
Pumpkin
BREF : The darker the skin of the pumpkin, the higher the beta-carotene content.
Olives
+ BREF : Olives come from {*Olea Europea*}, a small tree. Olives are the fruit of the olive tree. 90% of harvested olives are turned into {{olive oil}}, while the rest are sold as table olives.
+ LONG
+ & Table olives are classified into 3 groups: {*green olives*}, {*turning color olives (semi-ripe)*} and {*ripe olives*}.
Green Olives
PARENT : Olives
+ BREF : Green olives are picked before the olive ripening cycle has begun, they are either green or yellow.
Black Olives
PARENT : Olives
+ BREF : Ripe olives, or black olives, are picked at full maturity and come in shades of purple to brown to black. Most black olives sold in stores though are not ripe, they're green olives which have been chemically treated so that they are black.
Pimento Olives
- PARENT : Olives
+ PARENT : Olives
+ BREF : Pimento olives are pitted green olives with a {*pimento pepper*} stuffed inside, all preserved in oil. Pimento peppers are mild in taste.
Palm
- BREF : Heart of palm is a vegetable that is harvested from the inner core of certain palm trees. They can be eaten as is, but they're especially delicious when tossed into a salad.
-Squash
- BREF : The seeds of the acorn squash can be eaten, they're delicious when roasted!
+ BREF : Heart of palm is a vegetable that is harvested from the inner core of certain palm trees, like {*Bactris gasipaes*}. Heart of palm are rich in {*iron*}, {*zinc*}, {*vitamin C*}.
+ LONG
+ Heart of palm is considered a delicacy since harvesting them is labor-intensive.
+Acorn Squash
+ BREF : Acorn squash is a winter squash, with skin a ridged outer skin and a sweet, yellow-orange flesh. Acorn squash comes in a variety of colors, like green, white and gold. They contain small amounts of {*vitamin C*}.
+ LONG
+ & Acorn squash can be baked, sauteed or steamed. When cooked, the flesh becomes tender and offers a mildly sweet and nutty flavor with a dry-ish texture. It is often used in savory recipes, stuffed with rice or vegetables. Adding {{maple syrup}} as a glaze when baking enhances the flavor of the squash. The seeds can be eaten, but must be roasted first. Acorn squash keep up to 1 month when stored uncut, in a cold and dry place.
Artichokes
Asparagus
Bamboo shoots
Breadfruit
+ BREF : Breadfruit are prickly with yellow-green skin. Their appearances depends on the variety and growing conditions. When immature, the fruit is hard, and the flesh is starchy and a bit fibrous. Ripe breadfruit becomes soft, with the skin turning a yellow color, it also develops a creamy texture with a sweet aroma. Breadfruit is a high-energy food, containing all 9 EAA's. It's rich in {*protein*}, and contains {*vitamin C*}, {*calcium*} and {*iron*}.
+ LONG
+ & Breadfruit trees can grow more than 80 feet tall, they are one of the highest yielding food plants with a single tree producing up to 450 pounds of fruit per year. Because of it's high-yield and energy content, it has the potential to address world hunger. Breadfruit can be baked into cakes and bread, it can also be made into {{pasta|#breadfruit pasta}}, {{pan-fried|#Pan fried breadfruit}}, marinated, pickled, made into chips etc.
Scallions
- BREF : In some countries scallions are mistakenly referred to as 'shallots'.
+ BREF : Scallions, or green onions, is a term used for multiple varieties that were harvested when young before a bulb appears. They are crisp and juicy and have a milder taste than most onions. Scallions are a source of {*vitamin C*}, {*calcium*} and {*vitamin A*}.
+ LONG
+ & Scallions can be stir-fried, sauteed, roasted and grilled, but they can also be consumed raw, added as a topping on a variety of dishes. The leaves will keep up to 5 days when wrapped and stored in the refrigerator.
Spinach
- BREF : During the Cold War, wine with added spinach juice was given to weakened soldiers.
-Alfaalfa sprouts
+ BREF : Spinach, or {*Spinacia oleracea*}, is a leafy green with a subtle green flavor and iron/metallic notes. There are 3 main varieties: {*savoy*} (primary commercial type), {*semi savoy*} (partially crinkled leaves, often processed)and {*flat-leafed*} (mainly processed). Spinach is a rich source of {*beta-carotene*}, and is a good source of {*vitamin A*}, {*calcium*}, {*vitamin C*} and {*iron*}.
+ LONG
+ & Raw spinach contains high levels of {{oxalates|https://veganhealth.org/oxalate/}}, which block absorption of calcium and iron in the stomach and small intestine. Spinach cooked in several changes of water has much lower levels, and can be {{digested more easily|https://www.nof.org/patients/treatment/nutrition/}}. Spinach can be baked into breads of cakes, sauteed etc. Spinach can keep 1-2 weeks if dry and kept in a cool place.
+Alfalfa sprouts
+ BREF : Alfalfa sprouts, or {*lucerne*}, are soaked in water and allowed to {{sprout|https://web.archive.org/web/20130515011922/http://coolshinystuff.com/how-to-sprout-alfalfa}} over several days. Sprouts have a crunchy texture with a sweet and nutty taste. They are a source of {*vitamin C*} and {*zinc*}.
+ LONG
+ & Alfalfa sprouts can be added to sandwiches, salads, or sprinkled atop dishes. Sprouting alfalfa usually takes three to four days with one tablespoon of seed yielding up to three full cups of sprouts. If you want to sprout seeds, make sure they are fresh and washed thoroughly with water before use. The FDA has made {{recommendations|https://www.regulations.gov/docket?D=FDA-2018-D-4534}} for both growers and consumers on how to avoid contamination.
~ BERRIES
-Raisins
Dried Raisins
- PARENT : Raisins
+ BREF : Raisins are large, dried, dark-colored grapes, not to be confused with {*sultanas*} (golden-colored)and {*currants*} (small black seedless grapes). They contain some {*vitamin C*}, but less than fresh grapes.
+ LONG
+ & Raisins are dried in 3 steps, the first is pre-treatment. Raisins are dipped in a dry emulsion 'cold dip' that increases the rate of water loss by 3x. A faster water removal lowers browning and produces better raisins. Step two, is drying, where the raisins are either sun-dried, shade-dried or dried mechanically. Step three, involves cleaning the raisins and removing all foreign objects for consumption. This 'washing' process causes rehydration, which means that another drying step is require to remove all moisture.
+ & Important note: Raisins are toxic to dogs.
Blackberries
-Cherries
-Mulberries
-Raspberries
-Strawberries
-Cranberries
+ BREF : Blackberry is used as a generic term to refer to a wide range of bush berries ( loganberries, boysenberries, marionberries and ollalieberries), the fruit is a member of the {*Rosaceae*} family and of the {*Rubus*} genus. They are sweet, slightly tart and juicy. Blackberries are a good source of {*vitamin A*}, {*vitamin C*}, {*iron*} and {*calcium*}.
+ LONG
+ & Blackberries can be added to both sweet and savory dishes.
+Dried cranberries
BREF : Dried cranberries are often coated with a bit of vegetable oil to keep them from sticking to each other. Look in natural food stores to find brands that don't do this.
-Goji
-Mixed Berries
+Dried White Mulberries
+ BREF : White mulberries are one of many species of mulberries, one whose fruit remains white when ripe. White mulberries are sweet, with a mild flavor. The dried variety can be reconstituted in water. They are a source of {*vitamin C*} and {*iron*}.
+ LONG
+ & Dried mulberries can be reconstituted in water, and can also be used in herbal teas or granolas to add a bit of sweet. It is considered an invasive species in North America. If you want to dry your own mulberries, check out {{this tutorial|https://oureverydaylife.com/556453-how-to-dry-mulberries.html}}.
+Dry corn kernels
+ BREF : Corn kernels are the fruit of corn, or {*maize*}. One ear of corn has roughly 800 kernels and they come in a grand variety of colors: Black, blue-grey, purple, green, white and yellow.
+ LONG
+ & Corn kernels have many uses other than food, they're used to produce biofuel and bioplastics.
~ OTHER FRUITS
Pandanus fruit
- BREF : The fruit of the pandanus tectorius tree is widely consumed in the pacific islands, but it goes under other names, like "hala", "screwpine" or "pu hala". The phalanges covering the inner core are buoyant, so like coconuts they can be transported for many months by ocean currents while remaining viable.
+ BREF : The fruit of the {*pandanus tectorius*} tree is widely consumed in the pacific islands, but it goes under other names, like {*hala*}, {*screwpine*} or {*pu hala*}. The fruits are large, and composed of 40-80 wedge-like phalanges (or keys). The fruit changes from green to orange/red as it matures, and can stay on the tree for more than 12 months. The fruit is eaten raw or cooked, and is a source of {*vitamin A*}.
+ LONG
+ & Pandanus are a source of food, but they're also used to produce material for clothing, basket and weaving and shelters. Pandanus trees are super trees, they can withstand difficult conditions (storms, sea air, drought) and propagate with ease. The phalanges covering the inner core are buoyant, so like coconuts they can be transported for many months by ocean currents while remaining viable.
Banana
+ BREF :
+ & Bananas are a starch fruit (botanically berries) consumed the world over, and come from two wild species. They vary in size and color, and always grow in clusters at the top of the banana palm. Bananas are a source of {*vitamin C*}.
+ LONG
+ & They can be used in a variety of ways in recipes, for both desserts and savoury meals. They can be deep fried, baked in their skin, steamed, made into preserves, processed into vinegar etc.
+Kiwifruit
+ BREF : Kiwifruit is the edible berry of species of {*woody vines*} in the genus {*Actinidia*}. Kiwifruit have a thin, hair-like skin with a light green or golden flesh. It has a soft texture with a sweet tart flavor. Kiwi fruit is a rich source of {*vitamin C*}, and a source of {*calcium*} and {*iron*}.
LONG
- & Bananas are fruit (actually berries) consumed the world over, and come from two wild species. They vary in size and color, and always grow in clusters at the top of the banana palm.
- & Fun fact: they're 75% water.
- & They can be used in a variety of ways in recipes, for both desserts and savoury meals. As a low source of fat, they can be used to make non-dairy {{ice creams|balsamic banana ice cream}}.
-Kiwi
+ & Kiwifruit is eaten raw, used as a garnish, it is also processed into juices and baked into cakes. The whole fruit is edible, even the skin. To store, refrigerate ripe fruit up to ten days. Refrigerated unripe fruit lasts up to one month.
Apple
Apples
Lemon
- BREF : Fun fact: lemon juice can be used as an invisible ink, revealed with heat.
+ BREF : Lemons are a citrus fruit with a distinctive sour taste. They are a rich source of {*vitamin C*}.
+ LONG
+ & Lemon is sometimes used as a short-term preservative on foods (apples, avocados, bananas) that brown or oxidize after being sliced.
Lemon Zest
+ PARENT : Lemon
+ BREF : The rind of lemons can be grated, and used as 'zest' in baking and many other recipes.
Lemon Juice
+ PARENT : Lemon
+ BREF : Lemon juice is used in many culinary and cleaning uses.
Orange
BREF : In the early 16th century, the orange was considered a luxury item and rich people would grow it in private conservatories called "orangeries".
-Pear
+Pears
+ BREF : Pears are the fruit of the pear tree, a species of genus {*Pyrus*}. Most pears are cold-hardy, withstanding temperatures between -25C and -30C in winter. There are many species of pears, ranging in size, shape and color. They will keep up to 3 weeks when stored in the refrigerator and a little over 1 year if frozen. Pears ripen at room temperature. They will ripen faster if placed next to bananas in a fruit bowl.
Bartlett Pear
+ PARENT : Pears
+ BREF : Barlett pears are large, and have a skin that brightens as it ripens, transforming it from a green to a golden yellow tint. They have a cream-colored flesh, that is crunchy and tart when ripe, and a buttery and sweet taste when fully ripe. They are rich in {*vitamin C*} and {*iron*}.
+ LONG
+ & Bartlett pears can be eaten raw, they can be baked, boiled and grilled. Bartlett pears are known as the “canning pear” because they hold their shape and have a distinct flavor and sweetness when preserved.
Papaya
+ BREF : Papayas, or {*pawpaw*}, are the fruit (berries) of the {*carica papaya*}. It is one of 22 species of the genus {*Carica*}. There are two main kinds: Red papayas and yellow papayas. Even when unripe, these two varieties can be grated and eaten and are known as 'green papayas'. Papayas are a rich source of {*vitamin C*}.
+ LONG
+ & The ripe fruit can be consumed raw, and the unripe green fruit can be eaten cooked in salads or other meals. The seeds are edible, they can be washed and dried and used like {{black pepper}}.
Pomegranate
Pomegranate Juice
Mango
@@ -339,7 +536,9 @@ Anise
Anise Seeds
Nutritional yeast
COLOR : #FFD800
- BREF : In the US it's sometimes referred to as "nooch".
+ BREF : Nutritional yeast is a deactivated yeast, a strain of {{Saccharomyces cerevisiae|https://www.sciencedirect.com/topics/neuroscience/saccharomyces-cerevisiae}}. It is sold as yellow flakes or powder, and has a cheesy, nutty taste and flavor. Fortified nutritional yeast is a good source of {*vitamin B12*}.
+ LONG
+ & Nutritional yeast is often confused with brewer’s yeast, but the two are distinct. Brewer’s yeast is aptly named, as it was initially offered as a byproduct of the beer brewing industry. It is a key ingredient in vegan cheese sauces, it can also be used as a condiment. Nutritional yeast adds a lot of depth and flavor to a variety of dishes.
Vanilla
Vanilla Extract
Nutmeg
@@ -471,11 +670,10 @@ Flour
& {{Spelt flour}} was a staple food during the Bronze age all the way up to medieval times.
& Brown {{rice flour}} is sometimes used as a base to grow mushrooms.
& {{Einkorn|einkorn flour}} wheat was one of the first plants to be domesticated and cultivated. It has a high percentage of protein, more than regular wheat. It also has high levels of fat, phosphorus, potassium, pyridoxine (a form of vitamin b6) and beta-carotene, making it more nutritious than other kinds of grains. Another great thing about einkorn is that it isn't as toxic to people on gluten-free diets, it as yet to be proven but it should definitely be looked into!
- & {{Breadfruit flour}} is a type of flour made from dried and ground breadfruit.
All Purpose Flour
PARENT : Flour
Breadfruit Flour
- PARENT : Flour
+ PARENT : Breadfruit
BREF : The product of dried and ground breadfruit. Can be used to make cakes, pasta and a number of other meals.
Wheat Semolina
Oatmeal
@@ -484,6 +682,10 @@ Cornmeal
~ SPECIAL
Beni shouga
+ PARENT : Ginger root
+ BREF : Beni shouga, or pickled ginger, is a Japanese pickle or {*tsukemono 漬物*}.
+ LONG
+ & Beni shouga is made from thin strips of ginger, pickled in {*umezu 梅酢*} (plum brine). Umezu is the brine that results during the process of making {*umeboshi 梅干*} (pickled plums). Traditionally, the red of the ginger comes from the {*shiso シソ*} plant of the genus {*Perilla*}, although most commercial products use artificial coloring. Beni shouga is commonly served in yakisoba (sauteed buckwheat noodles) and {{okonomiyaki|#okonomiyaki}}.
Vegemite
COLOR : #875A2C
BREF : It's one of the richest sources of B vitamins, specifically thiamine, riboglavin, niacin and folic acid. It doesn't have any fat, added sugar or animal content.
@@ -496,18 +698,17 @@ White Miso
COLOR : #955C19
Tofu
COLOR : #EFEFEF
- BREF : The word {_bean curds_} for tofu has been used in the US since 1840. See also: {{silken tofu}}, {{burmese tofu}}.
-Silken Tofu
+ BREF : The word {_bean curds_} for tofu has been used in the US since 1840. See also: {{soft tofu}}, {{burmese tofu}}.
+Soft tofu
PARENT : Tofu
- COLOR : #EFEFEF
+ BREF : Soft tofu, as its name suggests, is a softer version of tofu. It has a high water content, this should be taken into consideration when added to recipes. It is often used to make sauces, or smoothies.
Burmese Tofu
PARENT : Tofu
COLOR : #EFEFEF
-Tofu Mayo
+Veganaise
PARENT : Tofu
+ BREF : Venagaise is a brand of plant-based mayonnaise, and it is also a general word used to refer to mayos that don't use animal products. To view the ingredients, see the {{recipe|#homemade veganaise}}.
COLOR : #FFD800
-Nutolene
-Soy protein
~ SAUCES
@@ -527,7 +728,8 @@ Bamboo charcoal powder
LONG
& Bamboo charcoal comes from pieces of bamboo plants, harvested after at least five years, and burned in ovens at temperatures ranging from {#800 °C#} to {#1200 °C#}.
& It benefits environmental protection by reducing pollutant residue. It is an environmentally functional material featuring excellent absorption properties. It can be added to foods to give it a black tint, it's very popular in Japan. You can get some through Taketora, a japanese company. (wikipedia description).
- & {*Important note*}: Bamboo charcoal binds on the nutrients in food that you're meant to be digesting, so it's preferable to not add bamboo charcoal to every food you make. Use it sparingly, as an occasional treat.
+ WARN
+ & Bamboo charcoal binds on the nutrients in food that you're meant to be digesting, so it's preferable to not add bamboo charcoal to every food you make. Use it sparingly, as an occasional treat.
Cornstarch
Active dry yeast
Baking soda
@@ -546,13 +748,23 @@ Brown rice syrup
BREF : Brown rice syrup is used to sweeten rice milk.
~ VINEGARS
-
Rice vinegar
- BREF : Substituting rice vinegar for western style vinegar isnt really appropriate, it's too acidic.
+ BREF : Rice vinegar is made by fermenting rice, and is often used as a dressing or as seasoning.
+ LONG
+ & Rice vinegar comes in a variety of flavors and color, ranging from clear to red, brown and black. The Chinese varieties are stronger, and known as 'rice wine vinegars' while Japanese vinegars are less acidic.
+Japanese rice vinegar
+ BREF : Japanese Rice vinegar "komezu" or simply "su" has a very mild taste, and is either colorless or yellow. Japanese rice vinegar is made from rice.
+ LONG
+ & This type of vinegar is less acidic than Chinese varieties, and are used to season rice, and for making "sunomono" (vinegar dishes) and "tsukemono" (pickles). There are some kinds of Japanese rice vinegars that are 'seasoned', meaning that they have additives like {{sake}}, {{salt}} and {{sugar}}, for added flavor.
Balsamic vinegar
COLOR : #6620B3
+ BREF : Balsamic vinegar, or {*aceto balsamico*} is a dark, concentrated, flavoured vinegar from Italy. It is made wholly, or in part from grape must. True balsamic vinegar is rich with a complex flavor that is both sweet and sour.
+ LONG
+ & The name "aceto balsamico" isn't regulated, but there are 3 in existence that are: Aceto Balsamic Tradizionale di Modena, Aceto Balsamico Tradizionale di Reggio Emilia and Aceto Balsamico di Modena. The two traditional varieties are made from a reduction of pressed Trebbiano and Lambrusco grapes that are aged for many years in wooden barrels (for a minimum of 12yrs), produced exclusively in the province of Modena or the Emilia region around it. Aceto Balsamico di Modena is also made from grape must, but it is blended with wine vinegar, and imitates the traditional product.
Apple cider vinegar
- BREF : It is thought that consuming vinegar between meals will help to make you feel full for longer.
+ BREF : Apple cider vinegar is made from fermented apple juice, it is used for food preservation, marinades, vinaigrettes salad dressings. It has a sour taste, and can be used to make homemade cleaning products.
+ LONG
+ & ACV is made from crushing apples and extracting the juice, bacteria and yeast are then aded to kickstart the fermentation process which converts the sugars into alcohol. There is a second fermentation, which then turns the alcohol into vinegar by acetic acid-forming bacteria. It can be used as a leavening agent in recipes, when mixed with baking soda, creating a chemical reaction which produces carbon dioxide which helps lift the batter.
~ SUPPLEMENTS
@@ -561,13 +773,17 @@ B12 supplement
~ TEA
Matcha Powder
- BREF : Only Tencha can be used to make matcha.
+ BREF : Matcha is finely ground powder of specialty grown green tea leaves.
+ LONG
+ & There are different grades of matcha, used for different purposes. There is {*ceremonial grade*}, {*premium grade*} and {*culinary grade*}. In recipes, it is used in desserts and drinks, it adds both bitterness and color to a dish and pairs well with sweet.
COLOR : #006633
TAGS
Tea
Houjicha
- BREF : KitKat in Japan has a houjicha flavour.
+ BREF : Houjicha is roasted Japanese green tea. It is roasted in a porcelain pot over charcoal, instead of being steamed like most Japanese teas. The leaves turn from green to brown, and develop a nutty, caramel-like flavor.
+ LONG
+ & Houjicha is lower in caffeine than green tea, because of the roasting process. Because of this, it is popular tea to serve in evenings after meals.
COLOR : #875A2C
Hibiscus
@@ -581,9 +797,21 @@ Lapsang souchong
~ ALCOHOL
Wine
- BREF : Wine has long been used as an antiseptic to treat wounds - it was even used to treat pain from child birth.
+ BREF : Wine is made from fermented grapes, with different varieties of grapes and strains of yeast produced different styles of wine.
+ LONG
+ & There are many wine variants, like {*red wine*}, {*white wine*}, {*rosé wine*}. {*fruit wines*}, {*honey wines*} and {*starch-based wines*}. Different concentrations of alcohol in the human body have different effects on a person.
+ & Wine is often served with dinner, paired with specific dishes for enhanced flavors. There are sweet wines, to accompany desserts. Wine is also cooked as a flavor agent in dishes, like in stocks or when braising. The acidity of wine lends balance to rich savory or sweet dishes.
Beer
+ BREF : Beer is brewed from cereal grains, like malted barley, wheat, maize and rice.
+ LONG
+ & During the brewing process, the starch sugars ferment and produce ethanol and carbonation in the beer. Nowadays, {{hops|hops}} is added to beer, as a preserving agent, but also because it adds bitterness and other flavors. Modern beer ranges from 4% to 6% strength ABV (alcohol by volume), but there are varieties that are much lower and much higher than this (up to 20%-40%).
+ & The sediment in craft beer, can be used as a leavening agent in {{beer bread|beer bread}}.
+ & There is some nutritional value in beer, but it varies greatly from beer to beer, and this does not make it essential to good health.
Sake
+ BREF : Sake is Japanese rice beer, and it comes in a variety of flavors and concentrations.
+ LONG
+ & There is {*nihonshu-do 日本酒度*}, {*san-do 酸度*}, {*aminosan-do アミノ酸度*}, {*ginjoushu 吟醸酒*} and many, many more. Sake is made by fermenting rice that has been polished to remove the outer bran. The process of sake is more similar to beer than to wine, because the starch is converted into sugars which ferment into alcohol.The serving temperature of sake depends on the type. Sake can be served at room temperature {*hiya 冷や*}, chilled {*reishu 冷酒*} or heated {*atsukan 熱燗*}.
+ & In cooking, you can use a cheaper variety called {*ryorishu 料理酒*} or {*cooking sake*}. Cooking sake has added salt to make it unfit for drinking, so that shop owners can sell it without an alcohol license. Adding regular sake in recipes though is also fine.
Whisky
Cider
Rhum
@@ -593,27 +821,55 @@ Porto
Coconut oil
COLOR : #EFEFEF
- BREF : Coconut oil was used in oil lamps in India before they had electrical lighting.
+ BREF : Coconut oil is an edible oil extracted from the meat of mature coconuts. It has a high-fat content, which makes it resistant to rancidification, lasting up to 6 months without spoiling.
+ LONG
+ & Coconut oil, as is the case for most cooking oils, isn't essential to good health and should be used sparingly. Fun fact: Coconut oil was used in oil lamps in India before they had electrical lighting.
Canola oil
- BREF : Canola oil has many non food uses, it is used in candles, lipsticks, inks etc
+ BREF : Canola oil is a good source of Omega-3's, it is derived from a variety of rapeseed. Canola oil has many non food uses, it is used in candles, lipsticks, inks etc
+ LONG
+ & Canola oil, as is the case for most cooking oils, isn't essential to good health and should be used sparingly.
Olive oil
- BREF : Extra virgin olive oil has strict requirements, it's checked for all kinds of defects to be made perfect
+ BREF : Olive oil is produced by pressing whole olives, and is used in frying or as salad dressings. It also has cosmetic and pharmaceutical uses.
+ LONG
+ & Olive oil, as is the case for most cooking oils, isn't essential to good health and should be used sparingly.
Sesame oil
COLOR : #875A2C
- BREF : Sesame oil is sometimes mixed into very hot and spicy food to help neutralize the heat.
+ BREF : Sesame oil is an edible oil derived from sesame seeds. It is used as a cooking oil, but also as a flavor enhancer because of its nutty aroma and taste.
+ LONG
+ & Light sesame oil has a high smoking point and is suitable for deep-frying, while darker varieties are used for stir-frying or sauteing food. Sesame oil is sometimes mixed into very hot and spicy food to help neutralize the heat.
+ & Sesame oil, as is the case for most cooking oils, isn't essential to good health and should be used sparingly.
Peppermint oil
+ BREF : Peppermint oil is made from peppermint leaves, obtained by extracting the oils from dried or fresh leaves and the flowering tops of the plant using alcohol.
+ LONG
+ & Peppermint oil is used as an insect repellent against ants, flying insects and spiders. Peppermint oil is a stronger ingredient than peppermint extract, often used in candy-making.
+Fresh dill
+ BREF : Dill is an herb, a wispy fern-like plant. This herb is a cross of {{lemon}}, parsley and {{anise}}.
+ LONG
+ & Dill is best used fresh. It is often used to flavor pickles and soups.
~ MISC
Coconut milk
+ BREF : Coconut milk is extracted from the grated pulp of mature coconuts. The rich taste of the milk is due to its high oil content. This high-fat milk is a perfect base for {{ice cream|hop ice cream}}.
+ LONG
+ & There are many varieties, differentiated on fat content: coconut cream (up to 50% fat), coconut milk (20% fat) and coconut skim milk (least fat). The terminology is not always described like this in products sold in western countries. Traditionally, coconut milk is made from grating the white inner flesh of mature coconuts and mixing the shredded pulp with a bit of hot water to suspend the fat in the pulp. The grating process was often done by hand.
Soy milk
+ PARENT : Soy beans, edamame, tofu, tempeh
+ BREF : {{Soy milk}} is a by-product of the manufacture of {{tofu}}, and an important source of protein, calcium, vitamin D and B12 for vegans. When buying soy milk, prioritize unsweetened enriched varieties.
+ LONG
+ & {{Soy milk}} is made from soaking and griding {{soy beans}}, boiling the mixture and filtering out the pulp. Soy milk is a stable emulsion of oil, water and protein.
Purple potato powder
COLOR : #6620B3
Baguette
COLOR : #875A2C
- BREF : A law in the 1920's was put in place to keep bakers from working before 4 am, this didn't give them time to make proper rounded loaves. Making slender baguettes was a simple solution to this problem since they bake more rapidly.
+ BREF : Originating in France, baguettes are made from basic lean dough. It is recognizable by its length and crisp crust.
+ LONG
+ & The supposed history of baguettes is an interesting one. A law in the 1920's was put in place to keep bakers from working before 4 am, this didn't give them time to make proper rounded loaves. Making slender baguettes was a simple solution to this problem since they bake more rapidly.
Bread crusts
Vegan butter
+ BREF : Vegan butter is made from vegetable oils, and serves as an alternative to cow's milk.
+ LONG
+ & Common brands include {{earth balance|https://world.openfoodfacts.org/product/0033776011703/original-buttery-spread-78-vegetable-oils-earth-balance}}. High-fat oils like coconut and olive oil can be used instead.
Royal blue colouring
Violet colouring
Wholegrain macaroni
@@ -621,11 +877,14 @@ Scoobi do
Fusilli
Soy yogurt
Kinako
+ BREF : Kinako is roasted soybean flour, used in Japanese cuisine. Kinako means "yellow flour" in Japanese. Kinako contains B vitamins and some protein.
+ LONG
+ & Kinako is produced by grinding roasted soybeans into powder, some kinds keep the roasted skin which alters the color of the final product. Kinako is often used to make desserts, like dumplings coated with it, it is also sometimes combined with {{soy milk}}.
Blue corn tortilla
Tofurky sausages
Corn tortillas
Sugar apple
- BREF : Sugar apples are covered with scale-like protuberances that you can pry off easily when the fruit is ripe. The skin is soft and sweet and can be eaten with a spoon, once the seeds have been removed. Sugar apples are high energy, and str very rich in minerals. They are a good source of calcium, manganese, phosphorus and vitamins B and C.
+ BREF : Sugar apples are covered with scale-like protuberances that you can pry off easily when the fruit is ripe. The skin is soft and sweet and can be eaten with a spoon, once the seeds have been removed. Sugar apples are high energy, and are very rich in minerals. They are a good source of calcium, manganese, phosphorus and vitamins B and C.
Fleur de sel
Vegetable bouillon
BREF : Dehydrated vegetable bouillon has many names depending on where you live. In Canada and the US it is known as 'bouillon cube', as 'stock cube' in Australia, Ireland, New Zealand, South Africa, and the UK, and as 'dehydrated bouillon' in France.
@@ -635,13 +894,30 @@ Instant noodles
Water
BREF : 70% of the fresh water used by people goes to agriculture.
Sugar
- BREF : The average person consumes about 24kg of sugar per year, which is about 260 calories per day. Natural brown sugars that have been highly centrifuged go by the names of turbinado, demeara or raw sugar. Others that have been midly centrifuged and that have a higher molasses content go by Panela, rapadura, jaggery, muscovado etc. Powdered sugar is available in different degrees of fineness, the more X's the finer the grain.
+ BREF : Sugar is a generic name for sweet-tasting, soluble carbohydrates.
+ LONG
+ & Natural brown sugars that have been highly centrifuged go by the names of turbinado, demeara or raw sugar. Others that have been midly centrifuged and that have a higher molasses content go by Panela, rapadura, jaggery, muscovado etc. Powdered sugar is available in different degrees of fineness, the more X's the finer the grain.
+ & The average person consumes about 24kg of sugar per year, which is about 260 calories per day. Sugar is not essential to good health, and should be eaten sparingly.
Powdered Sugar
Whole Cane Sugar
+ BREF : Cane sugar is extracted from sugarcane, then treated to remove impurities. The resulting juice is boiled, and as it cools the liquid crystallizes to produce sugar crystals.
+ LONG
+ & Whole cane sugar is not essential to good health. It is used in cooking, but also to produce ethanol fuel.
Coconut Sugar
+ BREF : Coconut sugar has a caramel-like flavor, and is subtly sweet. It is produced from the sap of the flower bud stem of the coconut palm. It is used as a sweetener in many countries.
+ LONG
+ & Coconut sugar isn't highly processed, and so its flavor can vary depending on what species was used and where/when it was harvested. Coconut sugar is not essential to good health and should be consumed in moderation.
Brown Sugar
+ BREF : Brown sugar has a brown color because of the presence of molasses.
+ LONG
+ & Brown sugar adds flavor to desserts and baked goods, and caramelizes better than refined sugar.
Salt
- BREF : Some boutiques in hawaii sell black salt with powdered black lava added in. {{Fleur de sel}} is considered more of a garnish or a condiment, used to create contrast in sweet deserts.
+ BREF : Salt is present in large quantities in seawater, with about 35g/L of seawater. Salt is essential to life, and is one of the oldest food seasonings. Iodized salt is a good source of {{iodine|nutrition}}.
+ LONG
+ & Salting is an important method of preserving food, used in many cultures around the world. Salt is produced by evaporating sea water and mineral-rich spring water in shallow pools. Industrial byproducts include caustic soda and chlorine, and is used to manufactur many products like plastics and paper pulp. Two hundred million tonnes of salt are use for human consumption per year.
Sea Salt
+ BREF : Sea salt is producted by evaporating seawater, and is used to season foods, in cooking and for preserving food.
+ LONG
+ & Iodine, an element essential for human health, is present only in small amounts in sea salt.
Chocolate
`
diff --git a/scripts/database/pages.ndtl b/scripts/database/pages.ndtl
@@ -3,7 +3,7 @@ ABOUT
BREF : We started {*Grimgrains*} to teach ourselves how to cook. This blog, which now doubles as a travel diary, helps measure our progress, while giving us another creative output. We cook and travel, and adapt to the local produce whenever possible. All of the recipes we make are plant-based, and tree-nut free.
LONG
& We are {{Rekka Bellum|http://kokorobot.ca/}}, an illustrator, and {{Devine Lu Linvega|http://xxiivv.com}}, an artist/musician, living on a small sailboat somewhere on the shores of the Pacific Ocean. Hundredrabbits is the name of our {{floating studio|http://100r.co}}, we make {{games|https://100r.co/pages/games.html}}, {{tools|https://100r.co/pages/tools.html}} and delicious recipes as we travel.
- & This website showcases our favourite creations, along with hand-drawn illustrations for {{each ingredient|ingredients-list}}. You can contact us on our twitter {{@grimgrains|http://twitter.com/grimgrains}}, or by email at rekkabell at gmail dot com.
+ & This website showcases our favourite creations, along with hand-drawn illustrations for {{each ingredient|ingredients-list}}. You can contact us on our twitter {{@grimgrains|http://twitter.com/grimgrains}} or via <a rel="me" href="https://merveilles.town/@rek">Mastodon</a>
* Copyright policy
& You may adapt our recipes, but a link back or mention would be nice :).
& The assets of grimgrains.com, unless stated otherwise, are {{©hundredrabbits|http://100r.co/}}. Photographs, drawings or text should not be used, published, reprinted or modified without our permission. The source code of the website is under the {{MIT License|https://github.com/hundredrabbits/Grimgrains/blob/master/LICENSE}}.
@@ -38,6 +38,161 @@ GALLERY
% pages/wakame.savoury.pie.jpg
% pages/simple.doctor.who.cake.jpg
+NUTRITION
+ BREF : The information in this guide may change as research develops. If you are concerned about your intake of vitamin and minerals, we highly recommend seeing a {*dietitian*} who specializes in plant-based diets.
+ LONG
+ % pages/nutrition.jpg
+ * General rules:
+ - Eat at least {*4 servings of vegetables*} per day.
+ - Eat at least {*3 servings of legumes*} per day.
+ - Eat at least {*4 servings of grains*} per day.
+ - Eat at least {*3 servings of fruits*} per day.
+ - Eat at least {*1 serving of seeds*} per day.
+ * Protein
+ > <hr class='stroke' />
+ % pages/protein.jpg
+ & Proteins are necessary for the growth and repair of muscles, bones, hormones, digestive enzymes and to absorb nutrients. They are composed of {*20 amino acids*}, 11 of which our bodies can synthesize. The other 9 must come from the food that we eat, they are called the "essential amino acids".
+ * Sources
+ & Consume 3-4 servings of:
+ - 1/2 cup of dried lentils or beans
+ - 1/2 cup tofu or tempeh
+ - 1 cup soy milk
+ - 1 cup quinoa or amaranth
+ - 1/4 cup peanuts(or, 2 tbsp peanut butter)
+ & Every plant protein contain all 9 of the essential amino acids, but in varying amounts. The body maintains reserves of amino acids for later use, the proteins of one meal {*can combine with proteins from another meal eaten later that day*}.
+ & Legumes are the best source of {*lysine*}, one of the essential amino acids. Quinoa and amaranth are two grains that are rich in lysine, although not as much as legumes.
+ & {{Read more|https://veganhealth.org/protein-part-1/}} about proteins.
+ * Iron
+ > <hr class='stroke' />
+ % pages/iron.jpg
+ & Iron is necessary for red blood cells and to form hemoglobins which helps circulate oxygen around the body. We lose some of this mineral everyday from the skin and intestines, menstruating women will lose a lot of it.
+ * Sources
+ - Beans
+ - Soy (high in iron and not affected by phytic acid)
+ - Nuts
+ - Seeds
+ - Winter squashes
+ - Dark leafy greens
+ - Dried fruit
+ - Oatmeal
+ - Quinoa
+ - Pearled barley
+ - Whole grain bread
+ & Iron-rich plant foods are high in {*phytic acid*}, a compound that binds to iron and other minerals and that makes it difficult for our bodies to absorb. Avoiding foods that contain phytic acid isn't necessary, but it's important to eat them in a way that minimizes their effects on iron.
+ & Iron is plentiful in vegan diets, you can increase your absorption of this vitamin by adding vitamin C to your meals (can increase absorption by 4-6X), avoiding tea (chamomille or pepppermint) of coffee at meals, eating more legumes, eating fermented grains (like yeast-leavened bread), cooking foods in a cast iron skillet (as the iron leeches into the food), and by avoiding calcium with meals.
+ & Other iron inhibitors include: turmeric and coriander, or calcium rich foods.
+ & {{Read more|https://veganhealth.org/iron/}} about iron.
+ * Calcium
+ > <hr class='stroke' />
+ % pages/calcium.jpg
+ * Sources
+ & Consume at least 3 1/2 to 4 cups a day of:
+ - Calcium-set tofu
+ - Cooked Chinese cabbage
+ - Turnip greens
+ - Mustard greens
+ - Collards
+ - Fortified plant milks (shake well before consuming)
+ - Fortified juices.
+ & This, with extra servings of beans, broccoli, kale, okra, sweet potatoes, figs, corn tortillas, navel oranges and blackstrap molasses.
+ & The amount of calcium in plant foods is somewhat dependent on the amount of calcium in the soil. The World Health Organization recommends 1,000mg of calcium per day, and 1,200mg if over 50, but what is most important is how much is truly absorbed. Most people absorb 25-30% of calcium. Absorption varies depending on food sources, so {*it's important to consume sources of well-absorbed calcium*}, like {*calcium-set tofu*}, {*kale*}, {*turnip greens*}, {*mustard greens*} and {*broccoli*}. Beans, nuts and seeds have moderate amounts of calcium and a slow absorption rate, soaking nuts and seeds aids in absorption. Fortified plant milk generally contains calcium with an absorption rate of 25%, similar to calcium-set tofu, although it is important to shake it before using it as the calcium tends to set at the bottom.
+ & {{Oxalate molecules|https://veganhealth.org/oxalate/}}, found in certain plant foods (such as spinach, beets, beet greens, sweet potatoes, peanuts, rhubarb, and swiss chard), can prevent the absorption of calcium. Oxalates plays a part in calcium-oxalate kidney stones. Consuming calcium and high-oxalate foods is fine and necessary for good health, but it's important to drink plenty of fluids. Doing this helps oxalate and calcium “bind” to one another in the stomach and intestines before reaching the kidneys, making it less likely for kidney stones to form. Boiling high-oxalate greens before consumption and discarding the cooking water also helps.
+ & {{Read more|https://veganhealth.org/calcium/}} about calcium.
+ * Vitamin D
+ > <hr class='stroke' />
+ % pages/vitamind.jpg
+ & Vitamin D can help prevent osteoporosis by increasing calcium absorption in the body.
+ & We make plenty of vitamin D when our skin is exposed to sunlight, but because of smog, cloud coverage and sunscreen, we may be producing less than our body requires. Light-skinned people require 10-15 minutes in the sun, while dark-skinned people might need {{two hours|https://veganhealth.org/vitamin-d-part-2-the-research/#dark}}. In winter, it is important to get a dietary source of this nutrient, especially for people with darker skin.
+ * Sources
+ - The sun
+ - Fortified plant milk
+ - Fortified foods
+ - Fortified margarine
+ - Mushroom (UV ray-treated)
+ & There are two forms of supplemental vitamin D:
+ - Ergocalciferol or D2
+ - Cholecalciferol or D3
+ & D2 is vegan, made from exposing fungi to UV Rays, while D3 comes from fish oil or sheep's wool. Vitamin D2 is not as effective as vitamin D3 if taken weekly, it must be consumed daily.
+ & {{Read more|https://veganhealth.org/vitamin-d/}} about vitamin D.
+ * Vitamin B-12
+ > <hr class='stroke' />
+ % pages/vitaminb12.jpg
+ & Vitamin b-12 is needed for the production of DNA and for maintaining nerve cells. Levels need to be over 400 pg/ml — or 4 to 6 mcg per day — for good health. This vitamin does not occur naturally in any plant.
+ * Sources
+ - Fortified plant milks
+ - Fortified foods
+ - Nutritional yeast
+ - Cyanocobalamin Supplements
+ & Eat two servings a day of fortified foods that contain at least 2-3.5 mcg of vitamin B12, these need to be consumed at least 4h apart for optimal absorption. Another way, is to take a daily supplement of {*cyanocobalamin B12*} that provides 25-100 mcg of vitamin B12, or a supplement that provides 1,000 mcg twice per week.
+ & Absorption of vitamin b-12 is tricky, because small amounts attach to receptors that become quickly saturated by just 1-2 mcg of B12 and will stay like this for several hours. This is what you get from a single meal of fortified foods. Ingesting a large dose of B12 from a supplement, you can absorb the excess that can't latch onto receptors, but that is a very small amount. It is easier to meet needs from many small servings of B12 to be eaten throughout the day, but if you rely on daily single-dose supplements you need to have a lot more since absorption rates are very low.
+ & {{Read more|https://veganhealth.org/vitamin-b12/}} about vitamin B12.
+ * Iodine
+ > <hr class='stroke' />
+ % pages/iodine.jpg
+ & Iodine is necessary for healthy thyroid function which regulates our metabolism.
+ * Sources
+ - Some fortified plant milks (few are fortified with it)
+ - Iodized salt, 1/4 tsp/day
+ - Seaweed
+ & A quantity of 90 micrograms is recommended daily.
+ & Note that the amount of iodine in seaweed and other sea vegetables is variable, it is the same for sea salt and other natural salts. {*The only reliable sources are iodized salt or a supplement*}.
+ & {{Read more|https://veganhealth.org/iodine/}} about iodine.
+ * Omega-3
+ > <hr class='stroke' />
+ % pages/omega3.jpg
+ & Omega3's are needed for optimal cognition, and helps reduce blood clotting (which protects against heart attacks).
+ * Sources
+ - Chia seeds, 1 tsp | 713mg
+ - Flax seeds, 1 tsp, ground | 570mg
+ - Soybeans, cooked, 1/2 cup | 500mg
+ - Tofu, 1 cup | 400mg
+ - Tempeh, 1 cup | 400mg
+ - Canola oil, 1 tsp | 433mg
+ - Flaxseed oil, 1/4 tsp | 608mg
+ & There are 3 omega-3 fatty acids:
+ - {*Alpha linolenic (ALA)*}, found in soy, walnuts, canola oil, flaxseeds, hemp seeds oil etc. The body cannot produce its own.
+ - {*Eicosapentaneoic acid (EPA)*}, found in small amounts in seaweed.
+ - {*Docosahexaneoic acid (DHA)*}, found in small amounts in seaweed. The body can convert EPA into DHA.
+ & Adult males require 1,600 mg/day while females require 1,100 mg/day of ALA. The numbers vary for {{babies, infants and pregnant women|https://veganhealth.org/daily-needs/#Omega-3-Fats}}. To be safe, it is recommended to take 200-300 mg of DHA per day.
+ & {{Read more|https://veganhealth.org/omega-3s-part-2/}} about omega-3's.
+ * Vitamin A
+ > <hr class='stroke' />
+ % pages/vitamina.jpg
+ & Vitamin A is important for growth and developments in young children, and for red blood cell formation.
+ * Sources
+ & Consume 2 or more per day.
+ - Butternut squash
+ - Pumpkin
+ - Sweet potatoes
+ - Kale
+ - Carrots
+ - Spinach
+ - Kale
+ - Cantaloupe
+ & The body can convert 50 carotenoids into vitamin A, the most common being {*beta-carotene*}. Eating vegetables high in carotenoids (carrots, pumpkin etc) with some fat increased the absorption and synthesis of Vitamin A.
+ & {{Read more|https://veganhealth.org/vitamin-a/}} about vitamin A.
+ * Zinc
+ > <hr class='stroke' />
+ % pages/zinc.jpg
+ & Zinc is important for immunity.
+ * Sources
+ - Chickpeas, 1/3 cup (cooked)
+ - Peanuts, 1/4 cup (raw)
+ - Oatmeal, 1 cup (cooked)
+ - Tempeh, 1/2 cup
+ - Bread
+ & Adult males (19-50yrs) require 11mg/day, while adult females (19-50yrs) require 40mg/day. {{These amounts vary|https://veganhealth.org/daily-needs/#zinc}} for newborns, infants, teens, pregnant/breastfeeding women and older adults.
+ & {{Phytates|https://www.nap.edu/read/10026/chapter/14#480}}, found in some plant foods, reduce zinc absorption. This is why it's important to increase our intake of zinc by at least 50%. Consuming protein — like legumes, leavened bread, fermented soy foods (miso or tempeh) and nuts – increases zinc absorption.
+ & {{Read more|https://veganhealth.org/zinc/}} about zinc.
+ > <hr class='stroke' />
+ * Nutrition References
+ & {{The vegan RD|https://www.theveganrd.com/}}
+ & {{Vegan Health|https://veganhealth.org/}}
+ & {{Nutrition Facts|https://nutritionfacts.org/}}
+ & {{Open Food Facts|https://world.openfoodfacts.org/}}
+ > <hr class='stroke' />
+ & Information last updated on 15/11/19
+ & See a mistake? {{Make a pull request|https://github.com/hundredrabbits/Grimgrains}} on Github. Or contact us on {{twitter|https://twitter.com/grimgrains}} or {{mastodon|https://merveilles.town/@rek}}.
TOOLS
BREF : Entering a store, with the goal of purchasing kitchenware can be a dizzying experience. There are many choices, but few are worth your money and attention. An ideal kitchen will have as few items as possible, be composed of things that make you happy and that you chose with purpose. With this in mind, for a tool to be awarded a place in your home, it needs to be effective and versatile. I made this list of notes on what to look for in a tool, based on experience and research:
@@ -86,9 +241,8 @@ TOOLS
& {{Test Drive: Pressure Cookers|http://www.finecooking.com/articles/test-drive-pressure-cookers.aspx?pg=0}} Nicki Pendleton Wood, Fine Cooking, 2011
* Skillet
& Skillets are used to stir-fry, bake, simmer and cook a grand variety of dishes.
- & {*Material*}: Cast-iron is the material of choice, it is durable, cheaper, and offers more versatility than stainless steel skillets. It can be used to cook in the oven, safe past 500 degrees. Cast-iron cookware gets better with time as it develops layers of seasoning. Buying a pre-seasoned skillet is best.
+ & {*Material*}: Cast-iron is the material of choice, it is durable, cheaper, and offers more versatility than stainless steel skillets. It can be used to cook in the oven, safe past 500 degrees. Cast-iron cookware gets better with time as it develops layers of seasoning. Buying a pre-seasoned skillet is best. Cooking in cast iron pans helps with your daily nutritional requirements of iron.
& {*Shape*}: A large cooking area is ideal, with large spouts to pour out contents with ease. The skillet will be heavy, rounded-stick handles make it easier and more comfortable to lift.
- & MORE WILL BE ADDED SOON...
INGREDIENTS
BREF : Here is an unsorted list of all the ingredients used in GrimGrains recipes!
diff --git a/scripts/database/recipes.ndtl b/scripts/database/recipes.ndtl
@@ -1,5 +1,93 @@
DATABASE.recipes = `
+Tzaziki
+ DATE : 2019-12-06
+ TAGS
+ sauce
+ TIME : 10
+ SERV : 8 servings
+ DESC
+ & Making tzaziki is easy. This is a basic recipe that works well enough with all kinds of substitutions, depending on dietary restrictions.
+ & {*Substitutions*}
+ & It is possible to use {{sunflower seeds}}, cashews and {{tofu}} to replace the hemp seeds. In this recipe, I used half hemp and half soy, because hemp — while being nutritious — is not cheap. Using just {{shelled hemp seeds}} — wallet permitting — is very possible, although you may have to add more water.
+ & If using cashews or sunflower seeds, you should pre-soak them for a few hours prior to blending (discard the soaking water and rinse them well). If using only tofu, you may not require extra water in the recipe.
+
+ INST
+ Preparation
+ - Blend {_1/2 cup_} of {{shelled hemp seeds }} with {_225g_} of {{soft tofu}}, {_3 cloves_} of {{garlic}}, {_1/4 cup_} of {{water}} and the juice of {_1_} {{lemon}}.
+ - Mince the {{fresh dill}} and {{fresh mint}}, set aside.
+ - Cut {_1_} cucumber into small cubes.
+ - Add {{fresh dill}}, {{fresh mint}}, the cubed {{persian cucumbers}} and {_1 pinch_} of {{salt}} to the rest of the ingredients and mix well.
+ - Garnish with some {{fresh mint}} and {{fresh dill}} leaves.
+
+ INGR
+ Main
+ Shelled hemp seeds : 1/2 cup
+ Soft tofu : 250g
+ Garlic : 2 cloves
+ Water : 1/4 cup
+ Lemon : 1, juiced
+ Fresh Dill : 1 tbsp
+ Fresh Mint : 1 tbsp
+ Persian cucumbers : 2
+ Salt : pinch
+
+Spicy stirfry chickpeas
+ DATE : 2019-06-25
+ TAGS
+ dinner
+ TIME : 15
+ SERV : 2 servings
+ DESC
+ & If someone was to ask me which food I could eat forever without stopping, I'd answer chickpeas. There's a TON of different ways to prepare them, and all of these ways are delicious. They can be baked, squished, pureed, ground, sprouted and baked. Their versatility make my life easier, I can eat them everyday and it doesn't ever get boring.
+ & {*Nutrition*}: Legumes is an important part of the diet, and one of the best plant sources of {*lysine*}, one of 9 essential amino acids required for good health. Protein is necessary for muscles, bones, hormones, digestive enzymes, to absorb nutrients and to rebuild cells. If you eat 1/2 cup dry beans a day, your daily protein needs are covered.
+ % recipes/spicy.stirfry.chickpeas.3.jpg
+ & Another plus is that dry chickpeas keep a long, long time. If you keep them in air-tight containers they will last even longer, because moisture and oxygen is the enemy of all beans. Oxygen makes the bean oils rancid overtime. You can store them for 5+ yrs if you add oxygen absorbers (packet consisting of powdered iron oxide) to the containers. I like to buy them in bulk and cook them as needed. An advantage of buying them dry is that it is cheap, and they taste better (honest). Read about {{storing dry beans|https://extension.usu.edu/foodstorage/howdoi/dry_beans}}.
+ & {*Recommendations*}
+ & Adding a {{bay leaf}}, a bit of {{onion}} or a clove or two of {{garlic}} to the cooking water add a subtle seasoning to the {{chickpeas}} and boost flavor.
+
+ INST
+ Marinade overnight
+ - Cook {_3/4 cup_} of dried {{chickpeas}} (see {{instructions|#chickpeas}}), or use 1 can (15oz).
+ - Mix the marinade ingredients together, and add the {_1.5 cups_} of cooked {{chickpeas}} (or 15-19 oz can) and {_175g_} of cubed {{tofu}}. Leave to marinate {#at least a few hours#}. {#Overnight#} is even better.
+ Preparation
+ - Peel and slice {_3 cloves_} of {{garlic}} and {_equal amounts_} of {{ginger}} thinly, and chop the {_2_} {{scallions}} in a size matching their diameter. Cut {_1_} {{carrot}} (peel carrot) and {_1/2 cup's worth_} of {{red cabbage}} into bite-sized bits.
+ Sauce
+ - In a small bowl, combine the ingredients for the sauce: mix {_3 tsp_} of {{maple syrup}}, {_1 tbsp_} of {{soy sauce}}, {_2 tbsp_} of {{balsamic vinegar}}, {_1 tbsp_} {{arrowroot starch}} and {_1 tsp_} of {{sesame oil}}.
+ Stir fry
+ - Add {_1 tbsp_} of vegetable oil, then warm pan to high heat. When oil is hot, add {_~1-2 tbsp_} of {{chili pepper flakes}} and {_1 tsp_} of {{sichuan peppercorns}}. Stir-fry until they're crisp and that the mixture is spicy and fragrant. Careful not to burn the spices, remove from heat for a bit if overheating.
+ - Add the {{chickpeas}}, {{tofu}}, {{carrot}} and {{red cabbage}} and fry over high heat, stirring constantly. {#After a minute#}, add the {{ginger root}}, {{garlic}} and {{scallions}} and stir-fry for {#a few more minutes#}.
+ - Stir the sauce, and add it to the pan while stirring and tossing. When the sauce starts to thicken, remove from heat and serve.
+
+ INGR
+ Main
+ Chickpeas : 1.5 cups, cooked
+ Carrots : 1
+ Tofu : 175g cubed, firm
+ Red cabbage : 1/2 cup
+ Scallions : 2 stalks
+ Garlic : 3 cloves
+ Ginger root : equal to garlic
+ Chili pepper flakes : 1-2 tbsp
+ Sichuan peppercorns : 1 tsp, whole
+ Salt : 1/4 tsp
+ Black pepper : 1/4 tsp
+
+ Marinade
+ Soy sauce : 2 tsp
+ Balsamic vinegar : 1 tsp
+ Arrowroot starch : 1 tbsp
+ Salt : 1/4 tsp
+ Black pepper : 1/4 tsp
+
+ Sauce
+ Maple syrup : 3 tsp
+ Soy sauce : 1 tbsp
+ Balsamic vinegar : 2 tbsp
+ Arrowroot starch : 1 tbsp
+ Sesame oil : 1 tsp
+ Arrowroot starch : 1 tbsp
+
Scrambled chickpeas
DATE : 2019-06-25
TAGS
@@ -104,7 +192,7 @@ SWEET AND SOUR LENTILS
Salt : 1/4 tsp
Sauce
Soy sauce : 2 tbsp
- Rice vinegar : 2 tbsp
+ Japanese rice vinegar : 2 tbsp
Chili pepper flakes : 2 tsp
Peanut butter : 1 tbsp
Maple syrup : 2 tbsp
@@ -262,7 +350,7 @@ SPINACH PAJEON
Scallions : 1 bunch
Sauce
Soy sauce : 2 tbsp
- Rice vinegar : 1 tbsp
+ Japanese rice vinegar : 1 tbsp
Chili pepper flakes : 1 tsp
Black sesame seeds : 1 tsp
Maple syrup : 1 tsp
@@ -377,7 +465,7 @@ ROASTED CARROTS WITH BELUGA LENTILS
- Wash {_1/2 cup_} of {{beluga lentils}}. Put {_375 ml_} of {{vegetable bouillon}} in a pot and add the {{lentils}}, bring to a boil.
- Reduce heat to {#medium#} and simmer for {#25 minutes#} — don't let them cook for too long or they'll get too mushy. If the lentils seem cooked but haven't absorbed all of the water, strain them out.
Sauce
- - Mix {_2 tbsp_} of {{sriracha}}, {_2 tbsp_} {{peanut butter}}, {_1/4 cup_} {{soy sauce}} and {_2 tbsp_} {{rice vinegar}} in a small bowl.
+ - Mix {_2 tbsp_} of {{sriracha}}, {_2 tbsp_} {{peanut butter}}, {_1/4 cup_} {{soy sauce}} and {_2 tbsp_} {{Japanese rice vinegar}} in a small bowl.
Combine
- Set the beluga lentils on a plate with a bit of sauce and top with 4 roasted carrots!
INGR
@@ -394,7 +482,7 @@ ROASTED CARROTS WITH BELUGA LENTILS
Sriracha : 2 tbsp
Peanut butter : 2 tbsp
Soy sauce : 1/4 cup
- Rice vinegar : 2 tbsp
+ Japanese rice vinegar : 2 tbsp
BLACK SESAME BRITTLE
DATE : 2014-11-06
@@ -457,10 +545,10 @@ BORSCHT WITH TOFU SOUR CREAM
& Funny to think that when I was a kid, I didn't want to go anywhere near beets. For the longest time, it was this thing that my family served around xmas time and that i didn't like. How things change! I buy beets regularly now, I use it to make pasta sauce, to serve over salads, to mix into smoothies and now to make Borscht!
& Devine has been taking russian classes every week, and he comes back from his lessons with new words to teach me. Last week, he not only returned with new words, he also brought back a Borscht recipe. Borscht fits perfectly in the Grim Grains universe - It's bright, red, beautiful and delicious!
% recipes/borscht.with.tofu.sour.cream.1.jpg
- & Borscht is traditionally served with sour cream, so evidently I needed to have that be part of this recipe as well! A lot of vegan sour cream recipes have cashews, because of my tree nut allergy, i had to opt for something different. Silken tofu does the job well, the mix of that plus lemon and apple cider vinegar gives a perfect sour taste! Sour cream recipe adapted from {{The blender girl|http://healthyblenderrecipes.com/recipes/tonys_vegan_tofu_sour_cream}}.
+ & Borscht is traditionally served with sour cream, so evidently I needed to have that be part of this recipe as well! A lot of vegan sour cream recipes have cashews, because of my tree nut allergy, i had to opt for something different. soft tofu does the job well, the mix of that plus lemon and apple cider vinegar gives a perfect sour taste! Sour cream recipe adapted from {{The blender girl|http://healthyblenderrecipes.com/recipes/tonys_vegan_tofu_sour_cream}}.
INST
Tofu sour cream
- - Drain the pack of {{silken tofu}}, press it lightly with a cloth or paper towels to remove some of the water.
+ - Drain the pack of {{soft tofu}}, press it lightly with a cloth or paper towels to remove some of the water.
- Put the {{tofu}}, {_1 tsp_} of {{whole cane sugar}}, {_1 tbsp_} of {{apple cider vinegar}} and {_5 tsp_} of {{lemon juice}} in a bowl. Blend until smooth.
- Put in the refrigerator for {#1 hour#} to give it time to thicken.
Borscht
@@ -472,7 +560,7 @@ BORSCHT WITH TOFU SOUR CREAM
- At the end, take pot off heat and stir in {_2 tsp_} of {{lemon juice}}. You can serve as is if you like a chunkier soup, otherwise purée it with a handblender. Serve hot with tofu sour cream! For thicker and tastier Borscht, cook the soup the day before you plan to eat it. Let it cool and refrigerate it. It tastes better the next day, just re-heat it. Trust me, it'll be delicious.
INGR
Sour cream
- Silken tofu : 1 pack
+ Soft tofu : 1 pack
Whole cane sugar : 1 tsp
Apple cider vinegar : 1 tbsp
Lemon juice : 5 tsp
@@ -510,7 +598,6 @@ DARK YAKI GYOZA
& We had a lot of fun making these gyoza, it's best made and eaten with friends!
% recipes/dark.yaki.gyoza.5.jpg
& Gyoza wrapper techniques and ratios were based on the recipe from {{Just one cookbook|http://www.justonecookbook.com/recipes/gyoza-wrappers/}}. She explains it really well too on her blog it's worth taking a look. I learned a lot from her even if our techniques differ slightly. While I preferred not to knead by hand, or with a rolling pin, i did do it her way the first time.
- & NOTE: Bamboo charcoal binds on the nutrients in food that you're meant to be digesting, so it's preferable to not add bamboo charcoal to every food you make. Use it sparingly, as an occasional treat.
INST
Dough
- Mix {_2 cups_} of {{all purpose flour}} with {_1 tsp_} of {{bamboo charcoal powder}} in a bowl.
@@ -547,7 +634,7 @@ DARK YAKI GYOZA
Black pepper : pinch
Sea salt : 1/2 tsp
Dipping sauce
- Rice vinegar : 3 tbsp
+ Japanese rice vinegar : 3 tbsp
Soy sauce : 3 tbsp
Sesame oil : 1 tsp
@@ -633,7 +720,7 @@ PERSIMMON CURRY
DESC
& I've been looking for ways to incorporate persimmon into savoury recipes. I always thought it could make a great sauce for pasta or rice meals. If puréed, it will taste very sweet, but if you mix in curry powder and other spices and ingredients it becomes less of a dessert.
& Be careful when selecting your persimmon, there are two varieties. Hachiya persimmon are more elongated and you need to wait for it to soften down before attempting to eat it. Fuyu persimmon, have a tomato-like shape and you can eat it like an apple.
- & There are many different varieties of curry powders it's just a pre-mixed combination of different ground spices. If you're in a hurry, buying a mix is best. But if you have a full stocked spice rack, it may be better and more fun to do it yourself. Typically curry mixes have turmeric, coriander, cumin, black and red pepper, cinnamon cloves, fennel seeds, cardamom, ginger and fenugreek. There can be as much as 20 different spices, but you can probably omit a few and it'll still taste pretty great.
+ & There are many different varieties of curry powders it's just a pre-mixed combination of different ground spices. If you're in a hurry, buying a mix is best. But if you have a full stocked spice rack, it may be better and more fun to do it yourself. Typically curry mixes have turmeric, coriander, cumin, black and red bell pepper, cinnamon cloves, fennel seeds, cardamom, ginger and fenugreek. There can be as much as 20 different spices, but you can probably omit a few and it'll still taste pretty great.
& Enjoy over some basmasti rice, or grated cauliflower rice for a lighter and grain-free meal.
INST
Rice
@@ -678,7 +765,7 @@ MASON JAR BREAD PUDDING
INST
Preparation
- Preheat oven at {#350F#}
- - Combine {_1/4 cup_} of {{tofu}} (or silken tofu), {_1/3 cup_} of {{soy milk}} and {_1/4 tsp_} of {{vanilla extract}}. Blend until smooth.
+ - Combine {_1/4 cup_} of {{tofu}} (or soft tofu), {_1/3 cup_} of {{soy milk}} and {_1/4 tsp_} of {{vanilla extract}}. Blend until smooth.
- Take a {_1/2 pint_} wide-mouthed mason jar. Fill it up halfway with {{bread crusts}}. Add a bit of {{dried raisins}}, pour liquid to cover Until it's at a level with bread crusts
- Cover with more bread crusts and dried raisins. Pour more liquid onto it, until the jar is about 3/4 full.
- Sprinkle {_1 tsp_} of {{whole cane sugar}} on top, decorate with slices of {{apple}} and add {{cinnamon}} to taste.
@@ -687,7 +774,7 @@ MASON JAR BREAD PUDDING
Main
Bread crusts : 1/2 cup, packed
Dried raisins : 1 tbsp
- Silken tofu : 1/4 cup
+ Soft tofu : 1/4 cup
Soy milk : 1/3 cup
Vanilla extract : 1/4 tsp
Whole cane sugar : 1 tsp
@@ -711,7 +798,6 @@ BASIC BLACK BREAD
& I made this loaf for a brunch I had with friends, we wanted to have fondue with a set I got as a gift during the holidays. We cut the loaf into cubes, and dunked them in! Soft bread is perfect for fondue!
% recipes/basic.black.bread.2.jpg
& So there you have it! A basic black bread!
- & NOTE: Bamboo charcoal binds on the nutrients in food that you're meant to be digesting, so it's preferable to not add bamboo charcoal to every food you make. Use it sparingly, as an occasional treat.
INST
Loaf
- In a large bowl, stir {_1 1/2 tsp_} of {{salt}} and {_3/4 tbsp_} of {{maple syrup}} in {_1 cup_} of {{warm water}} until dissolved. Sprinkle tsp of {{active dry yeast}}, let sit for {#10 minutes#}.
@@ -818,7 +904,6 @@ POTATO GNOCCHI
& These turned out perfect! This is a large recipe, so if you're only two you'll have plenty left-over that you can let dry, freeze and eat later.
% recipes/potato.gnocchi.2.jpg
& Because the sauce and toppings are light and simple, you can focus on the texture of the gnocchi.
- & NOTE: {*Bamboo charcoal*} binds on the nutrients in food that you're meant to be digesting, so it's preferable to not add bamboo charcoal to every food you make. Use it sparingly, as an occasional treat.
INST
Gnocchi
- Preheat oven to {#400F#}.
@@ -970,18 +1055,18 @@ SWEET MOCK EEL NIGIRI
TIME : 50
SERV : 2 servings
DESC
- & Burmese tofu is not really tofu, I know, it's confusing. At first, I thought it was tofu blended with turmeric, far from it! Burmese tofu is made with chickpea flour, one of my staple foods. The cool thing about it, is that it takes 10 minutes to make and sets under 1 hour. It's a great soy-free alternative, and the texture is comparable to that of silken tofu.
+ & Burmese tofu is not really tofu, I know, it's confusing. At first, I thought it was tofu blended with turmeric, far from it! Burmese tofu is made with chickpea flour, one of my staple foods. The cool thing about it, is that it takes 10 minutes to make and sets under 1 hour. It's a great soy-free alternative, and the texture is comparable to that of soft tofu.
% recipes/sweet.mock.eel.nigiri.1.jpg
& The original recipe for chickpea tofu, I believe, was sourced from a book called {{The Burmese kitchen|http://www.amazon.com/gp/product/0871317680/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=0871317680&linkCode=as2&tag=girl07-20}} by Aung Thein.
& This recipe will use up about half of the burmese tofu, which means you'll have a whole other half to use in other meals.
& I thought the chickpea tofu would be well-suited as a 'mock unagi kabayaki', and that it would look especially striking atop some black rice.
% recipes/sweet.mock.eel.nigiri.2.jpg
& The sauce served over unagi (eel) kabayaki is sweet, with hints of caramel; it's easy to prepare and really makes the dish!
- & Most Japanese sauces are easy to make, and usually require around 3-4 ingredients, these almost always include: soy sauce, sake, mirin, or rice vinegar. If you want to cook Japanese food, having these around is a must.
+ & Most Japanese sauces are easy to make, and usually require around 3-4 ingredients, these almost always include: soy sauce, sake, mirin, or Japanese rice vinegar. If you want to cook Japanese food, having these around is a must.
INST
Rice
- Prepare {{black glutinous rice}}, it needs to be prepared at a 2:1 water to rice ratio. If you prepare 1 cup of dry rice, you need 2 cups of water.
- - Put {_1 1/2 tbsp_} of {{rice vinegar}}, {_1 tbsp_} of {{whole cane sugar}} and {_1/2 tsp_} of {{salt}} in a sauce pan. Stir over low heat, until sugar dissolves.
+ - Put {_1 1/2 tbsp_} of {{Japanese rice vinegar}}, {_1 tbsp_} of {{whole cane sugar}} and {_1/2 tsp_} of {{salt}} in a sauce pan. Stir over low heat, until sugar dissolves.
- Once rice is cooked, transfer to a flat tray, and pour sushi dressing over it. Mix dressing into rice with a spatula, using a sideways cutting motion. Cover with a damp towel, and let cool.
Unagi sauce
- Mix {_2 tbsp_} of {{soy sauce}}, {_2 tbsp_} of {{mirin}}, {_1 tbsp_} of {{whole cane sugar}} and {_1 tbsp_} of {{sake}}.
@@ -1003,7 +1088,7 @@ SWEET MOCK EEL NIGIRI
Nigiri
Black glutinous rice : 3/4 cup
Water : 2 cups
- Rice vinegar : 1 1/2 tbsp
+ Japanese rice vinegar : 1 1/2 tbsp
Whole cane sugar : 1 tbsp
Sea salt : 1/2 tsp
Nori sheets : 1 sheet
@@ -1151,10 +1236,10 @@ CHILI POMEGRANATE BROWNIES
- Cut {_1/3 cup_} of {{pumpkin}}, steam until softened and process into a purée.
- Put {_3 tbsp_} of {{ground flax seeds}} in a bowl with {_9 tbsp_} of {{water}}, let thicken for {#5 minutes#}. Set aside.
- Put {_5 tbsp_} of {{coconut oil}}, {_5 tbsp_} of {{pumpkin purée}}, {_3/4 cup_} {{whole cane sugar}}, {_3/4 cup_} {{cocoa powder}} and a {_1/4 tsp_} {{salt}} in a pan over medium to low heat. Stir until the {{coconut oil}} is melted, and all is well mixed.
- - Stir in the flax 'egg', as well as the {_2 tbsp_} of {{red pepper flakes}} and {_1 tsp_} of {{cayenne powder}}. Add {_1/2 cup_} of {{all purpose flour}} and mix well. Mixture should be very thick.
+ - Stir in the flax 'egg', as well as the {_2 tbsp_} of {{chili pepper flakes}} and {_1 tsp_} of {{cayenne powder}}. Add {_1/2 cup_} of {{all purpose flour}} and mix well. Mixture should be very thick.
- Pour into a 8X8 baking dish lined with parchment papper. Flatten with the back of a spoon to even it out and bake for {#25 minutes#}, or until knife comes out clean. Let cool. {_Cut in 24 small squares_}.
Syrup
- - Pour {_2 cups_} of {{unsweetened pomegranate juice}} into a pot with {_1 tsp_} {{red pepper flakes}} and {_1 tsp_} {{cayenne powder}}. Bring to a boil, lower to medium-high heat and leave for up to {#1h#} or until liquid has been reduced to {_1 cup_}.
+ - Pour {_2 cups_} of {{unsweetened pomegranate juice}} into a pot with {_1 tsp_} {{chili pepper flakes}} and {_1 tsp_} {{cayenne powder}}. Bring to a boil, lower to medium-high heat and leave for up to {#1h#} or until liquid has been reduced to {_1 cup_}.
- Let cool, the syrup will thicken when cooled.
- Top brownies with fresh {{pomegranate seeds}}, and drizzle with the chili-infused syrup!
INGR
@@ -1189,12 +1274,11 @@ FRENCH TOAST
& You can make your own soft bread using my {{Basic black bread}} recipe - it's very easy to make. You can omit the {{bamboo charcoal}} if you don't want your dough to be black.
& Using bananas makes for a consistent morning meal, and adds a bit of sweetness to it. Bananas become sweeter when heated in a pan, they caramelize and develop a very pleasant taste. Adding a banana to the soy milk helps to thicken the mix and will make the bread become a 'golden' color.
% recipes/french.toast.2.jpg
- & NOTE: {*Bamboo charcoal*} binds on the nutrients in food that you're meant to be digesting, so it's preferable to not add bamboo charcoal to every food you make. Use it sparingly, as an occasional treat.
INST
Preparation
- Purée {_1_} {{banana}}, {_3/4 cup_} of {{soy milk}} and {_1/2 tsp_} of {{vanilla extract}}.
- Melt {_1 tsp_} of {{coconut oil}} in a pan at medium heat, dip slice into the banana purée batter. Pan-fry bread until golden and crispy on both sides.
- - Serve with slices of {{kiwi}}, or a fruit of your choice, along with a generous serving of maple syrup!
+ - Serve with slices of {{kiwifruit}}, or a fruit of your choice, along with a generous serving of maple syrup!
Black bread
- If you want to make black bread please refer to my {{basic black bread}} recipe. Follow the recipe, be sure to place it in a loaf pan for the second rise for a proper 'bread shape'.
INGR
@@ -1259,13 +1343,12 @@ UZUMAKI HUMMUS BITES
& Making tortillas at home is damn easy, it doesn't require a lot of waiting time or preparation. The only thing I had trouble with, was making them into nice circular shapes. The easy way is to use a tortilla press, or it just requires lots of practice.
% recipes/uzumaki.hummus.bites.3.jpg
& Making the tortillas black is optional, but it adds a nice contrast to the beet hummus.
- & NOTE: {*Bamboo charcoal*} binds on the nutrients in food that you're meant to be digesting, so it's preferable to not add bamboo charcoal to every food you make. Use it sparingly, as an occasional treat.
INST
Beet hummus
- Preheat oven to {#375F#}.
- Wash and cut {_2 small_} {{red beets}} into 4, rub quarters lightly with {{olive oil}}.
- Roast for {#30-40 minutes#} or until fork tender.
- - Purée the roasted beets, with {_1 1/4 cup_} of {{chickpeas}}, {_2 minced cloves_} of {{garlic}}, a {_1/4 cup_} of {{tahini}}, {_1/2 tsp_} of {{salt}} and {_1 tbsp_} of {{balsamic vinegar}}. Mix in {_2 tbsp_} of {{olive oil}} at the end. If the hummus feels too thick, add a few tbsp of water until you the desired consistency.
+ - Purée the roasted beets, with {_1 1/4 cup_} of cooked {{chickpeas}}, {_2 minced cloves_} of {{garlic}}, a {_1/4 cup_} of {{tahini}}, {_1/2 tsp_} of {{salt}} and {_1 tbsp_} of {{balsamic vinegar}}. Mix in {_2 tbsp_} of {{olive oil}} at the end. If the hummus feels too thick, add a few tbsp of water until you the desired consistency.
Tortillas
- Put {_3 cups_} of {{all purpose flour}}, {_1 tsp_} {{bamboo powder}} and {_1 tsp_} of {{salt}} in a bowl. Mix well.
- Add {_1/4 cup_} of {{olive oil}} and {_3/4 cup_} of {{cold water}}.
@@ -1278,7 +1361,7 @@ UZUMAKI HUMMUS BITES
INGR
Beet hummus
Red beets : 2
- Chickpeas : 1 1/4 cups
+ Chickpeas : 1 1/4 cups, cooked
Garlic : 2 cloves, minced
Tahini : 1/4 cup
Sea salt : 1/2 tsp
@@ -1568,17 +1651,19 @@ FRESH PESTO PASTA
& You can find the recipe for my roasted pepitas {{here|roasted pumpkin seeds}}! It's easy, and ready in 20 minutes. I usually make a double recipe, and add it to salads and other meals during the week. Enjoy!
INST
Pesto
- - Blend the following ingredients in a food processor or blender: {_2 cups_} of {{fresh basil}}, {_3 cloves_} of {{garlic}}, {#1/4 cup_} of {{nutritional yeast}}, {_1/4 tsp_} of {{salt}} and a dash of {{black pepper}}. Add {_1/4 cup_} of {{olive oil}} and blend again until smooth. Set aside.
+ - Blend the following ingredients in a food processor or blender: {_2 cups_} of {{fresh basil}}, {_3 cloves_} of {{garlic}}, {_1/4 cup_} of {{nutritional yeast}}, {_1/4 tsp_} of {{salt}} and a dash of {{black pepper}}.
+ - Add {_1/4 cup_} of {{olive oil}} and blend again until smooth. Set aside.
Cook
- Bring a pot of {{water}} to a boil, add {_1 1/2 cups_} of {{scoobi do}} pasta and cook until tender. While the pasta is cooking julienne {_2_} {{carrots}} and {_1_} {{zucchini}}.
- Drizzle some {{olive oil}} in a pan and bring up to medium heat. Add the vegetable strips and cook for {#2-3 minutes#}.
- Remove from heat, add the cooked pasta as well as a few tablespoons of pesto! The recipe makes about 1 cup of pesto, which you can keep and use for future meals.
- - Season pasta with {{salt}} and {{black pepper}}. Finally, top it all off with {{roasted pumpkin seeds}} and {{cherry tomatoes}}!
+ - Season pasta with {{salt}} and {{black pepper}}. Finally, top it all off with {{roasted pumpkin seeds}} and {{small heirloom tomatoes}}!
INGR
Main
Carrots : 2
Scoobi do : 1 1/2 cups
Zucchini : 1 large
+ Small heirloom tomatoes : 6
Pesto
Basil : 2 cups
Garlic : 3 cloves
@@ -1695,21 +1780,22 @@ SALTED CARAMEL CAROB CHIP COOKIES
Carob chips : 1/2 cup
Fleur de sel : to taste
-HIJIKI SOBA
+ARAME SOBA
DATE : 2015-12-12
TAGS
pasta
TIME : 40
- HIDE : yes
SERV : 2 portions
DESC
& After Japan opened itself to the world, Japanese cooks began to adapt western dishes in their own style. For instance in the west, people use ketchup as a condiment, but the Japanese use it as a base for tomato sauces. Spaghetti naporitan was created just after World War II, after Shigetada (the head chef at the Hotel New Grand in Yokohama) saw occupying soldiers eating it. Nowadays, you can find spaghetti seasoned with soy sauce, and served with seaweed.
- % recipes/hijiki.soba.2.jpg
+ % recipes/arame.soba.2.jpg
& While living in Tokyo, we spent many evenings at Saizeriya, a cheap Japanese food chain of family-style italian restaurants. I had my very first yoshoku-style (western style) pasta there.
- & This is a relatively simple recipe, and uses all of my favorite Japanese condiments! If you've never had yoshoku pasta, i envy you. A world of creativity awaits!
+ & {*About arame*}: {{Arame}} is a species of kelp of a dark brown color, it has a mild, semi-sweet flavor and a firm texture. It can be reconstituted in about 5 minutes, and can be added to many kinds of dishes. It is high in calcium, iodine, iron, magnesium and vitamin A.
+ & NOTE: This recipe used to include {{hijiki}} seaweed, but because even small amounts can contain inorganic arsenic that exceeds the tolerable daily intake for this substance, I have decided to subsitute it for arame. It doesn't change the recipe much, and it is a healthier alternative.
+
INST
Preparation
- - Put {_2 tbsp_} of dried {{hijiki}} in a bowl and cover with a cup of {{water}}. Let re-hydrate for at least {#30 minutes#}, drain.
+ - Put {_handful_} of dried {{arame}} in a bowl and cover with a cup of {{water}}. Let re-hydrate for at least {#5 minutes#}, drain.
- Bring a pot of {{water}} to a boil, add {_2 portions_} of soba({{buckwheat noodles}}) and give them a quick stir so they go underwater. Reduce heat to medium and cook for {#5 minutes#}. Drain, rinse and transfer to a pot of cold water. Wash the noodles using your hands to remove the excess starch, drain and set aside.
- Julienne {_1_} {{carrot}}, chop {_2 cloves_} of {{garlic}} and cut {_60g_} of {{tempeh}} into small cubes. I used {*noble bean*} original tempeh.
Sauce
@@ -1717,11 +1803,11 @@ HIJIKI SOBA
Cook
- Heat a pan with a drizzle of {{oil}} at medium heat and sautee the {{garlic}} for a minute until fragrant. Add the {{tempeh}} as well as the julienned {{carrot}} and cook for {#2-3 minutes#}.
- Pour the sauce and cook for an additional {#5 minutes#} until the {{tempeh}} and {{carrots}} are cooked.
- - Remove from heat and add the noodles, as well as the {{hijiki}}. Stir well and divide into 2 plates, season with some {{sichuan pepper}}.
+ - Remove from heat and add the noodles, as well as the {{arame}}. Stir well and divide into 2 plates, season with some {{sichuan pepper}}.
INGR
Main
Buckwheat noodles : 2 portions
- Dried hijiki : 2 tbsp
+ Arame : handful
Carrots : 1
Garlic : 2 cloves
Soy sauce : 2 tbsp
@@ -1730,7 +1816,34 @@ HIJIKI SOBA
Tempeh : 60g or 1/4 of 240g
Sichuan peppercorns : To taste
-CHICKPEA KELP SANDWICH
+Homemade Veganaise
+ DATE : 2019-12-06
+ TAGS
+ sauce
+ TIME : 5
+ SERV : 1.5 cup
+ DESC
+ & Making mayo is easy. This is a basic recipe that can be prepared right before eating, and that requires few tools.
+ & It's possible to add other spices and ingredients to augment the flavor of this homemade plant-based mayonnaise, ingredients like smoked paprika, garlic or fresh herbs.
+ & {*Substitutions*}
+ & In this recipe it's possible to use {{olive oil}} instead of canola. I used canola oil because it has a neutral flavor, while olive oil does not.
+ & Instead of using {{dijon mustard}}, you can sub with 1 tsp of mustard powder. If you have a spice grinder or a coffee grinder, you can grind your own mustard powder from whole mustard seeds. If you use mustard powder, you'll have to add 1 extra tbsp of apple cider vinegar to the recipe. In this recipe, I used old style {{dijon mustard}} with mustard seeds, which explains the texture present in the veganaise. If you want to know how to make old-style dijon mustard, check out {{my recipe|#mustard from seed}}.
+ & If you prefer sweeter venagaise, add 1/2 tsp of a sweetener.
+ INST
+ Preparation
+ - Blend {_1 cup_} of {{soft tofu}}, {_3 tbsp_} of olive oil, {_2 tbsp_} {{apple cider vinegar}}, {_3 tbsp_} {{dijon mustard}} and {_1/4 tsp_} {{salt}}.
+
+ INGR
+ Preparation
+ Soft tofu : 250g
+ Canola oil : 3 tbsp
+ Apple cider vinegar : 1 tbsp
+ Lemon juice : 1 tsp
+ Dijon mustard : 3 tbsp
+ Salt : 1/4 tsp
+
+
+CHICKPEA SALAD SANDWICH
DATE : 2016-01-18
TAGS
dinner
@@ -1740,27 +1853,24 @@ CHICKPEA KELP SANDWICH
& I recently ordered ingredients from BC Kelp, a company in northern Canada that grows their own seaweed. A lot of the food I make these days has either nori, wakame, bull kelp or bladderwack whole tips in it.
& I'd like to see more people cooking with sea vegetables. You can snack on dried seaweed, or add it to soups and salads. The powdered version I'm using in this recipe, adds a lot of umami and color to meals.
& You can order your own bull kelp powder from the {{BC Kelp website|http://www.bckelp.com/index.html}}, they have a wide range of quality seaweed to choose from.
+ & {*Recommendations*}
+ & Adding a bay leaf, a bit of onion or a clove or two of garlic to the cooking water add a subtle seasoning to the chickpeas and boost flavor.
+ & {*Substitutions*}
+ & If you don't have access to {{bull kelp powder}}, you can use 1 tsp capers or dulse flakes. These needs to be added to create a briny no-tuna taste.
INST
- Tofu mayo
- - Blend {_1 cup_} of {{tofu}}, {_3 tbsp_} of olive oil, {_2 tbsp_} {{apple cider vinegar}}, {_3 tbsp_} {{dijon mustard}} and {_1/4 tsp_} {{salt}}. This makes more than you'll need, but that means you get to use the rest in another recipe!
+ Venagaise
+ - See the {{recipe|#homemade veganaise}}.
Main
- - Soak dry {{chickpeas}} {#overnight#}, or for {#8h#}. Drain, rinse and cook according to pressure cooker instructions. I cook mine at the longer time, so they soften up. Alternatively, you can use a can of chickpeas.
- - Pressure cooker chickpeas come out a lot softer, if cooked at the longer time. Because of this, they don't need to be mashed as much. If you decide to use canned chickpeas ({_1 can_} will do), you may have to put a bit more effort to soften them up.
- - Mix the mashed {{chickpeas}} with {_3-4 tbsp_} of tofu mayo, {_1 tbsp_} {{dijon mustard}}, {_1/2 tsp_} {{kelp powder}}, {_2 branches_} of chopped {{scallions}} and {_1/4 tsp_} of {{cayenne powder}}.
- - Season with {{black pepper}} and some {{shichimi togarashi}}, serve over toasted sliced bread.
+ - Cook {_3/4 cup_} of dried {{chickpeas}} (see {{instructions|#chickpeas}}), or use 1 can (15oz).
+ - Mix the cooked {{chickpeas}} with {_3-4 tbsp_} of {{venagaise|#homemade veganaise}}, {_1 tbsp_} {{dijon mustard}}, {_1/2 tsp_} {{bull kelp powder}}, {_2 stalks_} of chopped {{scallions}} and {_1/4 tsp_} of {{cayenne powder}}.
+ - Season with {{black pepper}} and {{shichimi togarashi}}, and serve over toasted bread.
INGR
- Tofu Mayo
- Tofu : 1 cup, silken
- Olive oil : 3 tbsp
- Apple cider vinegar : 2 tbsp
- Dijon mustard : 3 tbsp
- Salt : 1/4 tsp
Main
- Chickpeas : 3/4 cup, dry
- Tofu mayo : 3-4 tbsp
+ Chickpeas : 15oz, cooked
+ Veganaise : 3-4 tbsp
Dijon mustard : 1 tbsp
- Bull kelp powder : 1/2 tsp
- Scallions : 2 branches
+ Bull kelp powder : 1 tsp
+ Scallions : 2 stalks
Cayenne powder : 1/4 tsp
Sea salt : 1/4 tsp
Black pepper : 1/4 tsp
@@ -1797,31 +1907,56 @@ BEER BREAD
Olive oil : 1 tbsp
Oats : 3 tbsp
-CHARCOAL TOOTHPASTE
+STOVETOP POPCORN
+ DATE : 2017-11-08
+ TAGS
+ basic
+ TIME : 5
+ SERV : 20 cups
+ DESC
+ & Making popcorn on the stovetop is not a recipe perse, it's a reminder that it's easy to do and that it doesn't require any specialized tools or ingredients. It doesn't require a microwave, just a pot and source of heat (stove).
+ & When I was a kid my family used Jiffy Pop, unpopped kernels, oil, and flavoring agents that come in a heavy-gauge aluminum foil pan. I enjoyed seeing the foil rise up into a dome as the kernels started to pop. Then later, my family adopted microwavable bags. These products — while easy and fun — cost more and create unecessary waste. Because I grew up with packaged popcorn, the idea of trying to pop my own kernels only occurred to me MUCH later in life.
+ & So, again, this is a reminder that there are conveniences in life that we just don't need.
+
+ INST
+ Preparation
+ - Put {_2 tbsp_} of {{olive oil}} in a deep pot, bring to a high heat.
+ - Add a few corn kernels into the pot. Once they start to pop, add the rest of the {{dry corn kernels}} and cover pot with a lid.
+ - Shake pot for 10 seconds, let rest for 10 seconds. Do this until the popping sounds begin to lessen.
+ - Add desired toppings.
+
+ INGR
+ Main
+ Dry corn kernels : 1/2 cup
+ Olive oil : 2 tbsp
+ Optional toppings
+ Nutritional yeast : 3 tbsp
+ Smoked paprika : 1 tsp
+ Salt : pinch
+
+BASIC TOOTHPASTE
DATE : 2016-11-05
TAGS
lifestyle
TIME : 5
SERV : 1 jar
DESC
- & I've always liked making things from scratch, especially when cooking. I enjoy the process, making it myself means that i control the quality and quantity of each ingredient. In the last couple of years, I've removed most pre-made cleaning and hygiene products from my life. I make my own shampoo, deodorant, toilet cleaner, kitchen cleaner and I also make my own toothpaste.
- % recipes/charcoal.toothpaste.1.jpg
- & Making it yourself is cheaper, and you're not burdened by wasteful packaging. Chances are you already have all of the ingredients at home to make it, there's nothing to it. The recipe consists of baking soda, foodgrade bamboo charcoal powder, coconut oil and peppermint oil (also food grade). You can omit the bamboo charcoal to make your own toothpaste, it will work just as well. If you want black toothpaste to match your black-everything though, this is a must. If you want some, make sure to get it from a reliable source. If you're a hardcore minimalist, you can also brush your teeth with a simple baking soda and water paste (though the saltiness can be overwhelming). Adding coconut and peppermint oil, makes for a better taste and texture. In colder climates, your toothpaste will solidify. Scraping some onto your toothbrush can be a challenge. Put the jar near a heater for 5 minutes or so to help soften it down.
- % recipes/charcoal.toothpaste.2.jpg
- & Baking soda you can purchase in bulk; you can use to make a ton of products. I use it almost everyday on the boat to polish metals, unclog drains etc. One day i will make a post about cleaning products, for now, enjoy the bamboo charcoal toothpaste recipe! Awaken the Ohaguro in you (be assured that the bamboo charcoal won't really stain your teeth).
- & You can order your own bamboo charcoal powder from {{Taketora|http://www.taketora.co.jp/fs/taketora/su00248}}, it's where i got mine.
+ & I've always liked making things from scratch, especially when cooking. I enjoy the process. Making it myself means that I control the quality and quantity of each ingredient. In the last couple of years, I've removed most pre-made cleaning and hygiene products from my life. I make my own shampoo, deodorant, toilet cleaner, kitchen cleaner, and I also make my own toothpaste.
+ & Chances are you already have all of the ingredients at home to make it. The recipe consists of {{baking soda}}, {{coconut oil}} and {{peppermint oil}} (also food grade).
+ & You can also brush your teeth with a simple baking soda and water paste. Baking soda is abrasive enough to remove accumulations on teeth and rinses completely clear with only a very slightly salty taste. For those who dislike brushing with a salty taste, adding coconut and peppermint oil helps to smooth down both the taste and texture.
+ & {*NOTE*}: In colder climates your toothpaste will solidify and scraping some onto your toothbrush can be a challenge. Put the jar near a heater for 5 minutes or so to help soften it down.
+ & Toothpaste is only as good as your brushing (which should last for a min of 2min). It is more important to brush your teeth thoroughly than to use toothpaste, especially after eating sweets.
+
INST
Preparation
- - Mix {_1 1/2 tbsp_} of {{baking soda}} with {_1/2 tsp_} of {{bamboo charcoal powder}}.
- - Add {_3 tbsp_} of {{coconut oil}}. If the coconut oil is hard, melt it down and mix it with the dry ingredients
+ - Mix {_1 1/2 tbsp_} of {{baking soda}} with {_3 tbsp_} of {{coconut oil}}. If the coconut oil is hard, melt it down and mix it with the dry ingredients
- Add {_1/2 tsp_} of food grade {{peppermint oil}}.
- Mix everything up and brush your teeth!
INGR
Main
Baking soda : 1 1/2 tbsp
- Bamboo charcoal powder : 1/2 tsp
Coconut oil : 3 tbsp
- Peppermint oil : 1/2 tsp, to taste
+ Peppermint oil : 1/2 tsp
PAPAYA BRUSCHETTA TOPPING
DATE : 2017-19-20
@@ -1913,7 +2048,7 @@ CORN DUMPLINGS
Sauce
Apricot jam : 3 tsp
Soy sauce : 2 tbsp
- Rice vinegar : 2 tbsp
+ Japanese rice vinegar : 2 tbsp
Lemon juice : 1 tbsp
Sesame oil : 1 tsp
Water : 1/4 cup
diff --git a/scripts/graph.js b/scripts/graph.js
@@ -31,12 +31,13 @@ function graph () {
<li><a class="local about" onclick="Ø('query').bang('About')">About</a></li>
<li><a class="local tools" onclick="Ø('query').bang('Tools')">Tools</a></li>
<li><a class="local gallery" onclick="Ø('query').bang('gallery')">Gallery</a></li>
+ <li><a class="local nutrition" onclick="Ø('query').bang('nutrition')">Nutrition</a></li>
<li class='right'><a href='http://twitter.com/grimgrains' target='_blank'>Twitter</a></li>
</ul>`.to_markup()),
Ø('core').create({ x: 10, y: 11 }, DomNode),
Ø('content').create({ x: 10, y: 16 }, DomNode),
Ø('related').create({ x: 14, y: 16 }, DomNode, 'ul'),
- Ø('footer').create({ x: 6, y: 11 }, DomNode, 'wr', `<a onclick="Ø('query').bang('about')">Grimgrains</a> © 2014—2018<br/><a href='http://100r.co/' target='_blank'>Hundred Rabbits</a>`)
+ Ø('footer').create({ x: 6, y: 11 }, DomNode, 'wr', '<a onclick="Ø(\'query\').bang(\'about\')">Grimgrains</a> © 2014—2019<br/><a href=\'http://100r.co/\' target=\'_blank\'>Hundred Rabbits</a>')
])
// Model
diff --git a/scripts/lib/riven.graph.js b/scripts/lib/riven.graph.js
@@ -1,7 +1,7 @@
function Riven_Graph () {
Riven.call(this)
- let GRID_SIZE = 20
+ const GRID_SIZE = 20
this.el = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
document.body.appendChild(this.el)
@@ -9,11 +9,11 @@ function Riven_Graph () {
this.graph = function () {
let html = ''
for (id in this.network) {
- let node = this.network[id]
+ const node = this.network[id]
html += draw_routes(node)
}
for (id in this.network) {
- let node = this.network[id]
+ const node = this.network[id]
html += draw_node(node)
}
this.el.innerHTML = html
@@ -22,10 +22,10 @@ function Riven_Graph () {
function draw_routes (node) {
let html = ''
for (id in node.ports) {
- let port = node.ports[id]
- let pos = port ? get_port_position(port) : { x: 0, y: 0 }
+ const port = node.ports[id]
+ const pos = port ? get_port_position(port) : { x: 0, y: 0 }
for (route_id in port.routes) {
- let route = port.routes[route_id]
+ const route = port.routes[route_id]
if (!route) { continue }
html += route ? draw_connection(port, route) : ''
}
@@ -34,7 +34,7 @@ function Riven_Graph () {
}
function draw_node (node) {
- let rect = get_rect(node)
+ const rect = get_rect(node)
return `
<g class='node ${node.is_mesh ? 'mesh' : ''}' id='node_${node.id}'>
@@ -54,12 +54,12 @@ function Riven_Graph () {
}
function draw_glyph (node) {
- let rect = get_rect(node)
+ const rect = get_rect(node)
return !node.is_mesh && node.glyph ? `<path class='glyph' transform="translate(${rect.x + (GRID_SIZE / 4)},${rect.y - (GRID_SIZE / 4)}) scale(0.1)" d='${node.glyph}'/>` : ''
}
function draw_port (port) {
- let pos = port ? get_port_position(port) : { x: 0, y: 0 }
+ const pos = port ? get_port_position(port) : { x: 0, y: 0 }
return `<g id='${port.host.id}_port_${port.id}'>${(port.type == PORT_TYPES.request || port.type == PORT_TYPES.answer) ? `<path d='${draw_diamond(pos)}' class='port ${port.type} ${port.host.ports[id] && port.host.ports[id].route ? 'route' : ''}' />` : `<circle cx='${pos.x}' cy="${pos.y}" r="${parseInt(GRID_SIZE / 6)}" class='port ${port.type} ${port.host.ports[id] && port.host.ports[id].route ? 'route' : ''}'/>`}</g>`
}
@@ -73,9 +73,9 @@ function Riven_Graph () {
function is_bidirectional (a, b) {
for (id in a.ports.output.routes) {
- let route_a = a.ports.output.routes[id]
+ const route_a = a.ports.output.routes[id]
for (id in a.ports.request.routes) {
- let route_b = a.ports.request.routes[id]
+ const route_b = a.ports.request.routes[id]
if (route_a.host.id == route_b.host.id) {
return true
}
@@ -85,11 +85,11 @@ function Riven_Graph () {
}
function draw_connection_output (a, b) {
- let pos_a = get_port_position(a)
- let pos_b = get_port_position(b)
- let pos_m = middle(pos_a, pos_b)
- let pos_c1 = { x: (pos_m.x + (pos_a.x + GRID_SIZE)) / 2, y: pos_a.y }
- let pos_c2 = { x: (pos_m.x + (pos_b.x - GRID_SIZE)) / 2, y: pos_b.y }
+ const pos_a = get_port_position(a)
+ const pos_b = get_port_position(b)
+ const pos_m = middle(pos_a, pos_b)
+ const pos_c1 = { x: (pos_m.x + (pos_a.x + GRID_SIZE)) / 2, y: pos_a.y }
+ const pos_c2 = { x: (pos_m.x + (pos_b.x - GRID_SIZE)) / 2, y: pos_b.y }
let path = ''
@@ -103,11 +103,11 @@ function Riven_Graph () {
}
function draw_connection_request (a, b) {
- let pos_a = get_port_position(a)
- let pos_b = get_port_position(b)
- let pos_m = middle(pos_a, pos_b)
- let pos_c1 = { x: pos_a.x, y: (pos_m.y + (pos_a.y + GRID_SIZE)) / 2 }
- let pos_c2 = { x: pos_b.x, y: (pos_m.y + (pos_b.y - GRID_SIZE)) / 2 }
+ const pos_a = get_port_position(a)
+ const pos_b = get_port_position(b)
+ const pos_m = middle(pos_a, pos_b)
+ const pos_c1 = { x: pos_a.x, y: (pos_m.y + (pos_a.y + GRID_SIZE)) / 2 }
+ const pos_c2 = { x: pos_b.x, y: (pos_m.y + (pos_b.y - GRID_SIZE)) / 2 }
let path = ''
@@ -121,11 +121,11 @@ function Riven_Graph () {
}
function draw_connection_bidirectional (a, b) {
- let pos_a = get_port_position(a)
- let pos_b = get_port_position(b)
- let pos_m = middle(pos_a, pos_b)
- let pos_c1 = { x: pos_a.x, y: (pos_m.y + (pos_a.y + GRID_SIZE)) / 2 }
- let pos_c2 = { x: pos_b.x, y: (pos_m.y + (pos_b.y - GRID_SIZE)) / 2 }
+ const pos_a = get_port_position(a)
+ const pos_b = get_port_position(b)
+ const pos_m = middle(pos_a, pos_b)
+ const pos_c1 = { x: pos_a.x, y: (pos_m.y + (pos_a.y + GRID_SIZE)) / 2 }
+ const pos_c2 = { x: pos_b.x, y: (pos_m.y + (pos_b.y - GRID_SIZE)) / 2 }
let path = ''
@@ -137,12 +137,12 @@ function Riven_Graph () {
}
function draw_diamond (pos) {
- let r = GRID_SIZE / 6
+ const r = GRID_SIZE / 6
return `M${pos.x - (r)},${pos.y} L${pos.x},${pos.y - (r)} L${pos.x + (r)},${pos.y} L${pos.x},${pos.y + (r)} Z`
}
function get_port_position (port) {
- let rect = get_rect(port.host)
+ const rect = get_rect(port.host)
let offset = { x: 0, y: 0 }
if (port.type == PORT_TYPES.output) {
offset = { x: GRID_SIZE * 2, y: GRID_SIZE / 2 }
@@ -157,14 +157,14 @@ function Riven_Graph () {
}
function get_rect (node) {
- let rect = node.rect
+ const rect = node.rect
let x = node.rect.x * GRID_SIZE
let y = node.rect.y * GRID_SIZE
- let w = node.rect.w * GRID_SIZE
- let h = node.rect.h * GRID_SIZE
+ const w = node.rect.w * GRID_SIZE
+ const h = node.rect.h * GRID_SIZE
if (node.parent) {
- let offset = get_rect(node.parent)
+ const offset = get_rect(node.parent)
x += offset.x
y += offset.y
}
diff --git a/scripts/lib/riven.js b/scripts/lib/riven.js
@@ -8,10 +8,10 @@ function Riven () {
// QUERY
function Ø (s, network = RIVEN.network) {
- let id = s.toLowerCase()
+ const id = s.toLowerCase()
if (id.indexOf(' ') > -1) {
- let node_id = id.split(' ')[0]
- let port_id = id.split(' ')[1]
+ const node_id = id.split(' ')[0]
+ const port_id = id.split(' ')[1]
return network[node_id] && network[node_id].ports[port_id] ? network[node_id].ports[port_id] : null
} else if (network[id]) {
return network[id]
@@ -38,7 +38,7 @@ function Node (id, rect = { x: 0, y: 0, w: 2, h: 2 }) {
}
this.create = function (pos = { x: 0, y: 0 }, type = Node, ...params) {
- let node = new type(this.id, rect, ...params)
+ const node = new type(this.id, rect, ...params)
this.rect.x = pos.x
this.rect.y = pos.y
node.setup()
@@ -47,7 +47,7 @@ function Node (id, rect = { x: 0, y: 0, w: 2, h: 2 }) {
}
this.mesh = function (pos, n) {
- let node = new Mesh(this.id, pos)
+ const node = new Mesh(this.id, pos)
node.rect.x = pos.x
node.rect.y = pos.y
node.setup()
@@ -92,9 +92,9 @@ function Node (id, rect = { x: 0, y: 0, w: 2, h: 2 }) {
this.signal = function (target) {
for (port_id in this.ports) {
- let port = this.ports[port_id]
+ const port = this.ports[port_id]
for (route_id in port.routes) {
- let route = port.routes[route_id]
+ const route = port.routes[route_id]
if (!route || !route.host || route.host.id != target.toLowerCase()) { continue }
return route.host
}
@@ -106,16 +106,16 @@ function Node (id, rect = { x: 0, y: 0, w: 2, h: 2 }) {
this.send = function (payload) {
for (route_id in this.ports.output.routes) {
- let route = this.ports.output.routes[route_id]
+ const route = this.ports.output.routes[route_id]
if (!route) { continue }
route.host.receive(payload)
}
}
this.receive = function (q) {
- let port = this.ports.output
+ const port = this.ports.output
for (route_id in port.routes) {
- let route = port.routes[route_id]
+ const route = port.routes[route_id]
if (route) {
route.host.receive(q)
}
@@ -133,11 +133,11 @@ function Node (id, rect = { x: 0, y: 0, w: 2, h: 2 }) {
}
this.request = function (q) {
- let payload = {}
+ const payload = {}
for (route_id in this.ports.request.routes) {
- let route = this.ports.request.routes[route_id]
+ const route = this.ports.request.routes[route_id]
if (!route) { continue }
- let answer = route.host.answer(q)
+ const answer = route.host.answer(q)
if (!answer) { continue }
payload[route.host.id] = answer
}
@@ -167,9 +167,9 @@ function Node (id, rect = { x: 0, y: 0, w: 2, h: 2 }) {
this.setup = function () {}
this.update = function () {
- let bounds = { x: 0, y: 0 }
+ const bounds = { x: 0, y: 0 }
for (id in this.children) {
- let node = this.children[id]
+ const node = this.children[id]
bounds.x = node.rect.x > bounds.x ? node.rect.x : bounds.x
bounds.y = node.rect.y > bounds.y ? node.rect.y : bounds.y
}
@@ -179,9 +179,9 @@ function Node (id, rect = { x: 0, y: 0, w: 2, h: 2 }) {
}
}
-let PORT_TYPES = { default: 'default', input: 'input', output: 'output', request: 'request', answer: 'answer' }
-let ROUTE_TYPES = { default: 'default', request: 'request' }
-let NODE_GLYPHS = {
+const PORT_TYPES = { default: 'default', input: 'input', output: 'output', request: 'request', answer: 'answer' }
+const ROUTE_TYPES = { default: 'default', request: 'request' }
+const NODE_GLYPHS = {
default: 'M150,60 L150,60 L60,150 L150,240 L240,150 Z',
router: 'M60,120 L60,120 L150,120 L240,60 M60,150 L60,150 L240,150 M60,180 L60,180 L150,180 L240,240',
parser: 'M60,60 L60,60 L240,60 M120,120 A30,30 0 0,1 150,150 M150,150 A30,30 0 0,0 180,180 M180,180 L180,180 L240,180 M120,120 L120,120 L60,120 M60,240 L60,240 L240,240 M240,120 L240,120 L180,120 M60,180 L60,180 L120,180',
diff --git a/scripts/lib/runic.js b/scripts/lib/runic.js
@@ -16,7 +16,7 @@ function Runic (raw) {
'=': { glyph: '=', tag: 'h3', class: '' },
'+': { glyph: '+', tag: 'hs', class: '' },
'>': { glyph: '>', tag: '', class: '' },
- '$': { glyph: '>', tag: '', class: '' }
+ $: { glyph: '>', tag: '', class: '' }
}
this.stash = {
@@ -27,7 +27,7 @@ function Runic (raw) {
this.all.push({ rune: rune, item: item })
},
pop: function () {
- let copy = this.copy(this.all)
+ const copy = this.copy(this.all)
this.all = []
return copy
},
@@ -43,8 +43,8 @@ function Runic (raw) {
}
this.media = function (val) {
- let service = val.split(' ')[0]
- let id = val.split(' ')[1]
+ const service = val.split(' ')[0]
+ const id = val.split(' ')[1]
if (service == 'itchio') {
return `<iframe frameborder="0" src="https://itch.io/embed/${id}?link_color=000000" width="600" height="167"></iframe>`
@@ -59,15 +59,15 @@ function Runic (raw) {
if (!raw) { return '' }
let html = ''
- let lines = !Array.isArray(raw) ? raw.split('\n') : raw
+ const lines = !Array.isArray(raw) ? raw.split('\n') : raw
for (id in lines) {
- let char = lines[id].substr(0, 1).trim().toString()
- let rune = this.runes[char]
- let trail = lines[id].substr(1, 1)
+ const char = lines[id].substr(0, 1).trim().toString()
+ const rune = this.runes[char]
+ const trail = lines[id].substr(1, 1)
if (char == '$') { html += '<p>' + Ø('operation').request(lines[id].substr(2)).to_markup() + '</p>'; continue }
if (char == '%') { html += this.media(lines[id].substr(2)); continue }
- let line = lines[id].substr(2).to_markup()
+ const line = lines[id].substr(2).to_markup()
if (!line || line.trim() == '') { continue }
if (!rune) { console.log(`Unknown rune:${char} : ${line}`) }
if (trail != ' ') { console.warn('Runic', 'Non-rune[' + trail + '] at:' + id + '(' + line + ')'); continue }
@@ -81,13 +81,13 @@ function Runic (raw) {
}
this.render_stash = function () {
- let rune = this.stash.rune
- let stash = this.stash.pop()
+ const rune = this.stash.rune
+ const stash = this.stash.pop()
let html = ''
for (id in stash) {
- let rune = stash[id].rune
- let line = stash[id].item
+ const rune = stash[id].rune
+ const line = stash[id].item
html += rune.wrap ? `<${rune.sub}><${rune.wrap}>${line.replace(/\|/g, `</${rune.wrap}><${rune.wrap}>`).trim()}</${rune.wrap}></${rune.sub}>` : `<${rune.sub}>${line}</${rune.sub}>`
}
return `<${rune.tag} class='${rune.class}'>${html}</${rune.tag}>`
@@ -127,16 +127,16 @@ String.prototype.to_markup = function () {
html = html.replace(/{\*/g, '<b>').replace(/\*}/g, '</b>')
html = html.replace(/{\#/g, "<code class='inline'>").replace(/\#}/g, '</code>')
- let parts = html.split('{{')
+ const parts = html.split('{{')
for (id in parts) {
- let part = parts[id]
+ const part = parts[id]
if (part.indexOf('}}') == -1) { continue }
- let content = part.split('}}')[0]
+ const content = part.split('}}')[0]
if (content.substr(0, 1) == '$') { html = html.replace(`{{${content}}}`, Ø('operation').request(content.replace('$', ''))); continue }
// if(content.substr(0,1) == "%"){ html = html.replace(`{{${content}}}`, this.media(content)); continue; }
- let target = content.indexOf('|') > -1 ? content.split('|')[1] : content
- let name = content.indexOf('|') > -1 ? content.split('|')[0] : content
- let external = (target.indexOf('https:') > -1 || target.indexOf('http:') > -1 || target.indexOf('dat:') > -1)
+ const target = content.indexOf('|') > -1 ? content.split('|')[1] : content
+ const name = content.indexOf('|') > -1 ? content.split('|')[0] : content
+ const external = (target.indexOf('https:') > -1 || target.indexOf('http:') > -1 || target.indexOf('dat:') > -1)
html = html.replace(`{{${content}}}`, external ? `<a href='${target}' class='external' target='_blank'>${name}</a>` : `<a class='local' href="#${target.to_url()}" onclick="Ø('query').bang('${target}')">${name}</a>`)
}
return html
diff --git a/scripts/nodes/document.js b/scripts/nodes/document.js
@@ -1,3 +1,5 @@
+'use strict'
+
function DocumentNode (id, rect, ...params) {
Node.call(this, id, rect)
diff --git a/scripts/nodes/dom.js b/scripts/nodes/dom.js
@@ -1,3 +1,5 @@
+'use strict'
+
function DomNode (id, rect, ...params) {
Node.call(this, id, rect)
diff --git a/scripts/nodes/indental.js b/scripts/nodes/indental.js
@@ -1,3 +1,5 @@
+'use strict'
+
function IndentalNode (id, rect, type) {
Node.call(this, id, rect)
@@ -23,10 +25,10 @@ function IndentalNode (id, rect, type) {
function build (lines, type) {
// Assoc lines
- let stack = {}
+ const stack = {}
let target = lines[0]
for (id in lines) {
- let line = lines[id]
+ const line = lines[id]
if (line.skip) { continue }
target = stack[line.indent - 2]
if (target) { target.children.push(line) }
@@ -34,21 +36,21 @@ function IndentalNode (id, rect, type) {
}
// Format
- let h = {}
+ const h = {}
for (id in lines) {
- let line = lines[id]
+ const line = lines[id]
if (line.skip || line.indent > 0) { continue }
- let key = line.content.toUpperCase()
+ const key = line.content.toUpperCase()
h[key] = type ? new type(key, format(line)) : format(line)
}
return h
}
function format (line) {
- let a = []
- let h = {}
+ const a = []
+ const h = {}
for (id in line.children) {
- let child = line.children[id]
+ const child = line.children[id]
if (child.key) { h[child.key.toUpperCase()] = child.value } else if (child.children.length == 0 && child.content) { a.push(child.content) } else { h[child.content.toUpperCase()] = format(child) }
}
return a.length > 0 ? a : h
@@ -67,4 +69,4 @@ function IndentalNode (id, rect, type) {
}
}
-let DATABASE = {}
+const DATABASE = {}
diff --git a/scripts/nodes/query.js b/scripts/nodes/query.js
@@ -1,3 +1,5 @@
+'use strict'
+
function QueryNode (id, rect) {
Node.call(this, id, rect)
@@ -5,7 +7,7 @@ function QueryNode (id, rect) {
this.label = 'query'
this.bang = function (input = window.location.hash) {
- let target = input.to_url() === '' ? 'home' : input.to_url()
+ const target = input.to_url() === '' ? 'home' : input.to_url()
Ø('view').el.className = `${target.to_path()} loading`
@@ -22,12 +24,12 @@ function QueryNode (id, rect) {
}
}
-let detectBackOrForward = function (onBack, onForward) {
- hashHistory = [window.location.hash]
- historyLength = window.history.length
+const detectBackOrForward = function (onBack, onForward) {
+ let hashHistory = [window.location.hash]
+ let historyLength = window.history.length
return function () {
- let hash = window.location.hash; let length = window.history.length
+ const hash = window.location.hash; const length = window.history.length
if (hashHistory.length && historyLength == length) {
if (hashHistory[hashHistory.length - 2] == hash) {
hashHistory = hashHistory.slice(0, -1)
diff --git a/scripts/nodes/router.js b/scripts/nodes/router.js
@@ -1,13 +1,15 @@
+'use strict'
+
function RouterNode (id, rect) {
Node.call(this, id, rect)
this.glyph = NODE_GLYPHS.router
this.receive = function (q) {
- let target = q.indexOf(':') > -1 ? q.split(':')[0].replace(/\+/g, ' ') : q.replace(/\+/g, ' ')
- let params = q.indexOf(':') > -1 ? q.split(':')[1] : null
- let db = this.request('database').database
- let data = find(target.toUpperCase(), db)
+ const target = q.indexOf(':') > -1 ? q.split(':')[0].replace(/\+/g, ' ') : q.replace(/\+/g, ' ')
+ const params = q.indexOf(':') > -1 ? q.split(':')[1] : null
+ const db = this.request('database').database
+ const data = find(target.toUpperCase(), db)
this.label = `${this.id}|${target}|${params}`
@@ -26,7 +28,7 @@ function RouterNode (id, rect) {
if (parseInt(key) > 0) { return null }
for (id in db) {
- let table = db[id]
+ const table = db[id]
if (table[key]) {
return { type: id, result: table[key] }
}
diff --git a/scripts/nodes/template.js b/scripts/nodes/template.js
@@ -1,3 +1,5 @@
+'use strict'
+
function TemplateNode (id, rect) {
Node.call(this, id, rect)
@@ -6,8 +8,8 @@ function TemplateNode (id, rect) {
this.cache = null
this.receive = function (q) {
- let assoc = this.signal(q.type ? q.type.slice(0, -1) : 'page')
- let payload = assoc.answer(q)
+ const assoc = this.signal(q.type ? q.type.slice(0, -1) : 'page')
+ const payload = assoc.answer(q)
this.send(payload)
this.label = `template:${assoc.id}`
diff --git a/scripts/templates/home.js b/scripts/templates/home.js
@@ -1,22 +1,24 @@
+'use strict'
+
function HomeTemplate (id, rect) {
Node.call(this, id, rect)
this.glyph = NODE_GLYPHS.render
this.answer = function (q) {
- let ingredients = find_ingredients(q.tables.recipes)
+ const ingredients = find_ingredients(q.tables.recipes)
- ingredients['coffee'] = 1
+ ingredients.coffee = 1
- let sorted_ingredients = sort_ingredients(ingredients)
+ const sorted_ingredients = sort_ingredients(ingredients)
- let html = `
+ const html = `
${make_ingredients(sorted_ingredients, q.tables.ingredients)}
<h1>Recipes</h1>
${make_recipes(q.tables.recipes)}
`
return {
- title: `GrimGrains — Home`,
+ title: 'GrimGrains — Home',
view: {
core: {
content: html,
@@ -27,11 +29,11 @@ function HomeTemplate (id, rect) {
}
function find_ingredients (recipes) {
- let h = {}
+ const h = {}
for (id in recipes) {
- let recipe = recipes[id]
+ const recipe = recipes[id]
for (id in recipe.INGR) {
- let category = recipe.INGR[id]
+ const category = recipe.INGR[id]
for (name in category) {
h[name] = h[name] ? h[name] + 1 : 1
}
@@ -41,9 +43,9 @@ function HomeTemplate (id, rect) {
}
function sort_ingredients (ingredients) {
- let a = []
+ const a = []
for (name in ingredients) {
- let value = ingredients[name]
+ const value = ingredients[name]
a.push([name, value])
}
a.sort(function (a, b) {
@@ -55,20 +57,20 @@ function HomeTemplate (id, rect) {
function make_ingredients (ingredients, table) {
let html = ''
for (id in ingredients) {
- let name = ingredients[id][0]
+ const name = ingredients[id][0]
html += `
<li class='ingredient${!table[name] ? ' missing' : ''}'>
<a href='#${name.to_url()}' onclick="Ø('query').bang('${name}')">
<img src='media/ingredients/${name.to_path()}.png'/>
+ <span class='name'>${name.capitalize()}</span>
</a>
- <t class='name'>${name.capitalize()}</t>
</li>`
}
return `<ul class='ingredients'>${html}</ul>`
}
function count_ingredients (recipe) {
- let ingredients = {}
+ const ingredients = {}
for (cat in recipe.INGR) {
for (id in recipe.INGR[cat]) {
ingredients[id] = 1
@@ -82,22 +84,22 @@ function HomeTemplate (id, rect) {
// Sort by tag
- let categorized = {}
+ const categorized = {}
- for (name in recipes) {
- let recipe = recipes[name]
+ for (const name in recipes) {
+ const recipe = recipes[name]
if (!categorized[recipe.TAGS[0]]) { categorized[recipe.TAGS[0]] = [] }
recipe.name = name
categorized[recipe.TAGS[0]].push(recipe)
}
- for (cat in categorized) {
- let recipes = categorized[cat]
+ for (const cat in categorized) {
+ const recipes = categorized[cat]
html += `<h3>${cat.capitalize()}</h3>`
html += "<ul style='margin-bottom:15px'>"
for (id in recipes) {
- let recipe = recipes[id]
- if(recipe.HIDE){ continue; }
+ const recipe = recipes[id]
+ if (recipe.HIDE) { continue }
html += `<li><a href="#${recipe.name.to_url()}" onclick="Ø('query').bang('${recipe.name.capitalize()}')">${recipe.name.capitalize()}</a></li>`
}
html += '</ul>'
diff --git a/scripts/templates/ingredient.js b/scripts/templates/ingredient.js
@@ -1,3 +1,5 @@
+'use strict'
+
function IngredientTemplate (id, rect) {
Node.call(this, id, rect)
@@ -6,7 +8,7 @@ function IngredientTemplate (id, rect) {
// Create the recipe body
this.answer = function (t) {
- let ingredient = t.result
+ const ingredient = t.result
return {
title: `GrimGrains — ${t.name.capitalize()}`,
@@ -23,84 +25,36 @@ function IngredientTemplate (id, rect) {
let html = ''
html += `<h1>${name.capitalize()}</h1>`
+ html += `<ul class='ingredients' style='float:right'>${print_ingredient(name)}</ul>`
html += ingredient.BREF ? `<p class='bref'>${ingredient.BREF.to_markup()}</p>` : ''
html += ingredient.LONG ? `${new Runic(ingredient.LONG)}` : ''
- html += `${make_parents(ingredient)}`
- html += `${make_children(name, all_ingredients)}`
- html += `${make_similar(name, recipes, all_ingredients)}`
- return html
- }
-
- function make_parents (ingredient) {
- let html = ''
- if (!ingredient.PARENT) {return html}
-
- html += "<h2>Parent Ingredients</h2><ul class='ingredients'>"
- let parents = ingredient.PARENT.split(",")
- for (id in parents) {
- let name = parents[id].trim()
- html += `
- <li class='ingredient'>
- <a onclick="Ø('query').bang('${name}')" href='#${name.to_url()}'>
- <img src='media/ingredients/${name.to_path()}.png'/>
- </a>
- <t class='name'>${name.capitalize()}</t>
- </li>`
+ if (ingredient.PARENT) {
+ const parent_ingr = all_ingredients[ingredient.PARENT.toUpperCase()]
+ if (parent_ingr && parent_ingr.BREF) {
+ html += `<p>${parent_ingr.BREF.to_markup()}</p>`
+ }
+ if (parent_ingr && parent_ingr.LONG) {
+ html += `${new Runic(parent_ingr.LONG)}`
+ }
}
- html += "</ul>"
- return html
- }
-
- function make_children (ingredient, all_ingredients) {
- let html = ''
- let child_ingredients = find_child_ingredients(ingredient, all_ingredients)
- if (child_ingredients.length == 0) {return html}
-
- html += "<h2>Child Ingredients</h2><ul class='ingredients'>"
-
- for (id in child_ingredients) {
- let name = child_ingredients[id]
- html += `
- <li class='ingredient'>
- <a onclick="Ø('query').bang('${name}')" href='#${name.to_url()}'>
- <img src='media/ingredients/${name.to_path()}.png'/>
- </a>
- <t class='name'>${name.capitalize()}</t>
- </li>`
- }
-
- html += "</ul>"
- return html
- }
+ html += ingredient.WARN ? `<section id='warn'>${new Runic(ingredient.WARN)}</section>` : ''
- function make_similar (search_name, recipes, all_ingredients) {
- let html = ''
- let ingredients = find_ingredients(recipes)
- let similar_ingredients = find_similar_ingredients(search_name, ingredients, all_ingredients)
+ const parents = ingredient && ingredient.PARENT ? ingredient.PARENT.split(',') : []
+ const children = find_child_ingredients(name, all_ingredients)
+ const related = parents.concat(children)
+ html += related.length > 0 ? `<h2>Related Ingredients</h2><ul class='ingredients'>${related.reduce((acc, ingr) => { return acc + print_ingredient(ingr) }, '')}</ul>` : ''
- for (id in similar_ingredients) {
- if (similar_ingredients[id][1] < 1) { break }
- let name = similar_ingredients[id][0]
- if (name.toLowerCase() == search_name.toLowerCase()) { continue }
- html += `
- <li class='ingredient'>
- <a onclick="Ø('query').bang('${name}')" href='#${name.to_url()}'>
- <img src='media/ingredients/${name.to_path()}.png'/>
- </a>
- <t class='name'>${name.capitalize()}</t>
- </li>`
- }
- return similar_ingredients.length >= 1 ? `<h2>Related Ingredients</h2><ul class='ingredients'>${html}<hr /></ul>` : ''
+ return html
}
function find_ingredients (recipes) {
- let h = {}
+ const h = {}
for (id in recipes) {
- let recipe = recipes[id]
+ const recipe = recipes[id]
for (id in recipe.INGR) {
- let category = recipe.INGR[id]
+ const category = recipe.INGR[id]
for (name in category) {
h[name] = h[name] ? h[name] + 1 : 1
}
@@ -110,14 +64,14 @@ function IngredientTemplate (id, rect) {
}
function find_similar_ingredients (name, ingredients, all_ingredients) {
- let a = []
-
- let children = find_child_ingredients(name, all_ingredients)
+ const a = []
+
+ const children = find_child_ingredients(name, all_ingredients)
for (id in ingredients) {
- if (children.includes(id.toLowerCase())) {continue}
- let words = id.toLowerCase().split(' ')
- let index = similarity(name.toLowerCase().split(' '), words)
+ if (children.includes(id.toLowerCase())) { continue }
+ const words = id.toLowerCase().split(' ')
+ const index = similarity(name.toLowerCase().split(' '), words)
if (index > 0) {
a.push([id, index])
}
@@ -129,28 +83,26 @@ function IngredientTemplate (id, rect) {
return a.reverse()
}
-
+
function find_child_ingredients (search_name, all_ingredients) {
- let a = []
-
+ const a = []
for (name in all_ingredients) {
- let ingr = all_ingredients[name]
+ const ingr = all_ingredients[name]
if (!ingr.PARENT) { continue }
- let parents = ingr.PARENT.split(",").map(function (name) {return name.trim().toLowerCase()})
+ const parents = ingr.PARENT.split(',').map(function (name) { return name.trim().toLowerCase() })
if (parents.includes(search_name.toLowerCase())) {
a.push(name.toLowerCase())
}
}
-
return a
}
function similarity (a, b) {
let score = 0
- for (a_id in a) {
- let word_a = a[a_id]
- for (b_id in b) {
- let word_b = b[b_id]
+ for (const a_id in a) {
+ const word_a = a[a_id]
+ for (const b_id in b) {
+ const word_b = b[b_id]
score += word_a == word_b ? 1 : 0
}
}
@@ -162,13 +114,13 @@ function IngredientTemplate (id, rect) {
let count = 0
for (id in recipes) {
- let recipe = recipes[id]
- let name = id
+ const recipe = recipes[id]
+ const name = id
html += `
<li class='recipe'>
<a onclick="Ø('query').bang('${name}')" class='photo' href='#${name.to_url()}' style='background-image:url(media/recipes/${name.to_path()}.jpg)'></a>
- <t class='name'>${name.capitalize()}</t>
- <t class='details'><b>${recipe.TIME} minutes</b><br />${count_ingredients(recipe)} ingredients<br />${recipe.INST.length} steps</t>
+ <span class='name'>${name.capitalize()}</span>
+ <span class='details'><b>${recipe.TIME} minutes</b><br />${count_ingredients(recipe)} ingredients<br />${recipe.INST.length} steps</span>
</li>`
if (count > 1) { break }
count += 1
@@ -181,12 +133,12 @@ function IngredientTemplate (id, rect) {
}
function related_recipes (name, recipes) {
- let h = {}
+ const h = {}
for (id in recipes) {
- let recipe = recipes[id]
- for (i in recipe.INGR) {
- let ingredients = recipe.INGR[i]
- for (n in ingredients) {
+ const recipe = recipes[id]
+ for (const i in recipe.INGR) {
+ const ingredients = recipe.INGR[i]
+ for (const n in ingredients) {
if (n.indexOf(name.toUpperCase()) < 0) { continue }
h[id] = recipes[id]
}
@@ -196,9 +148,9 @@ function IngredientTemplate (id, rect) {
}
function related_ingredients (name, tag, ingredients) {
- let a = []
- for (id in ingredients) {
- let ingredient = ingredients[id]
+ const a = []
+ for (const id in ingredients) {
+ const ingredient = ingredients[id]
if (!ingredient.TAGS || ingredient.TAGS.indexOf(tag) < 0 || id == name) { continue }
a.push(id)
}
@@ -206,12 +158,22 @@ function IngredientTemplate (id, rect) {
}
function count_ingredients (recipe) {
- let ingredients = {}
- for (cat in recipe.INGR) {
- for (id in recipe.INGR[cat]) {
+ const ingredients = {}
+ for (const cat in recipe.INGR) {
+ for (const id in recipe.INGR[cat]) {
ingredients[id] = 1
}
}
return Object.keys(ingredients).length
}
+
+ function print_ingredient (name) {
+ return `
+ <li class='ingredient'>
+ <a onclick="Ø('query').bang('${name}')" href='#${name.to_url()}'>
+ <img src='media/ingredients/${name.to_path()}.png'/>
+ <span class='name'>${name.capitalize()}</span>
+ </a>
+ </li>`
+ }
}
diff --git a/scripts/templates/page.js b/scripts/templates/page.js
@@ -1,3 +1,5 @@
+'use strict'
+
function PageTemplate (id, rect) {
Node.call(this, id, rect)
@@ -15,12 +17,12 @@ function PageTemplate (id, rect) {
return this.signal('search').answer(q)
}
- let page = q.result
+ const page = q.result
return {
title: `GrimGrains — ${q.name.capitalize()}`,
view: {
core: {
- content: `<h1>${q.name.capitalize()}</h1><p>${page.BREF.to_markup()}</p>${new Runic(page.LONG).toString()}`
+ content: `<h1>${q.name.capitalize()}</h1><p>${page.BREF.to_markup()}</p><div class='page'>${new Runic(page.LONG).toString()}</div>`
}
}
}
diff --git a/scripts/templates/recipe.js b/scripts/templates/recipe.js
@@ -1,3 +1,5 @@
+'use strict'
+
function RecipeTemplate (id, rect) {
Node.call(this, id, rect)
@@ -7,7 +9,7 @@ function RecipeTemplate (id, rect) {
this.answer = function (t) {
let name = t.name
- if (t.result && t.result.TITLE) {name = t.result.TITLE}
+ if (t.result && t.result.TITLE) { name = t.result.TITLE }
return {
title: `GrimGrains — ${name.capitalize()}`,
view: {
@@ -23,8 +25,8 @@ function RecipeTemplate (id, rect) {
}
function make_content (q) {
- let recipe = q.result
- let name = recipe.TITLE || q.name
+ const recipe = q.result
+ const name = recipe.TITLE || q.name
let html = ''
html += `
@@ -36,6 +38,7 @@ function RecipeTemplate (id, rect) {
<columns>${new Runic(recipe.DESC)}</columns>
${make_ingredients(recipe.INGR)}
+ ${make_warnings(recipe, q.tables.ingredients)}
${make_instructions(recipe)}`
return html
@@ -44,12 +47,12 @@ function RecipeTemplate (id, rect) {
function make_instructions (recipe) {
let html = ''
- html += `<h2>Instructions</h2>`
+ html += '<h2>Instructions</h2>'
let count = 1
- for (cat in recipe.INST) {
+ for (const cat in recipe.INST) {
html += `<h3>Step ${count}: ${cat.capitalize()}</h3>`
- let category = recipe.INST[cat].map(convertTemperatures)
+ const category = recipe.INST[cat].map(convertTemperatures)
html += new Runic(category).toString()
count += 1
}
@@ -57,6 +60,25 @@ function RecipeTemplate (id, rect) {
return `<div id='instructions'>${html}</div>`
}
+ function make_warnings (recipe, all_ingredients) {
+ let html = ''
+
+ for (const cat in recipe.INGR) {
+ for (const id in recipe.INGR[cat]) {
+ if (all_ingredients[id].WARN) {
+ const warn = all_ingredients[id].WARN
+ html += `
+ <section id='warn'>
+ ${new Runic(warn)}
+ </section>
+ `
+ }
+ }
+ }
+
+ return html
+ }
+
function formatTemperature (temperature) {
const celcius = (parseInt(temperature) - 32) / 1.8
return `${temperature}°F / ${parseInt(celcius / 10) * 10}°C`
@@ -75,18 +97,18 @@ function RecipeTemplate (id, rect) {
function make_related (q) {
let html = ''
- let recipe = q.result
- let recipes = find_related(q.name, recipe, q.tables.recipes)
+ const recipe = q.result
+ const recipes = find_related(q.name, recipe, q.tables.recipes)
let count = 0
for (id in recipes) {
- let name = recipes[id][0]
- let recipe = q.tables.recipes[name]
+ const name = recipes[id][0]
+ const recipe = q.tables.recipes[name]
html += `
<li class='recipe'>
<a class='photo' onclick="Ø('query').bang('${name}')" href='#${name.to_url()}' style='background-image:url(media/recipes/${name.to_path()}.jpg)'></a>
- <t class='name'>${name.capitalize()}</t>
- <t class='details'><b>${recipe.TIME} minutes</b><br />${count_ingredients(recipe)} ingredients<br />${Object.keys(recipe.INST).length} step${Object.keys(recipe.INST).length > 1 ? 's' : ''}</t>
+ <span class='name'>${name.capitalize()}</span>
+ <span class='details'><b>${recipe.TIME} minutes</b><br />${count_ingredients(recipe)} ingredients<br />${Object.keys(recipe.INST).length} step${Object.keys(recipe.INST).length > 1 ? 's' : ''}</span>
</li>`
if (count > 1) { break }
count += 1
@@ -95,9 +117,9 @@ function RecipeTemplate (id, rect) {
}
function count_ingredients (recipe) {
- let ingredients = {}
- for (cat in recipe.INGR) {
- for (id in recipe.INGR[cat]) {
+ const ingredients = {}
+ for (const cat in recipe.INGR) {
+ for (const id in recipe.INGR[cat]) {
ingredients[id] = 1
}
}
@@ -105,10 +127,10 @@ function RecipeTemplate (id, rect) {
}
function find_related (name, target, recipes) {
- let a = []
+ const a = []
for (id in recipes) {
- let recipe = recipes[id]
- let index = similarity(target.TAGS, recipe.TAGS)
+ const recipe = recipes[id]
+ const index = similarity(target.TAGS, recipe.TAGS)
if (id.toLowerCase() != name.toLowerCase()) {
a.push([id, index])
}
@@ -122,32 +144,32 @@ function RecipeTemplate (id, rect) {
function make_ingredients (categories) {
let html = ''
for (id in categories) {
- let elements = categories[id]
+ const elements = categories[id]
- html += `<ul class='ingredients'>`
+ html += '<ul class=\'ingredients\'>'
html += Object.keys(categories).length > 1 ? `<h3>${id.capitalize()}</h3>` : ''
for (name in elements) {
- let element = elements[name]
+ const element = elements[name]
html += `
<li class='ingredient'>
<a onclick="Ø('query').bang('${name}')" href='#${name.to_url()}'>
<img src='media/ingredients/${name.to_path()}.png'/>
</a>
- <t class='name'>${name.capitalize()}</t>
- <t class='quantity'>${element}</t>
+ <span class='name'>${name.capitalize()}</span>
+ <span class='quantity'>${element}</span>
</li>`
}
- html += `<hr /></ul>`
+ html += '<hr /></ul>'
}
return html
}
function similarity (a, b) {
let score = 0
- for (a_id in a) {
- let tag_a = a[a_id]
- for (b_id in b) {
- let tag_b = b[b_id]
+ for (const a_id in a) {
+ const tag_a = a[a_id]
+ for (const b_id in b) {
+ const tag_b = b[b_id]
score += tag_a.toLowerCase() == tag_b.toLowerCase() ? 1 : 0
}
}
diff --git a/scripts/templates/search.js b/scripts/templates/search.js
@@ -1,3 +1,5 @@
+'use strict'
+
function SearchTemplate (id, rect) {
Node.call(this, id, rect)
@@ -6,10 +8,10 @@ function SearchTemplate (id, rect) {
// Create the search body
this.answer = function (q) {
- let html = ''
+ const html = ''
return {
- title: `GrimGrains — Search`,
+ title: 'GrimGrains — Search',
view: {
header: {
search: 'search'
@@ -33,7 +35,7 @@ function SearchTemplate (id, rect) {
<h2 class='serving'>404</h2>
<hr />
<p>Did you mean <a onclick="Ø('query').bang('${similar[0].word.toLowerCase()}')" href='#${similar[0].word.toLowerCase().to_url()}'>${similar[0].word.toLowerCase()}</a>, <a onclick="Ø('query').bang('${similar[1].word.toLowerCase()}')" href='#${similar[1].word.toLowerCase().to_url()}'>${similar[1].word.toLowerCase()}</a>, or <a onclick="Ø('query').bang('${similar[2].word.toLowerCase()}')" href='#${similar[2].word.toLowerCase().to_url()}'>${similar[2].word.toLowerCase()}</a>?</p>
- <p>To create this page, open an issue or pull request ${"{{on GitHub|https://github.com/hundredrabbits/Grimgrains}}".to_markup()}.</p>`
+ <p>To create this page, open an issue or pull request ${'{{on GitHub|https://github.com/hundredrabbits/Grimgrains}}'.to_markup()}.</p>`
return html
}
diff --git a/scripts/templates/service.js b/scripts/templates/service.js
@@ -1,17 +1,19 @@
+'use strict'
+
function ServiceTemplate (id, rect) {
Node.call(this, id, rect)
this.glyph = NODE_GLYPHS.render
this.answer = function (q) {
- let recipe_ingredients = find_ingredients(q.tables.recipes)
+ const recipe_ingredients = find_ingredients(q.tables.recipes)
- let html = `
+ const html = `
${make_pageless(recipe_ingredients, q.tables.ingredients)}
${make_unused(recipe_ingredients, q.tables.ingredients)}
`
return {
- title: `GrimGrains — Service Panel`,
+ title: 'GrimGrains — Service Panel',
view: {
core: {
content: html,
@@ -22,90 +24,90 @@ function ServiceTemplate (id, rect) {
}
function find_ingredients (recipes) {
- let h = []
+ const h = []
for (id in recipes) {
- let recipe = recipes[id]
+ const recipe = recipes[id]
for (id in recipe.INGR) {
- let category = recipe.INGR[id]
+ const category = recipe.INGR[id]
for (name in category) {
- if (!h.includes(name.toLowerCase())) {h.push(name.toLowerCase())}
+ if (!h.includes(name.toLowerCase())) { h.push(name.toLowerCase()) }
}
}
}
return h
}
-
+
function make_pageless (used, pages) {
- let pageless = find_pageless(used, pages)
- let html = ""
+ const pageless = find_pageless(used, pages)
+ let html = ''
for (id in pageless) {
html += `
<li class='ingredient missing'>
<a href='#${pageless[id].to_url()}' onclick="Ø('query').bang('${pageless[id]}')">
<img src='media/ingredients/${pageless[id].to_path()}.png'/>
+ <span class='name'>${pageless[id].capitalize()}</span>
</a>
- <t class='name'>${pageless[id].capitalize()}</t>
</li>`
}
- if (html == "") {return `<h2>No Ingredients Without Pages!</h2>`}
+ if (html == '') { return '<h2>No Ingredients Without Pages!</h2>' }
return `<h2>Ingredients Without Pages</h2><ul class='ingredients'>${html}</ul>`
}
-
+
function find_pageless (used, pages) {
- let pageless = []
-
+ const pageless = []
+
for (id in used) {
- let name = used[id].toUpperCase()
- if (!pages[name]) {pageless.push(name)}
+ const name = used[id].toUpperCase()
+ if (!pages[name]) { pageless.push(name) }
}
-
+
return pageless
}
-
+
function make_unused (used, pages) {
- let unused = find_unused(used, pages)
- let html = ""
-
+ const unused = find_unused(used, pages)
+ let html = ''
+
for (id in unused) {
html += `
<li class='ingredient'>
<a href='#${unused[id].to_url()}' onclick="Ø('query').bang('${unused[id]}')">
<img src='media/ingredients/${unused[id].to_path()}.png'/>
+ <span class='name'>${unused[id].capitalize()}</span>
</a>
- <t class='name'>${unused[id].capitalize()}</t>
</li>`
}
- if (html == "") {return `<h2>No Unused Ingredients!</h2>`}
+ if (html == '') { return '<h2>No Unused Ingredients!</h2>' }
return `<h2>Unused Ingredients</h2><ul class='ingredients'>${html}</ul>`
}
-
+
function find_unused (used, pages) {
- let unused = []
-
+ const unused = []
+
for (name in pages) {
- if (!used.includes(name.toLowerCase())) {unused.push(name)}
+ if (!used.includes(name.toLowerCase())) { unused.push(name) }
}
-
+
return unused
}
function make_ingredients (ingredients, table) {
let html = ''
for (id in ingredients) {
- let name = ingredients[id][0]
+ const name = ingredients[id][0]
html += `
<li class='ingredient${!table[name] ? ' missing' : ''}'>
<a href='#${name.to_url()}' onclick="Ø('query').bang('${name}')">
<img src='media/ingredients/${name.to_path()}.png'/>
+ <span class='name'>${name.capitalize()}</span>
</a>
- <t class='name'>${name.capitalize()}</t>
</li>`
}
return `<ul class='ingredients'>${html}</ul>`
}
function count_ingredients (recipe) {
- let ingredients = {}
+ const ingredients = {}
for (cat in recipe.INGR) {
for (id in recipe.INGR[cat]) {
ingredients[id] = 1
@@ -119,21 +121,21 @@ function ServiceTemplate (id, rect) {
// Sort by tag
- let categorized = {}
+ const categorized = {}
for (name in recipes) {
- let recipe = recipes[name]
+ const recipe = recipes[name]
if (!categorized[recipe.TAGS[0]]) { categorized[recipe.TAGS[0]] = [] }
recipe.name = name
categorized[recipe.TAGS[0]].push(recipe)
}
for (cat in categorized) {
- let recipes = categorized[cat]
+ const recipes = categorized[cat]
html += `<h3>${cat.capitalize()}</h3>`
html += "<ul style='margin-bottom:15px'>"
for (id in recipes) {
- let recipe = recipes[id]
+ const recipe = recipes[id]
html += `<li><a href="#${recipe.name.to_url()}" onclick="Ø('query').bang('${recipe.name.capitalize()}')">${recipe.name.capitalize()}</a></li>`
}
html += '</ul>'