feat: update README and package.json for version 0.3.0; add titleFormat option to GemtextConfig

This commit is contained in:
aspizu
2025-03-10 04:12:38 +05:30
parent 1656bbef4a
commit b04c5eb7f7
4 changed files with 44 additions and 7 deletions
+25 -5
View File
@@ -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.
+1 -1
View File
@@ -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",
+5
View File
@@ -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"> & {
+13 -1
View File
@@ -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;