@@ -19,6 +19,7 @@ use std::path::PathBuf;
19
19
use std:: io:: Write ;
20
20
use std:: process:: Command ;
21
21
use tempdir:: TempDir ;
22
+ use toml:: Value ;
22
23
23
24
use utils;
24
25
use renderer:: { CmdRenderer , HtmlHandlebars , RenderContext , Renderer } ;
@@ -149,32 +150,36 @@ impl MDBook {
149
150
debug ! ( "[fn]: build" ) ;
150
151
151
152
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
+ }
164
158
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( )
170
167
) ;
171
168
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" ) ?;
175
171
}
176
172
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" )
178
183
}
179
184
180
185
/// 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>> {
284
289
285
290
if let Some ( output_table) = config. get ( "output" ) . and_then ( |o| o. as_table ( ) ) {
286
291
for ( key, table) in output_table. iter ( ) {
292
+ // the "html" backend has its own Renderer
287
293
if key == "html" {
288
294
renderers. push ( Box :: new ( HtmlHandlebars :: new ( ) ) ) ;
289
295
} 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) ;
303
298
}
304
299
}
305
300
}
@@ -312,6 +307,19 @@ fn determine_renderers(config: &Config) -> Vec<Box<Renderer>> {
312
307
renderers
313
308
}
314
309
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
+
315
323
#[ cfg( test) ]
316
324
mod tests {
317
325
use super :: * ;
0 commit comments