Skip to content

Commit

Permalink
Merge pull request #27 from NervJS/feat/capi-transform
Browse files Browse the repository at this point in the history
Feat: 完成transform的解析
  • Loading branch information
heiazu authored May 31, 2024
2 parents 493a427 + e5903da commit f2398cf
Show file tree
Hide file tree
Showing 7 changed files with 228 additions and 37 deletions.
60 changes: 32 additions & 28 deletions src/style_propetries/transform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -204,9 +207,10 @@ impl From<(String, &Property<'_>)> for Transform {
}
}
}
// println!("transform form {:?}", transform);
Transform {
id: prop.0,
value: transform
value: transform,
}
}
}
36 changes: 35 additions & 1 deletion src/style_propetries/transform_properties/matrix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down Expand Up @@ -47,6 +47,40 @@ impl Matrix {
m33: 1.0,
}
}

pub fn to_vec(&self) -> Vec<f32> {
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<ExprOrSpread> {
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::<f64>::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<Expr> {

Expand Down
12 changes: 11 additions & 1 deletion src/style_propetries/transform_properties/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,14 @@ pub mod translate;
pub mod rotate;
pub mod scale;
pub mod skew;
pub mod matrix;
pub mod matrix;

#[repr(u32)]
#[derive(Debug, PartialEq, Eq)]
pub enum ETransformType {
Matrix = 0,
Translate = 1,
Scale = 2,
Rotate = 3,
Skew = 4,
}
41 changes: 39 additions & 2 deletions src/style_propetries/transform_properties/rotate.rs
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -68,6 +68,43 @@ impl Rotate {
})))
}

pub fn to_expr_or_spread(&self) -> Option<ExprOrSpread> {
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<Expr> {
let mut props = vec![];
[("-x", &self.x), ("-y", &self.y), ("-z", &self.z), ("", &self.rotate)].into_iter().for_each(|item| {
Expand Down
35 changes: 34 additions & 1 deletion src/style_propetries/transform_properties/scale.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};


Expand Down Expand Up @@ -57,6 +57,39 @@ impl Scale {
})))
}

pub fn to_expr_or_spread(&self) -> Option<ExprOrSpread> {
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<Expr> {
let mut props = vec![];
[("x", &self.x), ("y", &self.y)].into_iter().for_each(|item| {
Expand Down
39 changes: 35 additions & 4 deletions src/style_propetries/transform_properties/skew.rs
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -21,6 +22,36 @@ impl Skew {
y: None,
}
}

pub fn to_expr_or_spread(&self) -> Option<ExprOrSpread> {
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::<f64>::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<Expr> {
let mut props = vec![];
[("x", &self.x), ("y", &self.y)].into_iter().for_each(|item| {
Expand Down
42 changes: 42 additions & 0 deletions src/style_propetries/transform_properties/translate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};

Expand Down Expand Up @@ -64,6 +65,47 @@ impl Translate {

}

pub fn to_expr_or_spread(&self) -> Option<ExprOrSpread> {
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<Expr> {
let mut props = vec![];
[("x", &self.x), ("y", &self.y)].into_iter().for_each(|item| {
Expand Down

0 comments on commit f2398cf

Please # to comment.