5 releases

0.2.0 Oct 20, 2024
0.1.3 Oct 20, 2024
0.1.2 Oct 20, 2024
0.1.1 Oct 18, 2024
0.1.0 Oct 18, 2024

#369 in Value formatting

Download history 295/week @ 2024-10-14 99/week @ 2024-10-21

394 downloads per month
Used in yoda

MIT license

13KB
217 lines

ggemtext

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::Code,
    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 Code::inline_from("```inline```") {
    Some(inline) => assert_eq!(inline.value, "inline"),
    None => assert!(false),
};
Multiline
match Code::multiline_begin_from("```alt") {
    Some(mut multiline) => {
        Code::multiline_continue_from(&mut multiline, "line 1");
        Code::multiline_continue_from(&mut multiline, "line 2");
        Code::multiline_continue_from(&mut multiline, "```"); // complete

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

Header

match Header::from("# H1") {
    Some(h1) => {
        assert_eq!(h1.level as i8, Level::H1 as i8);
        assert_eq!(h1.value, "H1");
    }
    None => assert!(false),
}; // 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(), 01);
                assert_eq!(timestamp.day_of_month(), 19);
            }
            None => assert!(false),
        }

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

List

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

Quote

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

Dependencies

~5.5MB
~119K SLoC