+use serde_json::json;
+
use crate::types::metadata::Metadata;
use crate::types::reference_list::ReferenceList;
use crate::types::Renderable;
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 => ()
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::<Vec<&str>>().iter().len(),
+ "character_count": text.split_whitespace().map(|s| s.chars()).flatten().collect::<Vec<char>>().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::<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:?}")
+ text.split_whitespace().collect::<Vec<&str>>().iter().len().to_string()
}
}