use std::collections::HashSet; use super::GlobalSettings; use super::PageHeader; use super::RenderDocumentElement; use super::footnote_definition::RenderRealFootnoteDefinition; use super::macros::render; use super::render_context::RenderContext; use crate::context::macros::push_file; use crate::error::CustomError; use crate::intermediate::IPage; use crate::intermediate::get_web_path; use serde::Serialize; #[derive(Debug, Serialize)] #[serde(tag = "type")] #[serde(rename = "page")] pub(crate) struct RenderPage { global_settings: GlobalSettings, page_header: Option, /// The title that will be shown visibly on the page. title: Option, self_link: Option, children: Vec, footnotes: Vec, } render!(RenderPage, IPage, original, render_context, { push_file!(render_context, &original.src, { let page_header = PageHeader::new( render_context.config.get_site_title().map(str::to_string), Some(get_web_path( render_context.config, render_context.output_root_directory, render_context.output_file, "", )?), Some(get_web_path( render_context.config, render_context.output_root_directory, render_context.output_file, "about_me", )?), ); let link_to_blog_post = get_web_path( render_context.config, render_context.output_root_directory, render_context.output_file, render_context .output_file .strip_prefix(render_context.output_root_directory)?, )?; let children = { let mut children = Vec::new(); for child in original.children.iter() { children.push(RenderDocumentElement::new(render_context.clone(), child)?); } children }; let footnotes = { let mut ret = Vec::new(); for footnote in original.footnotes.iter() { ret.push(RenderRealFootnoteDefinition::new( render_context.clone(), footnote, )?); } ret }; let mut css_files = vec![ get_web_path( render_context.config, render_context.output_root_directory, render_context.output_file, "stylesheet/reset.css", )?, get_web_path( render_context.config, render_context.output_root_directory, render_context.output_file, "stylesheet/main.css", )?, ]; let additional_css_files = render_context .dependency_manager .lock() .unwrap() .list_css()? .map(|css_name| { get_web_path( render_context.config, render_context.output_root_directory, render_context.output_file, format!("stylesheet/{}", css_name), ) }) .collect::, _>>()?; css_files.extend(additional_css_files.into_iter()); let js_files = vec![get_web_path( render_context.config, render_context.output_root_directory, render_context.output_file, "blog_post.js", )?]; let global_settings = GlobalSettings::new(original.title.clone(), css_files, js_files); let ret = RenderPage { global_settings, page_header: Some(page_header), title: original.title.clone(), self_link: Some(link_to_blog_post), children, footnotes, }; Ok(ret) }) });