kladd 0.2.0

A weirdly personal markup language
Documentation
pub mod ast;
pub mod ast_visualizer;
mod char_cursor;
pub mod error;
pub mod html;
mod lexer;
pub mod parser;
mod token_cursor;

#[cfg(test)]
pub mod test_utils;

#[cfg(test)]
mod tests {
    use serde::Deserialize;

    use crate::{
        ast::{AstNode, NodeKind, NodeTag},
        ast_visualizer::{visualize_document, visualize_nodes},
        html::{HtmlOptions, to_html_with_options},
        lexer::tokenize,
        parser::Parser,
        test_utils::TEST_INPUT,
    };

    #[derive(Deserialize)]
    struct Metadata {
        metadata: String,
    }

    #[test]
    fn it_works() {
        let tokens = tokenize(TEST_INPUT);
        assert!(!tokens.is_empty());
        insta::assert_debug_snapshot!("tokenizer", tokens);

        let parser = Parser::<Metadata>::new(TEST_INPUT).unwrap();
        let (doc, metadata) = parser.finish();

        assert_eq!(metadata.unwrap().metadata, "things".to_owned());

        insta::assert_debug_snapshot!("ast", doc);

        let vizualised = visualize_document(&doc);
        insta::assert_snapshot!("visualize", vizualised);

        let html = to_html_with_options(&doc, HtmlOptions::default()).unwrap();
        insta::assert_snapshot!("html", html);
    }

    #[test]
    fn test_parse_simple() {
        let input = r#"
This is some {*simple*} input without metadata.

It goes @italic[across] multiple paragraphs"#;

        let (ast, _) = Parser::<()>::new(input).unwrap().finish();
        let vizualised = visualize_nodes(&ast.body);
        insta::assert_snapshot!(vizualised);
    }

    #[test]
    fn test_document_iter() {
        let input = r"This is not {*bold*}";
        let (mut ast, _) = Parser::<()>::new(input).unwrap().finish();
        for n in ast.iter_mut() {
            match n.kind {
                NodeKind::Strong if n.tag == NodeTag::Start => {
                    *n = AstNode::start_attrs(NodeKind::Underline, n.attributes.clone());
                }
                _ => {}
            }
        }

        let vizualised = visualize_nodes(&ast.body);
        insta::assert_snapshot!(vizualised);
    }
}