From e823b1d676bc11ef09f413dd8a37d6edc372aa9e Mon Sep 17 00:00:00 2001 From: Jade Ellis Date: Mon, 15 Jul 2024 13:58:21 +0100 Subject: [PATCH] Add basic blog functionality --- packages/website/mdsvex.config.js | 127 +++++---- packages/website/package.json | 6 +- packages/website/src/lib/Nav.svelte | 4 +- packages/website/src/params/number.js | 3 + .../website/src/routes/blog/+page.server.ts | 8 + packages/website/src/routes/blog/+page.svelte | 31 +++ .../blog/[...date]/[slug]/+page.server.ts | 43 ++++ .../routes/blog/[...date]/[slug]/+page.svelte | 27 ++ .../src/routes/blog/[...date]/[slug]/+page.ts | 22 ++ packages/website/src/routes/blog/posts.ts | 106 ++++++++ .../src/routes/sitemap[[page]].xml/+server.ts | 7 +- packages/website/svelte.config.js | 2 +- pnpm-lock.yaml | 243 ++++++++++++++---- 13 files changed, 514 insertions(+), 115 deletions(-) create mode 100644 packages/website/src/params/number.js create mode 100644 packages/website/src/routes/blog/+page.server.ts create mode 100644 packages/website/src/routes/blog/+page.svelte create mode 100644 packages/website/src/routes/blog/[...date]/[slug]/+page.server.ts create mode 100644 packages/website/src/routes/blog/[...date]/[slug]/+page.svelte create mode 100644 packages/website/src/routes/blog/[...date]/[slug]/+page.ts create mode 100644 packages/website/src/routes/blog/posts.ts diff --git a/packages/website/mdsvex.config.js b/packages/website/mdsvex.config.js index eb9e95e0..5f52a6e9 100644 --- a/packages/website/mdsvex.config.js +++ b/packages/website/mdsvex.config.js @@ -1,12 +1,20 @@ -import { defineMDSveXConfig as defineConfig } from "mdsvex"; +// https://github.com/String10/Hakuba/blob/master/package.json +// import { defineMDSveXConfig as defineConfig } from "mdsvex"; // import type { Plugin, Settings } from 'unified'; import remarkGfm from "remark-gfm"; import remarkFrontmatter from "remark-frontmatter"; -import remarkMath from "remark-math"; import remarkWikiLink, { } from "remark-wiki-link"; -import slug from 'rehype-slug'; +import remarkMath from "remark-math" +// @ts-ignore +import remarkAbbr from "remark-abbr" +import remarkFootnotes from 'remark-footnotes' + +import rehypeKatexSvelte from 'rehype-katex-svelte'; +// import github from "remark-github"; + +import rehypeSlug from 'rehype-slug'; import { parse, format } from "node:path"; @@ -57,61 +65,68 @@ function pageResolver(pageName) { } const hrefTemplate = (/** @type {string} */ permalink) => `#${permalink}` +/** + * @type {import("mdsvex").MdsvexOptions} + */ +const config = { + extensions: [".svelte.md", ".md", ".svx"], -const config = defineConfig({ - extensions: [".svelte.md", ".md", ".svx"], + // fences: true, + // ruleSpaces: false, + smartypants: { + dashes: "oldschool", + }, -// fences: true, -// ruleSpaces: false, - smartypants: { - dashes: "oldschool", - }, - - highlight: { - alias: { - ts: "typescript", - mdx: "markdown", - svelte: "svelte", - svx: "svx", - mdsvex: "svx", - sig: "ts", - } - }, + highlight: { + alias: { + ts: "typescript", + mdx: "markdown", + svelte: "svelte", + svx: "svx", + mdsvex: "svx", + sig: "ts", + } + }, - remarkPlugins: [ - remarkGfm, - remarkFrontmatter, - remarkMath, - [remarkWikiLink, { - // @ts-ignore - aliasDivider: "|", - permalinks: permalinks, - pageResolver, - hrefTemplate, - - // wikiLinkClassName, - // newClassName, - }], - // [citePlugin, { - // syntax: { - // // see micromark-extension-cite - // enableAltSyntax: false, - // enablePandocSyntax: true, - // }, - // toMarkdown: { - // // see mdast-util-cite - // standardizeAltSyntax: false, - // enableAuthorSuppression: true, - // useNodeValue: false, - // }, - // }], - // [remarkBibliography, { bibliography }], - // [remarkMermaid, {}] - ], - rehypePlugins: [ - // @ts-ignore - slug - ], -}); + remarkPlugins: [ + // remarkFrontmatter, + // [github, {repository}], + remarkMath, + remarkAbbr, + [remarkFootnotes, { inlineNotes: true }], + remarkGfm, + [remarkWikiLink, { + // @ts-ignore + aliasDivider: "|", + permalinks: permalinks, + pageResolver, + hrefTemplate, + + // wikiLinkClassName, + // newClassName, + }], + // [citePlugin, { + // syntax: { + // // see micromark-extension-cite + // enableAltSyntax: false, + // enablePandocSyntax: true, + // }, + // toMarkdown: { + // // see mdast-util-cite + // standardizeAltSyntax: false, + // enableAuthorSuppression: true, + // useNodeValue: false, + // }, + // }], + // [remarkBibliography, { bibliography }], + // [remarkMermaid, {}] + ], + rehypePlugins: [ + // @ts-ignore + rehypeKatexSvelte, + // @ts-ignore + rehypeSlug + ], +}; export default config; diff --git a/packages/website/package.json b/packages/website/package.json index 0a097abe..57713ea7 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -22,10 +22,14 @@ "@types/sharedworker": "^0.0.115", "glob": "^10.4.1", "mdsvex": "^0.11.2", + "rehype-katex-svelte": "1.2", "rehype-slug": "^6.0.0", + "remark-abbr": "^1.4.2", + "remark-footnotes": "2", "remark-frontmatter": "^5.0.0", "remark-gfm": "^4.0.0", - "remark-math": "^6.0.0", + "remark-github": "^12.0.0", + "remark-math": "^3.0.1", "remark-wiki-link": "^2.0.1", "rollup": "^4.18.0", "rollup-plugin-type-as-json-schema": "^0.2.6", diff --git a/packages/website/src/lib/Nav.svelte b/packages/website/src/lib/Nav.svelte index d0f93a96..dff6425f 100644 --- a/packages/website/src/lib/Nav.svelte +++ b/packages/website/src/lib/Nav.svelte @@ -24,8 +24,8 @@ +
  • Art
  • --> +
  • Blog
  • diff --git a/packages/website/src/params/number.js b/packages/website/src/params/number.js new file mode 100644 index 00000000..99478ac1 --- /dev/null +++ b/packages/website/src/params/number.js @@ -0,0 +1,3 @@ +export function match(value) { + return /^\d+$/.test(value); +} \ No newline at end of file diff --git a/packages/website/src/routes/blog/+page.server.ts b/packages/website/src/routes/blog/+page.server.ts new file mode 100644 index 00000000..e5b3919d --- /dev/null +++ b/packages/website/src/routes/blog/+page.server.ts @@ -0,0 +1,8 @@ +import { pages } from './posts' + +export async function load({ params }) { + + return { + pages + } +} \ No newline at end of file diff --git a/packages/website/src/routes/blog/+page.svelte b/packages/website/src/routes/blog/+page.svelte new file mode 100644 index 00000000..108458c5 --- /dev/null +++ b/packages/website/src/routes/blog/+page.svelte @@ -0,0 +1,31 @@ + + +
    +

    Blog Posts

    + {#each pages as post, index} +
    +
    +

    + + {post.title} + +

    + {post.date} + {#if post.description} +

    {post.description}

    + {/if} +
    +
    + {:else} +

    No posts yet!

    + {/each} + +
    diff --git a/packages/website/src/routes/blog/[...date]/[slug]/+page.server.ts b/packages/website/src/routes/blog/[...date]/[slug]/+page.server.ts new file mode 100644 index 00000000..1ccaf85f --- /dev/null +++ b/packages/website/src/routes/blog/[...date]/[slug]/+page.server.ts @@ -0,0 +1,43 @@ +import { pages } from '../../posts' +import { error } from '@sveltejs/kit' +import TTLCache, { } from "@isaacs/ttlcache"; +import { parse } from "@tusbar/cache-control"; +const cache = new TTLCache({ max: 10000, ttl: 1000 }) + +import type { Endpoints } from "@octokit/types"; + +let repoRegex = new RegExp("https?://github\.com/(?[a-zA-Z0-9]+/[a-zA-Z0-9]+)/?") + +/** @type {import('./$types').PageServerLoad} */ +export async function load({ params }) { + const { slug } = params + let dateParts = params.date.split(/[\/-]/).map((p) => parseInt(p, 10)) + if (dateParts.length > 3) { + throw error(404, 'Post not found (bad date)') + } + + // let start = new Date(dateParts[0] || 1, dateParts[1] || 0, dateParts[2] || 0); + // // @ts-ignore + // let end = new Date(...dateParts); + // console.log(dateParts) + + // get post with metadata + const page = pages + .filter((post) => slug === post.slug) + .filter((post) => { + let date = new Date(post.date) + return ( + (!dateParts[0] || date.getFullYear() == dateParts[0]) && + (!dateParts[1] || date.getMonth()+1 == dateParts[1]) && + (!dateParts[2] || date.getDate() == dateParts[2]) + ) + })[0] + + if (!page) { + throw error(404, 'Post not found') + } + + return { + page + } +} \ No newline at end of file diff --git a/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte b/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte new file mode 100644 index 00000000..73263b87 --- /dev/null +++ b/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte @@ -0,0 +1,27 @@ + + + +

    {data.post.title}

    + + + diff --git a/packages/website/src/routes/blog/[...date]/[slug]/+page.ts b/packages/website/src/routes/blog/[...date]/[slug]/+page.ts new file mode 100644 index 00000000..251453fd --- /dev/null +++ b/packages/website/src/routes/blog/[...date]/[slug]/+page.ts @@ -0,0 +1,22 @@ +// import { pages } from './projects' +import { error } from '@sveltejs/kit' + + +/** @type {import('./$types').PageServerLoad} */ +export async function load({ data, params }) { + // if (!post) { + // throw error(404, 'Post not found') + // } + // load the markdown file based on slug + console.log(data) + const component = + // await import(data.page.filepath) + await import("Notes/Blogs/" + data.page.filepath.name + ".md") + // console.log(data.page.filepath) + + + return { + post: data.page, + component: component.default + } +} \ No newline at end of file diff --git a/packages/website/src/routes/blog/posts.ts b/packages/website/src/routes/blog/posts.ts new file mode 100644 index 00000000..7f6e88ed --- /dev/null +++ b/packages/website/src/routes/blog/posts.ts @@ -0,0 +1,106 @@ +import { browser } from '$app/environment' +// import { format } from 'date-fns' + +import slugify from 'slugify'; +import { parse, format, relative } from "node:path"; + +// we require some server-side APIs to parse all metadata +if (browser) { + throw new Error(`posts can only be imported server-side`) +} +// import { browser } from '$app/environment' +// import { format } from 'date-fns' +// import { parse } from 'node-html-parser' +// import readingTime from 'reading-time/lib/reading-time.js' + +// // we require some server-side APIs to parse all metadata +// if (browser) { +// throw new Error(`posts can only be imported server-side`) +// } + +// // Get all posts and add metadata +// export const posts = Object.entries(import.meta.glob('/posts/**/*.md', { eager: true })) +// .map(([filepath, post]) => { +// const html = parse(post.default.render().html) +// const preview = post.metadata.preview ? parse(post.metadata.preview) : html.querySelector('p') + +// return { +// ...post.metadata, + +// // generate the slug from the file path +// slug: filepath +// .replace(/(\/index)?\.md/, '') +// .split('/') +// .pop(), + +// // whether or not this file is `my-post.md` or `my-post/index.md` +// // (needed to do correct dynamic import in posts/[slug].svelte) +// isIndexFile: filepath.endsWith('/index.md'), + +// // format date as yyyy-MM-dd +// date: post.metadata.date +// ? format( +// // offset by timezone so that the date is correct +// addTimezoneOffset(new Date(post.metadata.date)), +// 'yyyy-MM-dd' +// ) +// : undefined, + +// preview: { +// html: preview.toString(), +// // text-only preview (i.e no html elements), used for SEO +// text: preview.structuredText ?? preview.toString() +// }, + +// // get estimated reading time for the post +// readingTime: readingTime(html.structuredText).text +// } +// }) +// // sort by date +// .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()) +// // add references to the next/previous post +// .map((post, index, allPosts) => ({ +// ...post, +// next: allPosts[index - 1], +// previous: allPosts[index + 1] +// })) +const dateRegex = /^((?\d{4})-(?[0][1-9]|1[0-2])-(?[0][1-9]|[1-2]\d|3[01]))\s*/ +export const pages = Object.entries(import.meta.glob('/node_modules/Notes/Blogs/*.md', { eager: true })) + .map(([filepath, post]) => { + let path = parse(filepath); + let title = path.name.replace(dateRegex, "") + + // @ts-ignore + // let {year, month, day}: { year: string, month: string, day: string } = path.name.match(dateRegex)?.groups; + + // console.log(year, month, day) + let date = path.name.match(dateRegex)[1]; + let datePath = date.replaceAll("-", "/") + let slug = slugify(title, { lower: true }) + return { + title, + date, + canonical: datePath + "/" + slug, + // @ts-ignore + ...post.metadata, + + slug, + // filepath: relative(import.meta.dirname, filepath) + filepath: path + } + }) + // sort by date + .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()) +// Get all posts and add metadata +// // add references to the next/previous post +// .map((post, index, allPosts) => ({ +// ...post, +// next: allPosts[index - 1], +// previous: allPosts[index + 1] +// })) + + +// function addTimezoneOffset(date) { +// const offsetInMilliseconds = new Date().getTimezoneOffset() * 60 * 1000 +// return new Date(new Date(date).getTime() + offsetInMilliseconds) +// } \ No newline at end of file diff --git a/packages/website/src/routes/sitemap[[page]].xml/+server.ts b/packages/website/src/routes/sitemap[[page]].xml/+server.ts index ddfa9843..0affbf10 100644 --- a/packages/website/src/routes/sitemap[[page]].xml/+server.ts +++ b/packages/website/src/routes/sitemap[[page]].xml/+server.ts @@ -6,8 +6,8 @@ import type { RequestHandler } from '@sveltejs/kit'; import slugify from 'slugify'; import { parse, format } from "node:path"; - -const pages = Object.entries(import.meta.glob('/node_modules/Notes/Projects/*.md', { eager: true })) +import { pages as blogPosts } from "../blog/posts" +const projects = Object.entries(import.meta.glob('/node_modules/Notes/Projects/*.md', { eager: true })) .map(([filepath, post]) => { return parse(filepath) }) @@ -27,7 +27,8 @@ export const GET: RequestHandler = async ({ params }) => { origin: SITE_URL, page: params.page, paramValues: { - '/projects/[slug]': pages + '/projects/[slug]': projects, + '/blog/[...date]/[slug]': blogPosts.map((post) => post.canonical) } }); }; \ No newline at end of file diff --git a/packages/website/svelte.config.js b/packages/website/svelte.config.js index 9f8cb83c..d0ed89d4 100644 --- a/packages/website/svelte.config.js +++ b/packages/website/svelte.config.js @@ -8,7 +8,7 @@ import cspDirectives from "./csp.js"; /** @type {import('@sveltejs/kit').Config} */ const config = { - extensions: [".svelte", ".md"], + extensions: ['.svelte', '.md', '.svelte.md'], // Consult https://kit.svelte.dev/docs/integrations#preprocessors // for more information about preprocessors diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86021369..e67cfa24 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,18 +116,30 @@ importers: mdsvex: specifier: ^0.11.2 version: 0.11.2(svelte@4.2.18) + rehype-katex-svelte: + specifier: '1.2' + version: 1.2.0 rehype-slug: specifier: ^6.0.0 version: 6.0.0 + remark-abbr: + specifier: ^1.4.2 + version: 1.4.2 + remark-footnotes: + specifier: '2' + version: 2.0.0 remark-frontmatter: specifier: ^5.0.0 version: 5.0.0 remark-gfm: specifier: ^4.0.0 version: 4.0.0 + remark-github: + specifier: ^12.0.0 + version: 12.0.0 remark-math: - specifier: ^6.0.0 - version: 6.0.0 + specifier: ^3.0.1 + version: 3.0.1 remark-wiki-link: specifier: ^2.0.1 version: 2.0.1 @@ -866,6 +878,9 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -875,9 +890,6 @@ packages: '@types/jsonwebtoken@9.0.6': resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} - '@types/katex@0.16.7': - resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -913,7 +925,7 @@ packages: '@codemirror/view': '>=6.0.0' Notes@file:packages/website/Notes-1.0.0.tgz: - resolution: {integrity: sha512-IfrtxNtg8KP6yOg6iUFDEDPyb5xFMpXF6Z++XsNnzCfnaNLoCZ3m6ZvoIkmLGymlx/K2oLuICpLHU/XH0VTq1Q==, tarball: file:packages/website/Notes-1.0.0.tgz} + resolution: {integrity: sha512-a8z5482+K/pZYkHbhVCn9LGMeidtlj7qlmaFKxdeKmlNtcZ0Sd04cqsvxPXMykjflQpTvF1FPHNPwSW8XsB7Ag==, tarball: file:packages/website/Notes-1.0.0.tgz} version: 1.0.0 acorn@8.12.0: @@ -980,6 +992,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} @@ -1084,6 +1099,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + command-line-args@5.2.1: resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} engines: {node: '>=4.0.0'} @@ -1131,6 +1149,9 @@ packages: css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-selector-parser@1.4.1: + resolution: {integrity: sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==} + css-tree@2.2.1: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -1188,6 +1209,10 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + directory-tree@3.5.1: resolution: {integrity: sha512-HqjZ49fDzUnKYUhHxVw9eKBqbQ+lL0v4kSBInlDlaktmLtGoV9tC54a6A0ZfYeIrkMHWTE6MwwmUXP477+UEKQ==} engines: {node: '>=10.0'} @@ -1340,12 +1365,27 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-from-string@2.0.0: + resolution: {integrity: sha512-9JlBGWh+RXbT8PDrdwYZloN6poib8xg7Vq+LgN5TTqnaMDO0YqfX4EyZd3Myel6yIXlDsgysiRB1CTjH2K+1Dg==} + + hast-util-has-property@2.0.1: + resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==} + hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + hast-util-select@5.0.5: + resolution: {integrity: sha512-QQhWMhgTFRhCaQdgTKzZ5g31GLQ9qRb1hZtDPMqQaOhpLBziWcshUS0uCR5IJ0U1jrK/mxg35fmcq+Dp/Cy2Aw==} + + hast-util-to-string@2.0.0: + resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} + hast-util-to-string@3.0.0: resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + html-minifier-terser@7.2.0: resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} engines: {node: ^14.13.1 || >=16.0.0} @@ -1534,9 +1574,6 @@ packages: mdast-util-gfm@3.0.0: resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} - mdast-util-math@3.0.0: - resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} - mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} @@ -1597,9 +1634,6 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-extension-math@3.0.0: - resolution: {integrity: sha512-iJ2Q28vBoEovLN5o3GO12CpqorQRYDPT+p4zW50tGwTfJB+iv/VnB6Ini+gqa24K97DwptMBBIvVX6Bjk49oyQ==} - micromark-extension-wiki-link@0.0.4: resolution: {integrity: sha512-dJc8AfnoU8BHkN+7fWZvIS20SMsMS1ZlxQUn6We67MqeKbOiEDZV5eEvCpwqGBijbJbxX3Kxz879L4K9HIiOvw==} @@ -1719,6 +1753,9 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + not@0.1.0: + resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -1781,6 +1818,9 @@ packages: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1795,6 +1835,9 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + rehype-katex-svelte@1.2.0: + resolution: {integrity: sha512-3mAa0J7LgMfaoU3oj9XLBIn5H/MyvWcOQcItoWhww/sABkcLpY73WsAs5mwH0c6cwYDYwJKaVVl2vNuL3wokeA==} + rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} @@ -1802,14 +1845,23 @@ packages: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} + remark-abbr@1.4.2: + resolution: {integrity: sha512-h/fS4aXiJ0B0yyPfNHtQuOI10DZvMkUG1jBhi7e9Bj666iJN6sgoh8KMsJ6P6jdfmq7FqcXZ0fk+t3OVJ5MePw==} + + remark-footnotes@2.0.0: + resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==} + remark-frontmatter@5.0.0: resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} - remark-math@6.0.0: - resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + remark-github@12.0.0: + resolution: {integrity: sha512-ByefQKFN184LeiGRCabfl7zUJsdlMYWEhiLX1gpmQ11yFg6xSuOTW7LVCv0oc1x+YvUMJW23NU36sJX2RWGgvg==} + + remark-math@3.0.1: + resolution: {integrity: sha512-epT77R/HK0x7NqrWHdSV75uNLwn8g9qTyMqCRCDujL0vj/6T6+yhdrR7mjELWtkse+Fw02kijAaBuVcHBor1+Q==} remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -1922,6 +1974,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -2052,6 +2107,9 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + to-vfile@8.0.0: + resolution: {integrity: sha512-IcmH1xB5576MJc9qcfEC/m/nQCFt3fzMHz45sSlgJyTWjRbKW1HAkJpuf3DgE57YzIlZcwcBZA5ENQbBo4aLkg==} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -2090,21 +2148,36 @@ packages: unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -2850,6 +2923,10 @@ snapshots: '@types/estree@1.0.5': {} + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.10 + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.2 @@ -2860,8 +2937,6 @@ snapshots: dependencies: '@types/node': 20.14.2 - '@types/katex@0.16.7': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.2 @@ -2948,6 +3023,8 @@ snapshots: balanced-match@1.0.2: {} + bcp-47-match@2.0.3: {} + before-after-hook@2.2.3: {} binary-extensions@2.3.0: {} @@ -3062,6 +3139,8 @@ snapshots: color-convert: 2.0.1 color-string: 1.9.1 + comma-separated-tokens@2.0.3: {} + command-line-args@5.2.1: dependencies: array-back: 3.1.0 @@ -3108,6 +3187,8 @@ snapshots: domutils: 3.1.0 nth-check: 2.1.1 + css-selector-parser@1.4.1: {} + css-tree@2.2.1: dependencies: mdn-data: 2.0.28 @@ -3150,6 +3231,8 @@ snapshots: dependencies: dequal: 2.0.3 + direction@2.0.1: {} + directory-tree@3.5.1: dependencies: command-line-args: 5.2.1 @@ -3321,14 +3404,44 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-from-string@2.0.0: + dependencies: + '@types/hast': 2.3.10 + + hast-util-has-property@2.0.1: {} + hast-util-heading-rank@3.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-select@5.0.5: + dependencies: + '@types/hast': 2.3.10 + '@types/unist': 2.0.10 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 1.4.1 + direction: 2.0.1 + hast-util-has-property: 2.0.1 + hast-util-to-string: 2.0.0 + hast-util-whitespace: 2.0.1 + not: 0.1.0 + nth-check: 2.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + + hast-util-to-string@2.0.0: + dependencies: + '@types/hast': 2.3.10 + hast-util-to-string@3.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-whitespace@2.0.1: {} + html-minifier-terser@7.2.0: dependencies: camel-case: 4.1.2 @@ -3575,18 +3688,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-math@3.0.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - longest-streak: 3.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - unist-util-remove-position: 5.0.0 - transitivePeerDependencies: - - supports-color - mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 @@ -3721,16 +3822,6 @@ snapshots: micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 - micromark-extension-math@3.0.0: - dependencies: - '@types/katex': 0.16.7 - devlop: 1.1.0 - katex: 0.16.10 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - micromark-extension-wiki-link@0.0.4: dependencies: '@babel/runtime': 7.24.7 @@ -3893,6 +3984,8 @@ snapshots: normalize-path@3.0.0: {} + not@0.1.0: {} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -3970,6 +4063,8 @@ snapshots: prismjs@1.29.0: {} + property-information@6.5.0: {} + queue-microtask@1.2.3: {} readdirp@3.6.0: @@ -3980,6 +4075,13 @@ snapshots: regenerator-runtime@0.14.1: {} + rehype-katex-svelte@1.2.0: + dependencies: + hast-util-from-string: 2.0.0 + hast-util-select: 5.0.5 + hast-util-to-string: 2.0.0 + katex: 0.16.10 + rehype-slug@6.0.0: dependencies: '@types/hast': 3.0.4 @@ -3990,6 +4092,12 @@ snapshots: relateurl@0.2.7: {} + remark-abbr@1.4.2: + dependencies: + unist-util-visit: 2.0.3 + + remark-footnotes@2.0.0: {} + remark-frontmatter@5.0.0: dependencies: '@types/mdast': 4.0.4 @@ -4010,14 +4118,16 @@ snapshots: transitivePeerDependencies: - supports-color - remark-math@6.0.0: + remark-github@12.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-math: 3.0.0 - micromark-extension-math: 3.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color + mdast-util-find-and-replace: 3.0.1 + mdast-util-to-string: 4.0.0 + to-vfile: 8.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + + remark-math@3.0.1: {} remark-parse@11.0.0: dependencies: @@ -4172,6 +4282,8 @@ snapshots: source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} + sprintf-js@1.0.3: {} string-width@4.2.3: @@ -4318,6 +4430,10 @@ snapshots: dependencies: is-number: 7.0.0 + to-vfile@8.0.0: + dependencies: + vfile: 6.0.1 + totalist@3.0.1: {} trough@2.2.0: {} @@ -4354,15 +4470,16 @@ snapshots: trough: 2.2.0 vfile: 6.0.1 + unist-util-is@4.1.0: {} + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.10 + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.2 - unist-util-remove-position@5.0.0: - dependencies: - '@types/unist': 3.0.2 - unist-util-visit: 5.0.0 - unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.10 @@ -4371,11 +4488,33 @@ snapshots: dependencies: '@types/unist': 3.0.2 + unist-util-visit-parents@3.1.1: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 + + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 + unist-util-visit@2.0.3: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.2