10 releases (4 breaking)

Uses new Rust 2024

new 0.5.0 Mar 17, 2025
0.4.0 Mar 15, 2025
0.3.1 Feb 16, 2025
0.3.0 Dec 5, 2024
0.1.3 Oct 20, 2024

#3 in #gemtext

Download history 4/week @ 2024-11-27 220/week @ 2024-12-04 97/week @ 2024-12-11 32/week @ 2024-12-18 1/week @ 2024-12-25 27/week @ 2025-01-08 55/week @ 2025-01-15 43/week @ 2025-01-22 65/week @ 2025-01-29 35/week @ 2025-02-05 137/week @ 2025-02-12 22/week @ 2025-02-19 16/week @ 2025-02-26 44/week @ 2025-03-05 245/week @ 2025-03-12

344 downloads per month
Used in yoda

MIT license

23KB
467 lines

ggemtext

Build Documentation crates.io

Glib-oriented Gemtext API

Install

cargo add ggemtext

Usage

Line

Line parser, useful for TextTag operations in TextBuffer context.

Iterate Gemtext lines to continue with Line API:

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

Inline code

Struct

use ggemtext::line::code::Inline;
match Inline::parse("```inline```") {
    Some(inline) => assert_eq!(inline.value, "inline"),
    None => assert!(false),
}

Trait

use ggemtext::line::code::inline::Gemtext;
assert_eq!("```inline```".as_value(), Some("inline"))
assert_eq!("inline".to_source(), "```inline```")

Multiline code

use ggemtext::line::code::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

use ggemtext::line::{Header, header::Level};
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
use ggemtext::line::Link;

const SOURCE: &str = "=> gemini://geminiprotocol.net 1965-01-19 Gemini";

let link = Link::parse(SOURCE).unwrap();

assert_eq!(link.alt, Some("1965-01-19 Gemini".to_string()));
assert_eq!(link.url, "gemini://geminiprotocol.net");

let uri = link.uri(None).unwrap();
assert_eq!(uri.scheme(), "gemini");
assert_eq!(uri.host().unwrap(), "geminiprotocol.net");

let time = link.time(Some(&glib::TimeZone::local())).unwrap();
assert_eq!(time.year(), 1965);
assert_eq!(time.month(), 1);
assert_eq!(time.day_of_month(), 19);

assert_eq!(link.to_source(), SOURCE);

List

Struct

use ggemtext::line::List;
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

use ggemtext::line::Quote;
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

Dependencies

~6.5MB
~140K SLoC