Skip to content

richardboydnz/gemtext

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

gemtext

A parser for text/gemini files.

(NOTE: As of 2020.10.31, this library comfronts to Gemini specification v0.14.2 (July 2nd 2020).)

Usage

Basic usage:

import * as Gemtext from 'gemtext';

Gemtext.parse(yourSourceStringHere).generate(Gemtext.HTMLRenderer);

With built-in CLI tool:

gemtext [-s|--strict] [html|md|org] [input file name] [output file name]

[-s|--strict] and [output file name] can be omitted.

API

  • parse(source: string, strict: boolean = false): ParseResult
  • ParseResult.generate
    • generate<T>(Renderer: Renderer<T>): T
  • Renderers
    • Renderer<T>: The base type of all Renderers.
    • HTMLRenderer: Renderer<string> - Renderer that generates HTML string.
    • MarkdownRenderer: Renderer<string> - Renderer that generates Markdown string.
    • OrgRenderer: Renderer<string> - Renderer that generates org-mode string.

"Strict" gemtext

I decided to have my own take on a strict gemtext subset.

Things that are optional in the official spec but aren't in this subset:

  • 5.4.2 Link lines: there must be at least 1 whitespace character after =>.
  • 5.5.1 Heading lines: there must be at least 1 whitespace character after the last #.
  • 5.5.3 Quote lines: there must be at least 1 whitespace character after >.

Strict mode parsing does not raise exceptions; when a text line does not meet the strict requirements, it will be simply regarded as a normal (unformatted) text line.

Custom Renderer

To write your own custom Renderer, create a new object that contains the following methods:

  • preamble() - Preamble. e.g. HTML header stuff before main content.
  • postamble() - Postamble. e.g. HTML footer stuff before main content (e.g. closing <html> tags and stuff).
  • text(content: string) - normal text lines.
  • link(url: string, alt: string)
  • preformatted(content: string[], alt: string)
  • heading(level: number, text: string)
  • unorderedList(content: string[])
  • quote(content: string[])
const MyCustomRenderer: Gemtext.Renderer<string> = {
    // ...implement all the methods here.
}

Build

You'll need typescript.

npm run build

About

A parser for text/gemini files

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 55.0%
  • TypeScript 45.0%