use html5ever::{namespace_url, ns, LocalName, QualName};
use kuchiki::{iter::NodeEdge, traits::*};
use super::{MessageComponent, MessageContent};
pub fn convert_matrix(message: &str) -> MessageContent {
let dom = kuchiki::parse_fragment(
QualName::new(None, ns!(html), LocalName::from("div")),
vec![],
)
.one(message);
// TODO: Work out how to convert the DOM into a message syntax tree
for edge in dom.traverse() {
match edge {
NodeEdge::Start(_) => {}
NodeEdge::End(_) => {}
};
}
todo!();
}
pub fn format_matrix(message_content: &[MessageComponent]) -> String {
message_content
.iter()
.map(|component| match component {
MessageComponent::Plain(text) => html_escape::encode_text(text).to_string(),
MessageComponent::Link { target, text } => format!(
r#"{}"#,
html_escape::encode_quoted_attribute(target),
format_matrix(text)
),
MessageComponent::Italic(inner) => format!("{}", format_matrix(inner)),
MessageComponent::Bold(inner) => format!("{}", format_matrix(inner)),
MessageComponent::Strikethrough(inner) => {
format!("{}", format_matrix(inner))
}
MessageComponent::Underline(inner) => format!("{}", format_matrix(inner)),
MessageComponent::Code(code) => {
format!("{}
", html_escape::encode_text(code))
}
MessageComponent::CodeBlock { lang, source } => {
format!(
r#"
{}
"#,
lang.as_ref()
.map(|lang| format!(
r#" class="language-{}""#,
html_escape::encode_quoted_attribute(lang)
))
.unwrap_or_else(|| "".to_string()),
source,
)
}
MessageComponent::Spoiler { reason, content } => format!(
"{}",
reason
.as_ref()
.map(|reason| format!(r#"="{}""#, html_escape::encode_quoted_attribute(reason)))
.unwrap_or_else(|| "".to_string()),
format_matrix(content)
),
MessageComponent::HardBreak => "{}", format_matrix(inner)) } }) .collect() }