From b04c5eb7f783f8f83931fc8b479fd8aa45d7c00c Mon Sep 17 00:00:00 2001 From: aspizu Date: Mon, 10 Mar 2025 04:12:38 +0530 Subject: [PATCH] feat: update README and package.json for version 0.3.0; add titleFormat option to GemtextConfig --- README.md | 30 +++++++++++++++++++++++++----- package.json | 2 +- src/index.ts | 5 +++++ src/vitePlugin.ts | 14 +++++++++++++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f1f566a..659f746 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,15 @@ ![https://www.npmjs.com/package/astro-gemtext](https://img.shields.io/npm/dm/astro-gemtext) +`astro-gemtext` is the Astro integration for [gemtext](https://geminiprotocol.net/) +documents. gemtext is a hypertext markup language used in the Gemini protocol. This +integration allows you to use `.gmi` files as pages in your Astro site. Just install +the integration and `.gmi` files in `/src/pages` will be rendered as HTML. + ## Installation -``` -bun add --save astro-gemtext +```shell +npm install astro-gemtext ``` Add to `astro.config.mjs` @@ -18,9 +23,13 @@ export default defineConfig({ }) ``` +> [!IMPORTANT] +> If you do not provide a layout option, Astro's HMR (Hot Module Reloading) and toolbar +> will not work. + ## Usage -Create a `/src/pages/example.gmi` file +Create a .gmi file in your project, for example: ```gmi # Hello World @@ -35,5 +44,16 @@ This is a gemtext file. ### `layout` The layout to use for the page. Set to an absolute import path such as -`/src/layouts/Layout.astro`. If you do not use a layout, you will not get HMR, or the -Astro toolbar. +`/src/layouts/Layout.astro`. +Will be provided the `title` prop. +If you do not provide a layout option, Astro's HMR (Hot Module Reloading) and toolbar +will not work. + +### `titleFormat` + +The format to use for the page title. Can be one of: + +- `first-heading`: The first heading in the document will be used as the title. (default) +- `filename`: The filename of the document will be used as the title. + +The title is passed to the layout as the `title` prop. diff --git a/package.json b/package.json index c7b1358..7a0c6e5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "astro-gemtext", "homepage": "https://github.com/aspizu/astro-gemtext", - "version": "0.2.0", + "version": "0.3.0", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/index.ts b/src/index.ts index 2068d0f..beacb56 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,6 +9,11 @@ export interface GemtextConfig { /** Absolute import path to the layout to use for all gemtext pages. * If not provided, HMR and the Astro toolbar will not work. (default: none) */ layout?: string + /** The format to use for the page title. Can be one of: + * - `first-heading`: The first heading in the document will be used as the title. (default) + * - `filename`: The filename of the document will be used as the title. + */ + titleFormat?: "first-heading" | "filename" } type SetupHookParams = HookParameters<"astro:config:setup"> & { diff --git a/src/vitePlugin.ts b/src/vitePlugin.ts index 853c3b8..138f8c8 100644 --- a/src/vitePlugin.ts +++ b/src/vitePlugin.ts @@ -5,6 +5,18 @@ import {ext, type GemtextConfig} from "./index.js" function transform(code: string, id: string, config: GemtextConfig) { const result = parse(code) + let title + + if (config.titleFormat === "first-heading") { + for (const node of result.data) { + if (node._ === 4) { + title = node.text + break + } + } + } else if (config.titleFormat === "filename") { + title = pathToFileURL(id).pathname.split("/").pop() + } const html = result.generate(HTMLRenderer) return ` import { @@ -28,7 +40,7 @@ export function getHeadings() { } export async function Content() { const content = h(Fragment, {"set:html": html}); - ${config.layout && `return h(Layout, {title: url, children: content});`} + ${config.layout && `return h(Layout, {title: ${JSON.stringify(title)}}, content);`} ${!config.layout && `return content;`} } export default Content;