on master help sign in
various: migrate markdown build to server-side
commita321532aff114fdcc47ff75d6578aaf79d0c10ac authorMatilde Park <matilde.park@gmail.com> dateThu 1 Jul 2021, 17:09 (5 years ago) parent75838a0
10 files changed+750−54
components/Markdown.js+33−33 package-lock.json+499−2 package.json+1 pages/_app.js+1 pages/blog/[slug].js+14−5 pages/docs/[[...slug]].js+8−2 pages/events/[slug].js+17−5 pages/grants/[slug].js+8−5 styles/markdown.module.css+4−2 styles/prism.css+165
components/Markdown.js+33−33
@@ -1,45 +1,45 @@
1−import markdownStyles from "../styles/markdown.module.css";
2−import unified from "unified";
3−import parse from "remark-parse";
4−import remark2react from "remark-react";
1+import remark from "remark";
52import slug from "remark-slug";
63import heading from "remark-heading-id";
7−
8−function P({ children }) {
9− return <p className="leading-snug">{children}</p>;
10−}
4+import html from "remark-html";
5+import prism from "remark-prism";
6+import normalize from "mdurl/encode";
117
128// img is wrapped in figure so that images can be extra wide in the blog posts
13−function Img({ src, children }) {
14− return (
15− <figure>
16− <img src={src}>{children}</img>
17− </figure>
18− );
9+
10+function Img(h, node) {
11+ var props = { src: normalize(node.url), alt: node.alt };
12+ if (node.title !== null && node.title !== undefined) {
13+ props.title = node.title;
14+ }
15+ return {
16+ type: "element",
17+ tagName: "figure",
18+ properties: {},
19+ children: [
20+ {
21+ type: "element",
22+ tagName: "img",
23+ properties: props,
24+ },
25+ ],
26+ };
1927}
2028
2129const options = {
22− remarkReactComponents: {
23− img: Img,
24− // p: P,
25− },
26− sanitize: {
27− clobberPrefix: "",
30+ handlers: {
31+ image: Img,
2832 },
2933};
3034
3135// Converts markdown strings into markdown HTML/React components
32−export default function Markdown({ post }) {
33− return (
34− <div className={markdownStyles["markdown"]}>
35− {
36− unified()
37− .use(parse)
38− .use(slug)
39− .use(heading)
40− .use(remark2react, options)
41− .processSync(post.content).result
42− }
43− </div>
44− );
36+export default async function Markdown({ post }) {
37+ const result = await remark()
38+ .use(html, options)
39+ .use(prism)
40+ .use(slug)
41+ .use(heading)
42+ .process(post.content);
43+
44+ return result.toString();
4545}
package-lock.json+499−2
@@ -1581,6 +1581,11 @@
15811581 }
15821582 }
15831583 },
1584+ "@tootallnate/once": {
1585+ "version": "1.1.2",
1586+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
1587+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
1588+ },
15841589 "@types/mdast": {
15851590 "version": "3.0.3",
15861591 "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
@@ -1628,6 +1633,11 @@
16281633 "rollup-pluginutils": "^2.8.2"
16291634 }
16301635 },
1636+ "abab": {
1637+ "version": "2.0.5",
1638+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
1639+ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="
1640+ },
16311641 "abbrev": {
16321642 "version": "1.1.1",
16331643 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -1651,6 +1661,15 @@
16511661 "resolved": "https://registry.npmjs.org/acorn-export-ns-from/-/acorn-export-ns-from-0.1.0.tgz",
16521662 "integrity": "sha512-QDQJBe2DfxNBIMxs+19XY2i/XXilJn+kPgX30HWNYK4IXoNj3ACNSWPU7szL0SzqjFyOG4zoZxG9P7JfNw5g7A=="
16531663 },
1664+ "acorn-globals": {
1665+ "version": "6.0.0",
1666+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
1667+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
1668+ "requires": {
1669+ "acorn": "^7.1.1",
1670+ "acorn-walk": "^7.1.1"
1671+ }
1672+ },
16541673 "acorn-import-meta": {
16551674 "version": "1.1.0",
16561675 "resolved": "https://registry.npmjs.org/acorn-import-meta/-/acorn-import-meta-1.1.0.tgz",
@@ -1688,14 +1707,36 @@
16881707 "acorn-walk": {
16891708 "version": "7.2.0",
16901709 "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
1691− "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
1692− "dev": true
1710+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
16931711 },
16941712 "adm-zip": {
16951713 "version": "0.5.5",
16961714 "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.5.tgz",
16971715 "integrity": "sha512-IWwXKnCbirdbyXSfUDvCCrmYrOHANRZcc8NcRrvTlIApdl7PwE9oGcsYvNeJPAVY1M+70b4PxXGKIf8AEuiQ6w=="
16981716 },
1717+ "agent-base": {
1718+ "version": "6.0.2",
1719+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
1720+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
1721+ "requires": {
1722+ "debug": "4"
1723+ },
1724+ "dependencies": {
1725+ "debug": {
1726+ "version": "4.3.1",
1727+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
1728+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
1729+ "requires": {
1730+ "ms": "2.1.2"
1731+ }
1732+ },
1733+ "ms": {
1734+ "version": "2.1.2",
1735+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1736+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1737+ }
1738+ }
1739+ },
16991740 "anser": {
17001741 "version": "1.4.9",
17011742 "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz",
@@ -1826,6 +1867,11 @@
18261867 "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz",
18271868 "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA=="
18281869 },
1870+ "asynckit": {
1871+ "version": "0.4.0",
1872+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1873+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
1874+ },
18291875 "at-least-node": {
18301876 "version": "1.0.0",
18311877 "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -1925,6 +1971,11 @@
19251971 "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
19261972 "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
19271973 },
1974+ "browser-process-hrtime": {
1975+ "version": "1.0.0",
1976+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
1977+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
1978+ },
19281979 "browserify-aes": {
19291980 "version": "1.2.0",
19301981 "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
@@ -2163,6 +2214,14 @@
21632214 "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
21642215 "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w=="
21652216 },
2217+ "combined-stream": {
2218+ "version": "1.0.8",
2219+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
2220+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
2221+ "requires": {
2222+ "delayed-stream": "~1.0.0"
2223+ }
2224+ },
21662225 "comma-separated-tokens": {
21672226 "version": "1.0.8",
21682227 "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
@@ -2293,6 +2352,11 @@
22932352 "randomfill": "^1.0.3"
22942353 }
22952354 },
2355+ "css-selector-parser": {
2356+ "version": "1.4.1",
2357+ "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz",
2358+ "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g=="
2359+ },
22962360 "css-unit-converter": {
22972361 "version": "1.1.2",
22982362 "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz",
@@ -2326,11 +2390,66 @@
23262390 "cssnano-preset-simple": "^2.0.0"
23272391 }
23282392 },
2393+ "cssom": {
2394+ "version": "0.4.4",
2395+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
2396+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
2397+ },
2398+ "cssstyle": {
2399+ "version": "2.3.0",
2400+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
2401+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
2402+ "requires": {
2403+ "cssom": "~0.3.6"
2404+ },
2405+ "dependencies": {
2406+ "cssom": {
2407+ "version": "0.3.8",
2408+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
2409+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
2410+ }
2411+ }
2412+ },
23292413 "data-uri-to-buffer": {
23302414 "version": "3.0.1",
23312415 "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
23322416 "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og=="
23332417 },
2418+ "data-urls": {
2419+ "version": "2.0.0",
2420+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
2421+ "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
2422+ "requires": {
2423+ "abab": "^2.0.3",
2424+ "whatwg-mimetype": "^2.3.0",
2425+ "whatwg-url": "^8.0.0"
2426+ },
2427+ "dependencies": {
2428+ "tr46": {
2429+ "version": "2.1.0",
2430+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
2431+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
2432+ "requires": {
2433+ "punycode": "^2.1.1"
2434+ }
2435+ },
2436+ "webidl-conversions": {
2437+ "version": "6.1.0",
2438+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
2439+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
2440+ },
2441+ "whatwg-url": {
2442+ "version": "8.7.0",
2443+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
2444+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
2445+ "requires": {
2446+ "lodash": "^4.7.0",
2447+ "tr46": "^2.1.0",
2448+ "webidl-conversions": "^6.1.0"
2449+ }
2450+ }
2451+ }
2452+ },
23342453 "debounce-fn": {
23352454 "version": "4.0.0",
23362455 "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz",
@@ -2354,6 +2473,11 @@
23542473 "ms": "2.0.0"
23552474 }
23562475 },
2476+ "decimal.js": {
2477+ "version": "10.3.1",
2478+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
2479+ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ=="
2480+ },
23572481 "decompress-response": {
23582482 "version": "4.2.1",
23592483 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
@@ -2367,6 +2491,11 @@
23672491 "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
23682492 "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
23692493 },
2494+ "deep-is": {
2495+ "version": "0.1.3",
2496+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
2497+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
2498+ },
23702499 "define-properties": {
23712500 "version": "1.1.3",
23722501 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -2381,6 +2510,11 @@
23812510 "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
23822511 "dev": true
23832512 },
2513+ "delayed-stream": {
2514+ "version": "1.0.0",
2515+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
2516+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
2517+ },
23842518 "delegates": {
23852519 "version": "1.0.0",
23862520 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -2455,6 +2589,21 @@
24552589 "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz",
24562590 "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ=="
24572591 },
2592+ "domexception": {
2593+ "version": "2.0.1",
2594+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
2595+ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
2596+ "requires": {
2597+ "webidl-conversions": "^5.0.0"
2598+ },
2599+ "dependencies": {
2600+ "webidl-conversions": {
2601+ "version": "5.0.0",
2602+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
2603+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
2604+ }
2605+ }
2606+ },
24582607 "ecdsa-sig-formatter": {
24592608 "version": "1.0.11",
24602609 "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -2578,11 +2727,36 @@
25782727 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
25792728 "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
25802729 },
2730+ "escodegen": {
2731+ "version": "2.0.0",
2732+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
2733+ "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
2734+ "requires": {
2735+ "esprima": "^4.0.1",
2736+ "estraverse": "^5.2.0",
2737+ "esutils": "^2.0.2",
2738+ "optionator": "^0.8.1",
2739+ "source-map": "~0.6.1"
2740+ },
2741+ "dependencies": {
2742+ "source-map": {
2743+ "version": "0.6.1",
2744+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2745+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2746+ "optional": true
2747+ }
2748+ }
2749+ },
25812750 "esprima": {
25822751 "version": "4.0.1",
25832752 "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
25842753 "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
25852754 },
2755+ "estraverse": {
2756+ "version": "5.2.0",
2757+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
2758+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
2759+ },
25862760 "estree-walker": {
25872761 "version": "0.6.1",
25882762 "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
@@ -2670,6 +2844,11 @@
26702844 "picomatch": "^2.2.1"
26712845 }
26722846 },
2847+ "fast-levenshtein": {
2848+ "version": "2.0.6",
2849+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
2850+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
2851+ },
26732852 "fast-xml-parser": {
26742853 "version": "3.19.0",
26752854 "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz",
@@ -2725,6 +2904,16 @@
27252904 "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
27262905 "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
27272906 },
2907+ "form-data": {
2908+ "version": "3.0.1",
2909+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
2910+ "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
2911+ "requires": {
2912+ "asynckit": "^0.4.0",
2913+ "combined-stream": "^1.0.8",
2914+ "mime-types": "^2.1.12"
2915+ }
2916+ },
27282917 "fraction.js": {
27292918 "version": "4.1.1",
27302919 "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz",
@@ -3053,6 +3242,14 @@
30533242 "minimalistic-crypto-utils": "^1.0.1"
30543243 }
30553244 },
3245+ "html-encoding-sniffer": {
3246+ "version": "2.0.1",
3247+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
3248+ "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
3249+ "requires": {
3250+ "whatwg-encoding": "^1.0.5"
3251+ }
3252+ },
30563253 "html-tags": {
30573254 "version": "3.1.0",
30583255 "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz",
@@ -3076,11 +3273,60 @@
30763273 "toidentifier": "1.0.0"
30773274 }
30783275 },
3276+ "http-proxy-agent": {
3277+ "version": "4.0.1",
3278+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
3279+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
3280+ "requires": {
3281+ "@tootallnate/once": "1",
3282+ "agent-base": "6",
3283+ "debug": "4"
3284+ },
3285+ "dependencies": {
3286+ "debug": {
3287+ "version": "4.3.1",
3288+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
3289+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
3290+ "requires": {
3291+ "ms": "2.1.2"
3292+ }
3293+ },
3294+ "ms": {
3295+ "version": "2.1.2",
3296+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
3297+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
3298+ }
3299+ }
3300+ },
30793301 "https-browserify": {
30803302 "version": "1.0.0",
30813303 "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
30823304 "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
30833305 },
3306+ "https-proxy-agent": {
3307+ "version": "5.0.0",
3308+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
3309+ "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
3310+ "requires": {
3311+ "agent-base": "6",
3312+ "debug": "4"
3313+ },
3314+ "dependencies": {
3315+ "debug": {
3316+ "version": "4.3.1",
3317+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
3318+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
3319+ "requires": {
3320+ "ms": "2.1.2"
3321+ }
3322+ },
3323+ "ms": {
3324+ "version": "2.1.2",
3325+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
3326+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
3327+ }
3328+ }
3329+ },
30843330 "human-signals": {
30853331 "version": "1.1.1",
30863332 "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
@@ -3304,6 +3550,11 @@
33043550 "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
33053551 "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
33063552 },
3553+ "is-potential-custom-element-name": {
3554+ "version": "1.0.1",
3555+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
3556+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
3557+ },
33073558 "is-promise": {
33083559 "version": "4.0.0",
33093560 "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
@@ -3400,6 +3651,70 @@
34003651 "esprima": "^4.0.0"
34013652 }
34023653 },
3654+ "jsdom": {
3655+ "version": "16.6.0",
3656+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz",
3657+ "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==",
3658+ "requires": {
3659+ "abab": "^2.0.5",
3660+ "acorn": "^8.2.4",
3661+ "acorn-globals": "^6.0.0",
3662+ "cssom": "^0.4.4",
3663+ "cssstyle": "^2.3.0",
3664+ "data-urls": "^2.0.0",
3665+ "decimal.js": "^10.2.1",
3666+ "domexception": "^2.0.1",
3667+ "escodegen": "^2.0.0",
3668+ "form-data": "^3.0.0",
3669+ "html-encoding-sniffer": "^2.0.1",
3670+ "http-proxy-agent": "^4.0.1",
3671+ "https-proxy-agent": "^5.0.0",
3672+ "is-potential-custom-element-name": "^1.0.1",
3673+ "nwsapi": "^2.2.0",
3674+ "parse5": "6.0.1",
3675+ "saxes": "^5.0.1",
3676+ "symbol-tree": "^3.2.4",
3677+ "tough-cookie": "^4.0.0",
3678+ "w3c-hr-time": "^1.0.2",
3679+ "w3c-xmlserializer": "^2.0.0",
3680+ "webidl-conversions": "^6.1.0",
3681+ "whatwg-encoding": "^1.0.5",
3682+ "whatwg-mimetype": "^2.3.0",
3683+ "whatwg-url": "^8.5.0",
3684+ "ws": "^7.4.5",
3685+ "xml-name-validator": "^3.0.0"
3686+ },
3687+ "dependencies": {
3688+ "acorn": {
3689+ "version": "8.4.1",
3690+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz",
3691+ "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA=="
3692+ },
3693+ "tr46": {
3694+ "version": "2.1.0",
3695+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
3696+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
3697+ "requires": {
3698+ "punycode": "^2.1.1"
3699+ }
3700+ },
3701+ "webidl-conversions": {
3702+ "version": "6.1.0",
3703+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
3704+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
3705+ },
3706+ "whatwg-url": {
3707+ "version": "8.7.0",
3708+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
3709+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
3710+ "requires": {
3711+ "lodash": "^4.7.0",
3712+ "tr46": "^2.1.0",
3713+ "webidl-conversions": "^6.1.0"
3714+ }
3715+ }
3716+ }
3717+ },
34033718 "json5": {
34043719 "version": "1.0.1",
34053720 "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
@@ -3478,6 +3793,15 @@
34783793 "graceful-fs": "^4.1.9"
34793794 }
34803795 },
3796+ "levn": {
3797+ "version": "0.3.0",
3798+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
3799+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
3800+ "requires": {
3801+ "prelude-ls": "~1.1.2",
3802+ "type-check": "~0.3.2"
3803+ }
3804+ },
34813805 "loader-utils": {
34823806 "version": "1.2.3",
34833807 "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
@@ -4318,6 +4642,11 @@
43184642 "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
43194643 "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
43204644 },
4645+ "nwsapi": {
4646+ "version": "2.2.0",
4647+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
4648+ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
4649+ },
43214650 "object-assign": {
43224651 "version": "4.1.1",
43234652 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -4383,6 +4712,19 @@
43834712 "mimic-fn": "^2.1.0"
43844713 }
43854714 },
4715+ "optionator": {
4716+ "version": "0.8.3",
4717+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
4718+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
4719+ "requires": {
4720+ "deep-is": "~0.1.3",
4721+ "fast-levenshtein": "~2.0.6",
4722+ "levn": "~0.3.0",
4723+ "prelude-ls": "~1.1.2",
4724+ "type-check": "~0.3.2",
4725+ "word-wrap": "~1.2.3"
4726+ }
4727+ },
43864728 "os-browserify": {
43874729 "version": "0.3.0",
43884730 "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
@@ -4497,6 +4839,24 @@
44974839 }
44984840 }
44994841 },
4842+ "parse-numeric-range": {
4843+ "version": "1.2.0",
4844+ "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz",
4845+ "integrity": "sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg=="
4846+ },
4847+ "parse5": {
4848+ "version": "6.0.1",
4849+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
4850+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
4851+ },
4852+ "parse5-htmlparser2-tree-adapter": {
4853+ "version": "6.0.1",
4854+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
4855+ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
4856+ "requires": {
4857+ "parse5": "^6.0.1"
4858+ }
4859+ },
45004860 "path-browserify": {
45014861 "version": "1.0.1",
45024862 "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
@@ -4669,6 +5029,11 @@
46695029 "tunnel-agent": "^0.6.0"
46705030 }
46715031 },
5032+ "prelude-ls": {
5033+ "version": "1.1.2",
5034+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
5035+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
5036+ },
46725037 "prettier": {
46735038 "version": "2.3.1",
46745039 "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz",
@@ -4740,6 +5105,11 @@
47405105 }
47415106 }
47425107 },
5108+ "prismjs": {
5109+ "version": "1.24.0",
5110+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.24.0.tgz",
5111+ "integrity": "sha512-SqV5GRsNqnzCL8k5dfAjCNhUrF3pR0A9lTDSCUZeh/LIshheXJEaP0hwLz2t4XHivd2J/v2HR+gRnigzeKe3cQ=="
5112+ },
47435113 "process": {
47445114 "version": "0.11.10",
47455115 "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@@ -4768,6 +5138,11 @@
47685138 "xtend": "^4.0.0"
47695139 }
47705140 },
5141+ "psl": {
5142+ "version": "1.8.0",
5143+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
5144+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
5145+ },
47715146 "public-encrypt": {
47725147 "version": "4.0.3",
47735148 "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
@@ -5012,6 +5387,22 @@
50125387 "mdast-util-from-markdown": "^0.8.0"
50135388 }
50145389 },
5390+ "remark-prism": {
5391+ "version": "1.3.6",
5392+ "resolved": "https://registry.npmjs.org/remark-prism/-/remark-prism-1.3.6.tgz",
5393+ "integrity": "sha512-yYSXJ2MEK2DeD9UKDKFkQPcVqRx6aX2FYD1kE27ScogpZ/BBO8MoOO6gf/AKqfXvKGnP51wqvDEBmPseypgaug==",
5394+ "requires": {
5395+ "classnames": "^2.3.1",
5396+ "css-selector-parser": "^1.4.1",
5397+ "escape-html": "^1.0.3",
5398+ "jsdom": "^16.5.3",
5399+ "parse-numeric-range": "^1.2.0",
5400+ "parse5": "^6.0.1",
5401+ "parse5-htmlparser2-tree-adapter": "^6.0.1",
5402+ "prismjs": "^1.23.0",
5403+ "unist-util-map": "^2.0.1"
5404+ }
5405+ },
50155406 "remark-react": {
50165407 "version": "8.0.0",
50175408 "resolved": "https://registry.npmjs.org/remark-react/-/remark-react-8.0.0.tgz",
@@ -5146,6 +5537,14 @@
51465537 "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
51475538 "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
51485539 },
5540+ "saxes": {
5541+ "version": "5.0.1",
5542+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
5543+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
5544+ "requires": {
5545+ "xmlchars": "^2.2.0"
5546+ }
5547+ },
51495548 "scheduler": {
51505549 "version": "0.20.2",
51515550 "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
@@ -5500,6 +5899,11 @@
55005899 }
55015900 }
55025901 },
5902+ "symbol-tree": {
5903+ "version": "3.2.4",
5904+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
5905+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
5906+ },
55035907 "tailwindcss": {
55045908 "version": "2.1.4",
55055909 "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.1.4.tgz",
@@ -5653,6 +6057,23 @@
56536057 "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz",
56546058 "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="
56556059 },
6060+ "tough-cookie": {
6061+ "version": "4.0.0",
6062+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
6063+ "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
6064+ "requires": {
6065+ "psl": "^1.1.33",
6066+ "punycode": "^2.1.1",
6067+ "universalify": "^0.1.2"
6068+ },
6069+ "dependencies": {
6070+ "universalify": {
6071+ "version": "0.1.2",
6072+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
6073+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
6074+ }
6075+ }
6076+ },
56566077 "tr46": {
56576078 "version": "1.0.1",
56586079 "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
@@ -5689,6 +6110,14 @@
56896110 "safe-buffer": "^5.0.1"
56906111 }
56916112 },
6113+ "type-check": {
6114+ "version": "0.3.2",
6115+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
6116+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
6117+ "requires": {
6118+ "prelude-ls": "~1.1.2"
6119+ }
6120+ },
56926121 "type-fest": {
56936122 "version": "0.7.1",
56946123 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
@@ -5733,6 +6162,15 @@
57336162 "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
57346163 "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A=="
57356164 },
6165+ "unist-util-map": {
6166+ "version": "2.0.1",
6167+ "resolved": "https://registry.npmjs.org/unist-util-map/-/unist-util-map-2.0.1.tgz",
6168+ "integrity": "sha512-VdNvk4BQUUU9Rgr8iUOvclHa/iN9O+6Dt66FKij8l9OVezGG37gGWCPU5KSax1R2degqXFvl3kWTkvzL79e9tQ==",
6169+ "requires": {
6170+ "@types/mdast": "^3.0.0",
6171+ "object-assign": "^4.0.0"
6172+ }
6173+ },
57366174 "unist-util-position": {
57376175 "version": "3.1.0",
57386176 "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz",
@@ -5849,6 +6287,22 @@
58496287 "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
58506288 "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
58516289 },
6290+ "w3c-hr-time": {
6291+ "version": "1.0.2",
6292+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
6293+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
6294+ "requires": {
6295+ "browser-process-hrtime": "^1.0.0"
6296+ }
6297+ },
6298+ "w3c-xmlserializer": {
6299+ "version": "2.0.0",
6300+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
6301+ "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
6302+ "requires": {
6303+ "xml-name-validator": "^3.0.0"
6304+ }
6305+ },
58526306 "watchpack": {
58536307 "version": "2.1.1",
58546308 "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz",
@@ -5868,6 +6322,29 @@
58686322 "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
58696323 "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
58706324 },
6325+ "whatwg-encoding": {
6326+ "version": "1.0.5",
6327+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
6328+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
6329+ "requires": {
6330+ "iconv-lite": "0.4.24"
6331+ },
6332+ "dependencies": {
6333+ "iconv-lite": {
6334+ "version": "0.4.24",
6335+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
6336+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
6337+ "requires": {
6338+ "safer-buffer": ">= 2.1.2 < 3"
6339+ }
6340+ }
6341+ }
6342+ },
6343+ "whatwg-mimetype": {
6344+ "version": "2.3.0",
6345+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
6346+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
6347+ },
58716348 "whatwg-url": {
58726349 "version": "7.1.0",
58736350 "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
@@ -5920,11 +6397,31 @@
59206397 "string-width": "^1.0.2 || 2"
59216398 }
59226399 },
6400+ "word-wrap": {
6401+ "version": "1.2.3",
6402+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
6403+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
6404+ },
59236405 "wrappy": {
59246406 "version": "1.0.2",
59256407 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
59266408 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
59276409 },
6410+ "ws": {
6411+ "version": "7.5.1",
6412+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.1.tgz",
6413+ "integrity": "sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow=="
6414+ },
6415+ "xml-name-validator": {
6416+ "version": "3.0.0",
6417+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
6418+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
6419+ },
6420+ "xmlchars": {
6421+ "version": "2.2.0",
6422+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
6423+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
6424+ },
59286425 "xtend": {
59296426 "version": "4.0.2",
59306427 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
package.json+1
@@ -23,6 +23,7 @@
2323 "remark-heading-id": "^1.0.0",
2424 "remark-html": "^13.0.1",
2525 "remark-parse": "^9.0.0",
26+ "remark-prism": "^1.3.6",
2627 "remark-react": "^8.0.0",
2728 "remark-slug": "^6.0.0",
2829 "toml": "^3.0.0",
pages/_app.js+1
@@ -3,6 +3,7 @@ import { useState } from "react";
33import { configure, GlobalHotKeys } from "react-hotkeys";
44import Search from "../components/Search";
55import "../styles/globals.css";
6+import "../styles/prism.css";
67
78function MyApp({ Component, pageProps }) {
89 const [showSearch, toggleSearch] = useState(false);
pages/blog/[slug].js+14−5
@@ -18,8 +18,15 @@ import SingleColumn from "../../components/SingleColumn";
1818import NewsletterSignup from "../../components/NewletterSignup";
1919import PostPreview from "../../components/PostPreview";
2020import { name, contact } from "../../lib/constants";
21+import markdownStyles from "../../styles/markdown.module.css";
2122
22−export default function Post({ post, nextPost, previousPost, toggleSearch }) {
23+export default function Post({
24+ post,
25+ nextPost,
26+ previousPost,
27+ markdown,
28+ toggleSearch,
29+}) {
2330 const router = useRouter();
2431 if (!router.isFallback && !post?.slug) {
2532 return <ErrorPage />;
@@ -40,9 +47,9 @@ export default function Post({ post, nextPost, previousPost, toggleSearch }) {
4047 {formatDate(new Date(post.date))}
4148 </div>
4249 </section>
43− <article className="layout-wide">
44− <Markdown post={post} />
45− </article>
50+ <div className={"layout-wide " + markdownStyles["markdown"]}>
51+ <article dangerouslySetInnerHTML={{ __html: markdown }}></article>
52+ </div>
4653 <section className="layout-narrow">
4754 <div className="measure">
4855 <h4 className="pb-6">
@@ -124,8 +131,10 @@ export async function getStaticProps({ params }) {
124131 "blog"
125132 );
126133
134+ const markdown = await Markdown({ post });
135+
127136 return {
128− props: { post, nextPost, previousPost },
137+ props: { post, markdown, nextPost, previousPost },
129138 };
130139}
131140
pages/docs/[[...slug]].js+8−2
@@ -8,6 +8,7 @@ import { getDocs, formatDate, buildPageTree, getPage } from "../../lib/lib";
88import Markdown from "../../components/Markdown";
99import ContentArea from "../../components/ContentArea";
1010import Sidebar from "../../components/Sidebar";
11+import markdownStyles from "../../styles/markdown.module.css";
1112
1213const breadcrumbs = (posts, paths) => {
1314 const results = [
@@ -100,6 +101,7 @@ export default function DocsLayout({
100101 content,
101102 params,
102103 toggleSearch,
104+ markdown,
103105}) {
104106 return (
105107 <>
@@ -113,7 +115,9 @@ export default function DocsLayout({
113115 title={data.title}
114116 toggleSearch={() => toggleSearch(true)}
115117 >
116− <Markdown post={{ content: content }} />
118+ <div className={markdownStyles["markdown"]}>
119+ <article dangerouslySetInnerHTML={{ __html: markdown }}></article>
120+ </div>
117121 </ContentArea>
118122 </div>
119123 </>
@@ -127,7 +131,9 @@ export async function getStaticProps({ params }) {
127131 join(process.cwd(), "content/docs", params.slug?.join("/") || "/")
128132 );
129133
130− return { props: { posts, data, content, params } };
134+ const markdown = await Markdown({ post: { content: content } });
135+
136+ return { props: { posts, data, markdown, params } };
131137}
132138
133139export async function getStaticPaths() {
pages/events/[slug].js+17−5
@@ -18,8 +18,15 @@ import SingleColumn from "../../components/SingleColumn";
1818import NewsletterSignup from "../../components/NewletterSignup";
1919import PostPreview from "../../components/PostPreview";
2020import { name, contact } from "../../lib/constants";
21+import markdownStyles from "../../styles/markdown.module.css";
2122
22−export default function Event({ post, nextPost, previousPost, toggleSearch }) {
23+export default function Event({
24+ post,
25+ nextPost,
26+ previousPost,
27+ markdown,
28+ toggleSearch,
29+}) {
2330 const router = useRouter();
2431 if (!router.isFallback && !post?.slug) {
2532 return <ErrorPage />;
@@ -53,9 +60,12 @@ export default function Event({ post, nextPost, previousPost, toggleSearch }) {
5360 ></iframe>
5461 ) : null}
5562 </section>
56− <article className="flex flex-col items-center pt-12 w-full">
57− <Markdown post={post} />
58− </article>
63+ <div className={"layout-wide " + markdownStyles["markdown"]}>
64+ <article
65+ className="flex flex-col items-center pt-12 w-full"
66+ dangerouslySetInnerHTML={{ __html: markdown }}
67+ ></article>
68+ </div>
5969 <section className="layout-narrow pt-24">
6070 <div className="measure">
6171 <h4 className="pb-6">
@@ -137,8 +147,10 @@ export async function getStaticProps({ params }) {
137147 "events"
138148 );
139149
150+ const markdown = await Markdown({ post });
151+
140152 return {
141− props: { post, nextPost, previousPost },
153+ props: { post, markdown, nextPost, previousPost },
142154 };
143155}
144156
pages/grants/[slug].js+8−5
@@ -18,8 +18,9 @@ import SingleColumn from "../../components/SingleColumn";
1818import NewsletterSignup from "../../components/NewletterSignup";
1919import PostPreview from "../../components/PostPreview";
2020import { name, contact } from "../../lib/constants";
21+import markdownStyles from "../../styles/markdown.module.css";
2122
22−export default function Grant({ post, nextPost, previousPost }) {
23+export default function Grant({ post, nextPost, markdown, previousPost }) {
2324 const router = useRouter();
2425 if (!router.isFallback && !post?.slug) {
2526 return <ErrorPage />;
@@ -41,9 +42,9 @@ export default function Grant({ post, nextPost, previousPost }) {
4142 {formatDate(new Date(post.date))}
4243 </div>
4344 </section>
44− <article className="layout-wide">
45− <Markdown post={post} />
46− </article>
45+ <div className={"layout-wide " + markdownStyles["markdown"]}>
46+ <article dangerouslySetInnerHTML={{ __html: markdown }}></article>
47+ </div>
4748 <section className="layout-narrow">
4849 <div className="measure">
4950 <h4 className="pb-6">
@@ -125,8 +126,10 @@ export async function getStaticProps({ params }) {
125126 "grants"
126127 );
127128
129+ const markdown = await Markdown({ post });
130+
128131 return {
129− props: { post, nextPost, previousPost },
132+ props: { post, markdown, nextPost, previousPost },
130133 };
131134}
132135
styles/markdown.module.css+4−2
@@ -62,11 +62,13 @@
6262 }
6363}
6464
65−.markdown pre {
65+.markdown pre,
66+.markdown pre[class*="language-"] {
6667 @apply p-8 bg-wall rounded-lg;
6768}
6869
69−.markdown code {
70+.markdown code,
71+.markdown code[class*="language-"] {
7072 @apply px-2 py-0.5 bg-wall rounded-lg;
7173}
7274
styles/prism.cssnew file+165
@@ -0,0 +1,165 @@
1+/* PrismJS 1.24.0
2+https://prismjs.com/download.html#themes=prism-coy&languages=markup+css+clike+javascript */
3+/**
4+ * prism.js Coy theme for JavaScript, CoffeeScript, CSS and HTML
5+ * Based on https://github.com/tshedor/workshop-wp-theme (Example: http://workshop.kansan.com/category/sessions/basics or http://workshop.timshedor.com/category/sessions/basics);
6+ * @author Tim Shedor
7+ */
8+
9+code[class*="language-"],
10+pre[class*="language-"] {
11+ color: black;
12+ background: none;
13+ font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;
14+ font-size: 1em;
15+ text-align: left;
16+ white-space: pre;
17+ word-spacing: normal;
18+ word-break: normal;
19+ word-wrap: normal;
20+ line-height: 1.5;
21+
22+ -moz-tab-size: 4;
23+ -o-tab-size: 4;
24+ tab-size: 4;
25+
26+ -webkit-hyphens: none;
27+ -moz-hyphens: none;
28+ -ms-hyphens: none;
29+ hyphens: none;
30+}
31+
32+/* Code blocks */
33+pre[class*="language-"] {
34+ position: relative;
35+ overflow: visible;
36+}
37+
38+code[class*="language-"] {
39+ max-height: inherit;
40+ height: inherit;
41+ display: block;
42+ overflow: auto;
43+}
44+
45+/* Inline code */
46+:not(pre) > code[class*="language-"] {
47+ position: relative;
48+ border-radius: 0.3em;
49+ color: #c92c2c;
50+ display: inline;
51+ white-space: normal;
52+}
53+
54+.token.comment,
55+.token.block-comment,
56+.token.prolog,
57+.token.doctype,
58+.token.cdata {
59+ color: #7d8b99;
60+}
61+
62+.token.punctuation {
63+ color: #5f6364;
64+}
65+
66+.token.property,
67+.token.tag,
68+.token.boolean,
69+.token.number,
70+.token.function-name,
71+.token.constant,
72+.token.symbol,
73+.token.deleted {
74+ color: #c92c2c;
75+}
76+
77+.token.selector,
78+.token.attr-name,
79+.token.string,
80+.token.char,
81+.token.function,
82+.token.builtin,
83+.token.inserted {
84+ color: #2f9c0a;
85+}
86+
87+.token.operator,
88+.token.entity,
89+.token.url,
90+.token.variable {
91+ color: #a67f59;
92+ background: rgba(255, 255, 255, 0.5);
93+}
94+
95+.token.atrule,
96+.token.attr-value,
97+.token.keyword,
98+.token.class-name {
99+ color: #1990b8;
100+}
101+
102+.token.regex,
103+.token.important {
104+ color: #e90;
105+}
106+
107+.language-css .token.string,
108+.style .token.string {
109+ color: #a67f59;
110+ background: rgba(255, 255, 255, 0.5);
111+}
112+
113+.token.important {
114+ font-weight: normal;
115+}
116+
117+.token.bold {
118+ font-weight: bold;
119+}
120+.token.italic {
121+ font-style: italic;
122+}
123+
124+.token.entity {
125+ cursor: help;
126+}
127+
128+.token.namespace {
129+ opacity: 0.7;
130+}
131+
132+@media screen and (max-width: 767px) {
133+ pre[class*="language-"]:before,
134+ pre[class*="language-"]:after {
135+ bottom: 14px;
136+ box-shadow: none;
137+ }
138+}
139+
140+/* Plugin styles: Line Numbers */
141+pre[class*="language-"].line-numbers.line-numbers {
142+ padding-left: 0;
143+}
144+
145+pre[class*="language-"].line-numbers.line-numbers code {
146+ padding-left: 3.8em;
147+}
148+
149+pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows {
150+ left: 0;
151+}
152+
153+/* Plugin styles: Line Highlight */
154+pre[class*="language-"][data-line] {
155+ padding-top: 0;
156+ padding-bottom: 0;
157+ padding-left: 0;
158+}
159+pre[data-line] code {
160+ position: relative;
161+ padding-left: 4em;
162+}
163+pre .line-highlight {
164+ margin-top: 0;
165+}