omena-transform-passes 0.2.0

Transform pass registry and DAG planner for Omena CSS
Documentation
pub(crate) fn strip_ascii_prefix_ignore_case<'a>(text: &'a str, prefix: &str) -> Option<&'a str> {
    text.get(..prefix.len())?
        .eq_ignore_ascii_case(prefix)
        .then(|| &text[prefix.len()..])
}

pub(crate) fn starts_with_ascii_case_insensitive(text: &str, prefix: &str) -> bool {
    let text_bytes = text.as_bytes();
    let prefix_bytes = prefix.as_bytes();
    text_bytes.len() >= prefix_bytes.len()
        && text_bytes
            .iter()
            .take(prefix_bytes.len())
            .zip(prefix_bytes)
            .all(|(left, right)| left.eq_ignore_ascii_case(right))
}

pub(crate) fn ascii_css_identifier_end(text: &str, start: usize) -> usize {
    let bytes = text.as_bytes();
    let mut end = start;
    while end < bytes.len() && css_identifier_byte_is_plain(bytes[end]) {
        end += 1;
    }
    end
}

fn css_identifier_byte_is_plain(byte: u8) -> bool {
    byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')
}

pub(crate) fn normalize_ascii_whitespace(text: &str) -> String {
    text.split_whitespace().collect::<Vec<_>>().join(" ")
}