use super::css::StyleSheet; use super::html_doc::HtmlDoc; use super::item::*; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Page { pub template_name: String, pub body: PageBody, pub metadata: PageMetadata, #[serde(default = "Vec::new")] pub sub_pages: Vec<Page>, #[serde(default = "HtmlDoc::new")] pub html: HtmlDoc, pub template: Option<PageTemplate>, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct PageTemplate { pub layout: StyleSheet, pub name: String, pub contents: Vec<HtmlElement>, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct PageBody(Vec<Item>); impl std::fmt::Display for PageBody { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!( f, "{}", &self .0 .iter() .map(|i| i.to_string()) .collect::<Vec<String>>() .join("") ) } } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct PageMetadata { pub title: String, pub lang: String, pub description: String, pub url_slug: String, pub css: Vec<String>, pub js: Vec<String>, } impl Page { pub fn build_html(&mut self) { self.html = HtmlDoc::from_page(self); } pub fn build_body_template(&mut self, template: PageTemplate) { let mut body = template.clone(); self.template = Some(template); let err = "Couldn't find page-body placeholder"; let body_container = body .contents .iter() .find(|el| el.attrs.get("id").expect(err).eq("page-body")) .expect(err); // HINT use HashMap::extend() to insert many values // TODO concat template with page body (template should have a page body placeholder) } pub fn text_from_key(&self, key: String) -> String { match &key[..] { "title" => self.metadata.title.to_owned(), "lang" => self.metadata.lang.to_owned(), "description" => self.metadata.description.to_owned(), "slug" => self.metadata.url_slug.to_owned(), "body" => self.body.to_string(), // "css" => self.css.as_ref().unwrap_or(&String::new()).to_owned(), // "js" => self.js.as_ref().unwrap_or(&String::new()).to_owned(), _ => String::new(), } } }