From e8f8650dcedf696e06a3431de138b2d2d2b3d157 Mon Sep 17 00:00:00 2001 From: Teascade Date: Wed, 18 Apr 2018 21:59:44 +0300 Subject: [PATCH] Add injections for before navbar and after/before content --- config.toml | 29 ++++++--- src/builder.rs | 14 ++++- src/renderer.rs | 63 ++++++++++++++++++- src/template.rs | 7 +++ test_page/other.toml | 2 +- test_page/resources/after_content.html | 1 + test_page/resources/before_content.html | 1 + test_page/resources/before_content_other.html | 1 + test_page/resources/before_navbar.html | 1 + 9 files changed, 107 insertions(+), 12 deletions(-) create mode 100644 test_page/resources/after_content.html create mode 100644 test_page/resources/before_content.html create mode 100644 test_page/resources/before_content_other.html create mode 100644 test_page/resources/before_navbar.html diff --git a/config.toml b/config.toml index 890d8be..670f3cd 100644 --- a/config.toml +++ b/config.toml @@ -1,17 +1,28 @@ [website] -website_name = "TestWebsite" +website_name = "Test Website Name!" built_pages = ["test_page/about.toml", "test_page/other.toml"] use_default_css = true javascript = [] css = [] +before_navbar_url = "test_page/resources/before_navbar.html" +before_content_url = "test_page/resources/before_content.html" +after_content_url = "test_page/resources/after_content.html" +#favicon = "favicon.png" +#twitter_author = "@teascade" +#google_robots = "all" +#google_site_verification = "" [navbar] -items = ["test", "other"] -[navbar.item.other] -title = "Other" -link = "/other.html" +items = ["about", "other", "google"] -[navbar.item.test] -title = "Home" -link = "/home.html" -image_url = "/img/image.png" + [navbar.item.about] + title = "About" + link = "/" + + [navbar.item.other] + title = "Other" + link = "/other" + + [navbar.item.google] + title = "Google!" + link = "https://google.com" \ No newline at end of file diff --git a/src/builder.rs b/src/builder.rs index 39f44d6..d318681 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -46,12 +46,24 @@ pub fn build(logger: &Logger, opt: &Opt, _: &BuildOpt) -> Result<(), Error> { let configs = config.get_configs()?; let mut renders = Vec::new(); for config in configs.clone() { + logger.log(LogLevel::DETAILER, "Rendering injections."); + let (before_navbar, before_content, after_content) = + renderer::render_injections(&logger, &config)?; + logger.log( LogLevel::DETAILER, format!("Rendering {}", config.page_config.page.html_path), ); + let markdown = renderer::render_markdown_content(&config)?; - let data = Template::page_data_from(config.clone(), navbar_content.clone(), markdown); + let data = Template::page_data_from( + config.clone(), + navbar_content.clone(), + before_navbar, + before_content, + after_content, + markdown, + ); let rendered = page_template.render(&data); renders.push(rendered); } diff --git a/src/renderer.rs b/src/renderer.rs index 5ceffd3..0ff88b7 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -1,12 +1,73 @@ use std::fs::File; use std::io::Read; +use std::path::PathBuf; +use std::error::Error as STDError; use pulldown_cmark::{html, Parser}; use config::{Config, SinglePageConfigs}; use template::Template; use error::Error; -use logger::LogLevel; +use logger::{LogLevel, Logger}; + +fn get_file_contents(path: Option) -> Result { + match path { + Some(url) => match File::open(PathBuf::from(&url)) { + Ok(mut file) => { + let mut content = String::new(); + file.read_to_string(&mut content).unwrap(); + Ok(content) + } + Err(err) => Err(Error::new( + LogLevel::WARNING, + format!("Failed to open {}, {}", url, err.description().to_owned()), + )), + }, + None => Ok(String::new()), + } +} + +pub fn render_injections( + logger: &Logger, + config: &SinglePageConfigs, +) -> Result<(String, String, String), Error> { + let before_navbar_url = match config.page_config.page.before_navbar_url.clone() { + Some(url) => Some(url), + None => config.global_config.website.before_navbar_url.clone(), + }; + let before_content_url = match config.page_config.page.before_content_url.clone() { + Some(url) => Some(url), + None => config.global_config.website.before_content_url.clone(), + }; + let after_content_url = match config.page_config.page.after_content_url.clone() { + Some(url) => Some(url), + None => config.global_config.website.after_content_url.clone(), + }; + + let before_navbar = match get_file_contents(before_navbar_url) { + Ok(content) => content, + Err(error) => { + logger.log(error.severity(), error.description()); + String::new() + } + }; + let before_content = match get_file_contents(before_content_url) { + Ok(content) => content, + Err(error) => { + logger.log(error.severity(), error.description()); + String::new() + } + }; + let after_content = match get_file_contents(after_content_url) { + Ok(content) => content, + Err(error) => { + logger.log(error.severity(), error.description()); + String::new() + } + }; + + Ok((before_navbar, before_content, after_content)) +} pub fn render_markdown_content(config: &SinglePageConfigs) -> Result { if let Some(parent) = config.page_config_path.parent() { diff --git a/src/template.rs b/src/template.rs index f2c560c..452a650 100644 --- a/src/template.rs +++ b/src/template.rs @@ -76,6 +76,9 @@ impl Template { pub fn page_data_from( config: SinglePageConfigs, navbar_content: String, + before_navbar: String, + before_content: String, + after_content: String, content: String, ) -> Data { let favicon = config.page_config.page.favicon.unwrap_or( @@ -109,6 +112,10 @@ impl Template { "google_verification".to_owned() => google_verification, "twitter_author".to_owned() => twitter_author, + "before_navbar".to_owned() => before_navbar, + "before_content".to_owned() => before_content, + "after_content".to_owned() => after_content, + "use_default_css".to_owned() => config.global_config.website.use_default_css.to_string(), "navbar".to_owned() => config.global_config.navbar.is_some().to_string(), diff --git a/test_page/other.toml b/test_page/other.toml index 30cd7e6..aa4e511 100644 --- a/test_page/other.toml +++ b/test_page/other.toml @@ -5,7 +5,7 @@ description = "This is the .. other page" content_path = "other.md" #favicon = "optional_favicon.png" #before_navbar_url = "/navbar.html" -#before_content_url = "/before_content.html" +before_content_url = "test_page/resources/before_content_other.html" #after_content_url = "/after_content.html" #javascript = ["Additional JavaScript"] #css = ["Additional CSS"] \ No newline at end of file diff --git a/test_page/resources/after_content.html b/test_page/resources/after_content.html new file mode 100644 index 0000000..acfaa7c --- /dev/null +++ b/test_page/resources/after_content.html @@ -0,0 +1 @@ +

Hi! I'm after the content!

\ No newline at end of file diff --git a/test_page/resources/before_content.html b/test_page/resources/before_content.html new file mode 100644 index 0000000..b6a54d9 --- /dev/null +++ b/test_page/resources/before_content.html @@ -0,0 +1 @@ +

Hi! I'm before the content!

\ No newline at end of file diff --git a/test_page/resources/before_content_other.html b/test_page/resources/before_content_other.html new file mode 100644 index 0000000..528c2c6 --- /dev/null +++ b/test_page/resources/before_content_other.html @@ -0,0 +1 @@ +

I'm different :)

\ No newline at end of file diff --git a/test_page/resources/before_navbar.html b/test_page/resources/before_navbar.html new file mode 100644 index 0000000..65ada40 --- /dev/null +++ b/test_page/resources/before_navbar.html @@ -0,0 +1 @@ +

Hi! I'm before the navbar!

\ No newline at end of file