From e5903da91e39f727d1b2d459d5a2ecfb19bd2861 Mon Sep 17 00:00:00 2001 From: mayintao3 Date: Fri, 31 May 2024 16:50:02 +0800 Subject: [PATCH] feat: transform --- src/style_propetries/transform.rs | 60 ++++++++++--------- .../transform_properties/matrix.rs | 36 ++++++++++- .../transform_properties/mod.rs | 12 +++- .../transform_properties/rotate.rs | 41 ++++++++++++- .../transform_properties/scale.rs | 35 ++++++++++- .../transform_properties/skew.rs | 39 ++++++++++-- .../transform_properties/translate.rs | 42 +++++++++++++ 7 files changed, 228 insertions(+), 37 deletions(-) diff --git a/src/style_propetries/transform.rs b/src/style_propetries/transform.rs index 1c8f8a4..587e1e1 100644 --- a/src/style_propetries/transform.rs +++ b/src/style_propetries/transform.rs @@ -25,35 +25,38 @@ pub struct Transform { } impl ToExpr for Transform { - fn to_expr(&self) -> PropertyTuple { - let mut props = vec![]; - self.value.iter().for_each(|item| { - match item { - Matrix4::Translates(value) => { - props.push(value.to_expr()); - }, - Matrix4::Rotates(value) => { - props.push(value.to_expr()); - } - Matrix4::Scales(value) => { - props.push(value.to_expr()); - } - // Matrix4::Matrix(value) => { - // props.extend(value.to_expr()); - // }, - _ => {} + fn to_expr(&self) -> PropertyTuple { + let mut props= vec![]; + self.value.iter().for_each(|item| { + match item { + Matrix4::Translates(value) => { + + props.push(value.to_expr_or_spread()); } - }); - PropertyTuple::One( - CSSPropertyType::Transform, - Expr::Object(ObjectLit { - span: Default::default(), - props:props, - }) - ) - } -} + Matrix4::Rotates(value) => { + props.push(value.to_expr_or_spread()); + } + Matrix4::Scales(value) => { + props.push(value.to_expr_or_spread()); + } + Matrix4::Skew(value) => { + props.push(value.to_expr_or_spread()); + } + Matrix4::Matrix(value) => { + props.push(value.to_expr_or_spread()); + } + } + }); + PropertyTuple::One( + CSSPropertyType::Transform, + Expr::Array(ArrayLit { + span: Default::default(), + elems: props, + }), + ) + } +} impl From<(String, &Property<'_>)> for Transform { fn from(prop: (String, &Property<'_>)) -> Self { @@ -204,9 +207,10 @@ impl From<(String, &Property<'_>)> for Transform { } } } + // println!("transform form {:?}", transform); Transform { id: prop.0, - value: transform + value: transform, } } } diff --git a/src/style_propetries/transform_properties/matrix.rs b/src/style_propetries/transform_properties/matrix.rs index 56aadce..f1b69dd 100644 --- a/src/style_propetries/transform_properties/matrix.rs +++ b/src/style_propetries/transform_properties/matrix.rs @@ -2,7 +2,7 @@ use swc_core::ecma::ast::*; use swc_core::common::DUMMY_SP; use crate::generate_expr_lit_num; - +use crate::{generate_expr_enum, style_propetries::transform_properties::ETransformType}; #[derive(Debug, Clone)] @@ -47,6 +47,40 @@ impl Matrix { m33: 1.0, } } + + pub fn to_vec(&self) -> Vec { + vec![ + self.m00, self.m01, self.m02, self.m03, + self.m10, self.m11, self.m12, self.m13, + self.m20, self.m21, self.m22, self.m23, + self.m30, self.m31, self.m32, self.m33, + ] +} + + pub fn to_expr_or_spread(&self) -> Option { + let mut props = vec![]; + + props.push(PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("type".into(), DUMMY_SP)), + value: Box::new(generate_expr_enum!(ETransformType::Matrix)) + })))); + + props.push(PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("matrix".into(), DUMMY_SP)), + value: Box::new(Expr::Array(ArrayLit { + span: Default::default(), + elems: self.to_vec().iter().map(|x| Some(generate_expr_lit_num!(Into::::into(*x)).into())).collect(), + })) + })))); + + Some(ExprOrSpread { + spread: None, + expr: Box::new(Expr::Object(ObjectLit { + span: Default::default(), + props: props + })) + }) + } // pub fn to_expr(&self) -> Vec { diff --git a/src/style_propetries/transform_properties/mod.rs b/src/style_propetries/transform_properties/mod.rs index 422368a..4e6afc2 100644 --- a/src/style_propetries/transform_properties/mod.rs +++ b/src/style_propetries/transform_properties/mod.rs @@ -2,4 +2,14 @@ pub mod translate; pub mod rotate; pub mod scale; pub mod skew; -pub mod matrix; \ No newline at end of file +pub mod matrix; + +#[repr(u32)] +#[derive(Debug, PartialEq, Eq)] +pub enum ETransformType { + Matrix = 0, + Translate = 1, + Scale = 2, + Rotate = 3, + Skew = 4, +} \ No newline at end of file diff --git a/src/style_propetries/transform_properties/rotate.rs b/src/style_propetries/transform_properties/rotate.rs index 50462f6..d6f0d52 100644 --- a/src/style_propetries/transform_properties/rotate.rs +++ b/src/style_propetries/transform_properties/rotate.rs @@ -1,9 +1,9 @@ use std::{borrow::Borrow, vec}; +use crate::{generate_expr_enum, style_propetries::transform_properties::ETransformType}; use lightningcss::{printer::PrinterOptions, traits::ToCss, values:: angle::Angle - } -; + }; use swc_core::ecma::ast::*; use swc_core::{ atoms::Atom, @@ -68,6 +68,43 @@ impl Rotate { }))) } + pub fn to_expr_or_spread(&self) -> Option { + let mut props = vec![]; + + [("x", &self.x), ("y", &self.y), ("z", &self.z), ("z", &self.rotate)].into_iter().for_each(|item| { + if let (name, Some(value)) = item.borrow() { + props.push( + PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new(Atom::new(*name), DUMMY_SP)), + value: Box::new(generate_expr_lit_num!(*value as f64)) + }))) + ) + } + }); + + if let Angle::Deg(angle) = self.angle { + props.push( + PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("angle".into(), DUMMY_SP)), + value: Box::new(generate_expr_lit_num!(angle as f64)) + }))) + ); + } + + props.push(PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("type".into(), DUMMY_SP)), + value: Box::new(generate_expr_enum!(ETransformType::Rotate)) + })))); + + Some(ExprOrSpread { + spread: None, + expr: Box::new(Expr::Object(ObjectLit { + span: Default::default(), + props: props + })) + }) + } + pub fn to_rn_expr(&self) -> Vec { let mut props = vec![]; [("-x", &self.x), ("-y", &self.y), ("-z", &self.z), ("", &self.rotate)].into_iter().for_each(|item| { diff --git a/src/style_propetries/transform_properties/scale.rs b/src/style_propetries/transform_properties/scale.rs index 54c65e5..ad519fc 100644 --- a/src/style_propetries/transform_properties/scale.rs +++ b/src/style_propetries/transform_properties/scale.rs @@ -6,7 +6,7 @@ use swc_core::{ atoms::Atom, common::DUMMY_SP }; - +use crate::{generate_expr_enum, style_propetries::transform_properties::ETransformType}; use crate::{generate_expr_lit_num, utils::to_camel_case}; @@ -57,6 +57,39 @@ impl Scale { }))) } + pub fn to_expr_or_spread(&self) -> Option { + let mut props = vec![]; + + [("x", &self.x), ("y", &self.y), ("z", &self.z)].into_iter().for_each(|item| { + if let (name, Some(side)) = item.borrow() { + match &side { + NumberOrPercentage::Number(value) => { + props.push( + PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new(Atom::new(*name), DUMMY_SP)), + value: Box::new(generate_expr_lit_num!(*value as f64)) + }))) + ); + }, + _ => {} + } + } + }); + + props.push(PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("type".into(), DUMMY_SP)), + value: Box::new(generate_expr_enum!(ETransformType::Scale)) + })))); + + Some(ExprOrSpread { + spread: None, + expr: Box::new(Expr::Object(ObjectLit { + span: Default::default(), + props: props + })) + }) + } + pub fn to_rn_expr(&self) -> Vec { let mut props = vec![]; [("x", &self.x), ("y", &self.y)].into_iter().for_each(|item| { diff --git a/src/style_propetries/transform_properties/skew.rs b/src/style_propetries/transform_properties/skew.rs index b6f641c..1fadb3d 100644 --- a/src/style_propetries/transform_properties/skew.rs +++ b/src/style_propetries/transform_properties/skew.rs @@ -1,11 +1,12 @@ use std::{borrow::Borrow, vec}; -use lightningcss::{printer::PrinterOptions, traits::ToCss, values::angle::Angle} -; +use lightningcss::{printer::PrinterOptions, traits::ToCss, values::angle::Angle}; use swc_core::ecma::ast::*; -use swc_core::common::DUMMY_SP; -use crate::{generate_expr_lit_str, utils::to_camel_case}; +use crate::{generate_expr_enum, style_propetries::transform_properties::ETransformType}; +use swc_core::{atoms::Atom, common::DUMMY_SP}; + +use crate::{generate_expr_lit_num, generate_expr_lit_str, utils::to_camel_case}; #[derive(Debug, Clone)] pub struct Skew { @@ -21,6 +22,36 @@ impl Skew { y: None, } } + + pub fn to_expr_or_spread(&self) -> Option { + let mut props = vec![]; + + [("skewX", &self.x), ("skewY", &self.y)] + .into_iter() + .for_each(|item| { + if let (name, Some(value)) = item.borrow() { + if let Angle::Deg(angle) = value { + props.push(PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new(Atom::new(*name), DUMMY_SP)), + value: Box::new(generate_expr_lit_num!(Into::::into(*angle))), + })))) + } + } + }); + + props.push(PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("type".into(), DUMMY_SP)), + value: Box::new(generate_expr_enum!(ETransformType::Skew)), + })))); + + Some(ExprOrSpread { + spread: None, + expr: Box::new(Expr::Object(ObjectLit { + span: Default::default(), + props: props, + })), + }) + } pub fn to_rn_expr(&self) -> Vec { let mut props = vec![]; [("x", &self.x), ("y", &self.y)].into_iter().for_each(|item| { diff --git a/src/style_propetries/transform_properties/translate.rs b/src/style_propetries/transform_properties/translate.rs index fcdc8f9..8ec6e26 100644 --- a/src/style_propetries/transform_properties/translate.rs +++ b/src/style_propetries/transform_properties/translate.rs @@ -7,6 +7,7 @@ use swc_core::{ atoms::Atom, common::DUMMY_SP }; +use crate::{generate_expr_enum, style_propetries::transform_properties::ETransformType}; use crate::{generate_expr_by_length_percentage, style_propetries::unit::{generate_expr_by_length_value, Platform}, utils::to_camel_case}; @@ -64,6 +65,47 @@ impl Translate { } + pub fn to_expr_or_spread(&self) -> Option { + let mut props = vec![]; + + + + [("x", &self.x), ("y", &self.y)].into_iter().for_each(|item| { + if let (name, Some(side)) = item.borrow() { + props.push( + PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new(Atom::new(*name), DUMMY_SP)), + value: Box::new(generate_expr_by_length_percentage!(side, Platform::Harmony)) + }))) + ); + } + }); + + if let Some(z) = &self.z { + match z { + Length::Value(val) => props.push(PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new(stringify!("z").into(), DUMMY_SP)), + value: Box::new(generate_expr_by_length_value(&val, Platform::Harmony)) + })))), + _ => {} + }; + } + + props.push(PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("type".into(), DUMMY_SP)), + value: Box::new(generate_expr_enum!(ETransformType::Translate)) + })))); + + Some(ExprOrSpread { + spread:None, + expr: Box::new(Expr::Object(ObjectLit { + span: Default::default(), + props: props + })) + }) + + } + pub fn to_rn_expr(&self) -> Vec { let mut props = vec![]; [("x", &self.x), ("y", &self.y)].into_iter().for_each(|item| {