use super::Error;
use mdbook_renderer::RenderContext;
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
pub const DEFAULT_TEMPLATE: &str = include_str!("index.hbs");
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(default, rename_all = "kebab-case")]
pub struct Config {
pub additional_css: Vec<PathBuf>,
pub use_default_css: bool,
pub index_template: Option<PathBuf>,
pub cover_image: Option<PathBuf>,
pub additional_resources: Vec<PathBuf>,
pub no_section_label: bool,
pub curly_quotes: bool,
pub footnote_backrefs: bool,
pub epub_version: Option<u8>,
}
impl Config {
pub fn from_render_context(ctx: &RenderContext) -> Result<Config, Error> {
match ctx.config.get::<Config>("output.epub")? {
Some(mut cfg) => {
if let Some(template_file) = cfg.index_template.take() {
cfg.index_template = Some(ctx.root.join(template_file));
}
Ok(cfg)
}
None => Ok(Config::default()),
}
}
pub fn template(&self) -> Result<String, Error> {
match self.index_template {
Some(ref filename) => {
let buffer = std::fs::read_to_string(filename)
.map_err(|_| Error::OpenTemplate(filename.clone()))?;
Ok(buffer)
}
None => Ok(DEFAULT_TEMPLATE.to_string()),
}
}
}
impl Default for Config {
fn default() -> Config {
Config {
use_default_css: true,
additional_css: Vec::new(),
index_template: None,
cover_image: None,
additional_resources: Vec::new(),
no_section_label: false,
curly_quotes: false,
footnote_backrefs: false,
epub_version: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
use std::path::Path;
use tempfile::TempDir;
#[test]
fn test_from_render_context_minimal_settings() {
let tmp_dir = TempDir::new().unwrap();
let json = ctx_with_template(
"unknown_src",
tmp_dir.path().join("test-mdbook-epub").as_path(),
)
.to_string();
let ctx = RenderContext::from_json(json.as_bytes()).unwrap();
let config = Config::from_render_context(&ctx);
assert!(config.is_ok());
}
fn ctx_with_template(source: &str, destination: &Path) -> serde_json::Value {
json!({
"version": mdbook_core::MDBOOK_VERSION,
"root": "tests/long_book_example",
"book": {"items": [], "__non_exhaustive": null},
"config": {
"book": {"authors": [], "language": "en", "text-direction": "ltr",
"src": source, "title": "DummyBook"},
"output": {"epub": {"optional": true}}},
"destination": destination
})
}
}