use crate::write::{LinkSink, Writer};
use vize_l0::{Span, String};
pub(super) fn template<L: LinkSink>(writer: &mut Writer<L>, text: &str, span: Span, html: bool) {
let mut encoded = String::with_capacity(text.len());
for character in text.chars() {
match character {
'&' if html => encoded.push_str("&"),
'<' if html => encoded.push_str("<"),
'>' if html => encoded.push_str(">"),
'"' if html => encoded.push_str("""),
'\'' if html => encoded.push_str("'"),
'\\' => encoded.push_str("\\\\"),
'`' => encoded.push_str("\\`"),
'$' => encoded.push_str("\\$"),
character => encoded.push(character),
}
}
writer.push_linked(&encoded, span);
}
pub(super) fn quoted<L: LinkSink>(writer: &mut Writer<L>, text: &str, span: Span) {
let encoded = serde_json::to_string(text).unwrap_or_default();
writer.push_linked(&encoded, span);
}
pub(super) fn property<L: LinkSink>(writer: &mut Writer<L>, name: &str, span: Span) {
let mut bytes = name.bytes();
if bytes
.next()
.is_some_and(|byte| byte.is_ascii_alphabetic() || matches!(byte, b'_' | b'$'))
&& bytes.all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'$'))
{
writer.push_linked(name, span);
} else {
quoted(writer, name, span);
}
}