From: Max Value Date: Wed, 7 May 2025 18:24:19 +0000 (+0100) Subject: Added parse plaintext and word count to metadata X-Git-Url: https://git.ozva.co.uk/?a=commitdiff_plain;h=aa4e08623a468d53326a83df650b9727d57a8f00;p=gn-parser Added parse plaintext and word count to metadata --- diff --git a/src/types.rs b/src/types.rs index 4c2bcca..e547d3a 100644 --- a/src/types.rs +++ b/src/types.rs @@ -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; } diff --git a/src/types/blockquote.rs b/src/types/blockquote.rs index 1d94fdd..c0f98d7 100644 --- a/src/types/blockquote.rs +++ b/src/types/blockquote.rs @@ -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 + } } diff --git a/src/types/contents.rs b/src/types/contents.rs index 2b3d6b1..44af23c 100644 --- a/src/types/contents.rs +++ b/src/types/contents.rs @@ -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() + } } diff --git a/src/types/document.rs b/src/types/document.rs index 25b7e65..98f5bad 100644 --- a/src/types/document.rs +++ b/src/types/document.rs @@ -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::>().iter().len(); + data.insert(String::from("word_count"), word_count.to_string()); + let character_count = text.split_whitespace().map(|s| s.chars()).flatten().collect::>().len(); + data.insert(String::from("character_count"), character_count.to_string()); format!("{data:?}") } diff --git a/src/types/heading.rs b/src/types/heading.rs index a98afb7..39eabc4 100644 --- a/src/types/heading.rs +++ b/src/types/heading.rs @@ -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)] diff --git a/src/types/list.rs b/src/types/list.rs index e06dbfb..b17ffc1 100644 --- a/src/types/list.rs +++ b/src/types/list.rs @@ -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" + } } diff --git a/src/types/metadata.rs b/src/types/metadata.rs index 27f2976..d08553f 100644 --- a/src/types/metadata.rs +++ b/src/types/metadata.rs @@ -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() ) } } diff --git a/src/types/paragraph.rs b/src/types/paragraph.rs index 9030448..96cc56a 100644 --- a/src/types/paragraph.rs +++ b/src/types/paragraph.rs @@ -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)] diff --git a/src/types/preformatted.rs b/src/types/preformatted.rs index 036ad2f..2cc0244 100644 --- a/src/types/preformatted.rs +++ b/src/types/preformatted.rs @@ -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" + } } diff --git a/src/types/reference_list.rs b/src/types/reference_list.rs index 9fa6ef1..a5c5fc0 100644 --- a/src/types/reference_list.rs +++ b/src/types/reference_list.rs @@ -106,6 +106,7 @@ impl Renderable for ReferenceList { } full_text } + fn render_html(&self) -> String { let mut full_text = String::from("

Bibliography

"); for reference in &self.list { @@ -113,6 +114,7 @@ impl Renderable for ReferenceList { } full_text + "
" } + 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 { diff --git a/src/types/reference_list/reference.rs b/src/types/reference_list/reference.rs index 7b4e59d..6c94025 100644 --- a/src/types/reference_list/reference.rs +++ b/src/types/reference_list/reference.rs @@ -102,6 +102,10 @@ impl Renderable for Reference { full_text } + + fn render_plaintext(&self) -> String { + String::new() + } } impl Clone for Reference { diff --git a/src/types/reference_list/work.rs b/src/types/reference_list/work.rs index fea92fa..fc58c73 100644 --- a/src/types/reference_list/work.rs +++ b/src/types/reference_list/work.rs @@ -76,6 +76,9 @@ impl Renderable for Work { full_text } + fn render_plaintext(&self) -> String { + String::new() + } } impl Clone for Work {