Skip to content
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

Backport theme.json tests from Core #58476

Merged
merged 20 commits into from
Feb 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions lib/class-wp-theme-json-gutenberg.php
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,7 @@ public function __construct( $theme_json = array(), $origin = 'theme' ) {
$origin = 'theme';
}

$this->theme_json = WP_Theme_JSON_Schema::migrate( $theme_json );
$this->theme_json = WP_Theme_JSON_Schema_Gutenberg::migrate( $theme_json );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be great if this renaming was part of the build process....

$registry = WP_Block_Type_Registry::get_instance();
$valid_block_names = array_keys( $registry->get_all_registered() );
$valid_element_names = array_keys( static::ELEMENTS );
Expand Down Expand Up @@ -2638,7 +2638,7 @@ public function get_root_layout_rules( $selector, $block_metadata ) {
$css .= '--wp--style--global--wide-size: ' . $wide_size . ';';
}

$css .= '}';
Copy link
Contributor Author

@ajlende ajlende Feb 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There were a bunch of places in the tests where this was different from core, so I figured I'd just add the space to make them the same. This is the only non-test change.

$css .= ' }';

if ( $use_root_padding ) {
// Top and bottom padding are applied to the outer block container.
Expand Down Expand Up @@ -2723,7 +2723,7 @@ protected static function get_metadata_boolean( $data, $path, $default_value = f
* @since 5.8.0
* @since 5.9.0 Duotone preset also has origins.
*
* @param WP_Theme_JSON $incoming Data to merge.
* @param WP_Theme_JSON_Gutenberg $incoming Data to merge.
*/
public function merge( $incoming ) {
$incoming_data = $incoming->get_raw_data();
Expand Down Expand Up @@ -2997,7 +2997,7 @@ protected static function filter_slugs( $node, $slugs ) {
public static function remove_insecure_properties( $theme_json ) {
$sanitized = array();

$theme_json = WP_Theme_JSON_Schema::migrate( $theme_json );
$theme_json = WP_Theme_JSON_Schema_Gutenberg::migrate( $theme_json );

$valid_block_names = array_keys( static::get_blocks_metadata() );
$valid_element_names = array_keys( static::ELEMENTS );
Expand Down
31 changes: 16 additions & 15 deletions lib/class-wp-theme-json-resolver-gutenberg.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?php
/**
* WP_Theme_JSON_Resolver class
* WP_Theme_JSON_Resolver_Gutenberg class
*
* @package gutenberg
* @package Gutenberg
* @since 5.8.0
*/

Expand All @@ -14,6 +14,7 @@
* This is a low-level API that may need to do breaking changes. Please,
* use gutenberg_get_global_settings, gutenberg_get_global_styles, and gutenberg_get_global_stylesheet instead.
*
* @since 5.8.0
* @access private
*/
#[AllowDynamicProperties]
Expand All @@ -36,31 +37,31 @@ class WP_Theme_JSON_Resolver_Gutenberg {
* Container for data coming from core.
*
* @since 5.8.0
* @var WP_Theme_JSON
* @var WP_Theme_JSON_Gutenberg
*/
protected static $core = null;

/**
* Container for data coming from the blocks.
*
* @since 6.1.0
* @var WP_Theme_JSON
* @var WP_Theme_JSON_Gutenberg
*/
protected static $blocks = null;

/**
* Container for data coming from the theme.
*
* @since 5.8.0
* @var WP_Theme_JSON
* @var WP_Theme_JSON_Gutenberg
*/
protected static $theme = null;

/**
* Container for data coming from the user.
*
* @since 5.9.0
* @var WP_Theme_JSON
* @var WP_Theme_JSON_Gutenberg
*/
protected static $user = null;

Expand Down Expand Up @@ -154,7 +155,7 @@ protected static function translate( $theme_json, $domain = 'default' ) {
*
* @since 5.8.0
*
* @return WP_Theme_JSON Entity that holds core data.
* @return WP_Theme_JSON_Gutenberg Entity that holds core data.
*/
public static function get_core_data() {
if ( null !== static::$core && static::has_same_registered_blocks( 'core' ) ) {
Expand All @@ -169,7 +170,7 @@ public static function get_core_data() {
*
* @since 6.1.0
*
* @param WP_Theme_JSON_Data Class to access and update the underlying data.
* @param WP_Theme_JSON_Data_Gutenberg Class to access and update the underlying data.
*/
$theme_json = apply_filters( 'wp_theme_json_data_default', new WP_Theme_JSON_Data_Gutenberg( $config, 'default' ) );
$config = $theme_json->get_data();
Expand Down Expand Up @@ -227,7 +228,7 @@ protected static function has_same_registered_blocks( $origin ) {
*
* @type bool $with_supports Whether to include theme supports in the data. Default true.
* }
* @return WP_Theme_JSON Entity that holds theme data.
* @return WP_Theme_JSON_Gutenberg Entity that holds theme data.
*/
public static function get_theme_data( $deprecated = array(), $options = array() ) {
if ( ! empty( $deprecated ) ) {
Expand All @@ -251,7 +252,7 @@ public static function get_theme_data( $deprecated = array(), $options = array()
*
* @since 6.1.0
*
* @param WP_Theme_JSON_Data Class to access and update the underlying data.
* @param WP_Theme_JSON_Data_Gutenberg Class to access and update the underlying data.
*/
$theme_json = apply_filters( 'wp_theme_json_data_theme', new WP_Theme_JSON_Data_Gutenberg( $theme_json_data, 'theme' ) );
$theme_json_data = $theme_json->get_data();
Expand Down Expand Up @@ -358,7 +359,7 @@ public static function get_theme_data( $deprecated = array(), $options = array()
*
* @since 6.1.0
*
* @return WP_Theme_JSON
* @return WP_Theme_JSON_Gutenberg
*/
public static function get_block_data() {
$registry = WP_Block_Type_Registry::get_instance();
Expand Down Expand Up @@ -389,7 +390,7 @@ public static function get_block_data() {
*
* @since 6.1.0
*
* @param WP_Theme_JSON_Data Class to access and update the underlying data.
* @param WP_Theme_JSON_Data_Gutenberg Class to access and update the underlying data.
*/
$theme_json = apply_filters( 'wp_theme_json_data_blocks', new WP_Theme_JSON_Data_Gutenberg( $config, 'blocks' ) );
$config = $theme_json->get_data();
Expand Down Expand Up @@ -502,7 +503,7 @@ public static function get_user_data_from_wp_global_styles( $theme, $create_post
*
* @since 5.9.0
*
* @return WP_Theme_JSON Entity that holds styles for user data.
* @return WP_Theme_JSON_Gutenberg Entity that holds styles for user data.
*/
public static function get_user_data() {
if ( null !== static::$user && static::has_same_registered_blocks( 'user' ) ) {
Expand All @@ -523,7 +524,7 @@ public static function get_user_data() {
*
* @since 6.1.0
*
* @param WP_Theme_JSON_Data Class to access and update the underlying data.
* @param WP_Theme_JSON_Data_Gutenberg Class to access and update the underlying data.
*/
$theme_json = apply_filters( 'wp_theme_json_data_user', new WP_Theme_JSON_Data_Gutenberg( $config, 'custom' ) );
$config = $theme_json->get_data();
Expand Down Expand Up @@ -583,7 +584,7 @@ public static function get_user_data() {
* @param string $origin Optional. To what level should we merge data:'default', 'blocks', 'theme' or 'custom'.
* 'custom' is used as default value as well as fallback value if the origin is unknown.
*
* @return WP_Theme_JSON
* @return WP_Theme_JSON_Gutenberg
*/
public static function get_merged_data( $origin = 'custom' ) {
if ( is_array( $origin ) ) {
Expand Down
154 changes: 154 additions & 0 deletions lib/class-wp-theme-json-schema-gutenberg.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
<?php
/**
* WP_Theme_JSON_Schema_Gutenberg class
*
* @package Gutenberg
* @since 5.9.0
*/

if ( class_exists( 'WP_Theme_JSON_Schema_Gutenberg' ) ) {
return;
}

/**
* Class that migrates a given theme.json structure to the latest schema.
*
* This class is for internal core usage and is not supposed to be used by extenders (plugins and/or themes).
* This is a low-level API that may need to do breaking changes. Please,
* use get_global_settings, get_global_styles, and get_global_stylesheet instead.
*
* @since 5.9.0
* @access private
*/
#[AllowDynamicProperties]
class WP_Theme_JSON_Schema_Gutenberg {

/**
* Maps old properties to their new location within the schema's settings.
* This will be applied at both the defaults and individual block levels.
*/
const V1_TO_V2_RENAMED_PATHS = array(
'border.customRadius' => 'border.radius',
'spacing.customMargin' => 'spacing.margin',
'spacing.customPadding' => 'spacing.padding',
'typography.customLineHeight' => 'typography.lineHeight',
);

/**
* Function that migrates a given theme.json structure to the last version.
*
* @since 5.9.0
*
* @param array $theme_json The structure to migrate.
*
* @return array The structure in the last version.
*/
public static function migrate( $theme_json ) {
if ( ! isset( $theme_json['version'] ) ) {
$theme_json = array(
'version' => WP_Theme_JSON::LATEST_SCHEMA,
);
}

if ( 1 === $theme_json['version'] ) {
$theme_json = self::migrate_v1_to_v2( $theme_json );
}

return $theme_json;
}

/**
* Removes the custom prefixes for a few properties
* that were part of v1:
*
* 'border.customRadius' => 'border.radius',
* 'spacing.customMargin' => 'spacing.margin',
* 'spacing.customPadding' => 'spacing.padding',
* 'typography.customLineHeight' => 'typography.lineHeight',
*
* @since 5.9.0
*
* @param array $old Data to migrate.
*
* @return array Data without the custom prefixes.
*/
private static function migrate_v1_to_v2( $old ) {
// Copy everything.
$new = $old;

// Overwrite the things that changed.
if ( isset( $old['settings'] ) ) {
$new['settings'] = self::rename_paths( $old['settings'], self::V1_TO_V2_RENAMED_PATHS );
}

// Set the new version.
$new['version'] = 2;

return $new;
}

/**
* Processes the settings subtree.
*
* @since 5.9.0
*
* @param array $settings Array to process.
* @param array $paths_to_rename Paths to rename.
*
* @return array The settings in the new format.
*/
private static function rename_paths( $settings, $paths_to_rename ) {
$new_settings = $settings;

// Process any renamed/moved paths within default settings.
self::rename_settings( $new_settings, $paths_to_rename );

// Process individual block settings.
if ( isset( $new_settings['blocks'] ) && is_array( $new_settings['blocks'] ) ) {
foreach ( $new_settings['blocks'] as &$block_settings ) {
self::rename_settings( $block_settings, $paths_to_rename );
}
}

return $new_settings;
}

/**
* Processes a settings array, renaming or moving properties.
*
* @since 5.9.0
*
* @param array $settings Reference to settings either defaults or an individual block's.
* @param array $paths_to_rename Paths to rename.
*/
private static function rename_settings( &$settings, $paths_to_rename ) {
foreach ( $paths_to_rename as $original => $renamed ) {
$original_path = explode( '.', $original );
$renamed_path = explode( '.', $renamed );
$current_value = _wp_array_get( $settings, $original_path, null );

if ( null !== $current_value ) {
_wp_array_set( $settings, $renamed_path, $current_value );
self::unset_setting_by_path( $settings, $original_path );
}
}
}

/**
* Removes a property from within the provided settings by its path.
*
* @since 5.9.0
*
* @param array $settings Reference to the current settings array.
* @param array $path Path to the property to be removed.
*/
private static function unset_setting_by_path( &$settings, $path ) {
$tmp_settings = &$settings; // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
$last_key = array_pop( $path );
foreach ( $path as $key ) {
$tmp_settings = &$tmp_settings[ $key ];
}

unset( $tmp_settings[ $last_key ] );
}
}
1 change: 1 addition & 0 deletions lib/load.php
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ function gutenberg_is_experiment_enabled( $name ) {
require __DIR__ . '/class-wp-theme-json-data-gutenberg.php';
require __DIR__ . '/class-wp-theme-json-gutenberg.php';
require __DIR__ . '/class-wp-theme-json-resolver-gutenberg.php';
require __DIR__ . '/class-wp-theme-json-schema-gutenberg.php';
require __DIR__ . '/class-wp-duotone-gutenberg.php';
require __DIR__ . '/blocks.php';
require __DIR__ . '/block-editor-settings.php';
Expand Down
Loading
Loading