-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Backport: Gutenberg 43660 - Separator color bugfix #3522
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
e4bbc98
cb62823
620a79a
11021ea
8a0be43
b4905cb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1932,36 +1932,31 @@ public function get_styles_block_nodes() { | |
| * @since 6.1.1 | ||
| * | ||
| * @param array $declarations List of declarations. | ||
| * | ||
| * @return array $declarations List of declarations filtered. | ||
| */ | ||
| private static function update_separator_declarations( $declarations ) { | ||
| $background_matches = array_values( | ||
| array_filter( | ||
| $declarations, | ||
| function( $declaration ) { | ||
| static function( $declaration ) { | ||
| return 'background-color' === $declaration['name']; | ||
| } | ||
| ) | ||
| ); | ||
| if ( ! empty( $background_matches && isset( $background_matches[0]['value'] ) ) ) { | ||
| $border_color_matches = array_values( | ||
| array_filter( | ||
| $declarations, | ||
| function( $declaration ) { | ||
| return 'border-color' === $declaration['name']; | ||
| } | ||
| ) | ||
| ); | ||
| $text_color_matches = array_values( | ||
| array_filter( | ||
| $declarations, | ||
| function( $declaration ) { | ||
| return 'color' === $declaration['name']; | ||
| } | ||
| ) | ||
| ); | ||
| if ( empty( $border_color_matches ) && empty( $text_color_matches ) ) { | ||
|
|
||
| if ( isset( $background_matches[0]['value'] ) ) { | ||
| $border_color_matches = false; | ||
| $text_color_matches = false; | ||
|
|
||
| foreach ( $declarations as $declaration ) { | ||
| if ( 'border-color' === $declaration['name'] ) { | ||
| $border_color_matches = true; | ||
| } elseif ( 'color' === $declaration['name'] ) { | ||
| $text_color_matches = true; | ||
| } | ||
| } | ||
|
Comment on lines
+1951
to
+1957
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Now that I look at the code, I see what you were saying @dream-encode: In the Why? The next conditional is checking if both are My suggestion: Add a What do you think @dream-encode ?
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think a break in both would not work properly since we need to absolutely determine if both are true. Line 1959 check both. If we bail on the first one found, the other may yet still exist in the array. However, @felixarntz suggestion to check if both have already been found then break earlier is good. |
||
|
|
||
| if ( ! $border_color_matches && ! $text_color_matches ) { | ||
| $declarations[] = array( | ||
| 'name' => 'color', | ||
| 'value' => $background_matches[0]['value'], | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I committed something similar a few months back, and learned that
array_filtergoes over every item in the array. Refactoring these asforeachs with abreakafter the first found instance is a nice little optimization.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm there are multiple
array_filter()s iterating over the same dataset. This means the entire dataset is iterated each and everyarray_filter()in this method.Combining all of the
array_filter()circuits into one iterator, such asforeach(), means the$declarationsarray is walked 1 time instead of N times (N = eacharray_filter()).Granted, this means refactoring and re-testing the code to be more performant. Likely not something that can happen before 6.1.1-RC.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@hellofromtonya I've refactored this to match your suggestions(at least as best as I understand them).
How does this look to you now? Any further improvements we can make?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@dream-encode I agree with @hellofromtonya, I think we can avoid using
array_filter()here entirely and rather use a singleforeach. Worth adding that alsoarray_values()has a cost which we can avoid as well.Given that #3555 is focused on optimizing performance by reducing excessive usage of array functions, it would feel counterproductive if we at the same time introduced new ones here.
IMO we can even have only a single
foreachloop for the entire method, iterating through$declarationsand checking for all three things (the firstbackground-colorvalue, whether there areborder-colormatches, and whether there arecolormatches).