Skip to content

Commit fe6c1c1

Browse files
Cleaned up the build() method and backend discovery
1 parent 69e26e6 commit fe6c1c1

File tree

2 files changed

+42
-35
lines changed

2 files changed

+42
-35
lines changed

src/bin/mdbook.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use clap::{App, AppSettings, ArgMatches};
1616
use chrono::Local;
1717
use log::LevelFilter;
1818
use env_logger::Builder;
19-
use error_chain::ChainedError;
2019
use mdbook::utils;
2120

2221
pub mod build;

src/book/mod.rs

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use std::path::PathBuf;
1919
use std::io::Write;
2020
use std::process::Command;
2121
use tempdir::TempDir;
22+
use toml::Value;
2223

2324
use utils;
2425
use renderer::{CmdRenderer, HtmlHandlebars, RenderContext, Renderer};
@@ -149,32 +150,36 @@ impl MDBook {
149150
debug!("[fn]: build");
150151

151152
for renderer in &self.renderers {
152-
let name = renderer.name();
153-
let build_dir = self.build_dir_for(name);
154-
if build_dir.exists() {
155-
debug!(
156-
"Cleaning build dir for the \"{}\" renderer ({})",
157-
name,
158-
build_dir.display()
159-
);
160-
161-
utils::fs::remove_dir_content(&build_dir)
162-
.chain_err(|| "Unable to clear output directory")?;
163-
}
153+
self.run_renderer(renderer.as_ref())?;
154+
}
155+
156+
Ok(())
157+
}
164158

165-
let render_context = RenderContext::new(
166-
self.root.clone(),
167-
self.book.clone(),
168-
self.config.clone(),
169-
build_dir,
159+
fn run_renderer(&self, renderer: &Renderer) -> Result<()> {
160+
let name = renderer.name();
161+
let build_dir = self.build_dir_for(name);
162+
if build_dir.exists() {
163+
debug!(
164+
"Cleaning build dir for the \"{}\" renderer ({})",
165+
name,
166+
build_dir.display()
170167
);
171168

172-
renderer
173-
.render(&render_context)
174-
.chain_err(|| "Rendering failed")?;
169+
utils::fs::remove_dir_content(&build_dir)
170+
.chain_err(|| "Unable to clear output directory")?;
175171
}
176172

177-
Ok(())
173+
let render_context = RenderContext::new(
174+
self.root.clone(),
175+
self.book.clone(),
176+
self.config.clone(),
177+
build_dir,
178+
);
179+
180+
renderer
181+
.render(&render_context)
182+
.chain_err(|| "Rendering failed")
178183
}
179184

180185
/// You can change the default renderer to another one by using this method.
@@ -284,22 +289,12 @@ fn determine_renderers(config: &Config) -> Vec<Box<Renderer>> {
284289

285290
if let Some(output_table) = config.get("output").and_then(|o| o.as_table()) {
286291
for (key, table) in output_table.iter() {
292+
// the "html" backend has its own Renderer
287293
if key == "html" {
288294
renderers.push(Box::new(HtmlHandlebars::new()));
289295
} else {
290-
// look for the `command` field, falling back to using the key
291-
// prepended by "mdbook-"
292-
let command = table
293-
.get("command")
294-
.and_then(|c| c.as_str())
295-
.map(|s| s.to_string())
296-
.unwrap_or_else(|| format!("mdbook-{}", key));
297-
298-
// TODO: Actually calculate the destination directory
299-
renderers.push(Box::new(CmdRenderer::new(
300-
key.to_string(),
301-
command.to_string(),
302-
)));
296+
let renderer = interpret_custom_renderer(key, table);
297+
renderers.push(renderer);
303298
}
304299
}
305300
}
@@ -312,6 +307,19 @@ fn determine_renderers(config: &Config) -> Vec<Box<Renderer>> {
312307
renderers
313308
}
314309

310+
fn interpret_custom_renderer(key: &str, table: &Value) -> Box<Renderer> {
311+
// look for the `command` field, falling back to using the key
312+
// prepended by "mdbook-"
313+
let table_dot_command = table
314+
.get("command")
315+
.and_then(|c| c.as_str())
316+
.map(|s| s.to_string());
317+
318+
let command = table_dot_command.unwrap_or_else(|| format!("mdbook-{}", key));
319+
320+
Box::new(CmdRenderer::new(key.to_string(), command.to_string()))
321+
}
322+
315323
#[cfg(test)]
316324
mod tests {
317325
use super::*;

0 commit comments

Comments
 (0)