Skip to content

Commit

Permalink
Implement special behavior for style attribute
Browse files Browse the repository at this point in the history
  • Loading branch information
voltrevo committed Mar 1, 2024
1 parent 5765983 commit 131ebcc
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 3 deletions.
51 changes: 49 additions & 2 deletions valuescript_vm/src/jsx_element.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,15 +137,25 @@ impl fmt::Display for JsxElement {

fn write_attributes(f: &mut fmt::Formatter<'_>, attrs: &Vec<(String, Val)>) -> fmt::Result {
for (key, val) in attrs {
write!(f, " {}=\"{}\"", key, val)?;
let val_str = match key.as_str() {
"style" => render_css(val),
_ => val.to_string(),
};

write!(f, " {}=\"{}\"", key, val_str)?;
}

Ok(())
}

fn write_attributes_pretty(f: &mut fmt::Formatter<'_>, attrs: &Vec<(String, Val)>) -> fmt::Result {
for (key, val) in attrs {
write!(f, " {}=\x1b[33m\"{}\"\x1b[39m", key, val)?;
let val_str = match key.as_str() {
"style" => render_css(val),
_ => val.to_string(),
};

write!(f, " {}=\x1b[33m\"{}\"\x1b[39m", key, val_str)?;
}

Ok(())
Expand All @@ -158,3 +168,40 @@ pub fn is_jsx_element(val: &Val) -> bool {
_ => false,
}
}

fn render_css(val: &Val) -> String {
if let Val::Object(obj) = val {
let mut css_str = String::new();

for (key, val) in &obj.string_map {
css_str.push_str(&format!("{}: {}; ", to_kebab_case(key), val));
}

return css_str;
}

val.to_string()
}

fn to_kebab_case(key: &str) -> String {
// eg: backgroundColor -> background-color

let mut kebab = String::new();
let mut last_was_upper = false;

for c in key.chars() {
if c.is_uppercase() {
if !last_was_upper {
kebab.push('-');
}

kebab.push_str(c.to_lowercase().collect::<String>().as_str());
last_was_upper = true;
} else {
kebab.push(c);
last_was_upper = false;
}
}

kebab
}
2 changes: 1 addition & 1 deletion website/src/playground/files/root/tutorial/alsoJsx.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ function greet(name: string) {
return (
<h1>
Hello
<span style="color: green;">{name}</span>!
<span style={{ color: "green" }}>{name}</span>!
</h1>
);
}
Expand Down

0 comments on commit 131ebcc

Please sign in to comment.