namumark_parser/span/bracket_span/
color.rs1use 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}