logo

Grimgrains

Unnamed repository; edit this file 'description' to name the repository.
commit: 7b83e4dfb562d6dd99aee206d8a44dc38c7dd6d9
parent aec8d3b3bba65075ccd617a1423d60e96971a1fa
Author: neauoire <aliceffekt@gmail.com>
Date:   Tue, 10 Dec 2019 10:34:34 -0500

Migrated Runic

Diffstat:

Mindex.html4++++
Mlinks/main.css2+-
Mscripts/database/recipes.ndtl22++++------------------
Ascripts/helpers.js33+++++++++++++++++++++++++++++++++
Mscripts/lib/runic.js157++++++++++++-------------------------------------------------------------------
Ascripts/runic.library.js53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Mscripts/templates/ingredient.js6+++---
Mscripts/templates/page.js2+-
Mscripts/templates/recipe.js6+++---
9 files changed, 125 insertions(+), 160 deletions(-)

diff --git a/index.html b/index.html @@ -19,9 +19,11 @@ <meta property="og:description" content="An illustrated food blog." /> <meta property="og:site_name" content="Grimgrains" /> + <script type="text/javascript" src="scripts/helpers.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 type="text/javascript" src="scripts/runic.library.js"></script> <script type="text/javascript" src="scripts/nodes/query.js"></script> <script type="text/javascript" src="scripts/nodes/router.js"></script> @@ -49,6 +51,8 @@ </head> <body> <script> + const runic = new Runic(runicLibrary) + let RIVEN = new Riven(); graph() </script> diff --git a/links/main.css b/links/main.css @@ -50,7 +50,7 @@ h1,h2,h3,h4 { font-weight: normal; font-family: 'alte_haas_grotesk_bold'; margin #view #core #content columns ul li { padding-left:25px; position: relative; } #view #core #content columns ul li:before { content:"●"; position: absolute; top:0px; left:0px; font-size:12px;} #view #core #content columns ul li a { font-weight: bold } -#view #core #content ul.bullet li { font-weight: bold;position: relative;padding-left:30px;line-height: 25px; } +#view #core #content ul.bullet li { position: relative;padding-left:30px;line-height: 25px; } #view #core #content ul.bullet li:before { content:"•"; position: absolute;left:15px; } #view #core #content ul.bullet li a { text-decoration: underline; } diff --git a/scripts/database/recipes.ndtl b/scripts/database/recipes.ndtl @@ -1,6 +1,6 @@ DATABASE.recipes = ` -Tzaziki +TZAZIKI DATE : 2019-12-06 TAGS sauce @@ -11,7 +11,6 @@ Tzaziki & {*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}}. @@ -19,7 +18,6 @@ Tzaziki - 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 @@ -32,7 +30,7 @@ Tzaziki Persian cucumbers : 2 Salt : pinch -Spicy stirfry chickpeas +SPICY STIRFRY CHICKPEAS DATE : 2019-06-25 TAGS dinner @@ -45,7 +43,6 @@ Spicy stirfry chickpeas & 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). @@ -58,7 +55,6 @@ Spicy stirfry chickpeas - 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 @@ -88,7 +84,7 @@ Spicy stirfry chickpeas Sesame oil : 1 tsp Arrowroot starch : 1 tbsp -Scrambled chickpeas +SCRAMBLED CHICKPEAS DATE : 2019-06-25 TAGS sidedish @@ -103,7 +99,6 @@ Scrambled chickpeas & {*Recommendations*} & I like to eat scrambled chickpeas with a side of sliced avocado, topped with a drizzle of sambal oelek or {{sriracha}}. Sometimes when I make meal salads, I add scrambled chickpeas for bulk. Another meal I enjoy with this recipe is a sort of ovenless deconstructed {{pate chinois}} (quebec-style sheperd's pie), I eat it with mashed potatoes, corn and sambal oelek. You can also make this with cooked chickpeas by smashing them with a fork and mixing them up with nutritional yeast, salt and other flavourings. % recipes/scrambled.chickpeas.3.jpg - INST Scrambled chickpeas - In a bowl, mix {_1/2 cup_} of {{chickpea flour}}, {_1/4 cup_} of {{nutritional yeast}}, {_1 tbsp_} of {{tahini}} and a {_pinch_} of {{salt}}. @@ -112,7 +107,6 @@ Scrambled chickpeas - When the edges start to cook, flip it and start to break it apart with the side of the spatula. - Let it cook {#for a minute#}, then continue to break it apart further. You'll need to do this repeatedly, until the mixture is broken up into smaller bits and until it has become dry and crisp for {#8-10 minutes or so#}. When cooking, it's important to stir often, and to constantly break it up into smaller bits so all sides can can cook. - NOTE: I like to use a spatula and a fork to break it up, and also to brush some of the batter off the spatula (it is very wet in the beginning and is a bit sticky). Serve into salads, or as a side for other dishes. - INGR Main Chickpea flour : 1/2 cup @@ -136,7 +130,6 @@ CHEESE & {*Flavors*} & For a pepper jack cheese flavor, add {{garlic}}, {{onion powder}} and {{chili pepper flakes}}. You can also add {{black pepper}}, for a bit of spice, or {{pimento olives}}! % recipes/cheese.2.jpg - INST CHEESE - In a bowl, mix {_1/4 cup_} of {{soy milk}}, {_4 tbsp_} of {{nutritional yeast}}, {_2 tbsp_} of {{tahini}}, {_1 tsp_} of {{apple cider vinegar}} and {_1 tsp_} of {{red miso}}. @@ -144,7 +137,6 @@ CHEESE - When content starts to boil, lower to a simmer and add the bowl of mixed ingredients into it. Stir, for {#a minute or two#} and then pour contents of pan into two small bowls. The reason I use two instead of one, is because the cheese will harden quicker. - Let mixture rest for {#1 hour or so, 2 is better#} (especially if it's hot where you are). - Flip bowls upside down, scoop out cheese and enjoy! This cheese can be grated onto pizza too! - INGR Main Soy milk : 1 cup @@ -168,7 +160,6 @@ SWEET AND SOUR LENTILS & It's a versatile recipe, so if I don't have any carrots or daikon I'll sometimes put brocoli or fresh green peas instead. For a heartier meal, adding sweet potatoes is also delicious. Sometimes, if I'm out of peanut butter I'll use tahini instead, the flavour is very similar and doesn't change much in the recipe (also nice for those with peanut allergies). This recipe only works with whole lentils, because there's still a bite to them, halved lentils will soften too much and the resulting texture won't be as pleasant. & Enjoy this humble, but delicious recipe. % recipes/sweet.and.sour.lentils.2.jpg - INST SAUCE - Mix all liquid ingredients together in a bowl, add {_1 tbsp_} of {{peanut butter}} and stir until dissolved. @@ -181,7 +172,6 @@ SWEET AND SOUR LENTILS - Let mixture simmer for an additional {#10-20 minutes#}, add extra water as needed. - If lentils are tender, they are ready. Strain lentils and return to pot with {_1/4 tsp_} of {{salt}}. - Pour sauce onto lentils, mix well. Serve into two bowls with some {{chives}}. Eat wrapped in salad or cabbage leaves, or with {{crackers}}. - INGR Main Brown lentils : 1/2 cup @@ -215,7 +205,6 @@ COFFEE JELLY & {*Quick soy pudding*} & Also, I sometimes make a quick 'soy pudding' by heating some soy milk in a pan with some arrowroot starch. The mixture will thicken, it becomes pudding-like and is delicious over coffee jelly. % recipes/coffee.jelly.2.jpg - INST BASIC - Brew a pot of {{coffee}}. @@ -224,7 +213,6 @@ COFFEE JELLY - Pour the mixture into two small bowls, or cups. Let stand for {#30 minutes and up to 1 hour#}. It doesn't need to be refrigerated to solidify, but you can do that if you prefer it cold. TOPPINGS - You can eat as is, or you can add the cubes in another recipe like a coconut or soy milk pudding. It can also be used as a garnish for other desserts. - INGR Main Coffee : 350 ml @@ -1816,7 +1804,7 @@ ARAME SOBA Tempeh : 60g or 1/4 of 240g Sichuan peppercorns : To taste -Homemade Veganaise +HOMEMADE VEGANAISE DATE : 2019-12-06 TAGS sauce @@ -1832,7 +1820,6 @@ Homemade Veganaise 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 @@ -1842,7 +1829,6 @@ Homemade Veganaise Dijon mustard : 3 tbsp Salt : 1/4 tsp - CHICKPEA SALAD SANDWICH DATE : 2016-01-18 TAGS diff --git a/scripts/helpers.js b/scripts/helpers.js @@ -0,0 +1,33 @@ + +String.prototype.capitalize = function () { + return this.charAt(0).toUpperCase() + this.slice(1).toLowerCase() +} + +String.prototype.to_url = function () { + return this.toLowerCase().replace(/ /g, '+').replace(/[^0-9a-z\+]/gi, '').trim() +} + +String.prototype.to_path = function () { + return this.toLowerCase().replace(/ /g, '.').replace(/[^0-9a-z\.]/gi, '').trim() +} + +String.prototype.to_markup = function () { + html = this + html = html.replace(/{_/g, '<i>').replace(/_}/g, '</i>') + html = html.replace(/{\*/g, '<b>').replace(/\*}/g, '</b>') + html = html.replace(/{\#/g, "<code class='inline'>").replace(/\#}/g, '</code>') + + const parts = html.split('{{') + for (id in parts) { + const part = parts[id] + if (part.indexOf('}}') == -1) { continue } + 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; } + 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/lib/runic.js b/scripts/lib/runic.js @@ -1,143 +1,32 @@ -function Runic (raw) { - this.raw = raw +'use strict' - this.runes = { - '&': { glyph: '&', tag: 'p', class: '' }, - '~': { glyph: '~', tag: 'ul', sub: 'li', class: 'parent', stash: true }, - '-': { glyph: '-', tag: 'ul', sub: 'li', class: '', stash: true }, - '!': { glyph: '!', tag: 'table', sub: 'tr', wrap: 'th', class: 'outline', stash: true }, - '|': { glyph: '|', tag: 'table', sub: 'tr', wrap: 'td', class: 'outline', stash: true }, - '•': { glyph: '•', tag: 'ul', sub: 'li', class: 'bullet', stash: true }, - '#': { glyph: '#', tag: 'code', sub: 'ln', class: '', stash: true }, - '%': { glyph: '%' }, - '?': { glyph: '?', tag: 'note', class: '' }, - ':': { glyph: ':', tag: 'info', class: '' }, - '*': { glyph: '*', tag: 'h2', class: '' }, - '=': { glyph: '=', tag: 'h3', class: '' }, - '+': { glyph: '+', tag: 'hs', class: '' }, - '>': { glyph: '>', tag: '', class: '' }, - $: { glyph: '>', tag: '', class: '' } +function Runic (lib = {}) { + function filter (line) { + const pass = lib[line.substr(0, 1)] && line.substr(1, 1) === ' ' + if (pass !== true) { console.warn('Runic', 'Error near: ', line) } + return pass } - this.stash = { - rune: '', - all: [], - add: function (rune, item) { - this.rune = this.copy(rune) - this.all.push({ rune: rune, item: item }) - }, - pop: function () { - const copy = this.copy(this.all) - this.all = [] - return copy - }, - is_pop: function (rune) { - return this.all.length > 0 && rune.tag != this.rune.tag - }, - length: function () { - return this.all.length - }, - copy: function (data) { - return JSON.parse(JSON.stringify(data)) - } + function stash (acc, line) { + const rune = line.substr(0, 1) + const prev = acc[acc.length - 1] ? acc[acc.length - 1] : [{ rune: rune, arr: [] }] + if (prev.rune === rune) { prev.arr.push(line.substr(2)) } else { acc.push({ rune: rune, arr: [line.substr(2)] }) } + return acc } - this.media = function (val) { - 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>` - } - if (service == 'bandcamp') { - return `<iframe style="border: 0; width: 600px; height: 274px;" src="https://bandcamp.com/EmbeddedPlayer/album=${id}/size=large/bgcol=ffffff/linkcol=333333/artwork=small/transparent=true/" seamless></iframe>` - } - return `<img src='media/${val}'/>` - } - - this.parse = function (raw = this.raw) { - if (!raw) { return '' } - - let html = '' - const lines = !Array.isArray(raw) ? raw.split('\n') : raw - - for (id in lines) { - 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 } - 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 } - - if (this.stash.is_pop(rune)) { html += this.render_stash() } - if (rune.stash === true) { this.stash.add(rune, line); continue } - html += this.render(line, rune) - } - if (this.stash.length() > 0) { html += this.render_stash() } - return html - } - - this.render_stash = function () { - const rune = this.stash.rune - const stash = this.stash.pop() - - let html = '' - for (id in stash) { - 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}>` - } - - this.render = function (line = '', rune = null) { - if (rune && rune.tag == 'img') { return `<img src='media/${line}'/>` } - if (rune && rune.tag == 'table') { return 'HEY' } - - return rune ? (rune.tag ? '<' + rune.tag + " class='" + rune.class + "'>" + line + '</' + rune.tag + '>' : line) : '' + function wrap (html, tag, cl) { + return tag ? `<${tag} ${cl ? 'class="' + cl + '"' : ''}>${html}</${tag}>` : html } - this.html = function () { - return this.parse(raw) - } - - this.toString = function () { - return this.html() - } -} - -String.prototype.capitalize = function () { - return this.charAt(0).toUpperCase() + this.slice(1).toLowerCase() -} - -String.prototype.to_url = function () { - return this.toLowerCase().replace(/ /g, '+').replace(/[^0-9a-z\+]/gi, '').trim() -} - -String.prototype.to_path = function () { - return this.toLowerCase().replace(/ /g, '.').replace(/[^0-9a-z\.]/gi, '').trim() -} - -String.prototype.to_markup = function () { - html = this - html = html.replace(/{_/g, '<i>').replace(/_}/g, '</i>') - html = html.replace(/{\*/g, '<b>').replace(/\*}/g, '</b>') - html = html.replace(/{\#/g, "<code class='inline'>").replace(/\#}/g, '</code>') - - const parts = html.split('{{') - for (id in parts) { - const part = parts[id] - if (part.indexOf('}}') == -1) { continue } - 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; } - 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>`) + this.run = (input = [], host = null) => { + return input.filter(filter).reduce(stash, []).reduce((acc, stash) => { + const rune = lib[stash.rune] + const html = stash.arr.reduce((acc, val, id) => { + const inner = rune.fn ? rune.fn(stash.arr[id], host) : stash.arr[id] + const outer = rune.tag ? wrap(inner, rune.tag, rune.class) : inner + return `${acc}${outer}` + }, '') + return `${acc}${wrap(html, rune.wrapper, rune.wrapperClass)}` + }, '') } - return html } diff --git a/scripts/runic.library.js b/scripts/runic.library.js @@ -0,0 +1,53 @@ +'use strict' + +const runicLibrary = { + '>': { }, + '*': { tag: 'h3' }, + '+': { tag: 'h4' }, + '?': { + tag: 'div', + class: 'notice', + fn: (html, host) => { + return html.to_markup(host) + } + }, + '-': { + tag: 'li', + wrapper: 'ul', + wrapperClass: 'bullet', + fn: (html, host) => { + return html.to_markup(host) + } + }, + '#': { + tag: 'li', + wrapper: 'code', + fn: (html, host) => { + return html.to_markup(host) + } + }, + '&': { + tag: 'p', + fn: (html, host) => { + return html.to_markup(host) + } + }, + ';': { + fn: (html, host) => { + console.log(html) + return '' + } + }, + '%': { + fn: (html, host) => { + const parts = html.split(' ') + const service = parts[0] + const id = parts[1] + if (service === 'itchio') { return `<iframe frameborder="0" src="https://itch.io/embed/${id}?link_color=000000" width="600" height="167"></iframe>` } + if (service === 'bandcamp') { return `<iframe style="border: 0; width: 600px; height: 274px;" src="https://bandcamp.com/EmbeddedPlayer/album=${id}/size=large/bgcol=ffffff/linkcol=333333/artwork=small/transparent=true/" seamless></iframe>` } + if (service === 'youtube') { return `<iframe width="100%" height="380" src="https://www.youtube.com/embed/${id}?rel=0" style="max-width:700px" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>` } + if (service === 'custom') { return `<iframe src='${id}' style='width:100%;height:350px;'></iframe>` } + return `<img src='media/${service}' loading='lazy' class='${id}'/>` + } + } +} diff --git a/scripts/templates/ingredient.js b/scripts/templates/ingredient.js @@ -27,7 +27,7 @@ function IngredientTemplate (id, rect) { 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 += ingredient.LONG ? `${runic.run(ingredient.LONG)}` : '' if (ingredient.PARENT) { const parent_ingr = all_ingredients[ingredient.PARENT.toUpperCase()] @@ -35,11 +35,11 @@ function IngredientTemplate (id, rect) { html += `<p>${parent_ingr.BREF.to_markup()}</p>` } if (parent_ingr && parent_ingr.LONG) { - html += `${new Runic(parent_ingr.LONG)}` + html += `${runic.run(parent_ingr.LONG)}` } } - html += ingredient.WARN ? `<section id='warn'>${new Runic(ingredient.WARN)}</section>` : '' + html += ingredient.WARN ? `<section id='warn'>${runic.run(ingredient.WARN)}</section>` : '' const parents = ingredient && ingredient.PARENT ? ingredient.PARENT.split(',') : [] const children = find_child_ingredients(name, all_ingredients) diff --git a/scripts/templates/page.js b/scripts/templates/page.js @@ -22,7 +22,7 @@ function PageTemplate (id, rect) { title: `GrimGrains — ${q.name.capitalize()}`, view: { core: { - content: `<h1>${q.name.capitalize()}</h1><p>${page.BREF.to_markup()}</p><div class='page'>${new Runic(page.LONG).toString()}</div>` + content: `<h1>${q.name.capitalize()}</h1><p>${page.BREF.to_markup()}</p><div class='page'>${runic.run(page.LONG).toString()}</div>` } } } diff --git a/scripts/templates/recipe.js b/scripts/templates/recipe.js @@ -36,7 +36,7 @@ function RecipeTemplate (id, rect) { <img class='photo' src='media/recipes/${q.name.to_path()}.jpg'/> - <columns>${new Runic(recipe.DESC)}</columns> + <columns>${runic.run(recipe.DESC)}</columns> ${make_ingredients(recipe.INGR)} ${make_warnings(recipe, q.tables.ingredients)} ${make_instructions(recipe)}` @@ -53,7 +53,7 @@ function RecipeTemplate (id, rect) { for (const cat in recipe.INST) { html += `<h3>Step ${count}: ${cat.capitalize()}</h3>` const category = recipe.INST[cat].map(convertTemperatures) - html += new Runic(category).toString() + html += runic.run(category).toString() count += 1 } @@ -69,7 +69,7 @@ function RecipeTemplate (id, rect) { const warn = all_ingredients[id].WARN html += ` <section id='warn'> - ${new Runic(warn)} + ${runic.run(warn)} </section> ` }