use nom::{ bytes::complete::{tag, take_while}, combinator::verify, IResult, }; use crate::elements::Element; // TODO: text-markup, entities, latex-fragments, subscript and superscript #[cfg_attr(test, derive(PartialEq))] #[cfg_attr(feature = "serde", derive(serde::Serialize))] #[derive(Debug)] pub struct RadioTarget; impl RadioTarget { #[inline] pub(crate) fn parse(input: &str) -> IResult<&str, (Element, &str)> { let (input, _) = tag("<<<")(input)?; let (input, contents) = verify( take_while(|c: char| c != '<' && c != '\n' && c != '>'), |s: &str| s.starts_with(|c| c != ' ') && s.ends_with(|c| c != ' '), )(input)?; let (input, _) = tag(">>>")(input)?; Ok((input, (Element::RadioTarget(RadioTarget), contents))) } } #[test] fn parse() { assert_eq!( RadioTarget::parse("<<>>"), Ok(("", (Element::RadioTarget(RadioTarget), "target"))) ); assert_eq!( RadioTarget::parse("<<>>"), Ok(("", (Element::RadioTarget(RadioTarget), "tar get"))) ); assert!(RadioTarget::parse("<<>>").is_err()); assert!(RadioTarget::parse("<<< target>>>").is_err()); assert!(RadioTarget::parse("<<>>").is_err()); assert!(RadioTarget::parse("<<get>>>").is_err()); assert!(RadioTarget::parse("<<>>").is_err()); assert!(RadioTarget::parse("<<>").is_err()); }