use super::css::StyleSheet; use super::html::HtmlDoc; use super::item::*; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Page { template: PageTemplate, body: PageBody, pub metadata: PageMetadata, pub sub_pages: Vec<Page>, pub html: HtmlDoc, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct PageTemplate { layout: StyleSheet, name: String, fixed_contents: Vec<ItemContent>, } #[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_src: Vec<String>, pub js_src: Vec<String>, } impl Page { pub fn build_html(&mut self) { self.html = HtmlDoc::from_page(self); } 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_src.as_ref().unwrap_or(&String::new()).to_owned(), // "js" => self.js_src.as_ref().unwrap_or(&String::new()).to_owned(), _ => String::new(), } } }