Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
page.rs 2.4 KiB
Newer Older
peterrabbit's avatar
peterrabbit committed
use super::css::StyleSheet;
use super::html_doc::HtmlDoc;
peterrabbit's avatar
peterrabbit committed
use super::item::*;
peterrabbit's avatar
peterrabbit committed
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, Clone)]
peterrabbit's avatar
peterrabbit committed
pub struct Page {
peterrabbit's avatar
peterrabbit committed
    pub template_name: String,
    pub body: PageBody,
peterrabbit's avatar
peterrabbit committed
    pub metadata: PageMetadata,
peterrabbit's avatar
peterrabbit committed
    #[serde(default = "Vec::new")]
peterrabbit's avatar
peterrabbit committed
    pub sub_pages: Vec<Page>,
    #[serde(default = "HtmlDoc::new")]
peterrabbit's avatar
peterrabbit committed
    pub html: HtmlDoc,
peterrabbit's avatar
peterrabbit committed
    pub template: Option<PageTemplate>,
peterrabbit's avatar
peterrabbit committed
}

#[derive(Debug, Serialize, Deserialize, Clone)]
peterrabbit's avatar
peterrabbit committed
pub struct PageTemplate {
peterrabbit's avatar
peterrabbit committed
    pub layout: StyleSheet,
    pub name: String,
    pub contents: Vec<HtmlElement>,
peterrabbit's avatar
peterrabbit committed
#[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,
peterrabbit's avatar
peterrabbit committed
    pub css: Vec<String>,
    pub js: Vec<String>,
peterrabbit's avatar
peterrabbit committed
}

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
peterrabbit's avatar
peterrabbit committed
        // TODO concat template with page body (template should have a page body placeholder)
    }

peterrabbit's avatar
peterrabbit committed
    pub fn text_from_key(&self, key: String) -> String {
peterrabbit's avatar
peterrabbit committed
        match &key[..] {
peterrabbit's avatar
peterrabbit committed
            "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(),
peterrabbit's avatar
peterrabbit committed
            // "css" => self.css.as_ref().unwrap_or(&String::new()).to_owned(),
            // "js" => self.js.as_ref().unwrap_or(&String::new()).to_owned(),
peterrabbit's avatar
peterrabbit committed
            _ => String::new(),
        }
    }
}