Skip to content

Repository files navigation

ancarda/gemtext-parser

Gemtext (text/gemini) parser and HTML encoder

LicenseLatest Stable VersionTotal Downloadsbuilds.sr.ht status

This package implements a PHP parser for Gemtext (text/gemini) as specified here: https://gemini.circumlunar.space/docs/gemtext.gmi

Useful Links

Usage

All the low level classes are built around Generator, which makes plugging in middleware easy while keeping memory usage low.

Unfortunately, Generators can be a bit of work to actually use. As such, a utility class, SimpleTransformer is available which abstracts this away if you just want a Gemtext to HTML conversion quickly and easily.

Here's how to convert Gemtext to HTML with the low level (Generator) API:

<?php$parser = newAncarda\Gemini\Gemtext\Parser;
$encoder = newAncarda\Gemini\Gemtext\Encoder\HTML;
$nodes = $parser->parse(explode("\n", $gemtext));
$html = implode("\n", iterator_to_array($encoder->encode($nodes)));

And here's the higher level utility class, which abstracts this away:

<?php$transformer = new \Ancarda\Gemini\Gemtext\Util\SimpleTransformer;
echo$transformer->transform($gemText);

Pipelining

You can create lightweight middleware by creating a function that accepts and returns Generator<Node>. This function would be inserted between encode and parse, like so:

$encoder->encode($middleware($parser->parse(explode("\n", $gemtext))));

Here, middleware's __invoke method accepts and returns Generator<Node>. Middleware could make modifications, inject new nodes, drop some nodes, and so on. For instance:

<?php$reverse_paragraphs = newclass {
publicfunction__invoke(Generator$nodes): Generator
{
foreach ($nodesas$node) {
if ($nodeinstanceof Paragraph) {
yieldnewParagraph(strrev($node->getText()));
} else {
yield$node;
}
}
}
};

About

[Mirror] Gemtext (text/gemini) parser and HTML encoder for PHP

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages