From: Max Value Date: Fri, 9 May 2025 00:34:58 +0000 (+0100) Subject: Metdata changes X-Git-Url: https://git.ozva.co.uk/?a=commitdiff_plain;h=50576300718b5645f37f226055a6a7070f305810;p=gn-parser Metdata changes Changed metadata JSON output format Added wordcount output Added title and author to latex output --- diff --git a/Cargo.toml b/Cargo.toml index 8ea5d8c..3317cf3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,3 +8,4 @@ edition = "2021" [dependencies] chrono = "0.4.41" regex = "1.11.1" +serde_json = "1.0.140" diff --git a/src/lib.rs b/src/lib.rs index e1b4ed5..8c4e16b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -38,6 +38,7 @@ pub fn run(config: Config) -> Result<(), Box> { "latex" => {document.render_latex()}, "gemtext" => {document.render_gemtext()}, "metadata" => {document.render_metadata()}, + "wc" => {document.render_wordcount()}, _ => {String::from("?")} }); diff --git a/src/types/document.rs b/src/types/document.rs index 3abb8c9..4dae7f7 100644 --- a/src/types/document.rs +++ b/src/types/document.rs @@ -1,3 +1,5 @@ +use serde_json::json; + use crate::types::metadata::Metadata; use crate::types::reference_list::ReferenceList; use crate::types::Renderable; @@ -23,10 +25,17 @@ impl Document { impl Renderable for Document { fn render_latex(&self) -> String { - let mut full_text = String::from("\ -\\documentclass{article} -\\usepackage{hyperref} - "); + let mut full_text = format!("\ +\\documentclass{{article}} +\\usepackage{{hyperref}} +\\hypersetup{{ + pdftitle={{{title}}}, + pdfauthor={{{author}}}, + }} + ", + title = self.metadata.title, + author = self.metadata.author + ); match &self.metadata.style { Some(style) => {full_text.push_str(&format!("\\usepackage{{{style}}}\n"));} None => () @@ -70,19 +79,24 @@ impl Renderable for Document { impl Document{ pub fn render_metadata(&self) -> String { - let mut data = self.metadata.keys.clone(); + let data = serde_json::to_value(self.metadata.keys.clone()).unwrap(); + let text = self.render_plaintext(); - data.insert(String::from("title"), self.metadata.title.to_string()); - data.insert(String::from("author"), self.metadata.author.to_string()); - data.insert(String::from("date"), self.metadata.date.to_string()); + json!({ + "title": self.metadata.title, + "author": self.metadata.author, + "date": self.metadata.date, + "stats": { + "elements": self.body.len(), + "word_count": text.split_whitespace().collect::>().iter().len(), + "character_count": text.split_whitespace().map(|s| s.chars()).flatten().collect::>().len() + }, + "data": data + }).to_string() + } - data.insert(String::from("elements"), self.body.len().to_string()); + pub fn render_wordcount(&self) -> 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:?}") + text.split_whitespace().collect::>().iter().len().to_string() } }