@@ -19,6 +19,48 @@ macro_rules! generate_expr_lit_num {
1919 } ;
2020}
2121
22+
23+ #[ macro_export]
24+ macro_rules! generate_expr_lit_calc {
25+ ( $var: expr, $platform: expr) => { {
26+
27+ use $crate:: constants:: { CONVERT_STYLE_PX_FN , RN_CONVERT_STYLE_PX_FN , RN_CONVERT_STYLE_VU_FN } ;
28+
29+ let re = regex:: Regex :: new( r#"(\d+(?:px|vw|vh))"# ) . unwrap( ) ;
30+ let result = re. replace_all( $var. as_str( ) , |caps: & regex:: Captures | {
31+ let value = & caps[ 1 ] ;
32+ let unit = & value[ value. len( ) - 2 ..] ;
33+ let parsed_value: i32 = value[ ..value. len( ) - 2 ] . parse( ) . unwrap( ) ;
34+ if $platform == Platform :: Harmony {
35+ if unit == "px" {
36+ return format!( "${{{}({}, 'px')}}" , CONVERT_STYLE_PX_FN , parsed_value) ;
37+ } else {
38+ return format!( "${{{}({}, '{}')}}" , CONVERT_STYLE_PX_FN , parsed_value, unit) ;
39+ }
40+ } else {
41+ if unit == "px" {
42+ return format!( "${{{}({}, 'px')}}" , RN_CONVERT_STYLE_PX_FN , parsed_value) ;
43+ } else {
44+ return format!( "${{{}({}, '{}')}}" , RN_CONVERT_STYLE_VU_FN , parsed_value, unit) ;
45+ }
46+ }
47+ } ) ;
48+
49+ swc_ecma_ast:: Expr :: Tpl ( swc_ecma_ast:: Tpl {
50+ span: swc_common:: DUMMY_SP ,
51+ exprs: vec![ ] ,
52+ quasis: vec![
53+ swc_ecma_ast:: TplElement {
54+ span: swc_common:: DUMMY_SP ,
55+ tail: false ,
56+ cooked: None ,
57+ raw: swc_atoms:: Atom :: from( result) . into( ) ,
58+ }
59+ ] ,
60+ } )
61+ } } ;
62+ }
63+
2264#[ macro_export]
2365macro_rules! generate_expr_ident {
2466 ( $var: expr) => {
@@ -45,10 +87,14 @@ macro_rules! generate_string_by_css_color {
4587macro_rules! generate_expr_by_length {
4688 ( $var: expr, $platform: expr) => { {
4789 use $crate:: style_propetries:: unit:: { Platform , generate_expr_by_length_value} ;
90+ use $crate:: generate_expr_lit_calc;
4891 use lightningcss:: values:: length:: Length ;
4992 match $var {
5093 Length :: Value ( val) => generate_expr_by_length_value( & val, $platform) ,
51- Length :: Calc ( val) => generate_expr_lit_str!( * val. to_css_string( lightningcss:: stylesheet:: PrinterOptions :: default ( ) ) . unwrap( ) ) ,
94+ Length :: Calc ( val) => {
95+ let calc_string = val. to_css_string( lightningcss:: stylesheet:: PrinterOptions :: default ( ) ) . unwrap( ) ;
96+ generate_expr_lit_calc!( calc_string, $platform)
97+ } ,
5298 }
5399 } } ;
54100}
@@ -70,13 +116,16 @@ macro_rules! generate_expr_by_length_percentage_or_auto {
70116#[ macro_export]
71117macro_rules! generate_expr_by_length_percentage {
72118 ( $var: expr, $platform: expr) => { {
73- use $crate:: { generate_expr_lit_str, style_propetries:: unit:: { generate_expr_by_length_value} } ;
119+ use $crate:: { generate_expr_lit_str, generate_expr_lit_calc , style_propetries:: unit:: { generate_expr_by_length_value} } ;
74120 use lightningcss:: traits:: ToCss ;
75121
76122 match $var {
77123 lightningcss:: values:: percentage:: DimensionPercentage :: Dimension ( dimension) => generate_expr_by_length_value( & dimension, $platform) ,
78124 lightningcss:: values:: percentage:: DimensionPercentage :: Percentage ( percentage) => generate_expr_lit_str!( ( percentage. 0 * 100.0 ) . to_string( ) + "%" ) ,
79- lightningcss:: values:: percentage:: DimensionPercentage :: Calc ( calc) => generate_expr_lit_str!( calc. to_css_string( lightningcss:: stylesheet:: PrinterOptions :: default ( ) ) . unwrap( ) ) ,
125+ lightningcss:: values:: percentage:: DimensionPercentage :: Calc ( calc) => {
126+ let calc_string = calc. to_css_string( lightningcss:: stylesheet:: PrinterOptions :: default ( ) ) . unwrap( ) ;
127+ generate_expr_lit_calc!( calc_string, $platform)
128+ } ,
80129 }
81130 } } ;
82131}
@@ -237,6 +286,9 @@ macro_rules! generate_number_property {
237286#[ macro_export]
238287macro_rules! generate_length_value_property {
239288 ( $class: ident, $( $property_name: ident ) , * ) => {
289+
290+ use $crate:: { generate_dimension_percentage, generate_expr_lit_calc} ;
291+
240292 #[ derive( Debug , Clone ) ]
241293 pub struct $class {
242294 pub id: String ,
@@ -256,7 +308,7 @@ macro_rules! generate_length_value_property {
256308 PropertyTuple :: One (
257309 self . id. clone( ) ,
258310 match & self . value {
259- EnumValue :: String ( value) => generate_expr_lit_str !( value. to_owned ( ) ) ,
311+ EnumValue :: String ( value) => generate_expr_lit_calc !( value, Platform :: Harmony ) ,
260312 EnumValue :: LengthValue ( length_value) => generate_expr_by_length_value( length_value, Platform :: Harmony ) ,
261313 EnumValue :: Percentage ( value) => generate_expr_lit_str!( ( value. 0 * 100.0 ) . to_string( ) + "%" ) ,
262314 EnumValue :: Auto => generate_invalid_expr!( ) // harmony 是个非法制,固不会生效
@@ -268,7 +320,7 @@ macro_rules! generate_length_value_property {
268320 PropertyTuple :: One (
269321 self . id. clone( ) ,
270322 match & self . value {
271- EnumValue :: String ( value) => generate_expr_lit_str !( value. to_owned ( ) ) ,
323+ EnumValue :: String ( value) => generate_expr_lit_calc !( value, Platform :: ReactNative ) ,
272324 EnumValue :: LengthValue ( length_value) => generate_expr_by_length_value( length_value, Platform :: ReactNative ) ,
273325 EnumValue :: Percentage ( value) => generate_expr_lit_str!( ( value. 0 * 100.0 ) . to_string( ) + "%" ) ,
274326 EnumValue :: Auto => generate_expr_lit_str!( "auto" )
@@ -309,6 +361,8 @@ macro_rules! generate_length_value_property {
309361macro_rules! generate_size_property {
310362 ( $class: ident, $( $property_name: ident ) , * ) => {
311363
364+ use $crate:: generate_expr_lit_calc;
365+
312366 #[ derive( Debug , Clone ) ]
313367 pub struct $class {
314368 pub id: String ,
@@ -328,7 +382,7 @@ macro_rules! generate_size_property {
328382 PropertyTuple :: One (
329383 self . id. clone( ) ,
330384 match & self . value {
331- EnumValue :: String ( value) => generate_expr_lit_str !( value. to_owned ( ) ) ,
385+ EnumValue :: String ( value) => generate_expr_lit_calc !( value, Platform :: Harmony ) ,
332386 EnumValue :: LengthValue ( length_value) => generate_expr_by_length_value( length_value, Platform :: Harmony ) ,
333387 EnumValue :: Percentage ( value) => generate_expr_lit_str!( ( value. 0 * 100.0 ) . to_string( ) + "%" ) ,
334388 EnumValue :: Auto => generate_expr_lit_str!( "auto" ) // harmony 是个非法制,固不会生效
@@ -340,7 +394,7 @@ macro_rules! generate_size_property {
340394 PropertyTuple :: One (
341395 self . id. clone( ) ,
342396 match & self . value {
343- EnumValue :: String ( value) => generate_expr_lit_str !( value. to_owned ( ) ) ,
397+ EnumValue :: String ( value) => generate_expr_lit_calc !( value, Platform :: ReactNative ) ,
344398 EnumValue :: LengthValue ( length_value) => generate_expr_by_length_value( length_value, Platform :: ReactNative ) ,
345399 EnumValue :: Percentage ( value) => generate_expr_lit_str!( ( value. 0 * 100.0 ) . to_string( ) + "%" ) ,
346400 EnumValue :: Auto => generate_expr_lit_str!( "auto" )
0 commit comments