summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraspizu <aspizu@protonmail.com>2025-03-10 04:12:38 +0530
committeraspizu <aspizu@protonmail.com>2025-03-10 04:12:38 +0530
commitb04c5eb7f783f8f83931fc8b479fd8aa45d7c00c (patch)
tree359cb03abc6ef394e0095c59448f7cc4c4369e10
parent1656bbef4ac09f60d901c372617312888dd147d9 (diff)
feat: update README and package.json for version 0.3.0; add titleFormat option to GemtextConfig
-rw-r--r--README.md30
-rw-r--r--package.json2
-rw-r--r--src/index.ts5
-rw-r--r--src/vitePlugin.ts14
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;