use std::ops::Range;
mod commonmark;
mod directive;
mod footnote;
mod html;
mod math;
mod table;
pub use commonmark::*;
pub use directive::*;
pub use footnote::*;
pub use html::*;
pub use math::*;
pub use table::*;
pub fn is_blank(tail: &str) -> bool {
tail.bytes().all(|b| b == b' ' || b == b'\t')
}
fn trim_range(s: &str, range: Range<usize>) -> Range<usize> {
let slice = &s[range.clone()];
let start = range.start + (slice.len() - slice.trim_start_matches([' ', '\t']).len());
let end = range.start + slice.trim_end_matches([' ', '\t']).len();
start..end.max(start)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn blank_lines() {
assert!(is_blank("") && is_blank(" \t "));
assert!(!is_blank(" x") && !is_blank("\u{A0}"));
}
#[test]
fn trim_range_shrinks_to_content() {
let s = " a b \t";
assert_eq!(trim_range(s, 0..s.len()), 2..5);
assert_eq!(trim_range(s, 1..3), 2..3);
assert_eq!(trim_range(s, 5..7), 7..7);
}
}