#[rustfmt::skip]
pub mod no_rustfmt_block {
use crate::*;
use constants::*;
use nom::{
branch::*, bytes::complete::*, character::complete::*, combinator::*, multi::*, sequence::*,
IResult,
};
pub fn parse_title(input: &str) -> IResult<&str, &str> {
return terminated(
alt((
parse_title_quoted,
parse_title_not_quoted
)),
tag(NEW_LINE)
)(input);
fn parse_title_quoted(input: &str) -> IResult<&str, &str> {
map(
preceded(
tuple((tag(TITLE), tag(COLON), space0)),
parse_quoted,
),
|it: &str| it.trim()
)(input)
}
fn parse_title_not_quoted(input: &str) -> IResult<&str, &str> {
map(
preceded(
tuple((tag(TITLE), tag(COLON), space0)),
is_not(NEW_LINE),
),
|it: &str| it.trim()
)(input)
}
}
pub fn parse_quoted(input: &str) -> IResult<&str, &str> {
delimited(
tag(QUOTE),
is_not(QUOTE),
tag(QUOTE),
)(input)
}
pub fn parse_tags(input: &str) -> IResult<&str, Vec<&str>> {
let (input, output) = delimited(
tuple((tag(TAGS), tag(COLON), space0)),
is_not(NEW_LINE),
tag(NEW_LINE),
)(input)?;
let (_, output) = parse_tag_list_enclosed_in_brackets(output)?;
let (_, output) = parse_tag_list_comma_separated(output)?;
return Ok((input, output));
fn parse_tag_list_enclosed_in_brackets(input: &str) -> IResult<&str, &str> {
let (input, output) = delimited(
tag(LEFT_BRACKET),
alt((
is_not(RIGHT_BRACKET),
is_not(LEFT_BRACKET)
)),
tag(RIGHT_BRACKET),
)(input)?;
Ok((input, output))
}
fn parse_tag_list_comma_separated(input: &str) -> IResult<&str, Vec<&str>> {
let (input, output) = separated_list1(
tag(COMMA),
preceded(
space0,
is_not(COMMA),
),
)(input)?;
let mut output_trimmed_unquoted = vec![];
for item in output.iter() {
if let Ok((_, output)) = parse_quoted(item) {
output_trimmed_unquoted.push(output.trim())
} else {
output_trimmed_unquoted.push(item.trim())
}
}
Ok((input, output_trimmed_unquoted))
}
}
}
pub use no_rustfmt_block::*;
#[cfg(test)]
mod tests {
use super::*;
use crate::parser_impl_metadata::tests::raw_strings::*;
#[test]
fn test_parse_metadata_tags() {
let output = parse_tags(TAG_STRING_1);
assert_eq!(output, Ok(("", vec!["tag 1", "tag 2", "tag3"])));
let output = parse_tags(TAG_STRING_2);
assert_eq!(output, Ok(("", vec!["tag 1", "tag 2", "tag 3"])));
}
#[test]
fn test_parse_metadata_title() {
let output = parse_title(raw_strings::TITLE_STRING_1);
assert_eq!(output, Ok(("", "Some title")));
let output = parse_title(raw_strings::TITLE_STRING_2);
assert_eq!(output, Ok(("", "Some title")));
}
#[rustfmt::skip]
mod raw_strings {
pub const TITLE_STRING_1: &str =
r#"@title: Some title
"#;
pub const TITLE_STRING_2: &str =
r#"@title: "Some title "
"#;
pub const TAG_STRING_1: &str =
r#"@tags: [tag 1 , tag 2, tag3]
"#;
pub const TAG_STRING_2: &str =
r#"@tags: ["tag 1 ", " tag 2", "tag 3"]
"#;
}
}