Render the head for the page.
This commit is contained in:
parent
2b6f86d4e9
commit
178ce877bc
5
default_environment/templates/html/blog_post_page.dust
Normal file
5
default_environment/templates/html/blog_post_page.dust
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<div class="blog_post">
|
||||||
|
<div class="blog_post_intro">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -2,8 +2,16 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
{#global_settings.css_files}<link rel="stylesheet" href="{.}">{/global_settings.css_files}
|
||||||
|
{#global_settings.js_files}<script type="text/javascript" src="{.}"></script>{/global_settings.js_files}
|
||||||
|
{?global_settings.page_title}<title>{global_settings.page_title}</title>{/global_settings.page_title}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<p>Hello world!</p>
|
<div class="main_content">
|
||||||
|
{@select key=.type}
|
||||||
|
{@eq value="blog_post_page"}{>blog_post_page/}{/eq}
|
||||||
|
{@none}{!TODO: make this panic!}ERROR: Unrecognized page content type{/none}
|
||||||
|
{/select}
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use super::render_context::GlobalSettings;
|
||||||
use super::render_context::RenderBlogPostPage;
|
use super::render_context::RenderBlogPostPage;
|
||||||
use super::BlogPost;
|
use super::BlogPost;
|
||||||
use super::BlogPostPage;
|
use super::BlogPostPage;
|
||||||
@ -5,6 +6,7 @@ use super::BlogPostPage;
|
|||||||
pub(crate) fn convert_blog_post_page_to_render_context(
|
pub(crate) fn convert_blog_post_page_to_render_context(
|
||||||
_post: &BlogPost,
|
_post: &BlogPost,
|
||||||
page: &BlogPostPage,
|
page: &BlogPostPage,
|
||||||
|
global_settings: GlobalSettings,
|
||||||
) -> RenderBlogPostPage {
|
) -> RenderBlogPostPage {
|
||||||
RenderBlogPostPage::new(page.title.clone())
|
RenderBlogPostPage::new(global_settings, page.title.clone())
|
||||||
}
|
}
|
||||||
|
@ -5,3 +5,4 @@ mod render_context;
|
|||||||
pub(crate) use convert::convert_blog_post_page_to_render_context;
|
pub(crate) use convert::convert_blog_post_page_to_render_context;
|
||||||
pub(crate) use definition::BlogPost;
|
pub(crate) use definition::BlogPost;
|
||||||
pub(crate) use page::BlogPostPage;
|
pub(crate) use page::BlogPostPage;
|
||||||
|
pub(crate) use render_context::GlobalSettings;
|
||||||
|
@ -1,14 +1,46 @@
|
|||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
|
/// The settings that a "global" to a single dustjs render.
|
||||||
|
#[derive(Debug, Serialize)]
|
||||||
|
pub(crate) struct GlobalSettings {
|
||||||
|
/// The title that goes in the html <title> tag in the <head>.
|
||||||
|
page_title: Option<String>,
|
||||||
|
css_files: Vec<String>,
|
||||||
|
js_files: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GlobalSettings {
|
||||||
|
pub(crate) fn new(
|
||||||
|
page_title: Option<String>,
|
||||||
|
css_files: Vec<String>,
|
||||||
|
js_files: Vec<String>,
|
||||||
|
) -> GlobalSettings {
|
||||||
|
GlobalSettings {
|
||||||
|
page_title,
|
||||||
|
css_files,
|
||||||
|
js_files,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
#[serde(tag = "type")]
|
#[serde(tag = "type")]
|
||||||
#[serde(rename = "blog_post_page")]
|
#[serde(rename = "blog_post_page")]
|
||||||
pub(crate) struct RenderBlogPostPage {
|
pub(crate) struct RenderBlogPostPage {
|
||||||
|
global_settings: GlobalSettings,
|
||||||
|
|
||||||
|
/// The title that will be shown visibly on the page.
|
||||||
title: Option<String>,
|
title: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RenderBlogPostPage {
|
impl RenderBlogPostPage {
|
||||||
pub(crate) fn new(title: Option<String>) -> RenderBlogPostPage {
|
pub(crate) fn new(
|
||||||
RenderBlogPostPage { title }
|
global_settings: GlobalSettings,
|
||||||
|
title: Option<String>,
|
||||||
|
) -> RenderBlogPostPage {
|
||||||
|
RenderBlogPostPage {
|
||||||
|
global_settings,
|
||||||
|
title,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use std::ffi::OsStr;
|
use std::ffi::OsStr;
|
||||||
|
use std::path::Path;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use include_dir::include_dir;
|
use include_dir::include_dir;
|
||||||
@ -6,6 +7,8 @@ use include_dir::Dir;
|
|||||||
|
|
||||||
use crate::blog_post::convert_blog_post_page_to_render_context;
|
use crate::blog_post::convert_blog_post_page_to_render_context;
|
||||||
use crate::blog_post::BlogPost;
|
use crate::blog_post::BlogPost;
|
||||||
|
use crate::blog_post::GlobalSettings;
|
||||||
|
use crate::config::Config;
|
||||||
use crate::error::CustomError;
|
use crate::error::CustomError;
|
||||||
use crate::render::DusterRenderer;
|
use crate::render::DusterRenderer;
|
||||||
use crate::render::RendererIntegration;
|
use crate::render::RendererIntegration;
|
||||||
@ -27,7 +30,7 @@ impl SiteRenderer {
|
|||||||
blog_posts,
|
blog_posts,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub(crate) async fn render_blog_posts(&self) -> Result<(), CustomError> {
|
pub(crate) async fn render_blog_posts(&self, config: &Config) -> Result<(), CustomError> {
|
||||||
let mut renderer_integration = DusterRenderer::new();
|
let mut renderer_integration = DusterRenderer::new();
|
||||||
|
|
||||||
let sources: Vec<_> = MAIN_TEMPLATES
|
let sources: Vec<_> = MAIN_TEMPLATES
|
||||||
@ -62,9 +65,25 @@ impl SiteRenderer {
|
|||||||
.join("posts")
|
.join("posts")
|
||||||
.join(&blog_post.id)
|
.join(&blog_post.id)
|
||||||
.join(blog_post_page.get_output_path());
|
.join(blog_post_page.get_output_path());
|
||||||
println!("Output path: {:?}", output_path);
|
let css_files = vec![get_web_path(
|
||||||
let render_context =
|
config,
|
||||||
convert_blog_post_page_to_render_context(blog_post, blog_post_page);
|
&self.output_directory,
|
||||||
|
&output_path,
|
||||||
|
"main.css",
|
||||||
|
)?];
|
||||||
|
let js_files = vec![get_web_path(
|
||||||
|
config,
|
||||||
|
&self.output_directory,
|
||||||
|
&output_path,
|
||||||
|
"blog_post.js",
|
||||||
|
)?];
|
||||||
|
let global_settings =
|
||||||
|
GlobalSettings::new(blog_post_page.title.clone(), css_files, js_files);
|
||||||
|
let render_context = convert_blog_post_page_to_render_context(
|
||||||
|
blog_post,
|
||||||
|
blog_post_page,
|
||||||
|
global_settings,
|
||||||
|
);
|
||||||
let rendered_output = renderer_integration.render(render_context)?;
|
let rendered_output = renderer_integration.render(render_context)?;
|
||||||
println!("Rendered: {}", rendered_output);
|
println!("Rendered: {}", rendered_output);
|
||||||
let parent_directory = output_path
|
let parent_directory = output_path
|
||||||
@ -91,3 +110,41 @@ fn build_name_contents_pairs<'a>(
|
|||||||
let contents = std::str::from_utf8(entry.contents())?;
|
let contents = std::str::from_utf8(entry.contents())?;
|
||||||
Ok((name, contents))
|
Ok((name, contents))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_web_path<D: AsRef<Path>, F: AsRef<Path>, P: AsRef<Path>>(
|
||||||
|
config: &Config,
|
||||||
|
output_directory: D,
|
||||||
|
containing_file: F,
|
||||||
|
path_from_web_root: P,
|
||||||
|
) -> Result<String, CustomError> {
|
||||||
|
let path_from_web_root = path_from_web_root.as_ref();
|
||||||
|
if config.use_relative_paths() {
|
||||||
|
let output_directory = output_directory.as_ref();
|
||||||
|
let containing_file = containing_file.as_ref();
|
||||||
|
// Subtracting 1 from the depth to "remove" the file name.
|
||||||
|
let depth_from_web_root = containing_file
|
||||||
|
.strip_prefix(output_directory)?
|
||||||
|
.components()
|
||||||
|
.count()
|
||||||
|
- 1;
|
||||||
|
let prefix = "../".repeat(depth_from_web_root);
|
||||||
|
let final_path = PathBuf::from(prefix).join(path_from_web_root);
|
||||||
|
let final_string = final_path
|
||||||
|
.as_path()
|
||||||
|
.to_str()
|
||||||
|
.map(str::to_string)
|
||||||
|
.ok_or("Path should be valid utf-8.")?;
|
||||||
|
Ok(final_string)
|
||||||
|
} else {
|
||||||
|
let web_root = config
|
||||||
|
.get_web_root()
|
||||||
|
.ok_or("Must either use_relative_paths or set the web_root in the config.")?;
|
||||||
|
let final_path = PathBuf::from(web_root).join(path_from_web_root);
|
||||||
|
let final_string = final_path
|
||||||
|
.as_path()
|
||||||
|
.to_str()
|
||||||
|
.map(str::to_string)
|
||||||
|
.ok_or("Path should be valid utf-8.")?;
|
||||||
|
Ok(final_string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -10,7 +10,7 @@ pub(crate) async fn build_site(args: BuildArgs) -> Result<(), CustomError> {
|
|||||||
let config = Config::load_from_file(args.config).await?;
|
let config = Config::load_from_file(args.config).await?;
|
||||||
let blog_posts = load_blog_posts(&config).await?;
|
let blog_posts = load_blog_posts(&config).await?;
|
||||||
let renderer = SiteRenderer::new(get_output_directory(&config).await?, blog_posts);
|
let renderer = SiteRenderer::new(get_output_directory(&config).await?, blog_posts);
|
||||||
renderer.render_blog_posts().await?;
|
renderer.render_blog_posts(&config).await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -59,4 +59,12 @@ impl Config {
|
|||||||
pub(crate) fn get_output_directory(&self) -> PathBuf {
|
pub(crate) fn get_output_directory(&self) -> PathBuf {
|
||||||
self.get_root_directory().join("output")
|
self.get_root_directory().join("output")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn use_relative_paths(&self) -> bool {
|
||||||
|
self.raw.use_relative_paths.unwrap_or(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn get_web_root(&self) -> Option<&str> {
|
||||||
|
self.raw.web_root.as_deref()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@ pub(crate) struct RawConfig {
|
|||||||
site_title: String,
|
site_title: String,
|
||||||
author: Option<String>,
|
author: Option<String>,
|
||||||
email: Option<String>,
|
email: Option<String>,
|
||||||
|
pub(super) use_relative_paths: Option<bool>,
|
||||||
|
pub(super) web_root: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for RawConfig {
|
impl Default for RawConfig {
|
||||||
@ -15,6 +17,8 @@ impl Default for RawConfig {
|
|||||||
site_title: "My super awesome website".to_owned(),
|
site_title: "My super awesome website".to_owned(),
|
||||||
author: None,
|
author: None,
|
||||||
email: None,
|
email: None,
|
||||||
|
use_relative_paths: None,
|
||||||
|
web_root: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user