use pulldown_cmark::{html, Parser}; use std::error::Error; use std::path::Path; pub struct Theme { root_path: String, parser_options: pulldown_cmark::Options, } impl Theme { pub fn new(root_path: String) -> Self { let mut parser_options = pulldown_cmark::Options::empty(); parser_options.insert(pulldown_cmark::Options::ENABLE_STRIKETHROUGH); Theme { root_path, parser_options, } } // Renders markdown as html pub fn markdown_as_html(&self, path: &String) -> Result { log::trace!("Rendering file '{}'", path); let path = format!("{}.md", path); let file = std::fs::read_to_string(&path); match file { Ok(content) => { let parser = Parser::new_ext(content.as_str(), self.parser_options); let mut html_output = String::new(); html::push_html(&mut html_output, parser); let mut buf = String::new(); buf.push_str(self.get_fragment("header").as_str()); buf.push_str(html_output.as_str()); buf.push_str(self.get_fragment("footer").as_str()); Ok(buf) } Err(error) => { log::error!("File located at path {} was not found.", path); Err(error.to_string()) } } } // TODO: Cache fn get_fragment(&self, fragment_name: &str) -> String { let path = format!("{}/{}.html.tpl", self.root_path, fragment_name); log::trace!("Loading fragment file '{}'", path); std::fs::read_to_string(path).unwrap_or("".to_owned()) } }