Skip to content

Commit

Permalink
Improve performance of compute_style_properties method. (#62522)
Browse files Browse the repository at this point in the history
* Improve performance of `compute_style_properties` method.

Improve logic in compute_style_properties to improve performance. This commit fixes a number of performance issues including.

- Expensive repeated call to `str_starts_with`.
- Return easy if not array.
- Repeated call to `strlen`.
- Move call to `get_property_value` where it is needed.
- Move call to implode to after empty check.

* Fix lint.

* Apply suggestions from code review

Co-authored-by: Joe McGill <801097+joemcgill@users.noreply.github.com>

---------

Co-authored-by: Jonny Harris <jonathan.harris@news.co.uk>
Co-authored-by: Joe McGill <801097+joemcgill@users.noreply.github.com>
  • Loading branch information
3 people authored and ellatrix committed Jun 25, 2024
1 parent be24a52 commit ab638a3
Showing 1 changed file with 26 additions and 22 deletions.
48 changes: 26 additions & 22 deletions lib/class-wp-theme-json-gutenberg.php
Original file line number Diff line number Diff line change
Expand Up @@ -2255,43 +2255,37 @@ protected static function flatten_tree( $tree, $prefix = '', $token = '--' ) {
* @return array Returns the modified $declarations.
*/
protected static function compute_style_properties( $styles, $settings = array(), $properties = null, $theme_json = null, $selector = null, $use_root_padding = null ) {
if ( null === $properties ) {
$properties = static::PROPERTIES_METADATA;
}

$declarations = array();
if ( empty( $styles ) ) {
return $declarations;
return array();
}

if ( null === $properties ) {
$properties = static::PROPERTIES_METADATA;
}
$declarations = array();
$root_variable_duplicates = array();
$root_style_length = strlen( '--wp--style--root--' );

foreach ( $properties as $css_property => $value_path ) {
$value = static::get_property_value( $styles, $value_path, $theme_json );
if ( ! is_array( $value_path ) ) {
continue;
}

if ( str_starts_with( $css_property, '--wp--style--root--' ) && ( static::ROOT_BLOCK_SELECTOR !== $selector || ! $use_root_padding ) ) {
$is_root_style = str_starts_with( $css_property, '--wp--style--root--' );
if ( $is_root_style && ( static::ROOT_BLOCK_SELECTOR !== $selector || ! $use_root_padding ) ) {
continue;
}

$value = static::get_property_value( $styles, $value_path, $theme_json );

// Root-level padding styles don't currently support strings with CSS shorthand values.
// This may change: https://github.com/WordPress/gutenberg/issues/40132.
if ( '--wp--style--root--padding' === $css_property && is_string( $value ) ) {
continue;
}

if ( str_starts_with( $css_property, '--wp--style--root--' ) && $use_root_padding ) {
$root_variable_duplicates[] = substr( $css_property, strlen( '--wp--style--root--' ) );
}

// Look up protected properties, keyed by value path.
// Skip protected properties that are explicitly set to `null`.
if ( is_array( $value_path ) ) {
$path_string = implode( '.', $value_path );
if (
isset( static::PROTECTED_PROPERTIES[ $path_string ] ) &&
_wp_array_get( $settings, static::PROTECTED_PROPERTIES[ $path_string ], null ) === null
) {
continue;
}
if ( $is_root_style && $use_root_padding ) {
$root_variable_duplicates[] = substr( $css_property, $root_style_length );
}

// Processes background styles.
Expand All @@ -2306,6 +2300,16 @@ protected static function compute_style_properties( $styles, $settings = array()
continue;
}

// Look up protected properties, keyed by value path.
// Skip protected properties that are explicitly set to `null`.
$path_string = implode( '.', $value_path );
if (
isset( static::PROTECTED_PROPERTIES[ $path_string ] ) &&
_wp_array_get( $settings, static::PROTECTED_PROPERTIES[ $path_string ], null ) === null
) {
continue;
}

// Calculates fluid typography rules where available.
if ( 'font-size' === $css_property ) {
/*
Expand Down

0 comments on commit ab638a3

Please sign in to comment.