From abe45c4ade847451e81990f3c3f76f45db6007f6 Mon Sep 17 00:00:00 2001 From: ckie Date: Sun, 27 Oct 2024 04:04:00 +0200 Subject: [PATCH] feat($lib/docs): introduce new docs pipeline --- bun.lockb | Bin 110703 -> 148443 bytes package.json | 14 +++- src/lib/docs/index.ts | 32 ++++++++ src/lib/docs/remark-include.ts | 69 ++++++++++++++++++ src/routes/docs/+layout.svelte | 18 ++++- .../docs/petal/[...rest]/+page.server.ts | 16 ++++ src/routes/docs/petal/[...rest]/+page.svelte | 5 ++ vite.config.js | 14 ++-- 8 files changed, 159 insertions(+), 9 deletions(-) create mode 100644 src/lib/docs/index.ts create mode 100644 src/lib/docs/remark-include.ts create mode 100644 src/routes/docs/petal/[...rest]/+page.server.ts create mode 100644 src/routes/docs/petal/[...rest]/+page.svelte diff --git a/bun.lockb b/bun.lockb index b7b6887ee681d376adbbe43d1817687e9e11f4b7..94bffbfc8e36716f75e4853c88e9e7a2f61e9e74 100755 GIT binary patch delta 44501 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 delta 20771 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 ZR!J#IS-IA1AEG{i*ct|j$oBHW{{^%x_)7o) diff --git a/package.json b/package.json index ac89b4a..ccfa50f 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@sveltejs/enhanced-img": "^0.3.9", "@sveltejs/kit": "^2.5.27", "@sveltejs/vite-plugin-svelte": "^4.0.0", + "@types/node": "^22.8.1", "autoprefixer": "^10.4.20", "husky": "^9.1.6", "lint-staged": "^15.2.10", @@ -32,8 +33,19 @@ "type": "module", "dependencies": { "clsx": "^2.1.1", + "mdast": "^3.0.0", "moderndash": "^3.12.0", - "svelte-highlight": "^7.7.0" + "rehype-autolink-headings": "^7.1.0", + "rehype-sanitize": "^6.0.0", + "rehype-slug-custom-id": "^2.0.0", + "rehype-stringify": "^10.0.1", + "remark": "^15.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.1", + "svelte-highlight": "^7.7.0", + "to-vfile": "^8.0.0", + "unified": "^11.0.5", + "unist-util-flatmap": "^1.0.0" }, "lint-staged": { "{package.json,*.js,src/**.{svelte,ts,js,css}}": "prettier --write --ignore-unknown" diff --git a/src/lib/docs/index.ts b/src/lib/docs/index.ts new file mode 100644 index 0000000..e1d7baa --- /dev/null +++ b/src/lib/docs/index.ts @@ -0,0 +1,32 @@ +import { readFile } from "fs/promises"; +import rehypeStringify from "rehype-stringify"; +import remarkParse from "remark-parse"; +import remarkRehype from "remark-rehype"; +import { unified } from "unified"; +import rehypeSlug from "rehype-slug-custom-id"; +import { join } from "path"; +import { remarkInclude } from "./remark-include"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; +// import rehypeSanitize from "rehype-sanitize"; + +export async function renderToHtml( + { base, path }: { + base: string, + path: string + } +) { + const md = await readFile(join(base, path + ".md"), { encoding: "utf-8" }); + + const html = await unified() + .use(remarkParse) + .use(remarkInclude, { resolveFrom: join(base, path.split("/").slice(0, -1).join("/")) }) + .use(remarkRehype) + .use(rehypeSlug, { enableCustomId: true }) + .use(rehypeAutolinkHeadings) + // .use(rehypeSanitize) TODO + .use(rehypeStringify) + .process(md) + .then(vfile => vfile.toString()); + + return html; +} diff --git a/src/lib/docs/remark-include.ts b/src/lib/docs/remark-include.ts new file mode 100644 index 0000000..0b54bc0 --- /dev/null +++ b/src/lib/docs/remark-include.ts @@ -0,0 +1,69 @@ +/** + * https://github.com/hashicorp/remark-plugins + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: MPL-2.0 + */ + +import path from "path"; +import { remark } from "remark"; +import flatMap from "unist-util-flatmap"; +import { readSync } from "to-vfile"; +import type { Node, Root, Code } from "mdast"; +import type { Plugin } from "unified"; + +export const remarkInclude: Plugin<[], Root> = ({ resolveFrom }: { resolveFrom: string }) => { + return (tree, file) => { + return flatMap(tree, (node: Code) => { + if (!(node.type == "code" + && node.lang == "{=include=}" + && node.meta !== "options")) + return [node]; + + // !== "options" because those are special, parsed from options.json: + // https://github.com/NixOS/nixpkgs/blob/d31617bedffa3e5fe067feba1c68b1a7f644cb4f/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/manual.py#L81-L102 + + console.log("awa", node); + + const includes = node.value.split("\n"); + + return includes.flatMap(included => { + // read the file contents + const includePath = path.join(resolveFrom ?? file.dirname, included); + let includeContents; + try { + includeContents = readSync(includePath, "utf8"); + } catch (err) { + throw new Error( + `The @include file path at ${includePath} was not found.\n\nInclude Location: ${file.path}:${node.position.start.line}:${node.position.start.column}` + ); + } + + // if we are including a ".md" or ".mdx" file, we add the contents as processed markdown + // if any other file type, they are embedded into a code block + if (includePath.match(/\.md(?:x)?$/)) { + // return the file contents in place of the @include + // (takes a couple steps because we're processing includes with remark) + const processor = remark(); + // use the includeMarkdown plugin to allow recursive includes + processor.use(remarkInclude, { resolveFrom }); + // Process the file contents, then return them + const ast = processor.parse(includeContents); + return processor.runSync(ast, includeContents).children; + } else { + // trim trailing newline + includeContents.contents = includeContents.contents.trim(); + + // return contents wrapped inside a "code" node + return [ + { + type: "code", + lang: includePath.match(/\.(\w+)$/)?.[1], + value: includeContents + } + ]; + } + + }) + }); + }; +}; diff --git a/src/routes/docs/+layout.svelte b/src/routes/docs/+layout.svelte index a943595..289023b 100644 --- a/src/routes/docs/+layout.svelte +++ b/src/routes/docs/+layout.svelte @@ -2,7 +2,7 @@ let { children } = $props(); -
+
-
{@render children?.()}
+
{@render children?.()}
diff --git a/src/routes/docs/petal/[...rest]/+page.server.ts b/src/routes/docs/petal/[...rest]/+page.server.ts new file mode 100644 index 0000000..f584498 --- /dev/null +++ b/src/routes/docs/petal/[...rest]/+page.server.ts @@ -0,0 +1,16 @@ +import type { PageServerLoad } from "./$types"; +import { join } from "path"; +import { renderToHtml } from "$lib/docs"; + + +export const load: PageServerLoad = async (event) => { + const userPath = event.params.rest; + // we shouldn't need this, but it doesn't hurt. + if (userPath.split("/").find(c => /^\.*$/.test(c))) + throw new Error("url is sus"); + + const base = join(process.cwd(), ".petalpkgs"); + return { + html: await renderToHtml({ base, path: userPath }) + }; +}; diff --git a/src/routes/docs/petal/[...rest]/+page.svelte b/src/routes/docs/petal/[...rest]/+page.svelte new file mode 100644 index 0000000..57e638f --- /dev/null +++ b/src/routes/docs/petal/[...rest]/+page.svelte @@ -0,0 +1,5 @@ + + +{@html $page.data.html} diff --git a/vite.config.js b/vite.config.js index ca9192c..ae34ab2 100644 --- a/vite.config.js +++ b/vite.config.js @@ -4,9 +4,13 @@ import { defineConfig } from "vite"; export default defineConfig({ plugins: [sveltekit(), enhancedImages()], - server: { - fs: { - allow: ["./tailwind.config.js"] - } - } + server: { + watch: { + // absurdly big + ignored: (file) => file.includes("/.petalpkgs") + }, + fs: { + allow: ["./tailwind.config.js", "./.petalpkgs"] + } + } });