Skip to main content

sevenmark_parser/parser/
element.rs

1use super::escape::escape_parser;
2use super::markdown::{
3    markdown_bold_parser, markdown_header_parser, markdown_hline_parser, markdown_italic_parser,
4    markdown_strikethrough_parser, markdown_subscript_parser, markdown_superscript_parser,
5    markdown_underline_parser,
6};
7use super::mention::{mention_discussion_parser, mention_user_parser};
8use super::text::text_parser;
9use super::token::*;
10
11use crate::ast::Element;
12use crate::parser::ParserInput;
13use crate::parser::brace::{
14    brace_blockquote_parser, brace_category_parser, brace_code_parser, brace_define_parser,
15    brace_fold_parser, brace_footnote_parser, brace_if_parser, brace_include_parser,
16    brace_list_parser, brace_literal_parser, brace_ruby_parser, brace_style_parser,
17    brace_table_parser, brace_tex_parser,
18};
19use crate::parser::bracket::{bracket_external_media_parser, bracket_media_parser};
20use crate::parser::comment::{inline_comment_parser, multiline_comment_parser};
21use crate::parser::r#macro::{
22    macro_age_parser, macro_footnote_parser, macro_newline_parser, macro_now_parser,
23    macro_null_parser, macro_variable_parser,
24};
25use winnow::Result;
26use winnow::combinator::{alt, dispatch, peek, repeat};
27use winnow::prelude::*;
28use winnow::token::any;
29
30pub fn element_parser(parser_input: &mut ParserInput) -> Result<Vec<Element>> {
31    repeat(
32        1..,
33        dispatch! {peek(any);
34            '\\' => alt((escape_parser, token_backslash_parser)),
35            '/' => alt((multiline_comment_parser, inline_comment_parser, token_slash)),
36            '{' => alt((
37                brace_include_parser,
38                brace_category_parser,
39                brace_if_parser,
40                brace_table_parser,
41                brace_list_parser,
42                brace_fold_parser,
43                brace_footnote_parser,
44                brace_blockquote_parser,
45                brace_ruby_parser,
46                brace_code_parser,
47                brace_tex_parser,
48                brace_define_parser,
49                brace_style_parser,
50                brace_literal_parser,
51                token_brace_open_parser,
52            )),
53            '}' => token_brace_close_parser,
54            '[' => alt((
55                bracket_external_media_parser,
56                bracket_media_parser,
57                macro_now_parser,
58                macro_newline_parser,
59                macro_variable_parser,
60                macro_age_parser,
61                macro_footnote_parser,
62                macro_null_parser,
63                token_bracket_open_parser,
64            )),
65            ']' => token_bracket_close_parser,
66            '<' => alt((mention_discussion_parser, mention_user_parser, token_angle_bracket_parser)),
67            '#' => alt((markdown_header_parser, text_parser)),
68            '-' => alt((markdown_hline_parser, text_parser)),
69            '*' => alt((markdown_bold_parser, markdown_italic_parser, token_asterisk_parser)),
70            '_' => alt((markdown_underline_parser, token_underscore_parser)),
71            '~' => alt((markdown_strikethrough_parser, token_tilde_parser)),
72            '^' => alt((markdown_superscript_parser, token_caret_parser)),
73            ',' => alt((markdown_subscript_parser, token_comma_parser)),
74            '\n' => token_newline_parser,
75            _ => text_parser,
76        },
77    )
78    .parse_next(parser_input)
79}