This commit is contained in:
parent
b295c66f0c
commit
799730bedc
|
@ -1022,6 +1022,19 @@ impl Context {
|
||||||
let FlankingDelim(closing_tag, closing_rule, ..) = closing_tag.into();
|
let FlankingDelim(closing_tag, closing_rule, ..) = closing_tag.into();
|
||||||
|
|
||||||
move |input| {
|
move |input| {
|
||||||
|
if let FlankingRule::Strict = opening_rule {
|
||||||
|
let (input, pre) = opt(recognize(tuple((
|
||||||
|
alphanumeric1_unicode,
|
||||||
|
opt(tag("\\")),
|
||||||
|
&opening_tag,
|
||||||
|
peek(not(alt((space1_unicode, eof)))),
|
||||||
|
))))(input)?;
|
||||||
|
|
||||||
|
if let Some(pre_text) = pre {
|
||||||
|
return Ok((input, Token::PlainText(pre_text.into_fragment().into())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if escape {
|
if escape {
|
||||||
if let Ok((input_escaped, (_, mark))) = tuple((tag("\\"), &opening_tag))(input) {
|
if let Ok((input_escaped, (_, mark))) = tuple((tag("\\"), &opening_tag))(input) {
|
||||||
return Ok((
|
return Ok((
|
||||||
|
@ -1031,14 +1044,6 @@ impl Context {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let FlankingRule::Strict = opening_rule {
|
|
||||||
let (input, pre) =
|
|
||||||
opt(recognize(tuple((alphanumeric1_unicode, &opening_tag))))(input)?;
|
|
||||||
if let Some(pre_text) = pre {
|
|
||||||
return Ok((input, Token::PlainText(pre_text.into_fragment().into())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let begin = input;
|
let begin = input;
|
||||||
let (post_open, _) = opening_tag(input)?;
|
let (post_open, _) = opening_tag(input)?;
|
||||||
|
|
||||||
|
@ -1047,11 +1052,7 @@ impl Context {
|
||||||
&closing_tag,
|
&closing_tag,
|
||||||
))(post_open);
|
))(post_open);
|
||||||
|
|
||||||
if let Err(nom::Err::Error(nom::error::Error {
|
if let Err(nom::Err::Error(nom::error::Error { .. })) = res {
|
||||||
input: input_past_err,
|
|
||||||
..
|
|
||||||
})) = res
|
|
||||||
{
|
|
||||||
let res_fallback = tuple((
|
let res_fallback = tuple((
|
||||||
many1(tuple((not(&closing_tag), &fallback.matcher_inner))),
|
many1(tuple((not(&closing_tag), &fallback.matcher_inner))),
|
||||||
&closing_tag,
|
&closing_tag,
|
||||||
|
@ -1059,8 +1060,8 @@ impl Context {
|
||||||
|
|
||||||
if res_fallback.is_err() {
|
if res_fallback.is_err() {
|
||||||
return Ok((
|
return Ok((
|
||||||
input_past_err,
|
post_open,
|
||||||
Token::PlainText(begin.fragment_between(&input_past_err).into()),
|
Token::PlainText(begin.fragment_between(&post_open).into()),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1727,8 +1728,6 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_empty() {
|
fn parse_empty() {
|
||||||
let ctx = Context::default();
|
|
||||||
|
|
||||||
assert_eq!(parse_full(""), Token::Sequence(vec![]));
|
assert_eq!(parse_full(""), Token::Sequence(vec![]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1833,6 +1832,14 @@ mod test {
|
||||||
Token::PlainText("_ italic *".into())
|
Token::PlainText("_ italic *".into())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
parse_full(r#"long text with a *footnote <b>text</b>"#),
|
||||||
|
Token::Sequence(vec![
|
||||||
|
Token::PlainText("long text with a *footnote ".into()),
|
||||||
|
Token::Bold(Box::new(Token::PlainText("text".into())))
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parse_full(r#"*"italic"*"#),
|
parse_full(r#"*"italic"*"#),
|
||||||
Token::Italic(Box::new(Token::PlainText("\"italic\"".into())))
|
Token::Italic(Box::new(Token::PlainText("\"italic\"".into())))
|
||||||
|
@ -1879,10 +1886,66 @@ mod test {
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parse_full("~~*hello\nworld*"),
|
parse_full("~~*hello\nworld*"),
|
||||||
Token::PlainText("~~*hello\nworld*".into())
|
Token::Sequence(vec![
|
||||||
|
Token::PlainText("~~".into()),
|
||||||
|
Token::Italic(Box::new(Token::PlainText("hello\nworld".into())))
|
||||||
|
])
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_flanking() {
|
||||||
|
assert_eq!(
|
||||||
|
parse_full(r#"aaa*iii*bbb"#),
|
||||||
|
Token::Sequence(vec![
|
||||||
|
Token::PlainText("aaa".into()),
|
||||||
|
Token::Italic(Box::new(Token::PlainText("iii".into()))),
|
||||||
|
Token::PlainText("bbb".into())
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
parse_full(r#"aaa_nnn_bbb"#),
|
||||||
|
Token::PlainText("aaa_nnn_bbb".into())
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
parse_full(r#"*iii*"#),
|
||||||
|
Token::Italic(Box::new(Token::PlainText("iii".into())))
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
parse_full(r#"_iii_"#),
|
||||||
|
Token::Italic(Box::new(Token::PlainText("iii".into())))
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
parse_full(r#"aaa*iii*"#),
|
||||||
|
Token::Sequence(vec![
|
||||||
|
Token::PlainText("aaa".into()),
|
||||||
|
Token::Italic(Box::new(Token::PlainText("iii".into()))),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
parse_full(r#"*iii*bbb"#),
|
||||||
|
Token::Sequence(vec![
|
||||||
|
Token::Italic(Box::new(Token::PlainText("iii".into()))),
|
||||||
|
Token::PlainText("bbb".into()),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
parse_full(r#"aaa_nnn_"#),
|
||||||
|
Token::PlainText("aaa_nnn_".into())
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
parse_full(r#"_nnn_bbb"#),
|
||||||
|
Token::PlainText("_nnn_bbb".into())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_complex() {
|
fn parse_complex() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
Loading…
Reference in New Issue