scraps 1.1.0

Scraps is a portable CLI knowledge hub for managing interconnected Markdown documentation with Wiki-link notation.
use crate::error::BuildError;
use crate::error::{anyhow::Context, ScrapsResult};
use crate::usecase::build::html::cdn_versions::CDN_VERSIONS;
use crate::usecase::build::model::html::HtmlMetadata;
use chrono_tz::Tz;
use once_cell::sync::Lazy;
use scraps_libs::model::base_url::BaseUrl;
use tera::Tera;

static SCRAP_TERA: Lazy<Tera> = Lazy::new(|| {
    let mut tera = Tera::default();
    tera.add_raw_templates(vec![
        (
            "__builtins/base.html",
            include_str!("../builtins/base.html"),
        ),
        (
            "__builtins/macros.html",
            include_str!("../builtins/macros.html"),
        ),
        (
            "__builtins/scrap.html",
            include_str!("../builtins/scrap.html"),
        ),
    ])
    .unwrap();
    tera
});

pub fn base(
    base_url: &BaseUrl,
    timezone: Tz,
    metadata: &HtmlMetadata,
    template_dir: &str,
) -> ScrapsResult<(Tera, tera::Context)> {
    let mut tera = Tera::new(template_dir).context(BuildError::RenderHtml)?;
    tera.extend(&SCRAP_TERA).unwrap();

    let mut context = tera::Context::new();
    context.insert("base_url", &base_url.as_url());
    context.insert("lang_code", &metadata.lang_code().to_string());
    context.insert("timezone", &timezone);
    context.insert("title", &metadata.title());
    context.insert("description", &metadata.description());
    context.insert("favicon", &metadata.favicon());
    context.insert("cdn", &CDN_VERSIONS);

    Ok((tera, context))
}