← All changes
|
modules/atomic-widgets/css-converter/value-parsers/background-image-value-parser.php
+36
-9
4.2.0-dev2
→
4.3.1
View file →
| @@ -211,24 +211,24 @@ | ||
| 211 | 211 | if ( empty( $tokens ) ) { |
| 212 | 212 | return null; |
| 213 | 213 | } |
| 214 | 214 | |
| 215 | - $stops = []; | |
| 215 | + $parsed = []; | |
| 216 | 216 | |
| 217 | 217 | foreach ( $tokens as $token ) { |
| 218 | - $stop = self::parse_color_stop( trim( $token ) ); | |
| 218 | + $parts = self::parse_color_stop_parts( trim( $token ) ); | |
| 219 | 219 | |
| 220 | - if ( null === $stop ) { | |
| 220 | + if ( null === $parts ) { | |
| 221 | 221 | return null; |
| 222 | 222 | } |
| 223 | 223 | |
| 224 | - $stops[] = $stop; | |
| 224 | + $parsed[] = $parts; | |
| 225 | 225 | } |
| 226 | 226 | |
| 227 | - return $stops; | |
| 227 | + return self::build_color_stops_with_defaults( $parsed ); | |
| 228 | 228 | } |
| 229 | 229 | |
| 230 | - private static function parse_color_stop( string $token ): ?array { | |
| 230 | + private static function parse_color_stop_parts( string $token ): ?array { | |
| 231 | 231 | $parts = Css_Token_Splitter::split_by_whitespace( $token ); |
| 232 | 232 | |
| 233 | 233 | if ( empty( $parts ) || count( $parts ) > 2 ) { |
| 234 | 234 | return null; |
| @@ -233,9 +233,9 @@ | ||
| 233 | 233 | if ( empty( $parts ) || count( $parts ) > 2 ) { |
| 234 | 234 | return null; |
| 235 | 235 | } |
| 236 | 236 | |
| 237 | - $stop_value = [ 'color' => Color_Prop_Type::generate( $parts[0] ) ]; | |
| 237 | + $offset = null; | |
| 238 | 238 | |
| 239 | 239 | if ( isset( $parts[1] ) ) { |
| 240 | 240 | if ( ! preg_match( '/^(-?\d+(?:\.\d+)?)%$/', $parts[1], $m ) ) { |
| 241 | 241 | return null; |
| @@ -240,10 +240,37 @@ | ||
| 240 | 240 | if ( ! preg_match( '/^(-?\d+(?:\.\d+)?)%$/', $parts[1], $m ) ) { |
| 241 | 241 | return null; |
| 242 | 242 | } |
| 243 | 243 | |
| 244 | - $stop_value['offset'] = Number_Prop_Type::generate( (float) $m[1] ); | |
| 244 | + $offset = (float) $m[1]; | |
| 245 | 245 | } |
| 246 | 246 | |
| 247 | - return Color_Stop_Prop_Type::generate( $stop_value ); | |
| 247 | + return [ | |
| 248 | + 'color' => $parts[0], | |
| 249 | + 'offset' => $offset, | |
| 250 | + ]; | |
| 251 | + } | |
| 252 | + | |
| 253 | + private static function build_color_stops_with_defaults( array $parsed ): array { | |
| 254 | + $count = count( $parsed ); | |
| 255 | + $stops = []; | |
| 256 | + | |
| 257 | + foreach ( $parsed as $index => $part ) { | |
| 258 | + $offset = $part['offset'] ?? self::default_offset_for_index( $index, $count ); | |
| 259 | + | |
| 260 | + $stops[] = Color_Stop_Prop_Type::generate( [ | |
| 261 | + 'color' => Color_Prop_Type::generate( $part['color'] ), | |
| 262 | + 'offset' => Number_Prop_Type::generate( $offset ), | |
| 263 | + ] ); | |
| 264 | + } | |
| 265 | + | |
| 266 | + return $stops; | |
| 267 | + } | |
| 268 | + | |
| 269 | + private static function default_offset_for_index( int $index, int $count ): float { | |
| 270 | + if ( $count <= 1 ) { | |
| 271 | + return 0.0; | |
| 272 | + } | |
| 273 | + | |
| 274 | + return ( $index / ( $count - 1 ) ) * 100; | |
| 248 | 275 | } |
| 249 | 276 | } |