sidereon_core/astro/
xml.rs1pub(crate) fn first_illegal_xml_1_0_char(value: &str) -> Option<char> {
9 value.chars().find(|&ch| !is_xml_1_0_char(ch))
10}
11
12fn is_xml_1_0_char(ch: char) -> bool {
13 matches!(
14 ch,
15 '\u{9}' | '\u{A}' | '\u{D}'
16 | '\u{20}'..='\u{D7FF}'
17 | '\u{E000}'..='\u{FFFD}'
18 | '\u{10000}'..='\u{10FFFF}'
19 )
20}
21
22pub(crate) fn escape(value: &str) -> String {
24 value
25 .replace('&', "&")
26 .replace('<', "<")
27 .replace('>', ">")
28 .replace('"', """)
29 .replace('\'', "'")
30 .replace('\r', "
")
31}
32
33pub(crate) fn escape_opt(value: &Option<String>) -> String {
35 value.as_deref().map(escape).unwrap_or_default()
36}