jotdown 0.10.0

A parser for the Djot markup language
Documentation
use super::Delimiter::*;
use super::Kind::*;
use super::Sequence::*;
use super::Symbol::*;

macro_rules! test_lex {
    ($($st:ident,)? $src:expr $(,$($token:expr),* $(,)?)?) => {
        #[allow(unused)]
        let actual = super::Lexer::new($src.as_bytes()).collect::<Vec<_>>();
        let expected = vec![$($($token),*,)?];
        assert_eq!(actual, expected, "{}", $src);
    };
}

impl super::Kind {
    fn l(self, len: usize) -> super::Token {
        super::Token { kind: self, len }
    }
}

#[test]
fn empty() {
    test_lex!("");
}

#[test]
fn basic() {
    test_lex!("abc", Text.l(3));
    test_lex!(
        "para w/ some _emphasis_ and *strong*.",
        Text.l(13),
        Sym(Underscore).l(1),
        Text.l(8),
        Sym(Underscore).l(1),
        Text.l(5),
        Sym(Asterisk).l(1),
        Text.l(6),
        Sym(Asterisk).l(1),
        Seq(Period).l(1),
    );
}

#[test]
fn escape() {
    test_lex!(r#"\a"#, Text.l(2));
    test_lex!(r#"\\a"#, Escape.l(1), Text.l(2));
    test_lex!(r#"\."#, Escape.l(1), Text.l(1));
    test_lex!(r#"\ "#, Escape.l(1), Nbsp.l(1));
    test_lex!(r#"\{-"#, Escape.l(1), Text.l(1), Seq(Hyphen).l(1));
}

#[test]
fn hardbreak() {
    test_lex!("a\\\n", Text.l(1), Escape.l(1), Hardbreak.l(1));
    test_lex!("a\\   \n", Text.l(1), Escape.l(1), Hardbreak.l(4));
    test_lex!("a\\\t \t \n", Text.l(1), Escape.l(1), Hardbreak.l(5));
}

#[test]
fn delim() {
    test_lex!("{-", Open(BraceHyphen).l(2));
    test_lex!("-}", Close(BraceHyphen).l(2));
    test_lex!("{++}", Open(BracePlus).l(2), Close(BracePlus).l(2));
}

#[test]
fn sym() {
    test_lex!(
        r#"'*^![<|"~_"#,
        Sym(Quote1).l(1),
        Sym(Asterisk).l(1),
        Sym(Caret).l(1),
        Sym(ExclaimBracket).l(2),
        Sym(Lt).l(1),
        Sym(Pipe).l(1),
        Sym(Quote2).l(1),
        Sym(Tilde).l(1),
        Sym(Underscore).l(1),
    );
    test_lex!(
        "''''",
        Sym(Quote1).l(1),
        Sym(Quote1).l(1),
        Sym(Quote1).l(1),
        Sym(Quote1).l(1),
    );
}

#[test]
fn seq() {
    test_lex!("`", Seq(Backtick).l(1));
    test_lex!("```", Seq(Backtick).l(3));
    test_lex!(
        "`-.",
        Seq(Backtick).l(1),
        Seq(Hyphen).l(1),
        Seq(Period).l(1),
    );
}