diff --git a/src/parser/bold.rs b/src/parser/bold.rs index 0f2d7675..9492c0a6 100644 --- a/src/parser/bold.rs +++ b/src/parser/bold.rs @@ -1,6 +1,7 @@ use crate::parser::parser_with_context::parser_with_context; use super::combinator::context_many_till; +use super::document::in_section; use super::error::CustomError; use super::error::MyError; use super::error::Res; @@ -8,10 +9,9 @@ use super::parser_context::ChainBehavior; use super::parser_context::ContextElement; use super::parser_context::ExitMatcherNode; use super::text::symbol; +use super::text::text_element; use super::text::Bold; use super::text::TextElement; -use super::text_element_parser::flat_text_element; -use super::text_element_parser::in_section; use super::token::Token; use super::Context; use nom::branch::alt; @@ -29,7 +29,7 @@ pub fn bold<'s, 'r>(context: Context<'r, 's>, i: &'s str) -> Res<&'s str, Bold<' })) .with_additional_node(ContextElement::Context("bold")); let (remaining, captured) = recognize(tuple((bold_start, |i| { - context_many_till(&parser_context, flat_text_element, context_bold_end)(i) + context_many_till(&parser_context, text_element, context_bold_end)(i) })))(i)?; let ret = Bold { contents: captured }; Ok((remaining, ret)) diff --git a/src/parser/text_element_parser.rs b/src/parser/document.rs similarity index 71% rename from src/parser/text_element_parser.rs rename to src/parser/document.rs index 0ea7e1dd..806ea795 100644 --- a/src/parser/text_element_parser.rs +++ b/src/parser/document.rs @@ -47,24 +47,3 @@ pub fn in_section<'s, 'r, 'x>(context: Context<'r, 's>, section_name: &'x str) - } false } - -pub fn flat_text_element<'s, 'r>( - context: Context<'r, 's>, - i: &'s str, -) -> Res<&'s str, TextElement<'s>> { - not(|i| context.check_exit_matcher(i))(i)?; - - let bold_matcher = parser_with_context!(bold)(&context); - let link_matcher = parser_with_context!(link)(&context); - - alt(( - map(bold_matcher, TextElement::Bold), - map(link_matcher, TextElement::Link), - map(span, TextElement::Span), - map(symbol("*"), TextElement::Symbol), - map(symbol("["), TextElement::Symbol), - map(symbol("]"), TextElement::Symbol), - map(space, TextElement::Space), - map(line_break, TextElement::LineBreak), - ))(i) -} diff --git a/src/parser/link.rs b/src/parser/link.rs index c78b2df4..ac318880 100644 --- a/src/parser/link.rs +++ b/src/parser/link.rs @@ -1,6 +1,7 @@ use crate::parser::parser_with_context::parser_with_context; use super::combinator::context_many_till; +use super::document::in_section; use super::error::CustomError; use super::error::MyError; use super::error::Res; @@ -8,10 +9,9 @@ use super::parser_context::ChainBehavior; use super::parser_context::ContextElement; use super::parser_context::ExitMatcherNode; use super::text::symbol; +use super::text::text_element; use super::text::Link; use super::text::TextElement; -use super::text_element_parser::flat_text_element; -use super::text_element_parser::in_section; use super::Context; use nom::combinator::map; use nom::combinator::recognize; @@ -25,7 +25,7 @@ pub fn link<'s, 'r>(context: Context<'r, 's>, i: &'s str) -> Res<&'s str, Link<' })) .with_additional_node(ContextElement::Context("link")); let (remaining, captured) = recognize(tuple((link_start, |i| { - context_many_till(&parser_context, flat_text_element, context_link_end)(i) + context_many_till(&parser_context, text_element, context_link_end)(i) })))(i)?; let ret = Link { contents: captured }; Ok((remaining, ret)) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 14a49c27..f3f80d7b 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -7,7 +7,7 @@ mod paragraph; mod parser_context; mod parser_with_context; mod text; -mod text_element_parser; +mod document; mod token; -pub use text_element_parser::document; +pub use document::document; type Context<'r, 's> = &'r parser_context::ContextTree<'r, 's>; diff --git a/src/parser/paragraph.rs b/src/parser/paragraph.rs index 61629726..ff4845a6 100644 --- a/src/parser/paragraph.rs +++ b/src/parser/paragraph.rs @@ -5,9 +5,9 @@ use super::parser_context::ContextElement; use super::parser_context::ExitMatcherNode; use super::text::blank_line; use super::text::line_break; +use super::text::text_element; use super::text::Paragraph; use super::text::TextElement; -use super::text_element_parser::flat_text_element; use super::token::Token; use super::Context; use nom::branch::alt; @@ -27,7 +27,7 @@ pub fn paragraph<'s, 'r>(context: Context<'r, 's>, i: &'s str) -> Res<&'s str, P })) .with_additional_node(ContextElement::StartOfParagraph); let (remaining, (many, till)) = - context_many_till(¶graph_context, flat_text_element, context_paragraph_end)(i)?; + context_many_till(¶graph_context, text_element, context_paragraph_end)(i)?; let many = many .into_iter() .filter_map(|token| match token { diff --git a/src/parser/text.rs b/src/parser/text.rs index 13d52061..c12f1990 100644 --- a/src/parser/text.rs +++ b/src/parser/text.rs @@ -1,12 +1,18 @@ +use nom::branch::alt; use nom::bytes::complete::tag; use nom::character::complete::alphanumeric1; use nom::character::complete::line_ending; use nom::character::complete::space1; use nom::combinator::map; +use nom::combinator::not; use nom::combinator::recognize; use nom::multi::many_till; +use super::bold::bold; use super::error::Res; +use super::link::link; +use super::parser_with_context::parser_with_context; +use super::Context; #[derive(Debug)] pub enum TextElement<'a> { @@ -92,3 +98,21 @@ pub fn blank_line(input: &str) -> Res<&str, BlankLine> { |contents| BlankLine { contents }, )(input) } + +pub fn text_element<'s, 'r>(context: Context<'r, 's>, i: &'s str) -> Res<&'s str, TextElement<'s>> { + not(|i| context.check_exit_matcher(i))(i)?; + + let bold_matcher = parser_with_context!(bold)(&context); + let link_matcher = parser_with_context!(link)(&context); + + alt(( + map(bold_matcher, TextElement::Bold), + map(link_matcher, TextElement::Link), + map(span, TextElement::Span), + map(symbol("*"), TextElement::Symbol), + map(symbol("["), TextElement::Symbol), + map(symbol("]"), TextElement::Symbol), + map(space, TextElement::Space), + map(line_break, TextElement::LineBreak), + ))(i) +}