mdbook-preprocessor-utils 0.2.0

Utilities for writing mdBook preprocessors
Documentation
use anyhow::Result;
use mdbook::{
  book::{load_book, Book},
  config::BuildConfig,
  preprocess::{CmdPreprocessor, Preprocessor},
  MDBook,
};
use std::{env, path::Path};
use tempfile::{tempdir, TempDir};

use crate::{processor::SimplePreprocessorDriver, SimplePreprocessor};

pub struct MdbookTestHarness {
  dir: TempDir,
}

impl MdbookTestHarness {
  pub fn new() -> Result<Self> {
    let dir = tempdir()?;
    let builder = MDBook::init(dir.path());
    builder.build()?;
    Ok(MdbookTestHarness { dir })
  }

  pub fn root(&self) -> &Path {
    self.dir.path()
  }

  pub fn compile<P: SimplePreprocessor>(&self, config: serde_json::Value) -> Result<Book> {
    let book = load_book(self.root().join("src"), &BuildConfig::default())?;
    let json = serde_json::json!(
      [
        {
          "root": self.root().display().to_string(),
          "config": {
            "preprocessor": {
              P::name(): config,
            },
          },
          "renderer": "html",
          "mdbook_version": "0.1.0"
        },
        serde_json::to_value(&book)?
      ]
    );
    let json_str = serde_json::to_string(&json)?;

    env::set_current_dir(self.root())?;

    let preprocessor = SimplePreprocessorDriver::<P>::new();
    let (ctx, book) = CmdPreprocessor::parse_input(json_str.as_bytes())?;
    let book = preprocessor.run(&ctx, book)?;

    Ok(book)
  }
}