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())
}
}