]> OzVa Git service - gn-parser/commitdiff
Added parse plaintext and word count to metadata
authorMax Value <greenwoodw50@gmail.com>
Wed, 7 May 2025 18:24:19 +0000 (19:24 +0100)
committerMax Value <greenwoodw50@gmail.com>
Wed, 7 May 2025 18:24:19 +0000 (19:24 +0100)
12 files changed:
src/types.rs
src/types/blockquote.rs
src/types/contents.rs
src/types/document.rs
src/types/heading.rs
src/types/list.rs
src/types/metadata.rs
src/types/paragraph.rs
src/types/preformatted.rs
src/types/reference_list.rs
src/types/reference_list/reference.rs
src/types/reference_list/work.rs

index 4c2bccaeefb8994ed2b241d6175880f1ec7d1afc..e547d3a8c090814c41d1a81a1764902dfc25c790 100644 (file)
@@ -12,5 +12,6 @@ pub trait Renderable {
        fn render_latex(&self) -> String;
        fn render_html(&self) -> String;
        fn render_gemtext(&self) -> String;
+       fn render_plaintext(&self) -> String;
 }
 
index 1d94fddd43a07ef1a096420bd41940f862af7e8b..c0f98d71ff4ee998c91a9046016293d8ca48ac0b 100644 (file)
@@ -28,4 +28,12 @@ impl Renderable for BlockQuote {
                }
                full_text
        }
+
+       fn render_plaintext(&self) -> String {
+               let mut full_text = String::new();
+               for element in &self.elements {
+                       full_text.push_str(&(String::from("\t") + &element.render_gemtext()));
+               }
+               full_text
+       }
 }
index 2b3d6b1eb82e22f0cede7dd6262a2565cca17edd..44af23c92265ca4ab433efd77dc54dfe32ac18d3 100644 (file)
@@ -22,4 +22,8 @@ impl Renderable for Contents {
 
 This is where the Table of Contents will go.\n\n")
        }
+
+       fn render_plaintext(&self) -> String {
+               String::new()
+       }
 }
index 25b7e6507f4698aa147b56145d2a146d4e36d304..98f5bada59d937a903f63b7765f694be3e44ad07 100644 (file)
@@ -1,3 +1,5 @@
+use std::collections::HashMap;
+
 use crate::types::metadata::Metadata;
 use crate::types::reference_list::ReferenceList;
 use crate::types::Renderable;
@@ -58,6 +60,14 @@ impl Renderable for Document {
                }
                full_text
        }
+
+       fn render_plaintext(&self) -> String {
+               let mut full_text = String::new();
+               for element in &self.body {
+                       full_text.push_str(&element.render_plaintext());
+               }
+               full_text
+       }
 }
 
 impl Document{
@@ -68,7 +78,12 @@ impl Document{
                data.insert(String::from("author"), self.metadata.author.to_string());
                data.insert(String::from("date"), self.metadata.date.to_string());
 
-               data.insert(String::from("elements"), format!("{}", self.body.len()));
+               data.insert(String::from("elements"), self.body.len().to_string());
+               let text = self.render_plaintext();
+               let word_count = text.split_whitespace().collect::<Vec<&str>>().iter().len();
+               data.insert(String::from("word_count"), word_count.to_string());
+               let character_count = text.split_whitespace().map(|s| s.chars()).flatten().collect::<Vec<char>>().len();
+               data.insert(String::from("character_count"), character_count.to_string());
 
                format!("{data:?}")
        }
index a98afb7967a47931d36a197017b599cc0121762a..39eabc4ddd2305f1e68f28a4e8cf7c9c56f6e290 100644 (file)
@@ -1,5 +1,5 @@
 use crate::types::Renderable;
-use crate::inline::{parse_inline_latex, parse_inline_html, parse_inline_gemtext};
+use crate::inline::{parse_inline_gemtext, parse_inline_html, parse_inline_latex, parse_inline_remove};
 
 // submodule for handling headings
 
@@ -41,6 +41,11 @@ impl Renderable for Heading {
                };
                format!("{section} {text}\n\n")
        }
+
+       fn render_plaintext (&self) -> String {
+               let text = parse_inline_remove(self.text.trim()).to_uppercase();
+               format!("{text}\n\n")
+       }
 }
 
 #[cfg(test)]
index e06dbfb766afebb6ccd8cc95a85e4ce164db338c..b17ffc144c528007aec0f0af0e3b9bff8f8c9eb2 100644 (file)
@@ -30,6 +30,14 @@ impl Renderable for List {
                }
                full_text + "\n"
        }
+
+       fn render_plaintext(&self) -> String {
+               let mut full_text = String::new();
+               for item in &self.items {
+                       full_text.push_str(&item.render_gemtext());
+               }
+               full_text + "\n"
+       }
 }
 
 pub struct Item {
@@ -48,4 +56,8 @@ impl Renderable for Item {
        fn render_gemtext(&self) -> String {
                format!("* {}\n", parse_inline_gemtext(self.text.trim()))
        }
+
+       fn render_plaintext(&self) -> String {
+               parse_inline_gemtext(self.text.trim()) + "\n"
+       }
 }
index 27f29766d5abcdc8bd7944c29e3176a3ad98ea22..d08553f547884b762f228524a8ae2038ba2038a1 100644 (file)
@@ -95,9 +95,19 @@ impl Renderable for Metadata {
                format!("\
 # {title}\n
 {author} - {date}\n\n",
-                 title = self.title.trim(),
-                 author = self.author.trim(),
-                 date = self.date.trim()
+               title = self.title.trim(),
+               author = self.author.trim(),
+               date = self.date.trim()
+               )
+       }
+
+       fn render_plaintext (&self) -> String {
+               format!("\
+{title}\n
+{author} - {date}\n\n",
+               title = self.title.trim(),
+               author = self.author.trim(),
+               date = self.date.trim()
                )
        }
 }
index 9030448117139d8b94cce05f7458d59521fbaf0c..96cc56a4263319591d494b788ab39407e16b47dc 100644 (file)
@@ -1,5 +1,5 @@
 use crate::types::Renderable;
-use crate::inline::{parse_inline_latex, parse_inline_html, parse_inline_gemtext};
+use crate::inline::{parse_inline_latex, parse_inline_html, parse_inline_gemtext, parse_inline_remove};
 
 // submodule for handling paragraphs
 
@@ -20,6 +20,10 @@ impl Renderable for Paragraph {
        fn render_gemtext (&self) -> String {
                parse_inline_gemtext(&self.text.trim()) + "\n\n"
        }
+
+       fn render_plaintext (&self) -> String {
+               parse_inline_remove(&self.text.trim()) + "\n\n"
+       }
 }
 
 #[cfg(test)]
index 036ad2fb77de02a253ce47d26a81f61480fa3cfb..2cc024440c0e1d8377cd3ca81f94f83749511f40 100644 (file)
@@ -18,4 +18,8 @@ impl Renderable for Preformatted {
        fn render_gemtext(&self) -> String {
                String::from("```\n") + &self.text.trim() + "\n```\n\n"
        }
+
+       fn render_plaintext(&self) -> String {
+               String::from(self.text.trim()) + "\n\n"
+       }
 }
index 9fa6ef192e56fd173614ee2e4a966ebc37c05c9b..a5c5fc0dde652e459aea72efc1d18f22de0de804 100644 (file)
@@ -106,6 +106,7 @@ impl Renderable for ReferenceList {
                }
                full_text
        }
+
        fn render_html(&self) -> String {
                let mut full_text = String::from("<section><h2>Bibliography</h2>");
                for reference in &self.list {
@@ -113,6 +114,7 @@ impl Renderable for ReferenceList {
                }
                full_text + "</section>"
        }
+
        fn render_gemtext(&self) -> String {
                let mut full_text = String::from("## Bibliography\n\n");
                for reference in &self.list {
@@ -120,6 +122,10 @@ impl Renderable for ReferenceList {
                }
                full_text
        }
+
+       fn render_plaintext(&self) -> String {
+               String::new()
+       }
 }
 
 impl Clone for ReferenceList {
index 7b4e59ddd415a88bf90edd7fd2c3819623d249c4..6c940251eaca575561ecc381dd796c60749f7b07 100644 (file)
@@ -102,6 +102,10 @@ impl Renderable for Reference {
                full_text
 
        }
+
+       fn render_plaintext(&self) -> String {
+               String::new()
+       }
 }
 
 impl Clone for Reference {
index fea92fa918bb6ee26c11aef8772c5e71ef1a7875..fc58c7358ee398a90bf31e776b95967739925f2d 100644 (file)
@@ -76,6 +76,9 @@ impl Renderable for Work {
 
                full_text
        }
+       fn render_plaintext(&self) -> String {
+               String::new()
+       }
 }
 
 impl Clone for Work {