theme.rs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. use pulldown_cmark::{html, Parser};
  2. use std::error::Error;
  3. use std::path::Path;
  4. pub struct Theme {
  5. root_path: String,
  6. parser_options: pulldown_cmark::Options,
  7. }
  8. impl Theme {
  9. pub fn new(root_path: String) -> Self {
  10. let mut parser_options = pulldown_cmark::Options::empty();
  11. parser_options.insert(pulldown_cmark::Options::ENABLE_STRIKETHROUGH);
  12. Theme {
  13. root_path,
  14. parser_options,
  15. }
  16. }
  17. // Renders markdown as html
  18. pub fn markdown_as_html(&self, path: &String) -> Result<String, String> {
  19. log::trace!("Rendering file '{}'", path);
  20. let path = format!("{}.md", path);
  21. let file = std::fs::read_to_string(&path);
  22. match file {
  23. Ok(content) => {
  24. let parser = Parser::new_ext(content.as_str(), self.parser_options);
  25. let mut html_output = String::new();
  26. html::push_html(&mut html_output, parser);
  27. let mut buf = String::new();
  28. buf.push_str(self.get_fragment("header").as_str());
  29. buf.push_str(html_output.as_str());
  30. buf.push_str(self.get_fragment("footer").as_str());
  31. Ok(buf)
  32. }
  33. Err(error) => {
  34. log::error!("File located at path {} was not found.", path);
  35. Err(error.to_string())
  36. }
  37. }
  38. }
  39. // TODO: Cache
  40. fn get_fragment(&self, fragment_name: &str) -> String {
  41. let path = format!("{}/{}.html.tpl", self.root_path, fragment_name);
  42. log::trace!("Loading fragment file '{}'", path);
  43. std::fs::read_to_string(path).unwrap_or("".to_owned())
  44. }
  45. }