///|
fn is_invisible_unicode_char(ch : Char) -> Bool {
let code = ch.to_int()
code == 0x061C ||
(code >= 0x200B && code <= 0x200F) ||
(code >= 0x202A && code <= 0x202E) ||
(code >= 0x2060 && code <= 0x2069) ||
(code >= 0xFE00 && code <= 0xFE0F) ||
code == 0xFEFF ||
(code >= 0xE000 && code <= 0xF8FF) ||
(code >= 0xE0100 && code <= 0xE01EF) ||
(code >= 0xF0000 && code <= 0xFFFFD) ||
(code >= 0x100000 && code <= 0x10FFFD)
}
///|
fn strip_invisible_unicode(value : String) -> String {
let out = StringBuilder::new(size_hint=value.length())
let mut changed = false
for ch in value {
if is_invisible_unicode_char(ch) {
changed = true
} else {
out.write_char(ch)
}
}
if changed {
out.to_string()
} else {
value
}
}
///|
fn sanitized_text_node_data(
node : @dom.Node,
policy : SanitizationPolicy,
) -> String? {
if policy.strip_invisible_unicode && node.data != "" {
let stripped = strip_invisible_unicode(node.data)
if stripped != node.data {
Some(stripped)
} else {
None
}
} else {
None
}
}