9 releases (4 stable)

3.0.0 Nov 12, 2023
2.0.1 Nov 12, 2023
2.0.0 Nov 4, 2021
1.0.0 Sep 3, 2021

#880 in Parser implementations

29 downloads per month

MIT/Apache

83KB
2K SLoC

discord-md

CI status crate version docs online MIT or Apache 2.0 Licenses

Parser and generator for Discord's markdown, written in Rust

Example

Parsing

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

fn main() {
  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
  );
}

Generating

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

fn main() {
  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!**__"
  );
}

Features

  • Minimal dependencies (only nom and derive_more)
  • Supports the following syntax:
    • Italics (*italics*, _italics_)
    • Bold (**bold**)
    • Underline (__underline__)
    • Strikethrough (~~strikethrough~~)
    • Spoiler (||spoiler||)
    • One line code (`one line code`)
    • Multi line code
      ```sh
      echo "multi line"
      echo "code"
      ```
      
    • Block Quote (generator only)
      > block quote
      > some text
      

Installation

Add the following to your Cargo.toml file:

[dependencies]
discord-md = "3.0.0"

Documentation

Available at docs.rs

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.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~1.1–1.8MB
~36K SLoC