use omgbase_properties::mask_code;
#[must_use]
pub fn mask_code_bytes(raw: &str) -> String {
let masked = mask_code(raw);
if masked == raw {
return masked;
}
let mut out = String::with_capacity(raw.len());
for (orig, m) in raw.chars().zip(masked.chars()) {
if m == orig {
out.push(orig);
} else {
debug_assert_eq!(m, ' ', "mask_code only blanks");
for _ in 0..orig.len_utf8() {
out.push(' ');
}
}
}
debug_assert_eq!(out.len(), raw.len());
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn preserves_byte_length() {
assert_eq!(mask_code_bytes("plain"), "plain");
assert_eq!(mask_code_bytes("a `é` b"), "a b");
assert_eq!(mask_code_bytes("a `é` b").len(), "a `é` b".len());
assert_eq!(
mask_code_bytes("```\nk:: v\n```\nafter"),
" \n \n \nafter"
);
let raw = "x `日本` [t](/p)";
let m = mask_code_bytes(raw);
assert_eq!(m.len(), raw.len());
assert_eq!(m.find("[t](/p)"), raw.find("[t](/p)"));
}
}