rustdoc_to_markdown.rs

 1//! Provides conversion from rustdoc's HTML output to Markdown.
 2
 3#![deny(missing_docs)]
 4
 5mod markdown_writer;
 6
 7use std::io::Read;
 8
 9use anyhow::{Context, Result};
10use html5ever::driver::ParseOpts;
11use html5ever::parse_document;
12use html5ever::tendril::TendrilSink;
13use html5ever::tree_builder::TreeBuilderOpts;
14use markup5ever_rcdom::RcDom;
15
16use crate::markdown_writer::MarkdownWriter;
17
18/// Converts the provided rustdoc HTML to Markdown.
19pub fn convert_rustdoc_to_markdown(mut html: impl Read) -> Result<String> {
20    let parse_options = ParseOpts {
21        tree_builder: TreeBuilderOpts {
22            drop_doctype: true,
23            ..Default::default()
24        },
25        ..Default::default()
26    };
27    let dom = parse_document(RcDom::default(), parse_options)
28        .from_utf8()
29        .read_from(&mut html)
30        .context("failed to parse rustdoc HTML")?;
31
32    let markdown_writer = MarkdownWriter::new();
33    let markdown = markdown_writer
34        .run(&dom.document)
35        .context("failed to convert rustdoc to HTML")?;
36
37    Ok(markdown)
38}