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 anyhow::{Context, Result};
 8use html5ever::driver::ParseOpts;
 9use html5ever::parse_document;
10use html5ever::tendril::TendrilSink;
11use html5ever::tree_builder::TreeBuilderOpts;
12use markup5ever_rcdom::RcDom;
13
14use crate::markdown_writer::MarkdownWriter;
15
16/// Converts the provided rustdoc HTML to Markdown.
17pub fn convert_rustdoc_to_markdown(html: &str) -> Result<String> {
18    let parse_options = ParseOpts {
19        tree_builder: TreeBuilderOpts {
20            drop_doctype: true,
21            ..Default::default()
22        },
23        ..Default::default()
24    };
25    let dom = parse_document(RcDom::default(), parse_options)
26        .from_utf8()
27        .read_from(&mut html.as_bytes())
28        .context("failed to parse rustdoc HTML")?;
29
30    let markdown_writer = MarkdownWriter::new();
31    let markdown = markdown_writer
32        .run(&dom.document)
33        .context("failed to convert rustdoc to HTML")?;
34
35    Ok(markdown)
36}