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}