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}