From 8137b02b1ea25836f80e6d61fae7592ddb6837f2 Mon Sep 17 00:00:00 2001 From: aspizu Date: Mon, 10 Mar 2025 02:58:09 +0530 Subject: initial commit --- src/vitePlugin.ts | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/vitePlugin.ts (limited to 'src/vitePlugin.ts') diff --git a/src/vitePlugin.ts b/src/vitePlugin.ts new file mode 100644 index 0000000..df4433d --- /dev/null +++ b/src/vitePlugin.ts @@ -0,0 +1,50 @@ +import {HTMLRenderer, parse} from "gemtext" +import {pathToFileURL} from "url" +import type {Plugin} from "vite" +import {ext} from "./index.js" + +function transform(code: string, id: string) { + const result = parse(code) + const html = result.generate(HTMLRenderer) + return ` +import { + createComponent, + render, + renderComponent, + unescapeHTML, +} from "astro/runtime/server/index.js"; +import { Fragment, jsx as h } from "astro/jsx-runtime"; +import Layout from "../layouts/Layout.astro"; +export const name = "TypstComponent"; +export const html = ${JSON.stringify(html)}; +export const frontmatter = undefined; +export const file = ${JSON.stringify(id)}; +export const url = ${JSON.stringify(pathToFileURL(id))}; +export function compiledContent() { + return html; +} +export function getHeadings() { + return undefined; +} +export async function Content() { + const content = h(Fragment, {"set:html": html}); + return h(Layout, {title: url, children: content}); +} +export default Content; +` +} + +export default function gemtextVitePlugin(): Plugin { + // let server: ViteDevServer + return { + name: "astro-gemtext", + enforce: "pre", + transform(code, id) { + if (!id.endsWith(`.${ext}`)) return + return { + code: transform(code, id), + map: null, + } + }, + } +} -- cgit v1.2.3