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}
{@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)