#![allow(dead_code)]
use nom::bytes::complete::take_till;
use nom::character::complete::anychar;
use parse_hyperlinks::parser::Link;
use parse_hyperlinks::parser::html::html_text2dest;
use parse_hyperlinks::parser::html::html_text2dest_link;
use parse_hyperlinks::parser::html_img::html_img;
use parse_hyperlinks::parser::html_img::html_img_link;
use parse_hyperlinks::parser::html_img::html_img2dest_link;
use std::borrow::Cow;
#[allow(clippy::type_complexity)]
pub fn take_img(i: &'_ str) -> nom::IResult<&'_ str, (&'_ str, (Cow<'_, str>, Cow<'_, str>))> {
let mut j = i;
let mut skip_count = 0;
let res = loop {
if let Ok((k, r)) = html_img(j) {
break (k, r);
};
let (k, _) = anychar(j)?;
skip_count += j.len() - k.len();
j = k;
let (k, _) = take_till(|c| c == '<')(j)?;
skip_count += j.len() - k.len();
j = k;
};
let (l, link) = res;
let skipped_input = &i[0..skip_count];
Ok((l, (skipped_input, link)))
}
#[allow(clippy::type_complexity)]
pub fn take_text2dest(
i: &'_ str,
) -> nom::IResult<&'_ str, (&'_ str, (Cow<'_, str>, Cow<'_, str>, Cow<'_, str>))> {
let mut j = i;
let mut skip_count = 0;
let res = loop {
if let Ok((k, r)) = html_text2dest(j) {
break (k, r);
};
let (k, _) = anychar(j)?;
skip_count += j.len() - k.len();
j = k;
let (k, _) = take_till(|c| c == '<')(j)?;
skip_count += j.len() - k.len();
j = k;
};
let (l, link) = res;
let skipped_input = &i[0..skip_count];
Ok((l, (skipped_input, link)))
}
pub fn take_link(i: &'_ str) -> nom::IResult<&'_ str, (&'_ str, Link<'_>)> {
let mut j = i;
let mut skip_count = 0;
let res = loop {
if let Ok((k, r)) = html_img2dest_link(j) {
break (k, r);
};
if let Ok((k, r)) = html_img_link(j) {
break (k, r);
};
if let Ok((k, r)) = html_text2dest_link(j) {
break (k, r);
};
let (k, _) = anychar(j)?;
skip_count += j.len() - k.len();
j = k;
let (k, _) = take_till(|c| c == '<')(j)?;
skip_count += j.len() - k.len();
j = k;
};
let (l, link) = res;
let skipped_input = &i[0..skip_count];
Ok((l, (skipped_input, link)))
}
#[cfg(test)]
mod tests {
use super::*;
use crate::parser::parse_html::take_link;
#[test]
fn test_take_link() {
let (i, r) = take_link(r#"<img src="t%20m%20p&.jpg" alt="test1" />"#).unwrap();
assert_eq!(i, "");
assert_eq!(r.0, "");
assert_eq!(
r.1,
Link::Image(Cow::from("test1"), Cow::from("t%20m%20p&.jpg"))
);
let (i, r) = take_link(
r#"<a href="http://getreu.net/%C3%9C%20&">http://getreu.net/Ü%20&</a>abc"#,
)
.unwrap();
assert_eq!(i, "abc");
assert_eq!(r.0, "");
assert_eq!(
r.1,
Link::Text2Dest(
Cow::from("http://getreu.net/Ü%20&"),
Cow::from("http://getreu.net/%C3%9C%20&"),
Cow::from(""),
)
);
let (i, r) = take_link(
r#"<a href="http://getreu.net/%C3%9C%20&">http://getreu.net/Ü &</a>abc"#,
)
.unwrap();
assert_eq!(i, "abc");
assert_eq!(r.0, "");
assert_eq!(
r.1,
Link::Text2Dest(
Cow::from("http://getreu.net/Ü &"),
Cow::from("http://getreu.net/%C3%9C%20&"),
Cow::from(""),
)
);
}
}