From 99715f57516bb5e72e337ed073738094ea58bfdf Mon Sep 17 00:00:00 2001 From: oandregal Date: Wed, 21 Jun 2023 07:56:18 +0000 Subject: [PATCH] `wp_get_global_styles`: return the standard format for CSS Custom Properties. Props samnajian, hellofromtonya, isabel_brison. Fixes #58467. Built from https://develop.svn.wordpress.org/trunk@55959 git-svn-id: http://core.svn.wordpress.org/trunk@55471 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/class-wp-theme-json.php | 72 ++++++++++++++++------ wp-includes/global-styles-and-settings.php | 3 +- wp-includes/version.php | 2 +- 3 files changed, 56 insertions(+), 21 deletions(-) diff --git a/wp-includes/class-wp-theme-json.php b/wp-includes/class-wp-theme-json.php index afff53f9da..700cb20f7e 100644 --- a/wp-includes/class-wp-theme-json.php +++ b/wp-includes/class-wp-theme-json.php @@ -779,7 +779,7 @@ class WP_Theme_JSON { if ( empty( $result ) ) { unset( $output[ $subtree ] ); } else { - $output[ $subtree ] = $result; + $output[ $subtree ] = static::resolve_custom_css_format( $result ); } } @@ -1958,10 +1958,6 @@ class WP_Theme_JSON { /** * Returns the style property for the given path. * - * It also converts CSS Custom Property stored as - * "var:preset|color|secondary" to the form - * "--wp--preset--color--secondary". - * * It also converts references to a path to the value * stored at that location, e.g. * { "ref": "style.color.background" } => "#fff". @@ -1969,6 +1965,10 @@ class WP_Theme_JSON { * @since 5.8.0 * @since 5.9.0 Added support for values of array type, which are returned as is. * @since 6.1.0 Added the `$theme_json` parameter. + * @since 6.3.0 It no longer converts the internal format "var:preset|color|secondary" + * to the standard form "--wp--preset--color--secondary". + * This is already done by the sanitize method, + * so every property will be in the standard form. * * @param array $styles Styles subtree. * @param array $path Which property to process. @@ -2018,20 +2018,6 @@ class WP_Theme_JSON { return $value; } - // Convert custom CSS properties. - $prefix = 'var:'; - $prefix_len = strlen( $prefix ); - $token_in = '|'; - $token_out = '--'; - if ( 0 === strncmp( $value, $prefix, $prefix_len ) ) { - $unwrapped_name = str_replace( - $token_in, - $token_out, - substr( $value, $prefix_len ) - ); - $value = "var(--wp--$unwrapped_name)"; - } - return $value; } @@ -3488,4 +3474,52 @@ class WP_Theme_JSON { _wp_array_set( $this->theme_json, array( 'settings', 'spacing', 'spacingSizes', 'default' ), $spacing_sizes ); } + + /** + * This is used to convert the internal representation of variables to the CSS representation. + * For example, `var:preset|color|vivid-green-cyan` becomes `var(--wp--preset--color--vivid-green-cyan)`. + * + * @since 6.3.0 + * @param string $value The variable such as var:preset|color|vivid-green-cyan to convert. + * @return string The converted variable. + */ + private static function convert_custom_properties( $value ) { + $prefix = 'var:'; + $prefix_len = strlen( $prefix ); + $token_in = '|'; + $token_out = '--'; + if ( 0 === strpos( $value, $prefix ) ) { + $unwrapped_name = str_replace( + $token_in, + $token_out, + substr( $value, $prefix_len ) + ); + $value = "var(--wp--$unwrapped_name)"; + } + + return $value; + } + + /** + * Given a tree, converts the internal representation of variables to the CSS representation. + * It is recursive and modifies the input in-place. + * + * @since 6.3.0 + * @param array $tree Input to process. + * @return array The modified $tree. + */ + private static function resolve_custom_css_format( $tree ) { + $prefix = 'var:'; + + foreach ( $tree as $key => $data ) { + if ( is_string( $data ) && 0 === strpos( $data, $prefix ) ) { + $tree[ $key ] = self::convert_custom_properties( $data ); + } elseif ( is_array( $data ) ) { + $tree[ $key ] = self::resolve_custom_css_format( $data ); + } + } + + return $tree; + } + } diff --git a/wp-includes/global-styles-and-settings.php b/wp-includes/global-styles-and-settings.php index f5ea9ed179..4c016930b7 100644 --- a/wp-includes/global-styles-and-settings.php +++ b/wp-includes/global-styles-and-settings.php @@ -92,6 +92,8 @@ function wp_get_global_settings( $path = array(), $context = array() ) { * Gets the styles resulting of merging core, theme, and user data. * * @since 5.9.0 + * @since 6.3.0 the internal format "var:preset|color|secondary" is always resolved + * to the standard form "var(--wp--preset--font-size--small)". * * @param array $path Path to the specific style to retrieve. Optional. * If empty, will return all styles. @@ -115,7 +117,6 @@ function wp_get_global_styles( $path = array(), $context = array() ) { if ( isset( $context['origin'] ) && 'base' === $context['origin'] ) { $origin = 'theme'; } - $styles = WP_Theme_JSON_Resolver::get_merged_data( $origin )->get_raw_data()['styles']; return _wp_array_get( $styles, $path, $styles ); diff --git a/wp-includes/version.php b/wp-includes/version.php index c4f06ff98d..edba961c9f 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.3-alpha-55958'; +$wp_version = '6.3-alpha-55959'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.