123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- 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<String, String> {
- 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())
- }
- }
|