Merge pull request #5 from len0rd/feature/len0rd/recipes

Feature/len0rd/recipes
This commit is contained in:
len0rd 2022-06-27 10:43:33 -04:00 committed by GitHub
commit 657081d88d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
35 changed files with 947 additions and 529 deletions

1
.gitignore vendored
View file

@ -1,4 +1,5 @@
*.DS_STORE *.DS_STORE
node_modules node_modules
views/partials/md/ views/partials/md/
views/partials/generated/
*.mp4 *.mp4

4
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,4 @@
{
"html.format.enable": false,
"html.format.endWithNewline": true
}

View file

@ -37,7 +37,6 @@
padding-bottom: 40vh; padding-bottom: 40vh;
width: 60%; width: 60%;
margin: auto; margin: auto;
} }
.container-cenMain { .container-cenMain {
@ -47,6 +46,13 @@
background-size: cover; background-size: cover;
} }
.topMargin {
padding-top: 5%;
padding-top: 5vh;
width: 60%;
margin: auto;
}
.code { .code {
background-color: #161038; background-color: #161038;
} }
@ -56,6 +62,8 @@
padding-left: 2%; padding-left: 2%;
} }
.card { .card-homepage {
background-color: rgba(0, 0, 0, 0.1) !important; background-color: rgba(0, 0, 0, 0.1) !important;
padding: 2%;
height: 100%;
} }

BIN
assets/img/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 728 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 954 KiB

566
package-lock.json generated
View file

@ -12,9 +12,11 @@
"dynamic-scrollspy": "^0.2.0", "dynamic-scrollspy": "^0.2.0",
"ejs": "^3.1.8", "ejs": "^3.1.8",
"express": "^4.17.1", "express": "^4.17.1",
"markdown-it": "^13.0.1",
"markdown-it-hashtag": "^0.4.0",
"mkdirp": "^1.0.4", "mkdirp": "^1.0.4",
"showdown": "^1.9.1", "showdown": "^2.1.0",
"showdown-highlight": "^2.1.8" "showdown-highlight": "^3.0.0"
} }
}, },
"node_modules/accepts": { "node_modules/accepts": {
@ -29,24 +31,10 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/ansi-regex": { "node_modules/argparse": {
"version": "4.1.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
"engines": {
"node": ">=6"
}
},
"node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
}, },
"node_modules/array-flatten": { "node_modules/array-flatten": {
"version": "1.1.1", "version": "1.1.1",
@ -100,14 +88,6 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"engines": {
"node": ">=6"
}
},
"node_modules/chalk": { "node_modules/chalk": {
"version": "4.1.2", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@ -153,29 +133,14 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
}, },
"node_modules/cliui": { "node_modules/commander": {
"version": "5.0.0", "version": "9.3.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz",
"integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==",
"dependencies": { "engines": {
"string-width": "^3.1.0", "node": "^12.20.0 || >=14"
"strip-ansi": "^5.2.0",
"wrap-ansi": "^5.1.0"
} }
}, },
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"node_modules/concat-map": { "node_modules/concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -221,14 +186,6 @@
"ms": "2.0.0" "ms": "2.0.0"
} }
}, },
"node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/depd": { "node_modules/depd": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@ -266,11 +223,6 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
},
"node_modules/encodeurl": { "node_modules/encodeurl": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@ -279,6 +231,17 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/entities": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
"integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/escape-html": { "node_modules/escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@ -376,17 +339,6 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dependencies": {
"locate-path": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/forwarded": { "node_modules/forwarded": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@ -403,14 +355,6 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/has-flag": { "node_modules/has-flag": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@ -428,11 +372,11 @@
} }
}, },
"node_modules/highlight.js": { "node_modules/highlight.js": {
"version": "10.7.3", "version": "11.5.1",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz",
"integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==",
"engines": { "engines": {
"node": "*" "node": ">=12.0.0"
} }
}, },
"node_modules/html-encoder-decoder": { "node_modules/html-encoder-decoder": {
@ -484,14 +428,6 @@
"node": ">= 0.10" "node": ">= 0.10"
} }
}, },
"node_modules/is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"engines": {
"node": ">=4"
}
},
"node_modules/iterate-object": { "node_modules/iterate-object": {
"version": "1.3.4", "version": "1.3.4",
"resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz",
@ -514,18 +450,39 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/locate-path": { "node_modules/linkify-it": {
"version": "3.0.0", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
"dependencies": { "dependencies": {
"p-locate": "^3.0.0", "uc.micro": "^1.0.1"
"path-exists": "^3.0.0"
},
"engines": {
"node": ">=6"
} }
}, },
"node_modules/markdown-it": {
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz",
"integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==",
"dependencies": {
"argparse": "^2.0.1",
"entities": "~3.0.1",
"linkify-it": "^4.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
"bin": {
"markdown-it": "bin/markdown-it.js"
}
},
"node_modules/markdown-it-hashtag": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/markdown-it-hashtag/-/markdown-it-hashtag-0.4.0.tgz",
"integrity": "sha512-+VCMH+f4/Ud5wPEtcAMrlLbUrrGViwR9JvjPy//X3Z7ZG1j5nQuHtDLTGZfMhkqYTMY+cTZgZkVNBsXMfU93Yg=="
},
"node_modules/mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
},
"node_modules/media-typer": { "node_modules/media-typer": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@ -623,36 +580,6 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/p-limit": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
"integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dependencies": {
"p-limit": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"engines": {
"node": ">=6"
}
},
"node_modules/parseurl": { "node_modules/parseurl": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@ -661,14 +588,6 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"engines": {
"node": ">=4"
}
},
"node_modules/path-to-regexp": { "node_modules/path-to-regexp": {
"version": "0.1.7", "version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@ -721,19 +640,6 @@
"resolved": "https://registry.npmjs.org/regex-escape/-/regex-escape-3.4.10.tgz", "resolved": "https://registry.npmjs.org/regex-escape/-/regex-escape-3.4.10.tgz",
"integrity": "sha512-qEqf7uzW+iYcKNLMDFnMkghhQBnGdivT6KqVQyKsyjSWnoFyooXVnxrw9dtv3AFLnD6VBGXxtZGAQNFGFTnCqA==" "integrity": "sha512-qEqf7uzW+iYcKNLMDFnMkghhQBnGdivT6KqVQyKsyjSWnoFyooXVnxrw9dtv3AFLnD6VBGXxtZGAQNFGFTnCqA=="
}, },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
},
"node_modules/safe-buffer": { "node_modules/safe-buffer": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@ -786,35 +692,34 @@
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
},
"node_modules/setprototypeof": { "node_modules/setprototypeof": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
}, },
"node_modules/showdown": { "node_modules/showdown": {
"version": "1.9.1", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz",
"integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==",
"dependencies": { "dependencies": {
"yargs": "^14.2" "commander": "^9.0.0"
}, },
"bin": { "bin": {
"showdown": "bin/showdown.js" "showdown": "bin/showdown.js"
},
"funding": {
"type": "individual",
"url": "https://www.paypal.me/tiviesantos"
} }
}, },
"node_modules/showdown-highlight": { "node_modules/showdown-highlight": {
"version": "2.1.8", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/showdown-highlight/-/showdown-highlight-2.1.8.tgz", "resolved": "https://registry.npmjs.org/showdown-highlight/-/showdown-highlight-3.0.0.tgz",
"integrity": "sha512-WqrMzMPYrWEwbA03GJT8mc82QxTe91kFwvNWpEPfTgEwd/5G32d44bn5Z7zMYgOcePnXInmYClldezqHDAyGZg==", "integrity": "sha512-xrMPNGaECoFMueD3uortV5r69NFY4oZp50QTrHf21T6aYgBO6FBdv5ibBvGd2atd/FeSsPjUhJOipLL6pwELhg==",
"dependencies": { "dependencies": {
"highlight.js": "^10.7.2", "highlight.js": "^11.5.0",
"html-encoder-decoder": "^1.3.9", "html-encoder-decoder": "^1.3.9",
"showdown": "^1.9.1" "showdown": "^2.0.3"
} }
}, },
"node_modules/statuses": { "node_modules/statuses": {
@ -825,30 +730,6 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dependencies": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dependencies": {
"ansi-regex": "^4.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/supports-color": { "node_modules/supports-color": {
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@ -880,6 +761,11 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
},
"node_modules/unpipe": { "node_modules/unpipe": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@ -903,56 +789,6 @@
"engines": { "engines": {
"node": ">= 0.8" "node": ">= 0.8"
} }
},
"node_modules/which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
},
"node_modules/wrap-ansi": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
"integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
"dependencies": {
"ansi-styles": "^3.2.0",
"string-width": "^3.0.0",
"strip-ansi": "^5.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/y18n": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
"integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ=="
},
"node_modules/yargs": {
"version": "14.2.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz",
"integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==",
"dependencies": {
"cliui": "^5.0.0",
"decamelize": "^1.2.0",
"find-up": "^3.0.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^3.0.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^15.0.0"
}
},
"node_modules/yargs-parser": {
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
"integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
"dependencies": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
} }
}, },
"dependencies": { "dependencies": {
@ -965,18 +801,10 @@
"negotiator": "0.6.2" "negotiator": "0.6.2"
} }
}, },
"ansi-regex": { "argparse": {
"version": "4.1.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": {
"color-convert": "^1.9.0"
}
}, },
"array-flatten": { "array-flatten": {
"version": "1.1.1", "version": "1.1.1",
@ -1024,11 +852,6 @@
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
}, },
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
},
"chalk": { "chalk": {
"version": "4.1.2", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@ -1061,28 +884,10 @@
} }
} }
}, },
"cliui": { "commander": {
"version": "5.0.0", "version": "9.3.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz",
"integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw=="
"requires": {
"string-width": "^3.1.0",
"strip-ansi": "^5.2.0",
"wrap-ansi": "^5.1.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
@ -1120,11 +925,6 @@
"ms": "2.0.0" "ms": "2.0.0"
} }
}, },
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
},
"depd": { "depd": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@ -1153,16 +953,16 @@
"jake": "^10.8.5" "jake": "^10.8.5"
} }
}, },
"emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
},
"encodeurl": { "encodeurl": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
}, },
"entities": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
"integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q=="
},
"escape-html": { "escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@ -1250,14 +1050,6 @@
"unpipe": "~1.0.0" "unpipe": "~1.0.0"
} }
}, },
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"requires": {
"locate-path": "^3.0.0"
}
},
"forwarded": { "forwarded": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@ -1268,11 +1060,6 @@
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
}, },
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
},
"has-flag": { "has-flag": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@ -1284,9 +1071,9 @@
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
}, },
"highlight.js": { "highlight.js": {
"version": "10.7.3", "version": "11.5.1",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz",
"integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q=="
}, },
"html-encoder-decoder": { "html-encoder-decoder": {
"version": "1.3.9", "version": "1.3.9",
@ -1328,11 +1115,6 @@
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
}, },
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
},
"iterate-object": { "iterate-object": {
"version": "1.3.4", "version": "1.3.4",
"resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz",
@ -1349,15 +1131,36 @@
"minimatch": "^3.0.4" "minimatch": "^3.0.4"
} }
}, },
"locate-path": { "linkify-it": {
"version": "3.0.0", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
"requires": { "requires": {
"p-locate": "^3.0.0", "uc.micro": "^1.0.1"
"path-exists": "^3.0.0"
} }
}, },
"markdown-it": {
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz",
"integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==",
"requires": {
"argparse": "^2.0.1",
"entities": "~3.0.1",
"linkify-it": "^4.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
}
},
"markdown-it-hashtag": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/markdown-it-hashtag/-/markdown-it-hashtag-0.4.0.tgz",
"integrity": "sha512-+VCMH+f4/Ud5wPEtcAMrlLbUrrGViwR9JvjPy//X3Z7ZG1j5nQuHtDLTGZfMhkqYTMY+cTZgZkVNBsXMfU93Yg=="
},
"mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
},
"media-typer": { "media-typer": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@ -1422,37 +1225,11 @@
"ee-first": "1.1.1" "ee-first": "1.1.1"
} }
}, },
"p-limit": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
"integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"requires": {
"p-limit": "^2.0.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
},
"parseurl": { "parseurl": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
}, },
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
},
"path-to-regexp": { "path-to-regexp": {
"version": "0.1.7", "version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@ -1493,16 +1270,6 @@
"resolved": "https://registry.npmjs.org/regex-escape/-/regex-escape-3.4.10.tgz", "resolved": "https://registry.npmjs.org/regex-escape/-/regex-escape-3.4.10.tgz",
"integrity": "sha512-qEqf7uzW+iYcKNLMDFnMkghhQBnGdivT6KqVQyKsyjSWnoFyooXVnxrw9dtv3AFLnD6VBGXxtZGAQNFGFTnCqA==" "integrity": "sha512-qEqf7uzW+iYcKNLMDFnMkghhQBnGdivT6KqVQyKsyjSWnoFyooXVnxrw9dtv3AFLnD6VBGXxtZGAQNFGFTnCqA=="
}, },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
},
"require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
},
"safe-buffer": { "safe-buffer": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@ -1551,32 +1318,27 @@
"send": "0.17.1" "send": "0.17.1"
} }
}, },
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
},
"setprototypeof": { "setprototypeof": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
}, },
"showdown": { "showdown": {
"version": "1.9.1", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz",
"integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==",
"requires": { "requires": {
"yargs": "^14.2" "commander": "^9.0.0"
} }
}, },
"showdown-highlight": { "showdown-highlight": {
"version": "2.1.8", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/showdown-highlight/-/showdown-highlight-2.1.8.tgz", "resolved": "https://registry.npmjs.org/showdown-highlight/-/showdown-highlight-3.0.0.tgz",
"integrity": "sha512-WqrMzMPYrWEwbA03GJT8mc82QxTe91kFwvNWpEPfTgEwd/5G32d44bn5Z7zMYgOcePnXInmYClldezqHDAyGZg==", "integrity": "sha512-xrMPNGaECoFMueD3uortV5r69NFY4oZp50QTrHf21T6aYgBO6FBdv5ibBvGd2atd/FeSsPjUhJOipLL6pwELhg==",
"requires": { "requires": {
"highlight.js": "^10.7.2", "highlight.js": "^11.5.0",
"html-encoder-decoder": "^1.3.9", "html-encoder-decoder": "^1.3.9",
"showdown": "^1.9.1" "showdown": "^2.0.3"
} }
}, },
"statuses": { "statuses": {
@ -1584,24 +1346,6 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
}, },
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"requires": {
"ansi-regex": "^4.1.0"
}
},
"supports-color": { "supports-color": {
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@ -1624,6 +1368,11 @@
"mime-types": "~2.1.24" "mime-types": "~2.1.24"
} }
}, },
"uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
},
"unpipe": { "unpipe": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@ -1638,53 +1387,6 @@
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
},
"wrap-ansi": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
"integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
"requires": {
"ansi-styles": "^3.2.0",
"string-width": "^3.0.0",
"strip-ansi": "^5.0.0"
}
},
"y18n": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
"integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ=="
},
"yargs": {
"version": "14.2.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz",
"integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==",
"requires": {
"cliui": "^5.0.0",
"decamelize": "^1.2.0",
"find-up": "^3.0.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^3.0.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^15.0.0"
}
},
"yargs-parser": {
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
"integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
} }
} }
} }

View file

@ -16,13 +16,15 @@
"bugs": { "bugs": {
"url": "https://github.com/len0rd/personal-website/issues" "url": "https://github.com/len0rd/personal-website/issues"
}, },
"homepage": "https://github.com/len0rd/personal-website#readme", "homepage": "https://github.com/len0rd/personal-website",
"dependencies": { "dependencies": {
"dynamic-scrollspy": "^0.2.0", "dynamic-scrollspy": "^0.2.0",
"ejs": "^3.1.8", "ejs": "^3.1.8",
"express": "^4.17.1", "express": "^4.17.1",
"markdown-it": "^13.0.1",
"markdown-it-hashtag": "^0.4.0",
"mkdirp": "^1.0.4", "mkdirp": "^1.0.4",
"showdown": "^1.9.1", "showdown": "^2.1.0",
"showdown-highlight": "^2.1.8" "showdown-highlight": "^3.0.0"
} }
} }

View file

@ -9,28 +9,29 @@ const showdown = require('showdown'),
showdownHighlight = require("showdown-highlight"), showdownHighlight = require("showdown-highlight"),
fs = require('fs'), fs = require('fs'),
mkdirp = require('mkdirp'), mkdirp = require('mkdirp'),
inputDir = './project_writeups/', projectInputDir = './project_writeups/',
outputDir = './views/partials/md/', projectOutputDir = './views/partials/md/projects/',
classMap = { recipeInputDir = './recipes/',
recipeOutputDir = './views/partials/md/recipes/',
recipeListGeneratedOutputDir = './views/partials/generated/',
projectClassMap = {
h1: 'display-1' //tag type : class to add to all tags of that type (class="display-1" added to all <h1>) h1: 'display-1' //tag type : class to add to all tags of that type (class="display-1" added to all <h1>)
}; };
const { assert } = require('console');
// handles adding classes to specific
// tag types automatically function addClassToTag(text, classMap) {
const addClass = {
type: 'output', // when it's triggered -> output is at the very end when text is html
filter: text => {
var modifiedText = text; var modifiedText = text;
Object.keys(classMap).forEach(function (key) { Object.keys(classMap).forEach(function (key) {
var regex = new RegExp(`<${key}(.*?)>`, 'g'); var regex = new RegExp(`<(${key})(.*?)>`, 'g');
matcher = regex.exec(modifiedText); matcher = regex.exec(modifiedText);
// only proceed if we found a match, and the class we add isn't already on the tag somehow // only proceed if we found a match, and the class we add isn't already on the tag somehow
while (matcher != null && !matcher[0].includes(classMap[key])) { while (matcher != null && !matcher[2].includes(classMap[key])) {
// add the class content WHILE preserving any other properties already in the tag! // add the class content WHILE preserving any other properties already in the tag!
console.log("adding class content in: " + matcher[0]); console.log("adding class content in: " + matcher[0]);
var restOfTag = matcher[1]; var restOfTag = matcher[2];
modifiedText = modifiedText.replace(matcher[0], `<${key} class="${classMap[key]}" ${restOfTag}>`); modifiedText = modifiedText.replace(matcher[0], `<${key} class="${classMap[key]}" ${restOfTag}>`);
matcher = regex.exec(modifiedText); matcher = regex.exec(modifiedText);
@ -38,23 +39,23 @@ const addClass = {
}); });
return modifiedText; return modifiedText;
} }
// handles adding classes to specific
// tag types automatically in project writeups
const projectsAddHeaderClass = {
type: 'output', // when it's triggered -> output is at the very end when text is html
filter: text => { return addClassToTag(text, projectClassMap); }
}; };
// create our Showdown converter with our custom extension // create Showdown converters
const converter = new showdown.Converter({ const projectsConverter = new showdown.Converter({
extensions: [addClass, showdownHighlight], extensions: [projectsAddHeaderClass, showdownHighlight],
tables: true
}); });
// make the directory for our html output if necessary function convertMarkdownInDirWithShowdown(inputDir, outputDir, converter) {
mkdirp(outputDir, null, (err) => { // make the directory for the html output if necessary
if (err) { mkdirp.sync(outputDir);
console.error(err);
} else {
console.log('output dir created');
}
});
// Lets start the actual conversion!
fs.readdir(inputDir, (err, files) => { fs.readdir(inputDir, (err, files) => {
files.forEach(file => { files.forEach(file => {
if (file.endsWith('.md')) { if (file.endsWith('.md')) {
@ -75,3 +76,187 @@ fs.readdir(inputDir, (err, files) => {
} }
}); });
}); });
}
function convertRecipeMarkdown(inputDir, outputDir) {
var md = require('markdown-it')()
.use(require('markdown-it-hashtag'));
md.renderer.rules.hashtag_open = function (tokens, idx) {
var tagName = tokens[idx].content.toLowerCase();
return '<a href="/recipe_navigator?tag=' + tagName + '"><span class="badge bg-secondary">';
}
md.renderer.rules.hashtag_close = function () { return '</span></a>'; }
// This is a hardcoded markdown header section number to html file name
//
// Example.md:
// """
// ... maybe some other header info here -| - exported as filename-title.ejs
// # Delicious Recipe Name -|
// Catch phrase or yield -|
// | - exported as filename-subtitle
// image of the food |
// -|
// ## Ingredients -|
// ... ingredients table, etc | - exported as filename-ingredients.ejs
// -|
// ## Instructions
// """
//
// NOTE: these titles are HARDCODED in recipe_template.ejs!
const mdSectionHtmlTitles = [
'title',
// 'subtitle',
'ingredients',
'instructions',
]
mkdirp.sync(outputDir);
fs.readdir(inputDir, (err, files) => {
files.forEach(file => {
if (!file.endsWith('.md')) {
return;
}
let fileNameNoExtension = file.slice(0, -3);
console.log('converting: ' + fileNameNoExtension);
fs.readFile(inputDir + file, 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
var ingredientTableRegex = new RegExp(`^(\\|?.*?)\\|(.*?)(\\|.*?\\|.*?)\n`, `gm`);
var ingredientDashCheck = new RegExp("^\-+$");
ingredientTableMatcher = ingredientTableRegex.exec(data);
while (ingredientTableMatcher != null) {
meas = ingredientTableMatcher[1];
let unit = ingredientTableMatcher[2].toLowerCase().trim();
if (unit != "unit" && unit && !ingredientDashCheck.test(unit)) {
meas += unit + " ";
}
data = data.replace(ingredientTableMatcher[0], `${meas}${ingredientTableMatcher[3]}\n`);
ingredientTableMatcher = ingredientTableRegex.exec(data);
}
ingredientTableMatcher = ingredientTableRegex.exec(data);
while (ingredientTableMatcher != null) {
meas = ingredientTableMatcher[1];
let unit = ingredientTableMatcher[2].toLowerCase().trim();
if (unit != "unit" && unit && !ingredientDashCheck.test(unit)) {
meas += unit + " ";
}
data = data.replace(ingredientTableMatcher[0], `${meas}${ingredientTableMatcher[3]}\n`);
ingredientTableMatcher = ingredientTableRegex.exec(data);
}
let tokens = md.parse(data)
let sections = []
sections.push([]); // start off the array and put everything before and including the first header in title
let numSections = 0;
for (const token of tokens) {
if (token.type === 'heading_open') {
if (numSections == 0) {
numSections++;
}
else if (numSections < mdSectionHtmlTitles.length) {
numSections++;
sections.push([]);
}
}
sections[sections.length - 1].push(token)
}
assert(sections.length <= mdSectionHtmlTitles.length);
// hardcode bootstrap class attribute to add to <table> tag in ingredients
for (let ii = 0; ii < sections[1].length; ii++) {
if (sections[1][ii].type == 'table_open') {
sections[1][ii].attrs = [["class", "table table-striped table-sm table-hover"]];
break;
}
}
for (let ii = 0; ii < sections.length; ii++) {
let html = md.renderer.render(sections[ii], md.options);
// hardcode making images in the title section larger
if (ii == 0) {
var regex = new RegExp(`<img (.*?)>`, `g`);
matcher = regex.exec(html);
while (matcher != null && !matcher[1].includes("w-100")) {
var restOfTag = matcher[1];
html = html.replace(matcher[0], `<img class="w-100" ${restOfTag}>`);
matcher = regex.exec(html);
}
}
fs.writeFileSync(outputDir + fileNameNoExtension + '-' + mdSectionHtmlTitles[ii] + '.ejs', html, 'utf8');
}
});
});
});
}
function generateRecipeNavigatorList(recipeSrcDir, generatedOutputDir) {
// generate a list of recipe links. While doing so generate an array
// of unique hashtags found in all recipes
mkdirp.sync(generatedOutputDir);
let recipeListPartialOut = "";
let allRecipeHashtags = [];
fs.readdir(recipeSrcDir, (err, files) => {
files.sort().forEach(file => {
if (!file.endsWith('.md')) {
return;
}
let fileNameNoExtension = file.slice(0, -3);
const data = fs.readFileSync(recipeSrcDir + file, { encoding: 'utf8', flag: 'r' });
// find all hashtags in the file
var hashtagRegex = new RegExp(`#(\\w+)`, `g`);
hashtagMatcher = hashtagRegex.exec(data);
var recipeTags = []; // hashtags of the current recipe only
while (hashtagMatcher != null) {
var hashtag = hashtagMatcher[1].toLowerCase();
if (!allRecipeHashtags.includes(hashtag)) {
allRecipeHashtags.push(hashtag);
}
if (!recipeTags.includes(hashtag)) {
recipeTags.push(hashtag);
}
hashtagMatcher = hashtagRegex.exec(data);
}
let combinedRecipeTags = "";
if (recipeTags.length > 0) {
combinedRecipeTags = recipeTags.join(",");
}
// get first recipe title from document
var titleRegex = new RegExp(`#\\s+(.+)\\n`, `g`);
titleMatcher = titleRegex.exec(data);
var recipeTitle = fileNameNoExtension;
if (titleMatcher != null) {
recipeTitle = titleMatcher[1];
}
recipeListPartialOut += `<a href="recipes/${fileNameNoExtension}" class="list-group-item list-group-item-action" tags="${combinedRecipeTags}">${recipeTitle}</a>\n`;
});
// writeout the link list partial
fs.writeFileSync(generatedOutputDir + "recipe-links.ejs", recipeListPartialOut, "utf-8");
// now generate the hashtag button list partial
// TODO: in the future sort the list by number of hashtag hits (most -> least common)
// instead of alphabetically
let tagListPartialOut = "";
allRecipeHashtags.sort().forEach(hashtag => {
tagListPartialOut += `<button type="button" class="btn btn-light btn-sm">${hashtag}</button>\n`;
});
fs.writeFileSync(generatedOutputDir + "recipe-tags.ejs", tagListPartialOut, "utf-8");
});
}
convertMarkdownInDirWithShowdown(projectInputDir, projectOutputDir, projectsConverter);
convertRecipeMarkdown(recipeInputDir, recipeOutputDir);
generateRecipeNavigatorList(recipeInputDir, recipeListGeneratedOutputDir);

View file

@ -28,13 +28,13 @@ With the requirements thought out, I started planning how I was going to build e
There were some really cool designs online, but I needed something simple. This was my first woodworking project, and I knew I *would* (hehe) be making a lot of mistakes. All of these thoughts culminated into a single whiteboard sketch: There were some really cool designs online, but I needed something simple. This was my first woodworking project, and I knew I *would* (hehe) be making a lot of mistakes. All of these thoughts culminated into a single whiteboard sketch:
![Whiteboard sketch of ititial design](/img/writeup/palletDesk/plans-1-sm.jpg) ![Whiteboard sketch of initial design](/img/writeup/palletDesk/plans-1-sm.jpg)
Yep. That's it. It was all a lot clearer in my head. Essentially the red 'rectangles' are 2x4 cross beams that would support the desktop and create a structure to build onto. The measurements were mainly based on what would fit in my Camry. Note: this only fits in the car when I put the back seats down so the desk can go through the trunk and into the back of the car. pics further down. I also measured a few desks nearby to see what an appropriate depth for a monitor + keyboard would be. Yep. That's it. It was all a lot clearer in my head. Essentially the red 'rectangles' are 2x4 cross beams that would support the desktop and create a structure to build onto. The measurements were mainly based on what would fit in my Camry. Note: this only fits in the car when I put the back seats down so the desk can go through the trunk and into the back of the car. pics further down. I also measured a few desks nearby to see what an appropriate depth for a monitor + keyboard would be.
## Build ## Build
### Pallet Aquisition ### Pallet Acquisition
There are a lot of guides on how to get pallets online. If you're in the US, check the free section of Craigslist or your local classifieds. You can also just walk into local places and ask if they have any pallets that you can use. Alternatively, just drive behind businesses and see if they have pallets stacked near the dumpster. There are a lot of guides on how to get pallets online. If you're in the US, check the free section of Craigslist or your local classifieds. You can also just walk into local places and ask if they have any pallets that you can use. Alternatively, just drive behind businesses and see if they have pallets stacked near the dumpster.

25
recipes/bananaBread.md Normal file
View file

@ -0,0 +1,25 @@
# Banana Bread
#bread #dessert
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
1/4 | c | | Cinnamon-Sugar
3 | c | | Sugar
3 | | | Eggs
6 | | | Banana
3/4 | c | | Butter
16 | oz | | Sour Cream
2 | tsp | | Vanilla
2 | tsp | | Cinnamon
1/2 | tsp | | Salt
3 | tsp | | Baking Soda
4 1/2 | c | | Flour
## Instructions
1. Cream butter and 3c Sugar. Mix in eggs, bananas, sour cream, vanilla and cinnamon
2. Add salt, baking soda and flour. Mix well. Optionally add chocolate chips
3. Preheat to 300. Grease bread pans and dust with cinnamon sugar. Fill ~3/4 pan with dough. Bake 1hr, or until a toothpick removes cleanly

View file

@ -0,0 +1,32 @@
# Chocolate Chip Cookies
#dessert #cookie
*yields: ~4 dozen*
![Cookies](/img/recipes/chocolateChipCookies.jpg)
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
1 | c | | Unsalted Butter
1 1/4 | c | 290g | Brown Sugar
1/4 | c | 60g | Sugar
1 | | | Egg
1 | | | Egg Yolk
2 | tbsp | | Whole Milk
1 1/2 | tsp | | Vanilla
2 3/4 | c | 370g | Flour
1 | tsp | 7g | Baking Soda
1 | tsp | 7g | Salt
1/4 | tsp | 1g | Cinnamon
2 | c | | Chocolate Chip
## Instructions
1. Melt butter on stove. In a medium bowl sift flour, salt and baking soda together, set aside.
2. Mix butter and sugars for 2 minutes
3. In a separate bowl, whisk together egg, egg yolk, milk and vanilla. Add to mixer and mix until thoroughly combined.
4. Gradually add dry ingredients until you have the proper consistency (generally not all the mixture). Mix in chocolate chips. Refrigerate for 1 hour.
5. Preheat oven to 355. Bake for 10 minutes (temp may vary depending on oven and altitude)

28
recipes/cinnamonRolls.md Normal file
View file

@ -0,0 +1,28 @@
# Cinnamon Rolls
#breakfast #bread #dessert
![Cinnamon Roll](/img/recipes/cinnamonRolls.jpeg)
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
4 3/4 | c | | Flour
1 1/2 | tsp | | Salt
1/3 | c | | Sugar
1/3 | c | | Oil
2 | | | Eggs
1 1/4 | c | | Warm water (110F)
2 | tbsp | | Yeast
4 | tbsp | | Melted Butter
1/2 | c | | Cinnamon Sugar
## Instructions
1. Mix sugar, water and yeast. Let bloom 5m. Beat Eggs. Add oil, egg, salt, 2c flour. Mix well
2. Add the rest of the flour until you have a stiff dough. Hand knead 5min. Let rise 15m
3. Roll out into rectangular shape on floured surface. Brush with butter, sprinkle with cinnamon sugar
4. Roll up dough and cut in 1-1/2” slices. Place in rectangular pan and press.
5. Let rise 10m. Preheat to 425. Bake for 12-15m until golden brown

View file

@ -0,0 +1,22 @@
# Coconut Meringue Macaroons
#dessert
![CoconutClouds](/img/recipes/coconutClouds.jpg)
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
1 1/4 | c | 250g | Sugar
3/4 | c | 180g | Water
3 | | 102g | Egg Whites
3 | c | 227g | Coconut
## Instructions
1. Toast coconut by spreading evenly on a sheet and baking at 325. Check/stir every 2-3 minutes until lightly browned.
2. Combine sugar and water in saucepan over medium heat. Stir until clear. Bring to a boil and watch on candy thermometer for soft ball.
3. While sugar cooks, place egg whites in stand mixer. Time so they reach medium peaks when sugar mixture hits soft ball.
4. When sugar ready, put mixer on medium-low and slowly add to egg whites. Once incorporated, mix on high until back at room temperature. Fold in toasted coconut and scoop onto sheet.
5. Bake 12 minutes at 325

20
recipes/drunkBananas.md Normal file
View file

@ -0,0 +1,20 @@
# Drunk Bananas
#dessert
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
3 | | | Bananas
1/3 | c | | Brandy or Rum
Dash | | | Cinnamon
1/2 | c | | Butter
1 | c | | Brown Sugar
1 | tsp | | Vanilla
## Instructions
1. Quarter bananas In a frying pan, mix butter and brown sugar over medium heat for a sticky caramel
2. Add vanilla, bananas and brandy/rum to the caramel, mix
3. Ignite the alcohol. Sprinkle cinnamon into the flames. Allow all alcohol to burn out. Serve with ice cream

View file

@ -0,0 +1,25 @@
# Hot Fudge Pudding
#dessert
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
1 1/2 | c | | Flour
3 | tsp | | Baking Powder
1/2 | tsp | | Salt
3/4 | c | | Sugar
3 | tbsp | | Cocoa
3/4 | c | | Milk
3 | tbsp | | Oil
1 | c | | Brown Sugar
1/4 | c | | Cocoa
2 1/4 | c | | Water
## Instructions
1. Mix flour, baking powder, salt, sugar and 3T cocoa. Stir in milk and oil. Pour into 2q baking dish
2. Combine brown sugar and 1/4c cocoa. Distribute evenly over batter in pan
3. Heat water. Pour hot water over everything
4. Bake 45 minutes at 375. Serve warm with whipped cream or ice cream

23
recipes/jillyChicken.md Normal file
View file

@ -0,0 +1,23 @@
# Jilly Chicken
#dinner #chicken
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
1 | Ib | | Chicken
1/2 | c | | Soy Sauce
1/2 | c | | Lemon Juice
1/2 | c | | Oil
1 | tbsp | | Basil
## Instructions
1. Cut chicken in strips (about the size of chicken fingers)
2. Combine all other ingredients in the pan you plan to cook the chicken in
3. Lay each piece of chicken in the sauce so they are not overlapped (touching is ok)
4. Marinate chicken for 30-60 minutes, preheat oven to 350
5. Bake the marinated chicken in the sauce for 30ish minutes, or until done
Note: take the pan out of the oven and flip the chicken pieces (using a fork) after 10 minutes of baking.
6. Enjoy on rice

26
recipes/karaChili.md Normal file
View file

@ -0,0 +1,26 @@
# Kara's Chili
#dinner #soup
![Chili](/img/recipes/karaChili.jpg)
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
2 | can | | Kidney Beans
2 | can | | Pinto Beans
2 | can | | Black Beans
1 (8oz) | can | | Tomato Paste
1 | can | | Petite Diced Tomatoes
4 | clove | | Garlic
1 | Ib | | Ground Beef
| | | | Salt
| | | | Pepper
| | | | Cumin
| | | | Cayenne Pepper
## Instructions
1. Brown beef on medium heat. Mince garlic while it cooks
2. Remove excess fat. Add everything. Season to taste. Let simmer 20m

37
recipes/karaLentil.md Normal file
View file

@ -0,0 +1,37 @@
# Kara's Lentils
#dinner #soup
![Lentils](/img/recipes/karaLentil.jpg)
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
1 | Ib | | Lentil
2 | | | Potato
2 | | | Red Bell Pepper
2 | | | Jalapeño
8 | clove | | Garlic
6 | tbsp | | Curry Powder
6 | c | | Chicken Broth
| | | | Cumin
| | | | Cayenne Pepper
| | | | Turmeric
| | | | Coriander
| | | | Plain Yogurt
| | | | Mustard Seeds
1 | bunch | | Cilantro
2 | tbsp | | Sesame Oil
## Instructions
1. Wash and dry produce
2. Small dice potatoes, jalapeños and bell pepper
3. Warm sesame oil in large pot
4. Once oil is warm, add mustard seeds. Stir occassionally until they start to pop
5. Add diced potato and fry until slightly tender. Add lentils
6. Add all the seasonings and mix until the potatoes and lentils are evenly coated
7. Pour in broth. Add all fresh vegetables
8. Bring to a boil. Then simmer, stirring occasionally until lentils are tender
9. Serve in bowls with a dollop of yogurt and a sprinkle of cilantro

22
recipes/monkeyBread.md Normal file
View file

@ -0,0 +1,22 @@
# Monkey Bread
#bread #dessert #breakfast
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
4 | | | Biscuit Cans
2/3 | c | | Sugar
1 1/2 | tsp | | Cinnamon
**Sauce** | | |
1 1/8 | c | | Butter
1 1/2 | c | | Sugar
1 1/2 | tsp | | Cinnamon
## Instructions
1. Quarter biscuits. Combine sugar and cinnamon in bowl
2. Toss biscuits in bowl, coating each with cinnamon sugar. Dump into greased pan
3. Boil sauce ingredients over low heat fo 2-3 minutes, stirring constantly. Pour over biscuits in pan
4. Bake at 350 for 30-35m. Cool for 10m

View file

@ -0,0 +1,25 @@
# Peppermint Brownies
#dessert
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
17 | | | York Patties
3/4 | c | | Cocoa
1/2 | tsp | | Baking Soda
2/3 | c | | Butter
1/2 | c | | Water
2 | c | | Sugar
2 | | | Egg
1 1/3 | c | | Flour
1 | tsp | | Vanilla
1 | tsp | | Powdered Sugar
## Instructions
1. Coarsely chop peppermint patties, set aside. Bring water to a boil
2. Mix cocoa and baking soda in large bowl. Melt and mix in 1/3c butter. Add boiling water, mix well
3. Add sugar, eggs and remaining butter. Add flour, vanilla and salt. Mix well, then stir in York pieces
4. Preheat oven to 350. Grease pan well and sprinkle with cinnamon before spreading batter. Bake 35-40m

21
recipes/pizzaDough.md Normal file
View file

@ -0,0 +1,21 @@
# Pizza Dough
#bread #italian
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
2 1/2 | c | | Flour
1 | tsp | 7g | Salt
1 | tsp | | Sugar
2 | tbsp | | Olive Oil
1 | c | | Warm Water (110F)
2 1/3 | tsp | | Yeast
## Instructions
1. Dissolve yeast and sugar in warm water. Let bloom (10m)
2. Mix in flour, salt and oil. Beat until smooth. Rest 5m
3. Roll dough into desired shape on lightly floured surface. Transfer to lightly greased pan or parchment paper dusted with cornmeal
4. Preheat to 450. Bake 15-20m. Let cool 5m

View file

@ -0,0 +1,36 @@
# Spinach Casserole
#dinner #chicken
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
1 | c | | Sour Cream
1/3 | c | | Milk
1/2 | tsp | | Garlic Powder
1/4 | tsp | | Cumin
Dash | | | Hot Pepper Sauce
1 | can | | Cream of Chicken
9 | oz | | Frozen Chopped Spinach
2-3 | c | | Cubed Chicken, cooked
1 | c | | Shredded Monterey Jack Cheese
1/2 | c | | Shredded Cheddar
**Topping** | | |
2 | | | Egg
1 | c | | Flour
1 1/2 | tsp | | Baking Powder
3/4 | c | | Milk
1/4 | c | | Butter
Dash | | | Paprika
## Instructions
1. Grease 2qt casserole pan.
2. In large bowl: combine sour cream, milk, garlic salt, cumin, hot pepper sauce, soup, spinach and chilies. Blend well
3. In second bowl: combine chicken and cheeses, toss lightly
4. Spoon half of spinach mixture into casserole pan, then half of chicken mixture. Repeat
5. Separate eggs. In separate bowl beat egg whites until stiff
6. Topping: combine flour, milk, butter and egg yolks. Beat at low speed until moistened. Beat 4m at high speed
7. Fold egg whites into topping. Pour over filling. Sprinkle with paprika
8. Bake 40-45m at 375 or until deep golden brown

23
recipes/waffles.md Normal file
View file

@ -0,0 +1,23 @@
# Waffles
#breakfast #pastry
## Ingredients
Measure | Unit | Weight | Ingredient
--------|------|--------|-----------
1 3/4 | c | | Flour
1/2 | tsp | | Salt
3 | tsp | | Baking Powder
1/2 | c | | Instant Dry Milk
2 | | | Eggs
1/2 | c | | Oil
1 3/4 | c | | Water
Dash | | | Cinnamon
## Instructions
1. Separate eggs/ Stiffly beat whites in mixer
2. Combine flour, salt, baking power, dry milk, cinnamon in large bowl
3. Combine egg yolks, oil, and water in small bowl. Combine with dry
4. Gently fold egg whites. Leaving a few folds. Cook in waffle iron

View file

@ -26,7 +26,13 @@ app.get(/\/.*/, function(req, res) {
pathname = pathname.substr(0, pathname.lastIndexOf(page)); pathname = pathname.substr(0, pathname.lastIndexOf(page));
pathname += 'project_template' pathname += 'project_template'
// provide the pagename for project_template to use for main content // provide the pagename for project_template to use for main content
page = 'partials/md/' + page; page = 'partials/md/projects/' + page;
}
else if (pathname.includes('recipes') && page !== 'index') {
pathname = pathname.substr(0, pathname.lastIndexOf(page));
pathname += 'recipe_template'
// provide the pagename for project_template to use for main content
page = 'partials/md/recipes/' + page;
} }
} }
console.log('request for path: ' + pathname + ', and page: ' + page); console.log('request for path: ' + pathname + ', and page: ' + page);

View file

@ -38,9 +38,9 @@
</div> </div>
</div> </div>
</div> </div>
<div class="container pb-5 pt-5"> <div class="row row-cols-1 row-cols-md-3 g-2 p-5">
<div class="card-columns"> <div class="col">
<div class="card bg-dark border-light text-white"> <div class="card bg-dark card-homepage border-light text-white">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Yama Crawler</h5> <h5 class="card-title">Yama Crawler</h5>
<h6 class="card-subtitle mb-2 text-muted">Selenium-Based Web Crawler</h6> <h6 class="card-subtitle mb-2 text-muted">Selenium-Based Web Crawler</h6>
@ -52,7 +52,9 @@
Code</a> Code</a>
</div> </div>
</div> </div>
<div class="card bg-dark border-light text-white"> </div>
<div class="col">
<div class="card bg-dark card-homepage border-light text-white">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Mavlib Gen</h5> <h5 class="card-title">Mavlib Gen</h5>
<h6 class="card-subtitle mb-2 text-muted">Modern Mavlink C generator</h6> <h6 class="card-subtitle mb-2 text-muted">Modern Mavlink C generator</h6>
@ -63,7 +65,9 @@
<a href="https://github.com/len0rd/mavlib_gen" class="card-link card-soft-link">See Code</a> <a href="https://github.com/len0rd/mavlib_gen" class="card-link card-soft-link">See Code</a>
</div> </div>
</div> </div>
<div class="card bg-dark border-light text-white"> </div>
<div class="col">
<div class="card bg-dark card-homepage border-light text-white">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Darkstar</h5> <h5 class="card-title">Darkstar</h5>
<h6 class="card-subtitle mb-2 text-muted">Why buy a quad when you can build it</h6> <h6 class="card-subtitle mb-2 text-muted">Why buy a quad when you can build it</h6>
@ -78,7 +82,9 @@
Code</a> Code</a>
</div> </div>
</div> </div>
<div class="card bg-dark border-light text-white"> </div>
<div class="col">
<div class="card bg-dark card-homepage border-light text-white">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Pallet Desk</h5> <h5 class="card-title">Pallet Desk</h5>
<h6 class="card-subtitle mb-2 text-muted">Reliable and cheap desk</h6> <h6 class="card-subtitle mb-2 text-muted">Reliable and cheap desk</h6>
@ -89,7 +95,9 @@
<a href="projects/palletDesk" class="btn btn-outline-light">Read More</a> <a href="projects/palletDesk" class="btn btn-outline-light">Read More</a>
</div> </div>
</div> </div>
<div class="card bg-dark border-light text-white"> </div>
<div class="col">
<div class="card bg-dark card-homepage border-light text-white">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">My Website</h5> <h5 class="card-title">My Website</h5>
<h6 class="card-subtitle mb-2 text-muted">Is this meta</h6> <h6 class="card-subtitle mb-2 text-muted">Is this meta</h6>
@ -103,8 +111,9 @@
Code</a> Code</a>
</div> </div>
</div> </div>
</div>
<div class="card bg-dark border-light text-white"> <div class="col">
<div class="card bg-dark card-homepage border-light text-white">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">LS-1 Synth</h5> <h5 class="card-title">LS-1 Synth</h5>
<h6 class="card-subtitle mb-2 text-muted">Music to my ears</h6> <h6 class="card-subtitle mb-2 text-muted">Music to my ears</h6>
@ -119,7 +128,6 @@
Code</a> Code</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -0,0 +1,102 @@
<!DOCTYPE html>
<html lang="en">
<head>
<%- include('../partials/include' ) %>
<link rel="stylesheet" type="text/css" href="/css/projects.css">
</head>
<body>
<header>
<%- include('../partials/nav') %>
</header>
<div class="container mt-5 topMargin">
<div class="row mb-3">
<div class="col">
<h1 class="display-1">Recipes</h1>
</div>
<div class="col-4 align-self-end">
<input class="form-control" id="recipeSearch" type="text" placeholder="search..">
</div>
</div>
<div class="row mb-2">
<div class="col btn-container">
<%- include('../partials/generated/recipe-tags') %>
</div>
</div>
<div class="row">
<div class="list-group list-group-flush" id="recipe-link-container">
<%- include('../partials/generated/recipe-links') %>
</div>
</div>
</div>
<%- include('../partials/post_html_include') %>
<script>
const TAG_ACTIVE_CLASS = "btn-primary";
/// Returns a list of the current recipe hashtags that are enabled (enabled filters)
function getActiveTags() {
var activeTags = [];
// create a list of currently active tags
$(".btn-container button").filter(function() {
if ($(this).hasClass(TAG_ACTIVE_CLASS)){
activeTags.push($(this).text())
}
});
return activeTags;
}
/// check if the given recipe item all the currently selected hashtag filters (an 'AND' search)
function recipeHasAllActiveTags(activeTags, recipe) {
const recipeTags = recipe.attr("tags").toLowerCase().split(",");
return activeTags.every(elem => recipeTags.includes(elem));
}
function recipeHasCurrentSearchPhrase(searchValue, recipe) {
return !searchValue || recipe.text().toLowerCase().indexOf(searchValue) > -1;
}
function setActiveRecipes() {
const activeTags = getActiveTags();
const searchValue = $("#recipeSearch").val().toLowerCase();
$("#recipe-link-container a").filter(function() {
$(this).toggle(recipeHasCurrentSearchPhrase(searchValue, $(this)) && recipeHasAllActiveTags(activeTags, $(this)));
});
}
/// This script is responsible for filtering the recipe list
/// based on enabled/disabled hashtags. I'm certain theres more
/// efficient ways to do this but /shrug
$(".btn-container").on("click", "button", function() {
$(this).toggleClass("btn-light btn-primary");
setActiveRecipes();
});
/// This method is responsible for filtering the recipe list based on the search bar
$(document).ready(function() {
$("#recipeSearch").on("keyup", function() {
setActiveRecipes();
});
});
// apply a tag on page load if specified in the url
$(document).ready(function() {
let searchParams = new URLSearchParams(window.location.search);
if (searchParams.has("tag")) {
const tagParam = searchParams.get("tag").toLowerCase().trim();
$(".btn-container button").filter(function() {
if (tagParam == $(this).text().toLowerCase().trim()) {
$(this).toggleClass("btn-light btn-primary");
setActiveRecipes();
return;
}
});
}
});
</script>
</body>
</html>

View file

@ -0,0 +1,34 @@
<% var rootPath = '../../'; %>
<!DOCTYPE html>
<html lang="en">
<head>
<%- include(rootPath + 'partials/include' ) %>
<link rel="stylesheet" type="text/css" href="/css/projects.css">
</head>
<body>
<header>
<%- include(rootPath + 'partials/nav') %>
</header>
<div class="container mt-5 topMargin">
<div class="row">
<div class="col-md-8">
<%- include(rootPath + page + '-title') %>
</div>
<div class="col">
<div class="card">
<div class="card-body">
<%- include(rootPath + page + '-ingredients') %>
</div>
</div>
</div>
</div>
<%- include(rootPath + page + '-instructions') %>
</div>
<%- include(rootPath + 'partials/post_html_include') %>
</body>
</html>

View file

@ -1,8 +1,9 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="icon" type="image/png" href="/img/favicon.png"> <link rel="icon" type="image/png" href="/img/favicon.png">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/animate.css@3.5.2/animate.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/animate.css@3.5.2/animate.min.css">
<link rel="stylesheet" type="text/css" href="/css/site.css"> <link rel="stylesheet" type="text/css" href="/css/site.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css" integrity="sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ" crossorigin="anonymous"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css" integrity="sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ" crossorigin="anonymous">
<link rel="stylesheet" href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.16.2/build/styles/default.min.css"> <link rel="stylesheet" href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.16.2/build/styles/default.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

View file

@ -7,12 +7,12 @@
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="navbarText"> <div class="collapse navbar-collapse" id="navbarText">
<ul class="navbar-nav mr-auto"> <ul class="navbar-nav me-auto my-2 my-lg-0 navbar-nav-scroll" style="--bs-scroll-height: 100px;">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="https://home.lenord.me/lovelace-rooms">Home Assistant</a> <a class="nav-link" href="https://home.lenord.me/lovelace-rooms">Home Assistant</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="https://github.com/len0rd">Github</a> <a class="nav-link" href="/recipe_navigator">Recipes</a>
</li> </li>
</ul> </ul>
<a href="/contact" class="btn btn-outline-light my-2 my-sm-0">Contact</a> <a href="/contact" class="btn btn-outline-light my-2 my-sm-0">Contact</a>

View file

@ -1,4 +1,4 @@
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script type="text/javascript" src="/script/app.js"></script> <script type="text/javascript" src="/script/app.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js" integrity="sha384-o+RDsa0aLu++PJvFqy8fFScvbHFLtbvScb8AjopnFD+iEQ7wo/CG0xlczd+2O/em" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>