Parse links from matrix messages
parent
60540b3b6d
commit
5e2b6bee64
|
@ -22,7 +22,8 @@ pub fn convert_matrix(message: &str) -> MessageContent {
|
||||||
local_name!("strong")
|
local_name!("strong")
|
||||||
| local_name!("b")
|
| local_name!("b")
|
||||||
| local_name!("em")
|
| local_name!("em")
|
||||||
| local_name!("i") => {
|
| local_name!("i")
|
||||||
|
| local_name!("a") => {
|
||||||
parents.push(components);
|
parents.push(components);
|
||||||
components = vec![];
|
components = vec![];
|
||||||
}
|
}
|
||||||
|
@ -57,6 +58,21 @@ pub fn convert_matrix(message: &str) -> MessageContent {
|
||||||
local_name!("em") | local_name!("i") => {
|
local_name!("em") | local_name!("i") => {
|
||||||
construct_component!(MessageComponent::Italic)
|
construct_component!(MessageComponent::Italic)
|
||||||
}
|
}
|
||||||
|
local_name!("a") => {
|
||||||
|
if let Some(mut parent_components) = parents.pop() {
|
||||||
|
let attrs = element.attributes.borrow();
|
||||||
|
if let Some(href) = attrs.get(local_name!("href")) {
|
||||||
|
parent_components.push(MessageComponent::Link {
|
||||||
|
target: href.to_string(),
|
||||||
|
text: components,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
parent_components.append(&mut components);
|
||||||
|
}
|
||||||
|
|
||||||
|
components = parent_components;
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -122,14 +138,24 @@ pub fn format_matrix(message_content: &[MessageComponent]) -> String {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn simple_matrix_parsing() {
|
fn simple_matrix_parsing() {
|
||||||
let html = r"<strong>hello! <i><></i></strong>";
|
use MessageComponent::*;
|
||||||
|
|
||||||
|
let html =
|
||||||
|
r#"<strong>hello! <i><></i></strong> <a href="https://example.com/">example</a>"#;
|
||||||
let ast = convert_matrix(html);
|
let ast = convert_matrix(html);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
ast,
|
ast,
|
||||||
vec![MessageComponent::Bold(vec![
|
vec![
|
||||||
MessageComponent::Plain("hello! ".to_string(),),
|
Bold(vec![
|
||||||
MessageComponent::Italic(vec![MessageComponent::Plain("<>".to_string())])
|
Plain("hello! ".to_string(),),
|
||||||
])]
|
Italic(vec![Plain("<>".to_string())]),
|
||||||
|
]),
|
||||||
|
Plain(" ".to_string()),
|
||||||
|
Link {
|
||||||
|
target: "https://example.com/".to_string(),
|
||||||
|
text: vec![Plain("example".to_string())]
|
||||||
|
},
|
||||||
|
]
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue