Cautiously hopeful this might work.
This commit is contained in:
parent
b3b2874cc2
commit
c88a5305ad
@ -19,6 +19,7 @@ where
|
|||||||
impl<F> NomContext<F>
|
impl<F> NomContext<F>
|
||||||
where
|
where
|
||||||
F: for<'a> FnMut(&'a str) -> IResult<&'a str, &'a str, VerboseError<&'a str>>,
|
F: for<'a> FnMut(&'a str) -> IResult<&'a str, &'a str, VerboseError<&'a str>>,
|
||||||
|
F: Clone,
|
||||||
{
|
{
|
||||||
pub fn new(fail_matcher: F) -> Self {
|
pub fn new(fail_matcher: F) -> Self {
|
||||||
NomContext {
|
NomContext {
|
||||||
@ -27,4 +28,12 @@ where
|
|||||||
can_match_link: true,
|
can_match_link: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn without_bold(&self) -> Self {
|
||||||
|
NomContext {
|
||||||
|
fail_matcher: self.fail_matcher.clone(),
|
||||||
|
can_match_bold: true,
|
||||||
|
can_match_link: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,17 +3,22 @@ use crate::parser::parser_with_context::parser_with_context;
|
|||||||
use crate::parser::text::paragraph_end;
|
use crate::parser::text::paragraph_end;
|
||||||
|
|
||||||
use super::nom_context::NomContext;
|
use super::nom_context::NomContext;
|
||||||
|
use super::text::bold_end;
|
||||||
|
use super::text::bold_start;
|
||||||
use super::text::line_break;
|
use super::text::line_break;
|
||||||
use super::text::space;
|
use super::text::space;
|
||||||
use super::text::span;
|
use super::text::span;
|
||||||
use super::text::symbol;
|
use super::text::symbol;
|
||||||
|
use super::text::Bold;
|
||||||
use super::text::Res;
|
use super::text::Res;
|
||||||
use super::text::TextElement;
|
use super::text::TextElement;
|
||||||
use nom::branch::alt;
|
use nom::branch::alt;
|
||||||
use nom::combinator::map;
|
use nom::combinator::map;
|
||||||
use nom::combinator::not;
|
use nom::combinator::not;
|
||||||
|
use nom::combinator::recognize;
|
||||||
use nom::error::VerboseError;
|
use nom::error::VerboseError;
|
||||||
use nom::multi::many_till;
|
use nom::multi::many_till;
|
||||||
|
use nom::sequence::tuple;
|
||||||
use nom::IResult;
|
use nom::IResult;
|
||||||
|
|
||||||
pub fn flat_text_element<'a, F>(
|
pub fn flat_text_element<'a, F>(
|
||||||
@ -24,6 +29,12 @@ where
|
|||||||
F: for<'b> FnMut(&'b str) -> IResult<&'b str, &'b str, VerboseError<&'b str>>,
|
F: for<'b> FnMut(&'b str) -> IResult<&'b str, &'b str, VerboseError<&'b str>>,
|
||||||
{
|
{
|
||||||
not(&mut context.fail_matcher)(i)?;
|
not(&mut context.fail_matcher)(i)?;
|
||||||
|
if context.can_match_bold {
|
||||||
|
// todo
|
||||||
|
}
|
||||||
|
if context.can_match_link {
|
||||||
|
// todo
|
||||||
|
}
|
||||||
alt((
|
alt((
|
||||||
// map(
|
// map(
|
||||||
// BoldParser::new(slf.context.fail_matcher.clone()),
|
// BoldParser::new(slf.context.fail_matcher.clone()),
|
||||||
@ -42,6 +53,24 @@ where
|
|||||||
))(i)
|
))(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn flat_bold<'a, F>(i: &'a str, context: &mut NomContext<F>) -> Res<&'a str, TextElement<'a>>
|
||||||
|
where
|
||||||
|
F: for<'b> FnMut(&'b str) -> IResult<&'b str, &'b str, VerboseError<&'b str>>,
|
||||||
|
F: Clone,
|
||||||
|
{
|
||||||
|
not(&mut context.fail_matcher)(i)?;
|
||||||
|
let new_context = context.without_bold();
|
||||||
|
let text_element_parser = parser_with_context!(flat_text_element)(new_context);
|
||||||
|
map(
|
||||||
|
recognize(tuple((
|
||||||
|
bold_start,
|
||||||
|
many_till(text_element_parser, bold_end),
|
||||||
|
bold_end,
|
||||||
|
))),
|
||||||
|
|body| TextElement::Bold(Bold { contents: body }),
|
||||||
|
)(i)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn paragraph(input: &str) -> Res<&str, (Vec<TextElement>, &str)> {
|
pub fn paragraph(input: &str) -> Res<&str, (Vec<TextElement>, &str)> {
|
||||||
let initial_context = NomContext::new(¶graph_end);
|
let initial_context = NomContext::new(¶graph_end);
|
||||||
let text_element_parser = parser_with_context!(flat_text_element)(initial_context);
|
let text_element_parser = parser_with_context!(flat_text_element)(initial_context);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user