use std::path::PathBuf; use config::Config; use template::Template; use renderer; use logger::{LogLevel, Logger}; use error::Error; use options::BuildOps; use file_writer; const DEFAULT_CSS: &'static str = include_str!("templates/default-css.css"); const PAGE_TEMPLATE: &'static str = include_str!("templates/page-template.html"); const NAVBAR_ITEM: &'static str = include_str!("templates/navbar/item-template.html"); const NAVBAR_IMAGE_ITEM: &'static str = include_str!("templates/navbar/image-item-template.html"); fn fetch_config() -> Result { match Config::new() { Ok(config) => Ok(config), Err(err) => Err(Error::from(err)), } } pub fn build(logger: &Logger, ops: &BuildOps) -> Result<(), Error> { logger.log(LogLevel::INFO, "Starting build"); let config = fetch_config()?; if config.global_config.website.use_default_css { let css_path = file_writer::add_to_beginning(PathBuf::from("css/default.css"), "public")?; logger.log(LogLevel::DETAIL, format!("Adding {:?}", css_path)); file_writer::write_file(css_path, DEFAULT_CSS, ops.overwrite)?; } logger.log(LogLevel::INFO, "Generating page templates"); let page_template = Template::new(PAGE_TEMPLATE); let mut navbar_content = String::new(); if config.global_config.navbar.is_some() { let navbar_item_template = Template::new(NAVBAR_ITEM); let navbar_image_item_template = Template::new(NAVBAR_IMAGE_ITEM); logger.log(LogLevel::DETAIL, "Rendering Navbar"); navbar_content = renderer::render_navbar(&config, navbar_item_template, navbar_image_item_template)?; } logger.log(LogLevel::INFO, "Rendering"); let configs = config.get_configs()?; let mut renders = Vec::new(); for config in configs.clone() { logger.log( LogLevel::DETAILER, format!("Rendering {}", config.page_config.page.html_path), ); let markdown = renderer::render_markdown_content(&config)?; let data = Template::page_data_from(config.clone(), navbar_content.clone(), markdown); let rendered = page_template.render(&data); renders.push(rendered); } logger.log(LogLevel::INFO, "Writing"); for (idx, config) in configs.clone().iter().enumerate() { let html_path = config.clone().page_config.page.html_path; let html_path = file_writer::add_to_beginning(PathBuf::from(html_path), "public")?; logger.log(LogLevel::DETAILER, format!("Writing {:?}", html_path)); if let Some(render) = renders.get(idx) { file_writer::write_file(html_path, render.clone(), ops.overwrite)?; } else { return Err(Error::new( LogLevel::SEVERE, format!("Internal error; Render not found for file: {:?}", html_path), )); } } logger.log(LogLevel::INFO, "Done!"); Ok(()) }