Glib-oriented Gemtext API https://crates.io/crates/ggemtext
Find a file
2025-03-16 19:53:29 +02:00
.github add missed dependencies 2025-02-15 21:12:47 +02:00
src skip regex operations on tag mismatch subject 2025-03-16 19:53:29 +02:00
tests remove regex dependency, rename constructor, implement Gemtext trait 2025-03-16 15:43:27 +02:00
.gitignore fix sources location 2024-10-18 19:19:39 +03:00
Cargo.toml update versions 2025-03-16 13:43:02 +02:00
LICENSE Initial commit 2024-10-18 18:26:46 +03:00
README.md update readme 2025-03-16 19:43:15 +02:00

ggemtext

Build Documentation crates.io

Glib-oriented Gemtext API

Install

cargo add ggemtext

Usage

Line

Line parser, useful for TextTag operations in TextBuffer context.

Connect dependencies

use ggemtext::line::{
    code::{Inline, Multiline},
    header::{Header, Level},
    link::Link,
    list::List,
    quote::Quote,
}

Prepare document

Iterate Gemtext lines to continue with Line API:

for line in gemtext.lines() {
    // ..
}

Code

Inline
match Inline::from("```inline```") {
    Some(inline) => assert_eq!(inline.value, "inline"),
    None => assert!(false),
}
Multiline
match Multiline::begin_from("```alt") {
    Some(mut multiline) => {
        assert!(Multiline::continue_from(&mut multiline, "line 1").is_ok());
        assert!(Multiline::continue_from(&mut multiline, "line 2").is_ok());
        assert!(Multiline::continue_from(&mut multiline, "```").is_ok()); // complete

        assert!(multiline.completed);
        assert_eq!(multiline.alt, Some("alt".into()));
        assert_eq!(multiline.buffer.len(), 3);
    }
    None => assert!(false),
}

Header

Struct

match Header::parse("# H1") {
    Some(h1) => {
        assert_eq!(h1.level as u8, Level::H1 as u8);
        assert_eq!(h1.value, "H1");
    }
    None => assert!(false),
} // H1, H2, H3

Trait

use ggemtext::line::header::{Gemtext, Level};
assert_eq!("# H1".as_value(), Some("H1"));
assert_eq!("H1".to_source(&Level::H1), "# H1");
// H1, H2, H3
match Link::from(
    "=> gemini://geminiprotocol.net 1965-01-19 Gemini",
    None, // absolute path given, base not wanted
    Some(&glib::TimeZone::local()),
) {
    Some(link) => {
        // Alt
        assert_eq!(link.alt, Some("Gemini".into()));

        // Date
        match link.timestamp {
            Some(timestamp) => {
                assert_eq!(timestamp.year(), 1965);
                assert_eq!(timestamp.month(), 1);
                assert_eq!(timestamp.day_of_month(), 19);
            }
            None => assert!(false),
        }

        // URI
        assert_eq!(link.uri.to_string(), "gemini://geminiprotocol.net");
    }
    None => assert!(false),
}

List

Struct

match List::parse("* Item") {
    Some(list) => assert_eq!(list.value, "Item"),
    None => assert!(false),
}

Trait

use ggemtext::line::list::Gemtext;
assert_eq!("* Item".as_value(), Some("Item"))
assert_eq!("Item".to_source(), "* Item")

Quote

Struct

match Quote::parse("> Quote") {
    Some(quote) => assert_eq!(quote.value, "Quote"),
    None => assert!(false),
}

Trait

use ggemtext::line::quote::Gemtext;
assert_eq!("> Quote".as_value(), Some("Quote"))
assert_eq!("Quote".to_source(), "> Quote")

Integrations

  • Yoda - Browser for Gemini Protocol

See also

  • ggemini - Glib-oriented client for Gemini Protocol