use nom::{branch::alt,
bytes::complete::tag,
combinator::{map, recognize},
multi::many0,
IResult, Parser};
use super::specialized_parser_delim_matchers;
use crate::{fg_blue, fg_red,
md_parser::constants::{BACK_TICK, CHECKED, LEFT_BRACKET, LEFT_IMAGE,
LEFT_PARENTHESIS, RIGHT_BRACKET, RIGHT_IMAGE,
RIGHT_PARENTHESIS, STAR, UNCHECKED, UNDERSCORE},
take_text_between_delims_err_on_new_line, HyperlinkData,
DEBUG_MD_PARSER_STDOUT};
pub fn parse_fragment_starts_with_underscore_err_on_new_line(
input: &str,
) -> IResult<&str, &str> {
specialized_parser_delim_matchers::take_starts_with_delim_no_new_line(
input, UNDERSCORE,
)
}
pub fn parse_fragment_starts_with_star_err_on_new_line(
input: &str,
) -> IResult<&str, &str> {
specialized_parser_delim_matchers::take_starts_with_delim_no_new_line(input, STAR)
}
pub fn parse_fragment_starts_with_backtick_err_on_new_line(
input: &str,
) -> IResult<&str, &str> {
let it = recognize(many0(tag(BACK_TICK))).parse(input);
if it.is_err() {
DEBUG_MD_PARSER_STDOUT.then(|| {
println!(
"\n{} specialized parser error out with backtick: \ninput: {:?}, delim: {:?}",
fg_red("⬢⬢"),
input,
BACK_TICK
);
});
}
let (_, output) = it?;
if output.len() > 2 {
DEBUG_MD_PARSER_STDOUT.then(|| {
println!(
"{} more than 2 backticks in input:{:?}",
fg_red("⬢⬢"),
input
);
});
return Err(nom::Err::Error(nom::error::Error {
input: output,
code: nom::error::ErrorKind::Tag,
}));
}
specialized_parser_delim_matchers::take_starts_with_delim_no_new_line(
input, BACK_TICK,
)
}
pub fn parse_fragment_starts_with_left_image_err_on_new_line(
input: &str,
) -> IResult<&str, HyperlinkData<'_>> {
let result_first =
take_text_between_delims_err_on_new_line(input, LEFT_IMAGE, RIGHT_IMAGE);
if result_first.is_err() {
DEBUG_MD_PARSER_STDOUT.then(|| {
println!(
"\n{} specialized parser error out with image: \ninput: {:?}, delim: {:?}",
fg_red("⬢⬢"),
input,
LEFT_IMAGE
);
});
}
let (rem, part_between_image_tags) = result_first?;
let result_second = take_text_between_delims_err_on_new_line(
rem,
LEFT_PARENTHESIS,
RIGHT_PARENTHESIS,
);
if result_second.is_err() {
DEBUG_MD_PARSER_STDOUT.then(|| {
println!(
"\n{} specialized parser error out with image: \ninput: {:?}, delim: {:?}",
fg_red("⬢⬢"),
rem,
LEFT_PARENTHESIS
);
});
}
let (rem, part_between_parenthesis) = result_second?;
let it = Ok((
rem,
HyperlinkData::from((part_between_image_tags, part_between_parenthesis)),
));
DEBUG_MD_PARSER_STDOUT.then(|| {
println!(
"{} specialized parser for image: {:?}",
if it.is_err() {
fg_red("⬢⬢")
} else {
fg_blue("▲▲")
},
it
);
});
it
}
pub fn parse_fragment_starts_with_left_link_err_on_new_line(
input: &str,
) -> IResult<&str, HyperlinkData<'_>> {
let result_first =
take_text_between_delims_err_on_new_line(input, LEFT_BRACKET, RIGHT_BRACKET);
if result_first.is_err() {
DEBUG_MD_PARSER_STDOUT.then(|| {
println!(
"\n{} specialized parser error out with link: \ninput: {:?}, delim: {:?}",
fg_red("⬢⬢"),
input,
LEFT_BRACKET
);
});
}
let (rem, part_between_brackets) = result_first?;
let result_second = take_text_between_delims_err_on_new_line(
rem,
LEFT_PARENTHESIS,
RIGHT_PARENTHESIS,
);
if result_second.is_err() {
DEBUG_MD_PARSER_STDOUT.then(|| {
println!(
"\n{} specialized parser error out with link: \ninput: {:?}, delim: {:?}",
fg_red("⬢⬢"),
rem,
LEFT_PARENTHESIS
);
});
}
let (rem, part_between_parenthesis) = result_second?;
let it = Ok((
rem,
HyperlinkData::from((part_between_brackets, part_between_parenthesis)),
));
DEBUG_MD_PARSER_STDOUT.then(|| {
println!(
"{} specialized parser for link: {:?}",
if it.is_err() {
fg_red("⬢⬢")
} else {
fg_blue("▲▲")
},
it
);
});
it
}
pub fn parse_fragment_starts_with_checkbox_into_str(input: &str) -> IResult<&str, &str> {
let it = alt((recognize(tag(CHECKED)), recognize(tag(UNCHECKED)))).parse(input);
DEBUG_MD_PARSER_STDOUT.then(|| {
println!(
"{} specialized parser for checkbox: {:?}",
if it.is_err() {
fg_red("⬢⬢")
} else {
fg_blue("▲▲")
},
it
);
});
it
}
pub fn parse_fragment_starts_with_checkbox_checkbox_into_bool(
input: &str,
) -> IResult<&str, bool> {
let it =
alt((map(tag(CHECKED), |_| true), map(tag(UNCHECKED), |_| false))).parse(input);
DEBUG_MD_PARSER_STDOUT.then(|| {
println!(
"{} specialized parser for checkbox: {:?}",
if it.is_err() {
fg_red("⬢⬢")
} else {
fg_blue("▲▲")
},
it
);
});
it
}