aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-06-19 07:13:56 +0000
committerFuwn <[email protected]>2024-06-19 07:13:56 +0000
commit49898e1c1214470e2684e661b558ee198fba18f0 (patch)
treed8f7f96f5604aa028fa246919bc98ce3c8ae690d
parentdeps(rustc): bump rust toolchain (diff)
downloadgerm-49898e1c1214470e2684e661b558ee198fba18f0.tar.xz
germ-49898e1c1214470e2684e661b558ee198fba18f0.zip
feat: single Node gemtext content conversion
-rw-r--r--src/ast/container.rs19
-rw-r--r--src/ast/node.rs8
-rw-r--r--tests/ast.rs9
3 files changed, 36 insertions, 0 deletions
diff --git a/src/ast/container.rs b/src/ast/container.rs
index 51931c6..d8f2817 100644
--- a/src/ast/container.rs
+++ b/src/ast/container.rs
@@ -85,6 +85,25 @@ impl Ast {
Self { inner: ast }
}
+ /// Build an AST tree from a [`Vec`] of [`Node`]s
+ ///
+ /// # Example
+ ///
+ /// ```rust
+ /// // This assertion converts the Gemtext "=> / Home\n" to an AST tree of one
+ /// // node, then converts the AST tree back to Gemtext, and compares it against
+ /// // the original Gemtext.
+ /// assert_eq!(
+ /// germ::ast::Ast::from_nodes(
+ /// germ::gemini_to_ast!("=> / Home\n").inner().to_vec()
+ /// )
+ /// .to_gemtext(),
+ /// "=> / Home\n"
+ /// );
+ /// ```
+ #[must_use]
+ pub fn from_nodes(nodes: Vec<Node>) -> Self { Self { inner: nodes } }
+
#[must_use]
pub fn to_gemtext(&self) -> String {
let mut gemtext = String::new();
diff --git a/src/ast/node.rs b/src/ast/node.rs
index e80ef84..1040d2b 100644
--- a/src/ast/node.rs
+++ b/src/ast/node.rs
@@ -171,3 +171,11 @@ pub enum Node {
/// A whitespace line, a line which contains nothing but whitespace.
Whitespace,
}
+
+impl Node {
+ /// Obtain the Gemtext content of a single [`Node`] as a [`String`]
+ #[must_use]
+ pub fn content(&self) -> String {
+ super::Ast::from_nodes(vec![self.to_owned()]).to_gemtext()
+ }
+}
diff --git a/tests/ast.rs b/tests/ast.rs
index 6d1f545..9bb7fce 100644
--- a/tests/ast.rs
+++ b/tests/ast.rs
@@ -101,4 +101,13 @@ That was a link without text."#;
format!("{}\n", EXAMPLE_GEMTEXT),
);
}
+
+ #[test]
+ fn gemtext_to_ast_then_node_to_ast_to_gemtext() {
+ assert_eq!(
+ Ast::from_nodes(germ::gemini_to_ast!("=> / Home\n").inner().to_vec())
+ .to_gemtext(),
+ "=> / Home\n"
+ );
+ }
}