//! 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 crate::errors::*; 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>, #[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; /// 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 } }