#[doc(hidden)]
pub fn item(name: &str) -> String {
let token = !name.is_empty()
&& name.as_bytes()[0].is_ascii_alphabetic()
&& name.bytes().all(|b| b.is_ascii_alphanumeric() || b":/!#$%&'*+-.^_`|~".contains(&b));
if token {
name.to_string()
} else {
string(name)
}
}
#[doc(hidden)]
pub fn string(s: &str) -> String {
let mut out = String::with_capacity(s.len() + 2);
out.push('"');
for c in s.chars().take(256) {
match c {
'"' | '\\' => {
out.push('\\');
out.push(c);
}
' '..='~' => out.push(c),
_ => {}
}
}
out.push('"');
out
}