Crate discord_md

Source
Expand description

discord-md is a Rust library that provides parser and builder for Discord’s markdown.

§Installation

Add the following to your Cargo.toml file:

[dependencies]
discord-md = "3.0.0"

§Parsing

parse parses a markdown document and returns an AST.

§Example

use discord_md::ast::*;
use discord_md::parse;

let message = "You can write *italics text*, `*inline code*`, and more!";

let ast = MarkdownDocument::new(vec![
    MarkdownElement::Plain(Box::new(
        Plain::new("You can write ")
    )),
    MarkdownElement::ItalicsStar(Box::new(
        ItalicsStar::new(vec![
            MarkdownElement::Plain(Box::new(
                Plain::new("italics text")
            ))
        ])
    )),
    MarkdownElement::Plain(Box::new(
        Plain::new(", ")
    )),
    MarkdownElement::OneLineCode(Box::new(
        OneLineCode::new("*inline code*")
    )),
    MarkdownElement::Plain(Box::new(
        Plain::new(", and more!")
    )),
]);

assert_eq!(
    parse(message),
    ast
);
use discord_md::ast::*;
use discord_md::parse;

let message = "Of course __*nested* styles__ are supported!";

let ast = MarkdownDocument::new(vec![
    MarkdownElement::Plain(Box::new(
        Plain::new("Of course ")
    )),
    MarkdownElement::Underline(Box::new(
        Underline::new(vec![
            MarkdownElement::ItalicsStar(Box::new(
                ItalicsStar::new(vec![
                    MarkdownElement::Plain(Box::new(
                        Plain::new("nested")
                    ))
                ])
            )),
            MarkdownElement::Plain(Box::new(
                Plain::new(" styles")
            )),
        ])
    )),
    MarkdownElement::Plain(Box::new(
        Plain::new(" are supported!")
    )),
]);

assert_eq!(
    parse(message),
    ast
);
use discord_md::ast::*;
use discord_md::parse;

let message = r#"```sh
echo "Code block is _available_ too!"
```"#;

let ast = MarkdownDocument::new(vec![
    MarkdownElement::MultiLineCode(Box::new(
        MultiLineCode::new(
            "\necho \"Code block is _available_ too!\"\n",
            Some("sh".to_string())
        )
    ))
]);

assert_eq!(
    parse(message),
    ast
);

§Generating

First, build an AST with builder module. Then call to_string() to generate markdown text from the AST.

§Example

use discord_md::ast::MarkdownDocument;
use discord_md::builder::*;

let ast = MarkdownDocument::new(vec![
    plain("generating "),
    one_line_code("markdown"),
    plain(" is "),
    underline(vec![
        bold("easy"),
        plain(" and "),
        bold("fun!"),
    ]),
]);

assert_eq!(
    ast.to_string(),
    "generating `markdown` is __**easy** and **fun!**__"
);

§Parser limitations

The parser tries to mimic the behavior of the official Discord client’s markdown parser, but it’s not perfect. The following is the list of known limitations.

  • Block quotes are not parsed. > will be treated as plain text.
  • Nested emphasis, like *italics **bold italics** italics*, may not be parsed properly.
  • Intraword emphasis may not be handled properly. The parser treats foo_bar_baz as emphasis, while Discord’s parser does not.
  • Escaping sequence will be treated as plain text.

Modules§

ast
Markdown AST structure
builder
Helper functions to build AST in less lines of code.
generate
Generates markdown text or plain text from an AST

Functions§

parse
Parses a markdown document and returns AST.