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}