From b98ed3f79418eb355dafb714f455a3409f65499d Mon Sep 17 00:00:00 2001 From: Jaime Valdemoros Date: Sun, 7 Jan 2018 20:05:57 +0000 Subject: [PATCH] Clean up LinkPreprocessor exports and use explicit PreprocessorContext struct --- src/book/mod.rs | 37 +++++++++++++++++-------------------- src/preprocess/links.rs | 14 ++++++-------- src/preprocess/mod.rs | 11 +++++++++-- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/book/mod.rs b/src/book/mod.rs index e0ab9bf7..2734d296 100644 --- a/src/book/mod.rs +++ b/src/book/mod.rs @@ -23,7 +23,7 @@ use toml::Value; use utils; use renderer::{CmdRenderer, HtmlHandlebars, RenderContext, Renderer}; -use preprocess::{self, Preprocessor}; +use preprocess::{Preprocessor, LinkPreprocessor, PreprocessorContext}; use errors::*; use config::Config; @@ -88,20 +88,16 @@ impl MDBook { let livereload = None; let renderers = determine_renderers(&config); + let preprocessors = determine_preprocessors(&config); - let mut md_book = MDBook { + Ok(MDBook { root, config, book, renderers, livereload, - preprocessors: vec![], - }; - - let preprocessors = determine_preprocessors(&md_book); - md_book.preprocessors = preprocessors; - - Ok(md_book) + preprocessors, + }) } /// Returns a flat depth-first iterator over the elements of the book, @@ -161,9 +157,12 @@ impl MDBook { debug!("[fn]: build"); let mut preprocessed_book = self.book.clone(); + let preprocess_ctx = PreprocessorContext { + src_dir: self.source_dir(), + }; for preprocessor in &self.preprocessors { - preprocessor.run(&mut preprocessed_book)?; + preprocessor.run(&preprocess_ctx, &mut preprocessed_book)?; } for renderer in &self.renderers { @@ -225,9 +224,11 @@ impl MDBook { let temp_dir = TempDir::new("mdbook")?; let src_dir = self.source_dir(); - let replace_all_preprocessor = preprocess::links::LinkPreprocessor::new(src_dir); + let preprocess_context = PreprocessorContext { + src_dir + }; - replace_all_preprocessor.run(&mut self.book)?; + LinkPreprocessor::new().run(&preprocess_context, &mut self.book)?; for item in self.iter() { if let BookItem::Chapter(ref ch) = *item { @@ -333,16 +334,14 @@ fn determine_renderers(config: &Config) -> Vec> { } /// Look at the `MDBook` and try to figure out what preprocessors to run. -fn determine_preprocessors(md_book: &MDBook) -> Vec> { +fn determine_preprocessors(config: &Config) -> Vec> { let mut preprocessors: Vec> = Vec::new(); - if let Some(preprocess_array) = md_book.config.get("preprocess").and_then(|o| o.as_array()) { + if let Some(preprocess_array) = config.get("preprocess").and_then(|o| o.as_array()) { for key in preprocess_array.iter() { match key.as_str() { Some(key) if key == "links" => { - let src_dir = md_book.source_dir(); - let link_preprocessor = preprocess::links::LinkPreprocessor::new(src_dir); - preprocessors.push(Box::new(link_preprocessor)) + preprocessors.push(Box::new(LinkPreprocessor::new())) } _ => {} } @@ -350,9 +349,7 @@ fn determine_preprocessors(md_book: &MDBook) -> Vec> { } if preprocessors.is_empty() { - let src_dir = md_book.source_dir(); - let link_preprocessor = preprocess::links::LinkPreprocessor::new(src_dir); - preprocessors.push(Box::new(link_preprocessor)) + preprocessors.push(Box::new(LinkPreprocessor::new())) } preprocessors diff --git a/src/preprocess/links.rs b/src/preprocess/links.rs index 7058c07d..cbbd71f6 100644 --- a/src/preprocess/links.rs +++ b/src/preprocess/links.rs @@ -5,28 +5,26 @@ use utils::fs::file_to_string; use utils::take_lines; use errors::*; -use super::Preprocessor; +use super::{Preprocessor, PreprocessorContext}; use book::{Book, BookItem}; const ESCAPE_CHAR: char = '\\'; -pub struct LinkPreprocessor { - src_dir: PathBuf -} +pub struct LinkPreprocessor; impl LinkPreprocessor { - pub fn new>(src_dir: P) -> Self { - LinkPreprocessor { src_dir: src_dir.into() } + pub fn new() -> Self { + LinkPreprocessor } } impl Preprocessor for LinkPreprocessor { - fn run(&self, book: &mut Book) -> Result<()> { + fn run(&self, ctx: &PreprocessorContext, book: &mut Book) -> Result<()> { for section in &mut book.sections { match *section { BookItem::Chapter(ref mut ch) => { let base = ch.path.parent() - .map(|dir| self.src_dir.join(dir)) + .map(|dir| ctx.src_dir.join(dir)) .ok_or_else(|| String::from("Invalid bookitem path!"))?; let content = replace_all(&ch.content, base)?; ch.content = content diff --git a/src/preprocess/mod.rs b/src/preprocess/mod.rs index acc954ec..727fad1e 100644 --- a/src/preprocess/mod.rs +++ b/src/preprocess/mod.rs @@ -1,9 +1,16 @@ -pub mod links; +pub use self::links::LinkPreprocessor; + +mod links; use book::Book; use errors::*; +use std::path::PathBuf; + +pub struct PreprocessorContext { + pub src_dir: PathBuf +} pub trait Preprocessor { - fn run(&self, book: &mut Book) -> Result<()>; + fn run(&self, ctx: &PreprocessorContext, book: &mut Book) -> Result<()>; } \ No newline at end of file