Skip to main content

namumark_parser/span/bracket_span/
color.rs

1use crate::{span_list, whitespace1, BracketSpan, Color, Result, EMPTY};
2use nom::bytes::complete::{is_a, tag, take};
3
4pub(crate) fn color(input: &str) -> Result<BracketSpan> {
5  let (input, (code, span_input)) = expect_color(input)?;
6  let span_list = span_list(span_input);
7  let span = BracketSpan::Color(span_list, Color::Raw(code.to_owned()));
8
9  Ok((input, span))
10}
11
12pub(crate) fn expect_color(input: &str) -> Result<(&str, &str)> {
13  const LEFT: &'static str = "#";
14  const CODE: &'static str = "0123456789abcdefABCDEF";
15
16  fn start(input: &str) -> Result<&str> {
17    let (input, _) = tag(LEFT)(input)?;
18    let (input, level) = take(6usize)(input)?;
19    let _ = is_a(CODE)(level)?;
20    let (input, _) = whitespace1(input)?;
21
22    Ok((input, level))
23  };
24
25  let (input, code) = start(input)?;
26
27  Ok((EMPTY, (code, input)))
28}
29
30#[cfg(test)]
31mod tests {
32  use crate::*;
33
34  #[test]
35  fn basic() {
36    let source = "{{{#000000 Danuel}}}";
37    assert_eq!(
38      span_list(source),
39      vec![Span::Bracket(BracketSpan::Color(
40        vec![Span::Inline("Danuel".to_owned())],
41        Color::Raw("000000".to_owned())
42      ))]
43    );
44  }
45}