pub(super) fn is_checkbox_task_id_token(id: &str) -> bool {
let bytes = id.as_bytes();
if bytes.is_empty() {
return false;
}
if !bytes[0].is_ascii_digit() || !bytes[bytes.len() - 1].is_ascii_digit() {
return false;
}
let mut prev_dot = false;
for &b in bytes {
if b.is_ascii_digit() {
prev_dot = false;
continue;
}
if b == b'.' {
if prev_dot {
return false;
}
prev_dot = true;
continue;
}
return false;
}
true
}
pub(super) fn split_checkbox_task_label(s: &str) -> Option<(&str, &str)> {
let s = s.trim_start();
if s.is_empty() {
return None;
}
let bytes = s.as_bytes();
let i = bytes.iter().position(|&b| b == b' ' || b == b'\t')?;
let (token, rest) = s.split_at(i);
let token = token.strip_suffix(':').unwrap_or(token);
let token = token.strip_suffix('.').unwrap_or(token);
if !is_checkbox_task_id_token(token) {
return None;
}
Some((token, rest.trim()))
}
#[cfg(test)]
#[path = "checkbox_tests.rs"]
mod checkbox_tests;