{
match node {
Node::Text(text) => Some(BodyNode::Text(ifmt_from_text(text))),
Node::Element(el) => {
- let el_name = el.name.to_case(Case::Snake);
- let el_name = ElementName::Ident(Ident::new(el_name.as_str(), Span::call_site()));
+ let el_name = if let Some(name) = map_html_element_to_rsx(&el.name) {
+ ElementName::Ident(Ident::new(name, Span::call_site()))
+ } else {
+ // if we don't recognize it and it has a dash, we assume it's a web component
+ if el.name.contains('-') {
+ ElementName::Custom(LitStr::new(&el.name, Span::call_site()))
+ } else {
+ // otherwise, it might be an element that isn't supported yet
+ ElementName::Ident(Ident::new(&el.name.to_case(Case::Snake), Span::call_site()))
+ }
+ };
let mut attributes: Vec<_> = el
.attributes
.iter()
.map(|(name, value)| {
- let ident = if matches!(name.as_str(), "for" | "async" | "type" | "as") {
- Ident::new_raw(name.as_str(), Span::call_site())
+ let value = ifmt_from_text(value.as_deref().unwrap_or("false"));
+ let attr = if let Some(name) = map_html_attribute_to_rsx(name) {
+ let ident = if let Some(name) = name.strip_prefix("r#") {
+ Ident::new_raw(name, Span::call_site())
+ } else {
+ Ident::new(name, Span::call_site())
+ };
+ ElementAttr::AttrText { value, name: ident }
} else {
- let new_name = name.to_case(Case::Snake);
- Ident::new(new_name.as_str(), Span::call_site())
+ // If we don't recognize the attribute, we assume it's a custom attribute
+ ElementAttr::CustomAttrText {
+ value,
+ name: LitStr::new(name, Span::call_site()),
+ }
};
ElementAttrNamed {
el_name: el_name.clone(),
- attr: ElementAttr::AttrText {
- value: ifmt_from_text(value.as_deref().unwrap_or("false")),
- name: ident,
- },
+ attr,
}
})
.collect();
diff --git a/packages/rsx-rosetta/tests/h-tags.rs b/packages/rsx-rosetta/tests/h-tags.rs
new file mode 100644
index 000000000..eb179c57f
--- /dev/null
+++ b/packages/rsx-rosetta/tests/h-tags.rs
@@ -0,0 +1,33 @@
+use html_parser::Dom;
+
+#[test]
+fn h_tags_translate() {
+ let html = r#"
+
+
hello world!
+ hello world!
+ hello world!
+ hello world!
+ hello world!
+ hello world!
+
+ "#
+ .trim();
+
+ let dom = Dom::parse(html).unwrap();
+
+ let body = rsx_rosetta::rsx_from_html(&dom);
+
+ let out = dioxus_autofmt::write_block_out(body).unwrap();
+
+ let expected = r#"
+ div {
+ h1 { "hello world!" }
+ h2 { "hello world!" }
+ h3 { "hello world!" }
+ h4 { "hello world!" }
+ h5 { "hello world!" }
+ h6 { "hello world!" }
+ }"#;
+ pretty_assertions::assert_eq!(&out, &expected);
+}
diff --git a/packages/rsx-rosetta/tests/raw.rs b/packages/rsx-rosetta/tests/raw.rs
new file mode 100644
index 000000000..a3ed1eef8
--- /dev/null
+++ b/packages/rsx-rosetta/tests/raw.rs
@@ -0,0 +1,21 @@
+use html_parser::Dom;
+
+#[test]
+fn raw_attribute() {
+ let html = r#"
+
+ "#
+ .trim();
+
+ let dom = Dom::parse(html).unwrap();
+
+ let body = rsx_rosetta::rsx_from_html(&dom);
+
+ let out = dioxus_autofmt::write_block_out(body).unwrap();
+
+ let expected = r#"
+ div { div { "unrecognizedattribute": "asd", "hello world!" } }"#;
+ pretty_assertions::assert_eq!(&out, &expected);
+}
diff --git a/packages/rsx-rosetta/tests/simple.rs b/packages/rsx-rosetta/tests/simple.rs
index b8fd095e1..3f3f8230a 100644
--- a/packages/rsx-rosetta/tests/simple.rs
+++ b/packages/rsx-rosetta/tests/simple.rs
@@ -9,8 +9,6 @@ fn simple_elements() {
hello world!
hello world!
hello world!
- hello world!
- hello world!
"#
.trim();
@@ -28,8 +26,6 @@ fn simple_elements() {
div { id: "asd", "hello world!" }
div { r#for: "asd", "hello world!" }
div { r#async: "asd", "hello world!" }
- div { large_thing: "asd", "hello world!" }
- ai_is_awesome { "hello world!" }
}"#;
pretty_assertions::assert_eq!(&out, &expected);
}
diff --git a/packages/rsx-rosetta/tests/web-component.rs b/packages/rsx-rosetta/tests/web-component.rs
new file mode 100644
index 000000000..c7309e1b7
--- /dev/null
+++ b/packages/rsx-rosetta/tests/web-component.rs
@@ -0,0 +1,21 @@
+use html_parser::Dom;
+
+#[test]
+fn web_components_translate() {
+ let html = r#"
+
+
+
+ "#
+ .trim();
+
+ let dom = Dom::parse(html).unwrap();
+
+ let body = rsx_rosetta::rsx_from_html(&dom);
+
+ let out = dioxus_autofmt::write_block_out(body).unwrap();
+
+ let expected = r#"
+ div { my-component {} }"#;
+ pretty_assertions::assert_eq!(&out, &expected);
+}