Skip to main content

rustc_errors/markdown/
mod.rs

1//! A simple markdown parser that can write formatted text to the terminal
2//!
3//! Entrypoint is `MdStream::parse_str(...)`
4
5use std::io;
6
7mod parse;
8mod term;
9
10/// An AST representation of a Markdown document
11#[derive(#[automatically_derived]
impl<'a> ::core::clone::Clone for MdStream<'a> {
    #[inline]
    fn clone(&self) -> MdStream<'a> {
        MdStream(::core::clone::Clone::clone(&self.0))
    }
}Clone, #[automatically_derived]
impl<'a> ::core::fmt::Debug for MdStream<'a> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "MdStream",
            &&self.0)
    }
}Debug, #[automatically_derived]
impl<'a> ::core::default::Default for MdStream<'a> {
    #[inline]
    fn default() -> MdStream<'a> {
        MdStream(::core::default::Default::default())
    }
}Default, #[automatically_derived]
impl<'a> ::core::cmp::PartialEq for MdStream<'a> {
    #[inline]
    fn eq(&self, other: &MdStream<'a>) -> bool { self.0 == other.0 }
}PartialEq)]
12pub struct MdStream<'a>(Vec<MdTree<'a>>);
13
14impl<'a> MdStream<'a> {
15    /// Parse a markdown string to a tokenstream
16    #[must_use]
17    pub fn parse_str(s: &str) -> MdStream<'_> {
18        parse::entrypoint(s)
19    }
20
21    /// Write formatted output to a stdout buffer, optionally with
22    /// a formatter for code blocks
23    pub fn write_anstream_buf(
24        &self,
25        buf: &mut Vec<u8>,
26        formatter: Option<&(dyn Fn(&str, &mut Vec<u8>) -> io::Result<()> + 'static)>,
27    ) -> io::Result<()> {
28        term::entrypoint(self, buf, formatter)
29    }
30}
31
32/// Create an anstream buffer with the `Always` color choice
33pub fn create_stdout_bufwtr() -> anstream::Stdout {
34    anstream::Stdout::always(std::io::stdout())
35}
36
37/// A single tokentree within a Markdown document
38#[derive(#[automatically_derived]
impl<'a> ::core::clone::Clone for MdTree<'a> {
    #[inline]
    fn clone(&self) -> MdTree<'a> {
        match self {
            MdTree::Comment(__self_0) =>
                MdTree::Comment(::core::clone::Clone::clone(__self_0)),
            MdTree::CodeBlock { txt: __self_0, lang: __self_1 } =>
                MdTree::CodeBlock {
                    txt: ::core::clone::Clone::clone(__self_0),
                    lang: ::core::clone::Clone::clone(__self_1),
                },
            MdTree::CodeInline(__self_0) =>
                MdTree::CodeInline(::core::clone::Clone::clone(__self_0)),
            MdTree::Strong(__self_0) =>
                MdTree::Strong(::core::clone::Clone::clone(__self_0)),
            MdTree::Emphasis(__self_0) =>
                MdTree::Emphasis(::core::clone::Clone::clone(__self_0)),
            MdTree::Strikethrough(__self_0) =>
                MdTree::Strikethrough(::core::clone::Clone::clone(__self_0)),
            MdTree::PlainText(__self_0) =>
                MdTree::PlainText(::core::clone::Clone::clone(__self_0)),
            MdTree::Link { disp: __self_0, link: __self_1 } =>
                MdTree::Link {
                    disp: ::core::clone::Clone::clone(__self_0),
                    link: ::core::clone::Clone::clone(__self_1),
                },
            MdTree::RefLink { disp: __self_0, id: __self_1 } =>
                MdTree::RefLink {
                    disp: ::core::clone::Clone::clone(__self_0),
                    id: ::core::clone::Clone::clone(__self_1),
                },
            MdTree::LinkDef { id: __self_0, link: __self_1 } =>
                MdTree::LinkDef {
                    id: ::core::clone::Clone::clone(__self_0),
                    link: ::core::clone::Clone::clone(__self_1),
                },
            MdTree::ParagraphBreak => MdTree::ParagraphBreak,
            MdTree::LineBreak => MdTree::LineBreak,
            MdTree::HorizontalRule => MdTree::HorizontalRule,
            MdTree::Heading(__self_0, __self_1) =>
                MdTree::Heading(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            MdTree::OrderedListItem(__self_0, __self_1) =>
                MdTree::OrderedListItem(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            MdTree::UnorderedListItem(__self_0) =>
                MdTree::UnorderedListItem(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl<'a> ::core::fmt::Debug for MdTree<'a> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MdTree::Comment(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Comment", &__self_0),
            MdTree::CodeBlock { txt: __self_0, lang: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "CodeBlock", "txt", __self_0, "lang", &__self_1),
            MdTree::CodeInline(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "CodeInline", &__self_0),
            MdTree::Strong(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Strong",
                    &__self_0),
            MdTree::Emphasis(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Emphasis", &__self_0),
            MdTree::Strikethrough(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Strikethrough", &__self_0),
            MdTree::PlainText(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "PlainText", &__self_0),
            MdTree::Link { disp: __self_0, link: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Link",
                    "disp", __self_0, "link", &__self_1),
            MdTree::RefLink { disp: __self_0, id: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "RefLink", "disp", __self_0, "id", &__self_1),
            MdTree::LinkDef { id: __self_0, link: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "LinkDef", "id", __self_0, "link", &__self_1),
            MdTree::ParagraphBreak =>
                ::core::fmt::Formatter::write_str(f, "ParagraphBreak"),
            MdTree::LineBreak =>
                ::core::fmt::Formatter::write_str(f, "LineBreak"),
            MdTree::HorizontalRule =>
                ::core::fmt::Formatter::write_str(f, "HorizontalRule"),
            MdTree::Heading(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Heading", __self_0, &__self_1),
            MdTree::OrderedListItem(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "OrderedListItem", __self_0, &__self_1),
            MdTree::UnorderedListItem(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "UnorderedListItem", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl<'a> ::core::cmp::PartialEq for MdTree<'a> {
    #[inline]
    fn eq(&self, other: &MdTree<'a>) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (MdTree::Comment(__self_0), MdTree::Comment(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (MdTree::CodeBlock { txt: __self_0, lang: __self_1 },
                    MdTree::CodeBlock { txt: __arg1_0, lang: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::CodeInline(__self_0), MdTree::CodeInline(__arg1_0))
                    => __self_0 == __arg1_0,
                (MdTree::Strong(__self_0), MdTree::Strong(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (MdTree::Emphasis(__self_0), MdTree::Emphasis(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (MdTree::Strikethrough(__self_0),
                    MdTree::Strikethrough(__arg1_0)) => __self_0 == __arg1_0,
                (MdTree::PlainText(__self_0), MdTree::PlainText(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (MdTree::Link { disp: __self_0, link: __self_1 },
                    MdTree::Link { disp: __arg1_0, link: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::RefLink { disp: __self_0, id: __self_1 },
                    MdTree::RefLink { disp: __arg1_0, id: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::LinkDef { id: __self_0, link: __self_1 },
                    MdTree::LinkDef { id: __arg1_0, link: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::Heading(__self_0, __self_1),
                    MdTree::Heading(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::OrderedListItem(__self_0, __self_1),
                    MdTree::OrderedListItem(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::UnorderedListItem(__self_0),
                    MdTree::UnorderedListItem(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
39pub enum MdTree<'a> {
40    /// Leaf types
41    Comment(&'a str),
42    CodeBlock {
43        txt: &'a str,
44        lang: Option<&'a str>,
45    },
46    CodeInline(&'a str),
47    Strong(&'a str),
48    Emphasis(&'a str),
49    Strikethrough(&'a str),
50    PlainText(&'a str),
51    /// [Foo](www.foo.com) or simple anchor <www.foo.com>
52    Link {
53        disp: &'a str,
54        link: &'a str,
55    },
56    /// `[Foo link][ref]`
57    RefLink {
58        disp: &'a str,
59        id: Option<&'a str>,
60    },
61    /// [ref]: www.foo.com
62    LinkDef {
63        id: &'a str,
64        link: &'a str,
65    },
66    /// Break bewtween two paragraphs (double `\n`), not directly parsed but
67    /// added later
68    ParagraphBreak,
69    /// Break bewtween two lines (single `\n`)
70    LineBreak,
71    HorizontalRule,
72    Heading(u8, MdStream<'a>),
73    OrderedListItem(u16, MdStream<'a>),
74    UnorderedListItem(MdStream<'a>),
75}
76
77impl<'a> From<Vec<MdTree<'a>>> for MdStream<'a> {
78    fn from(value: Vec<MdTree<'a>>) -> Self {
79        Self(value)
80    }
81}