diff --git a/api/package-lock.json b/api/package-lock.json index 40ba04f..2702f12 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -1,11 +1,11 @@ { - "name": "calebburke-api", + "name": "calebburkedev-api", "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "calebburke-api", + "name": "calebburkedev-api", "version": "0.0.1", "license": "ISC", "dependencies": { @@ -8131,4 +8131,4 @@ } } } -} +} \ No newline at end of file diff --git a/api/package.json b/api/package.json index 738a1ff..77f364d 100644 --- a/api/package.json +++ b/api/package.json @@ -1,5 +1,5 @@ { - "name": "calebburke-api", + "name": "calebburkedev-api", "private": true, "version": "0.0.1", "description": "calebburke.dev Backend", diff --git a/web/package-lock.json b/web/package-lock.json index dc368a4..2b0bcac 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,11 +1,11 @@ { - "name": "calebburke-web", + "name": "calebburkedev-web", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "calebburke-web", + "name": "calebburkedev-web", "version": "0.1.0", "dependencies": { "@auth0/auth0-vue": "^2.5.0", @@ -17,9 +17,11 @@ "dompurify": "^3.3.3", "grid-layout-plus": "^1.1.1", "js-yaml": "^4.1.0", + "katex": "^0.17.0", "lodash": "^4.17.21", "luxon": "^3.7.2", "marked": "^17.0.5", + "marked-katex-extension": "^5.1.10", "md5": "^2.3.0", "qs": "^6.14.0", "validator": "^13.15.26", @@ -4146,6 +4148,31 @@ "jsox": "lib/cli.js" } }, + "node_modules/katex": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.17.0.tgz", + "integrity": "sha512-Vdw0ATsQ9V+LuegM/BTwQqV/6cTl5lbGcIrU+BCgLxyf6bo38ybOr372tuSIxir3CN720flu1meYR6XzNMwQnw==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4243,6 +4270,16 @@ "node": ">= 20" } }, + "node_modules/marked-katex-extension": { + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/marked-katex-extension/-/marked-katex-extension-5.1.10.tgz", + "integrity": "sha512-TuqrzguLeXXm6iBaf16leL3+dVmMj8KrBdunMVVzxMS/bwcjtQ0YG0sNytl1j7uUo8yClsXJqBbVjH1yOPurwQ==", + "license": "MIT", + "peerDependencies": { + "katex": ">=0.16 <0.18", + "marked": ">=4 <19" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", diff --git a/web/package.json b/web/package.json index 72ec985..4cc4a47 100644 --- a/web/package.json +++ b/web/package.json @@ -1,5 +1,5 @@ { - "name": "calebburke-web", + "name": "calebburkedev-web", "private": true, "version": "0.1.0", "type": "module", @@ -21,9 +21,11 @@ "dompurify": "^3.3.3", "grid-layout-plus": "^1.1.1", "js-yaml": "^4.1.0", + "katex": "^0.17.0", "lodash": "^4.17.21", "luxon": "^3.7.2", "marked": "^17.0.5", + "marked-katex-extension": "^5.1.10", "md5": "^2.3.0", "qs": "^6.14.0", "validator": "^13.15.26", @@ -60,4 +62,4 @@ "vitest": "^3.2.4", "vue-tsc": "^3.2.1" } -} \ No newline at end of file +} diff --git a/web/src/utils/render-markdown.ts b/web/src/utils/render-markdown.ts new file mode 100644 index 0000000..ab5fa49 --- /dev/null +++ b/web/src/utils/render-markdown.ts @@ -0,0 +1,12 @@ +import DOMPurify from "dompurify" +import { marked } from "marked" +import markedKatex from "marked-katex-extension" +import "katex/dist/katex.min.css" + +marked.use(markedKatex({ throwOnError: false })) + +export function renderMarkdown(source: string): string { + return DOMPurify.sanitize(marked.parse(source) as string) +} + +export default renderMarkdown