This moves Result and Error to mdbook-core with the anticipation of using them in user crates. For now, the internal APIs will be using anyhow directly, but the intent is to transition more of these to mdbook-core where it makes sense.
69 lines
2 KiB
Rust
69 lines
2 KiB
Rust
//! Book preprocessing.
|
|
|
|
pub use self::cmd::CmdPreprocessor;
|
|
pub use self::index::IndexPreprocessor;
|
|
pub use self::links::LinkPreprocessor;
|
|
|
|
mod cmd;
|
|
mod index;
|
|
mod links;
|
|
|
|
use crate::book::Book;
|
|
use crate::config::Config;
|
|
use anyhow::Result;
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
use std::cell::RefCell;
|
|
use std::collections::HashMap;
|
|
use std::path::PathBuf;
|
|
|
|
/// Extra information for a `Preprocessor` to give them more context when
|
|
/// processing a book.
|
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
|
pub struct PreprocessorContext {
|
|
/// The location of the book directory on disk.
|
|
pub root: PathBuf,
|
|
/// The book configuration (`book.toml`).
|
|
pub config: Config,
|
|
/// The `Renderer` this preprocessor is being used with.
|
|
pub renderer: String,
|
|
/// The calling `mdbook` version.
|
|
pub mdbook_version: String,
|
|
#[serde(skip)]
|
|
pub(crate) chapter_titles: RefCell<HashMap<PathBuf, String>>,
|
|
#[serde(skip)]
|
|
__non_exhaustive: (),
|
|
}
|
|
|
|
impl PreprocessorContext {
|
|
/// Create a new `PreprocessorContext`.
|
|
pub(crate) fn new(root: PathBuf, config: Config, renderer: String) -> Self {
|
|
PreprocessorContext {
|
|
root,
|
|
config,
|
|
renderer,
|
|
mdbook_version: crate::MDBOOK_VERSION.to_string(),
|
|
chapter_titles: RefCell::new(HashMap::new()),
|
|
__non_exhaustive: (),
|
|
}
|
|
}
|
|
}
|
|
|
|
/// An operation which is run immediately after loading a book into memory and
|
|
/// before it gets rendered.
|
|
pub trait Preprocessor {
|
|
/// Get the `Preprocessor`'s name.
|
|
fn name(&self) -> &str;
|
|
|
|
/// Run this `Preprocessor`, allowing it to update the book before it is
|
|
/// given to a renderer.
|
|
fn run(&self, ctx: &PreprocessorContext, book: Book) -> Result<Book>;
|
|
|
|
/// A hint to `MDBook` whether this preprocessor is compatible with a
|
|
/// particular renderer.
|
|
///
|
|
/// By default, always returns `true`.
|
|
fn supports_renderer(&self, _renderer: &str) -> bool {
|
|
true
|
|
}
|
|
}
|