diff --git a/default_environment/templates/html/main.dust b/default_environment/templates/html/main.dust index 77faec1..375d21b 100644 --- a/default_environment/templates/html/main.dust +++ b/default_environment/templates/html/main.dust @@ -7,7 +7,7 @@ {?global_settings.page_title}{global_settings.page_title}{/global_settings.page_title} - {! TODO: Header bar with links? !} + {#.page_header}{>page_header/}{/.page_header}
{@select key=.type} {@eq value="blog_post_page"}{>blog_post_page/}{/eq} diff --git a/default_environment/templates/html/page_header.dust b/default_environment/templates/html/page_header.dust new file mode 100644 index 0000000..f2c3089 --- /dev/null +++ b/default_environment/templates/html/page_header.dust @@ -0,0 +1,4 @@ + diff --git a/src/config/full.rs b/src/config/full.rs index 0f962aa..4978e8d 100644 --- a/src/config/full.rs +++ b/src/config/full.rs @@ -67,4 +67,8 @@ impl Config { pub(crate) fn get_web_root(&self) -> Option<&str> { self.raw.web_root.as_deref() } + + pub(crate) fn get_site_title(&self) -> Option<&str> { + self.raw.site_title.as_deref() + } } diff --git a/src/config/raw.rs b/src/config/raw.rs index b0d95cf..ce34997 100644 --- a/src/config/raw.rs +++ b/src/config/raw.rs @@ -4,7 +4,7 @@ use serde::Serialize; /// This is the struct for the writer.toml config file that ends up in each site's root directory. #[derive(Deserialize, Serialize)] pub(crate) struct RawConfig { - site_title: String, + pub(super) site_title: Option, author: Option, email: Option, pub(super) use_relative_paths: Option, @@ -14,7 +14,7 @@ pub(crate) struct RawConfig { impl Default for RawConfig { fn default() -> Self { RawConfig { - site_title: "My super awesome website".to_owned(), + site_title: None, author: None, email: None, use_relative_paths: None, diff --git a/src/context/blog_post_page.rs b/src/context/blog_post_page.rs index d7dd043..b42df31 100644 --- a/src/context/blog_post_page.rs +++ b/src/context/blog_post_page.rs @@ -2,6 +2,7 @@ use serde::Serialize; use super::footnote_definition::RenderRealFootnoteDefinition; use super::GlobalSettings; +use super::PageHeader; use super::RenderDocumentElement; #[derive(Debug, Serialize)] @@ -10,6 +11,8 @@ use super::RenderDocumentElement; pub(crate) struct RenderBlogPostPage { global_settings: GlobalSettings, + page_header: Option, + /// The title that will be shown visibly on the page. title: Option, @@ -24,6 +27,7 @@ impl RenderBlogPostPage { // TODO: Maybe these settings should be moved into a common struct so this can have the same type signature as the others. pub(crate) fn new( global_settings: GlobalSettings, + page_header: Option, title: Option, self_link: Option, children: Vec, @@ -31,6 +35,7 @@ impl RenderBlogPostPage { ) -> RenderBlogPostPage { RenderBlogPostPage { global_settings, + page_header, title, self_link, children, diff --git a/src/context/mod.rs b/src/context/mod.rs index 2c412b3..f3a8311 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -35,6 +35,7 @@ mod line_break; mod macros; mod object; mod org_macro; +mod page_header; mod paragraph; mod plain_link; mod plain_list; @@ -69,4 +70,5 @@ pub(crate) use footnote_definition::RenderRealFootnoteDefinition; pub(crate) use global_settings::GlobalSettings; pub(crate) use heading::RenderHeading; pub(crate) use object::RenderObject; +pub(crate) use page_header::PageHeader; pub(crate) use section::RenderSection; diff --git a/src/context/page_header.rs b/src/context/page_header.rs new file mode 100644 index 0000000..0115e9c --- /dev/null +++ b/src/context/page_header.rs @@ -0,0 +1,19 @@ +use serde::Serialize; + +/// The header that goes above the content of the page. +/// +/// This header will be mostly the same on every page. +#[derive(Debug, Serialize)] +pub(crate) struct PageHeader { + website_title: Option, + home_link: Option, +} + +impl PageHeader { + pub(crate) fn new(website_title: Option, home_link: Option) -> PageHeader { + PageHeader { + website_title, + home_link, + } + } +} diff --git a/src/intermediate/convert.rs b/src/intermediate/convert.rs index 747fce8..596a55c 100644 --- a/src/intermediate/convert.rs +++ b/src/intermediate/convert.rs @@ -4,6 +4,7 @@ use std::path::PathBuf; use crate::config::Config; use crate::context::GlobalSettings; +use crate::context::PageHeader; use crate::context::RenderBlogPostPage; use crate::context::RenderDocumentElement; use crate::context::RenderRealFootnoteDefinition; @@ -37,6 +38,10 @@ pub(crate) fn convert_blog_post_page_to_render_context, F: AsRef< "blog_post.js", )?]; let global_settings = GlobalSettings::new(page.title.clone(), css_files, js_files); + let page_header = PageHeader::new( + config.get_site_title().map(str::to_string), + Some(get_web_path(config, output_directory, output_file, "")?), + ); let link_to_blog_post = get_web_path( config, output_directory, @@ -76,6 +81,7 @@ pub(crate) fn convert_blog_post_page_to_render_context, F: AsRef< let ret = RenderBlogPostPage::new( global_settings, + Some(page_header), page.title.clone(), Some(link_to_blog_post), children, @@ -100,9 +106,7 @@ fn get_web_path, F: AsRef, P: AsRef>( containing_file_relative_to_output_directory .parent() .ok_or("File should exist in a folder.")?, - path_from_web_root - .parent() - .ok_or("File should exist in a folder.")?, + path_from_web_root.parent().unwrap_or(&Path::new("")), ) .collect::(); // Subtracting 1 from the depth to "remove" the file name. diff --git a/src/render/duster_renderer.rs b/src/render/duster_renderer.rs index e5078a9..2208077 100644 --- a/src/render/duster_renderer.rs +++ b/src/render/duster_renderer.rs @@ -34,7 +34,7 @@ impl<'a> RendererIntegration<'a> for DusterRenderer<'a> { } // TODO: This is horribly inefficient. I am converting from a serialize type to json and back again so I can use the existing implementation of IntoContextElement. Honestly, I probably need to rework a lot of duster now that I've improved in rust over the years. let json_context = serde_json::to_string(&context)?; - println!("{}", json_context); + // println!("{}", json_context); let parsed_context: serde_json::Value = serde_json::from_str(json_context.as_str())?; let rendered_output = dust_renderer.render("main", Some(&parsed_context))?; Ok(rendered_output)