diff options
| -rw-r--r-- | README.md | 6 | ||||
| -rw-r--r-- | crates/germ/Cargo.toml | 3 | ||||
| -rw-r--r-- | crates/germ/src/lib.rs | 5 | ||||
| -rw-r--r-- | crates/germ/src/quick.rs | 65 | ||||
| -rw-r--r-- | crates/germ/tests/quick.rs | 71 |
5 files changed, 146 insertions, 4 deletions
@@ -20,7 +20,8 @@ dependencies as possible. ## Usage -Current version: [](https://crates.io/crates/germ) +Current version: +[](https://crates.io/crates/germ) ```toml # Cargo.toml @@ -39,12 +40,13 @@ features = ["ast"] # Enable the features you would like to use! ### Features | Feature | Description | -|-----------|------------------------------------------------------------------| +| --------- | ---------------------------------------------------------------- | | `ast` | Construct AST trees from raw Gemtext. | | `convert` | Convert from Gemtext to markup formats such as HTML or Markdown. | | `request` | Make Gemini requests and get sane, structured results. | | `meta` | Structure-ize a Gemini response's meta section | | `macros` | Macros to aid with various Germ-related functionalities | +| `quick` | Quick functions to create valid Gemtext elements from input | ### Examples diff --git a/crates/germ/Cargo.toml b/crates/germ/Cargo.toml index 5e29eee..3e00d5d 100644 --- a/crates/germ/Cargo.toml +++ b/crates/germ/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "germ" -version = "0.3.0" +version = "0.3.1" authors = ["Fuwn <[email protected]>"] edition = "2021" description = "The Ultimate Gemini Toolkit." @@ -21,6 +21,7 @@ default = ["ast", "convert", "meta", "request"] macros = ["ast", "convert"] meta = [] request = ["rustls", "url", "anyhow"] +quick = [] [dependencies] anyhow = { version = "1.0.57", optional = true } # `Result` diff --git a/crates/germ/src/lib.rs b/crates/germ/src/lib.rs index 41e063f..ddab063 100644 --- a/crates/germ/src/lib.rs +++ b/crates/germ/src/lib.rs @@ -27,7 +27,7 @@ clippy::nursery, clippy::pedantic )] -#![doc = include_str!("../../../../README.md")] +#![doc = include_str!("../../../README.md")] #![recursion_limit = "128"] #[cfg(feature = "ast")] @@ -41,3 +41,6 @@ pub mod request; #[cfg(feature = "meta")] pub mod meta; + +#[cfg(feature = "quick")] +pub mod quick; diff --git a/crates/germ/src/quick.rs b/crates/germ/src/quick.rs new file mode 100644 index 0000000..d952b08 --- /dev/null +++ b/crates/germ/src/quick.rs @@ -0,0 +1,65 @@ +// This file is part of Germ <https://github.com/gemrest/germ>. +// Copyright (C) 2022-2022 Fuwn <[email protected]> +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright (C) 2022-2022 Fuwn <[email protected]> +// SPDX-License-Identifier: GPL-3.0-only + +pub enum HeadingLevel { + One, + Two, + Three, +} + +#[must_use] +pub fn heading(text: &str, level: &HeadingLevel) -> String { + format!( + "{} {}", + match level { + HeadingLevel::One => "#", + HeadingLevel::Two => "##", + HeadingLevel::Three => "###", + }, + text + ) +} + +#[must_use] +pub fn list_item(text: &str) -> String { format!("* {}", text) } + +#[must_use] +pub fn list_items(items: &[&str]) -> String { + items + .iter() + .map(|item| list_item(item)) + .collect::<Vec<_>>() + .join("\n") +} + +#[must_use] +pub fn link(text: &str, location: Option<&str>) -> String { + format!( + "=> {}{}", + text, + location.map_or_else(|| "".to_string(), |l| format!(" {}", l)) + ) +} + +#[must_use] +pub fn block_quote(text: &str) -> String { format!("> {}", text) } + +#[must_use] +pub fn preformatted_text(text: &str, alt_text: Option<&str>) -> String { + format!("```{}\n{}\n```", alt_text.unwrap_or(""), text) +} diff --git a/crates/germ/tests/quick.rs b/crates/germ/tests/quick.rs new file mode 100644 index 0000000..255acd9 --- /dev/null +++ b/crates/germ/tests/quick.rs @@ -0,0 +1,71 @@ +// This file is part of Germ <https://github.com/gemrest/germ>. +// Copyright (C) 2022-2022 Fuwn <[email protected]> +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright (C) 2022-2022 Fuwn <[email protected]> +// SPDX-License-Identifier: GPL-3.0-only + +#[cfg(test)] +mod test { + use germ::quick::{self, heading}; + + #[test] + fn all_heading_levels() { + assert_eq!(heading("Soup", &germ::quick::HeadingLevel::One), "# Soup"); + assert_eq!( + heading("Vegetables", &germ::quick::HeadingLevel::Two), + "## Vegetables" + ); + assert_eq!( + heading("Fruits", &germ::quick::HeadingLevel::Three), + "### Fruits" + ); + } + + #[test] + fn list_item() { + assert_eq!(quick::list_item("Soup"), "* Soup"); + } + + #[test] + fn list_items() { + assert_eq!( + quick::list_items(&["Soup", "Vegetables", "Fruits"]), + "* Soup\n* Vegetables\n* Fruits" + ); + } + + #[test] + fn link_variants() { + assert_eq!(quick::link("Soup", None), "=> Soup"); + assert_eq!( + quick::link("Soup", Some("gemini://soup.com")), + "=> Soup gemini://soup.com" + ); + } + + #[test] + fn block_quote() { + assert_eq!(quick::block_quote("Soup"), "> Soup"); + } + + #[test] + fn preformatted_text_variants() { + assert_eq!(quick::preformatted_text("Soup", None), "```\nSoup\n```"); + assert_eq!( + quick::preformatted_text("Vegetables", Some("Fruits")), + "```Fruits\nVegetables\n```" + ); + } +} |