Use case: when trying to `mdbook test` a file that has many `include` directives, and a test fails, the line numbers in the `rustdoc` output don't match the line numbers in the original markdown file. Turning on the markdown renderer implemented here lets you see what is being passed to `rustdoc` by saving the markdown after the preprocessors have run. This renderer could be helpful for debugging many preprocessors, but it's probably not useful in the general case, so it's turned off by default.
46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
use crate::book::BookItem;
|
|
use crate::errors::*;
|
|
use crate::renderer::{RenderContext, Renderer};
|
|
use crate::utils;
|
|
|
|
use std::fs;
|
|
|
|
#[derive(Default)]
|
|
/// A renderer to output the Markdown after the preprocessors have run. Mostly useful
|
|
/// when debugging preprocessors.
|
|
pub struct MarkdownRenderer;
|
|
|
|
impl MarkdownRenderer {
|
|
/// Create a new `MarkdownRenderer` instance.
|
|
pub fn new() -> Self {
|
|
MarkdownRenderer
|
|
}
|
|
}
|
|
|
|
impl Renderer for MarkdownRenderer {
|
|
fn name(&self) -> &str {
|
|
"markdown"
|
|
}
|
|
|
|
fn render(&self, ctx: &RenderContext) -> Result<()> {
|
|
let destination = &ctx.destination;
|
|
let book = &ctx.book;
|
|
|
|
if destination.exists() {
|
|
utils::fs::remove_dir_content(destination)
|
|
.chain_err(|| "Unable to remove stale Markdown output")?;
|
|
}
|
|
|
|
trace!("markdown render");
|
|
for item in book.iter() {
|
|
if let BookItem::Chapter(ref ch) = *item {
|
|
utils::fs::write_file(&ctx.destination, &ch.path, ch.content.as_bytes())?;
|
|
}
|
|
}
|
|
|
|
fs::create_dir_all(&destination)
|
|
.chain_err(|| "Unexpected error when constructing destination path")?;
|
|
|
|
Ok(())
|
|
}
|
|
}
|