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

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

Functions

  • Parses a markdown document and returns AST.