PluginProbe
Elementor Website Builder – more than just a page builder / 4.3.0
Elementor Website Builder – more than just a page builder v4.3.0
4.3.2 4.3.1 4.3.0 4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 All 455 releases
elementor / modules / atomic-widgets / css-converter / converters / flex-property-converter.php

flex-property-converter.php in Elementor Website Builder – more than just a page builder 4.3.0, at modules/atomic-widgets/css-converter/converters/flex-property-converter.php

128 lines 3.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Elementor\Modules\AtomicWidgets\CssConverter\Converters;
4
5 use Elementor\Modules\AtomicWidgets\CssConverter\Conversion_Context;
6 use Elementor\Modules\AtomicWidgets\CssConverter\Property_Converter_Base;
7 use Elementor\Modules\AtomicWidgets\CssConverter\ValueParsers\Css_Token_Splitter;
8 use Elementor\Modules\AtomicWidgets\CssConverter\ValueParsers\Size_Value_Parser;
9 use Elementor\Modules\AtomicWidgets\PropTypes\Flex_Prop_Type;
10 use Elementor\Modules\AtomicWidgets\PropTypes\Primitives\Number_Prop_Type;
11 use Elementor\Modules\AtomicWidgets\PropTypes\Size_Prop_Type;
12
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit; // Exit if accessed directly.
15 }
16
17 /**
18 * Converter for the `flex` shorthand: Flex_Prop_Type{flexGrow: Number, flexShrink: Number, flexBasis: Size}.
19 *
20 * Supported forms:
21 * flex: none -> 0 1 auto (CSS spec equivalent)
22 * flex: auto -> 1 1 auto
23 * flex: <grow> -> <grow> 1 0 (unitless number only)
24 * flex: <grow> <basis> (unitless grow + size basis)
25 * flex: <grow> <shrink> <basis>
26 *
27 * Declines to custom_css for any unrecognised syntax.
28 */
29 class Flex_Property_Converter extends Property_Converter_Base {
30 const AUTO_BASIS = [
31 'size' => 'auto',
32 'unit' => 'custom',
33 ];
34 const ZERO_BASIS = [
35 'size' => 0,
36 'unit' => 'px',
37 ];
38
39 protected function get_supported_properties(): array {
40 return [ 'flex' ];
41 }
42
43 protected function do_convert( Conversion_Context $context, array $rule ): bool {
44 $value = trim( $rule['value'] );
45
46 $parsed = $this->parse( $value );
47
48 if ( null === $parsed ) {
49 return false;
50 }
51
52 [ $grow, $shrink, $basis ] = $parsed;
53
54 $context->set_prop( 'flex', Flex_Prop_Type::generate( [
55 'flexGrow' => Number_Prop_Type::generate( $grow ),
56 'flexShrink' => Number_Prop_Type::generate( $shrink ),
57 'flexBasis' => Size_Prop_Type::generate( $basis ),
58 ] ) );
59
60 return true;
61 }
62
63 private function parse( string $value ): ?array {
64 $lower = strtolower( $value );
65
66 if ( 'none' === $lower ) {
67 return [ 0, 1, self::AUTO_BASIS ];
68 }
69
70 if ( 'auto' === $lower ) {
71 return [ 1, 1, self::AUTO_BASIS ];
72 }
73
74 $tokens = Css_Token_Splitter::split_by_whitespace( $value );
75
76 if ( 1 === count( $tokens ) ) {
77 $grow = $this->parse_number( $tokens[0] );
78 if ( null === $grow ) {
79 return null;
80 }
81 return [ $grow, 1, self::ZERO_BASIS ];
82 }
83
84 if ( 2 === count( $tokens ) ) {
85 $grow = $this->parse_number( $tokens[0] );
86 if ( null === $grow ) {
87 return null;
88 }
89 $basis = Size_Value_Parser::parse( $tokens[1] );
90 if ( null === $basis ) {
91 return null;
92 }
93 return [ $grow, 1, $basis ];
94 }
95
96 if ( 3 === count( $tokens ) ) {
97 $grow = $this->parse_number( $tokens[0] );
98 $shrink = $this->parse_number( $tokens[1] );
99 $basis = $this->parse_basis( $tokens[2] );
100
101 if ( null === $grow || null === $shrink || null === $basis ) {
102 return null;
103 }
104
105 return [ $grow, $shrink, $basis ];
106 }
107
108 return null;
109 }
110
111 private function parse_number( string $token ): ?float {
112 if ( ! is_numeric( $token ) ) {
113 return null;
114 }
115 return (float) $token;
116 }
117
118 private function parse_basis( string $token ): ?array {
119 $lower = strtolower( $token );
120
121 if ( 'auto' === $lower ) {
122 return self::AUTO_BASIS;
123 }
124
125 return Size_Value_Parser::parse( $token );
126 }
127 }
128