Merge branch 'master' into many_optional_attributes
This commit is contained in:
569 files changed
+8815
-21321
No files matched your search
@@ -15,6 +15,7 @@ keywords = ["dom", "ui", "gui", "react"]
|
||||
[dependencies]
|
||||
dioxus-autofmt = { workspace = true }
|
||||
dioxus-rsx = { workspace = true }
|
||||
dioxus-html = { workspace = true, features = ["html-to-rsx"]}
|
||||
html_parser.workspace = true
|
||||
proc-macro2 = "1.0.49"
|
||||
quote = "1.0.23"
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
# `rsx-rosetta`
|
||||
|
||||
[![Crates.io][crates-badge]][crates-url]
|
||||
@@ -9,18 +7,15 @@
|
||||
|
||||
[crates-badge]: https://img.shields.io/crates/v/rsx-rosetta.svg
|
||||
[crates-url]: https://crates.io/crates/rsx-rosetta
|
||||
|
||||
[mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg
|
||||
[mit-url]: https://github.com/dioxuslabs/dioxus/blob/master/LICENSE
|
||||
|
||||
[actions-badge]: https://github.com/dioxuslabs/dioxus/actions/workflows/main.yml/badge.svg
|
||||
[actions-url]: https://github.com/dioxuslabs/dioxus/actions?query=workflow%3ACI+branch%3Amaster
|
||||
|
||||
[discord-badge]: https://img.shields.io/discord/899851952891002890.svg?logo=discord&style=flat-square
|
||||
[discord-url]: https://discord.gg/XgGxMSkvUM
|
||||
|
||||
[Website](https://dioxuslabs.com) |
|
||||
[Guides](https://dioxuslabs.com/docs/0.3/guide/en/) |
|
||||
[Guides](https://dioxuslabs.com/learn/0.4/) |
|
||||
[API Docs](https://docs.rs/rsx-rosetta/latest/rsx-rosetta) |
|
||||
[Chat](https://discord.gg/XgGxMSkvUM)
|
||||
|
||||
@@ -49,6 +44,7 @@ From there, you can convert directly to a string or into some other AST.
|
||||
- Join the discord and ask questions!
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the [MIT license].
|
||||
|
||||
[mit license]: https://github.com/DioxusLabs/dioxus/blob/master/LICENSE-MIT
|
||||
@@ -56,4 +52,3 @@ This project is licensed under the [MIT license].
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted
|
||||
for inclusion in Dioxus by you, shall be licensed as MIT, without any additional
|
||||
terms or conditions.
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
#![doc = include_str!("../README.md")]
|
||||
#![doc(html_logo_url = "https://avatars.githubusercontent.com/u/79236386")]
|
||||
#![doc(html_favicon_url = "https://avatars.githubusercontent.com/u/79236386")]
|
||||
|
||||
use convert_case::{Case, Casing};
|
||||
use dioxus_html::{map_html_attribute_to_rsx, map_html_element_to_rsx};
|
||||
use dioxus_rsx::{
|
||||
BodyNode, CallBody, Component, Element, ElementAttr, ElementAttrNamed, ElementName, IfmtInput,
|
||||
};
|
||||
@@ -20,28 +25,47 @@ pub fn rsx_node_from_html(node: &Node) -> Option<BodyNode> {
|
||||
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 {
|
||||
value: dioxus_rsx::ElementAttrValue::AttrLiteral(ifmt_from_text(
|
||||
value.as_deref().unwrap_or("false"),
|
||||
)),
|
||||
name: dioxus_rsx::ElementAttrName::BuiltIn(ident),
|
||||
},
|
||||
// attr: ElementAttr {
|
||||
// value: dioxus_rsx::ElementAttrValue::AttrLiteral(ifmt_from_text(
|
||||
// value.as_deref().unwrap_or("false"),
|
||||
// )),
|
||||
// name: dioxus_rsx::ElementAttrName::BuiltIn(ident),
|
||||
// },
|
||||
attr,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
use html_parser::Dom;
|
||||
|
||||
#[test]
|
||||
fn h_tags_translate() {
|
||||
let html = r#"
|
||||
<div>
|
||||
<h1>hello world!</h1>
|
||||
<h2>hello world!</h2>
|
||||
<h3>hello world!</h3>
|
||||
<h4>hello world!</h4>
|
||||
<h5>hello world!</h5>
|
||||
<h6>hello world!</h6>
|
||||
</div>
|
||||
"#
|
||||
.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);
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
use html_parser::Dom;
|
||||
|
||||
#[test]
|
||||
fn raw_attribute() {
|
||||
let html = r#"
|
||||
<div>
|
||||
<div unrecognizedattribute="asd">hello world!</div>
|
||||
</div>
|
||||
"#
|
||||
.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);
|
||||
}
|
||||
@@ -9,8 +9,6 @@ fn simple_elements() {
|
||||
<div id="asd">hello world!</div>
|
||||
<div for="asd">hello world!</div>
|
||||
<div async="asd">hello world!</div>
|
||||
<div LargeThing="asd">hello world!</div>
|
||||
<ai-is-awesome>hello world!</ai-is-awesome>
|
||||
</div>
|
||||
"#
|
||||
.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);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
use html_parser::Dom;
|
||||
|
||||
#[test]
|
||||
fn web_components_translate() {
|
||||
let html = r#"
|
||||
<div>
|
||||
<my-component></my-component>
|
||||
</div>
|
||||
"#
|
||||
.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);
|
||||
}
|
||||
Reference in new issue
Block a user