Editor: update packages; Port block supports to WordPress core.

The following package versions were changed:
@wordpress/a11y: 2.11.0 -> 2.13.0
@wordpress/annotations: 1.20.4 -> 1.22.0
@wordpress/api-fetch: 3.18.0 -> 3.20.0
@wordpress/autop: 2.9.0 -> 2.10.0
@wordpress/blob: 2.9.0 -> 2.10.0
@wordpress/block-directory: 1.13.7 -> 1.16.0
@wordpress/block-editor: 4.3.7 -> 5.0.0
@wordpress/block-library: 2.22.7 -> 2.25.0
@wordpress/block-serialization-default-parser: 3.7.0 -> 3.8.0
@wordpress/blocks: 6.20.3 -> 6.23.0
@wordpress/components: 10.0.6 -> 11.0.0
@wordpress/compose: 3.19.3 -> 3.21.0
@wordpress/core-data: 2.20.3 -> 2.23.0
@wordpress/data: 4.22.3 -> 4.24.0
@wordpress/data-controls: 1.16.3 -> 1.18.0
@wordpress/date: 3.10.0 -> 3.12.0
@wordpress/deprecated: 2.9.0 -> 2.10.0
@wordpress/dom: 2.13.1 -> 2.15.0
@wordpress/dom-ready: 2.10.0 -> 2.11.0
@wordpress/e2e-test-utils: 4.11.2 -> 4.14.0
@wordpress/edit-post: 3.21.7 -> 3.24.0
@wordpress/editor: 9.20.7 -> 9.23.0
@wordpress/element: 2.16.0 -> 2.18.0
@wordpress/escape-html: 1.9.0 -> 1.10.0
@wordpress/format-library: 1.22.7 -> 1.24.0
@wordpress/hooks: 2.9.0 -> 2.10.0
@wordpress/html-entities: 2.8.0 -> 2.9.0
@wordpress/i18n: 3.14.0 -> 3.16.0
@wordpress/icons: 2.4.0 -> 2.7.0
@wordpress/is-shallow-equal: 2.1.0 -> 2.3.0
@wordpress/keyboard-shortcuts: 1.9.3 -> 1.11.0
@wordpress/keycodes: 2.14.0 -> 2.16.0
@wordpress/library-export-default-webpack-plugin: 1.7.0 -> 1.9.0
@wordpress/list-reusable-blocks: 1.21.6 -> 1.23.0
@wordpress/media-utils: 1.15.0 -> 1.17.0
@wordpress/notices: 2.8.3 -> 2.10.0
@wordpress/nux: 3.20.6 -> 3.22.0
@wordpress/plugins: 2.20.3 -> 2.22.0
@wordpress/primitives: 1.7.0 -> 1.9.0
@wordpress/priority-queue: 1.7.0 -> 1.9.0
@wordpress/redux-routine: 3.10.0 -> 3.12.0
@wordpress/rich-text: 3.20.4 -> 3.22.0
@wordpress/scripts: 12.1.1 -> 12.3.0
@wordpress/server-side-render: 1.16.6 -> 1.18.0
@wordpress/shortcode: 2.9.0 -> 2.11.0
@wordpress/token-list: 1.11.0 -> 1.13.0
@wordpress/url: 2.17.0 -> 2.19.0
@wordpress/viewport: 2.21.3 -> 2.23.0
@wordpress/warning: 1.2.0 -> 1.3.0
@wordpress/wordcount: 2.10.0 -> 2.12.0

Props isabel_brison, youknowriad, mcsf.
Fixes #51461.

git-svn-id: https://develop.svn.wordpress.org/trunk@49135 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Jorge Costa 2020-10-13 13:07:23 +00:00
parent 011cd72394
commit 27ad65df4d
46 changed files with 3075 additions and 1514 deletions

3380
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -27,9 +27,9 @@
"devDependencies": { "devDependencies": {
"@wordpress/custom-templated-path-webpack-plugin": "1.7.0", "@wordpress/custom-templated-path-webpack-plugin": "1.7.0",
"@wordpress/dependency-extraction-webpack-plugin": "2.8.0", "@wordpress/dependency-extraction-webpack-plugin": "2.8.0",
"@wordpress/e2e-test-utils": "4.11.2", "@wordpress/e2e-test-utils": "4.14.0",
"@wordpress/library-export-default-webpack-plugin": "1.7.0", "@wordpress/library-export-default-webpack-plugin": "1.9.0",
"@wordpress/scripts": "12.1.1", "@wordpress/scripts": "12.3.0",
"autoprefixer": "9.6.2", "autoprefixer": "9.6.2",
"chalk": "4.1.0", "chalk": "4.1.0",
"check-node-version": "4.0.1", "check-node-version": "4.0.1",
@ -79,53 +79,53 @@
}, },
"dependencies": { "dependencies": {
"@babel/polyfill": "7.10.1", "@babel/polyfill": "7.10.1",
"@wordpress/a11y": "2.11.0", "@wordpress/a11y": "2.13.0",
"@wordpress/annotations": "1.20.4", "@wordpress/annotations": "1.22.0",
"@wordpress/api-fetch": "3.18.0", "@wordpress/api-fetch": "3.20.0",
"@wordpress/autop": "2.9.0", "@wordpress/autop": "2.10.0",
"@wordpress/blob": "2.9.0", "@wordpress/blob": "2.10.0",
"@wordpress/block-directory": "1.13.7", "@wordpress/block-directory": "1.16.1",
"@wordpress/block-editor": "4.3.7", "@wordpress/block-editor": "5.0.1",
"@wordpress/block-library": "2.22.7", "@wordpress/block-library": "2.25.1",
"@wordpress/block-serialization-default-parser": "3.7.0", "@wordpress/block-serialization-default-parser": "3.8.0",
"@wordpress/blocks": "6.20.3", "@wordpress/blocks": "6.23.0",
"@wordpress/components": "10.0.6", "@wordpress/components": "11.0.0",
"@wordpress/compose": "3.19.3", "@wordpress/compose": "3.21.0",
"@wordpress/core-data": "2.20.3", "@wordpress/core-data": "2.23.0",
"@wordpress/data": "4.22.3", "@wordpress/data": "4.24.0",
"@wordpress/data-controls": "1.16.3", "@wordpress/data-controls": "1.18.0",
"@wordpress/date": "3.10.0", "@wordpress/date": "3.12.0",
"@wordpress/deprecated": "2.9.0", "@wordpress/deprecated": "2.10.0",
"@wordpress/dom": "2.13.1", "@wordpress/dom": "2.15.0",
"@wordpress/dom-ready": "2.10.0", "@wordpress/dom-ready": "2.11.0",
"@wordpress/edit-post": "3.21.7", "@wordpress/edit-post": "3.24.1",
"@wordpress/editor": "9.20.7", "@wordpress/editor": "9.23.1",
"@wordpress/element": "2.16.0", "@wordpress/element": "2.18.0",
"@wordpress/escape-html": "1.9.0", "@wordpress/escape-html": "1.10.0",
"@wordpress/format-library": "1.22.7", "@wordpress/format-library": "1.24.1",
"@wordpress/hooks": "2.9.0", "@wordpress/hooks": "2.10.0",
"@wordpress/html-entities": "2.8.0", "@wordpress/html-entities": "2.9.0",
"@wordpress/i18n": "3.14.0", "@wordpress/i18n": "3.16.0",
"@wordpress/icons": "2.4.0", "@wordpress/icons": "2.7.0",
"@wordpress/is-shallow-equal": "2.1.0", "@wordpress/is-shallow-equal": "2.3.0",
"@wordpress/keyboard-shortcuts": "1.9.3", "@wordpress/keyboard-shortcuts": "1.11.0",
"@wordpress/keycodes": "2.14.0", "@wordpress/keycodes": "2.16.0",
"@wordpress/list-reusable-blocks": "1.21.6", "@wordpress/list-reusable-blocks": "1.23.0",
"@wordpress/media-utils": "1.15.0", "@wordpress/media-utils": "1.17.0",
"@wordpress/notices": "2.8.3", "@wordpress/notices": "2.10.0",
"@wordpress/nux": "3.20.6", "@wordpress/nux": "3.22.0",
"@wordpress/plugins": "2.20.3", "@wordpress/plugins": "2.22.0",
"@wordpress/primitives": "1.7.0", "@wordpress/primitives": "1.9.0",
"@wordpress/priority-queue": "1.7.0", "@wordpress/priority-queue": "1.9.0",
"@wordpress/redux-routine": "3.10.0", "@wordpress/redux-routine": "3.12.0",
"@wordpress/rich-text": "3.20.4", "@wordpress/rich-text": "3.22.0",
"@wordpress/server-side-render": "1.16.6", "@wordpress/server-side-render": "1.18.0",
"@wordpress/shortcode": "2.9.0", "@wordpress/shortcode": "2.11.0",
"@wordpress/token-list": "1.11.0", "@wordpress/token-list": "1.13.0",
"@wordpress/url": "2.17.0", "@wordpress/url": "2.19.0",
"@wordpress/viewport": "2.21.3", "@wordpress/viewport": "2.23.0",
"@wordpress/warning": "1.2.0", "@wordpress/warning": "1.3.0",
"@wordpress/wordcount": "2.10.0", "@wordpress/wordcount": "2.12.0",
"backbone": "1.4.0", "backbone": "1.4.0",
"clipboard": "2.0.6", "clipboard": "2.0.6",
"core-js-url-browser": "3.6.4", "core-js-url-browser": "3.6.4",

34
src/wp-includes/array.php Normal file
View File

@ -0,0 +1,34 @@
<?php
/**
* Array API: WordPress array utilities.
*
* @package WordPress
* @since 5.6.0
*/
/**
* Accesses an array in depth based on a path of keys.
* It is the PHP equivalent of JavaScript's lodash.get, and mirroring it may help other components
* retain some symmetry between client and server implementations.
*
* @param array $array An array from which we want to retrieve some information.
* @param array $path An array of keys describing the path with which to retrieve information.
* @param array $default The return value if the path is not set on the array or if the types of array and path are not arrays.
*
* @return array An array matching the path specified.
*/
function wp_array_get( $array, $path, $default = array() ) {
// Confirm input values are expected type to avoid notice warnings.
if ( ! is_array( $array ) || ! is_array( $path ) ) {
return $default;
}
$path_length = count( $path );
for ( $i = 0; $i < $path_length; ++$i ) {
if ( ! isset( $array[ $path[ $i ] ] ) ) {
return $default;
}
$array = $array[ $path[ $i ] ];
}
return $array;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,56 @@
<?php
/**
* Align block support flag.
*
* @package WordPress
*/
/**
* Registers the align block attribute for block types that support it.
*
* @param WP_Block_Type $block_type Block Type.
*/
function wp_register_alignment_support( $block_type ) {
$has_align_support = false;
if ( property_exists( $block_type, 'supports' ) ) {
$has_align_support = wp_array_get( $block_type->supports, array( 'align' ), false );
}
if ( $has_align_support ) {
if ( ! $block_type->attributes ) {
$block_type->attributes = array();
}
if ( ! array_key_exists( 'align', $block_type->attributes ) ) {
$block_type->attributes['align'] = array(
'type' => 'string',
'enum' => array( 'left', 'center', 'right', 'wide', 'full', '' ),
);
}
}
}
/**
* Add CSS classes for block alignment to the incoming attributes array.
* This will be applied to the block markup in the front-end.
*
* @param array $attributes Comprehensive list of attributes to be applied.
* @param array $block_attributes Block attributes.
* @param WP_Block_Type $block_type Block Type.
*
* @return array Block alignment CSS classes and inline styles.
*/
function wp_apply_alignment_support( $attributes, $block_attributes, $block_type ) {
$has_align_support = false;
if ( property_exists( $block_type, 'supports' ) ) {
$has_align_support = wp_array_get( $block_type->supports, array( 'align' ), false );
}
if ( $has_align_support ) {
$has_block_alignment = array_key_exists( 'align', $block_attributes );
if ( $has_block_alignment ) {
$attributes['css_classes'][] = sprintf( 'align%s', $block_attributes['align'] );
}
}
return $attributes;
}

View File

@ -0,0 +1,139 @@
<?php
/**
* Colors block support flag.
*
* @package WordPress
*/
/**
* Registers the style and colors block attributes for block types that support it.
*
* @param WP_Block_Type $block_type Block Type.
*/
function wp_register_colors_support( $block_type ) {
$color_support = false;
if ( property_exists( $block_type, 'supports' ) ) {
$color_support = wp_array_get( $block_type->supports, array( '__experimentalColor' ), false );
}
$has_text_colors_support = true === $color_support || ( is_array( $color_support ) && wp_array_get( $color_support, array( 'text' ), true ) );
$has_background_colors_support = true === $color_support || ( is_array( $color_support ) && wp_array_get( $color_support, array( 'background' ), true ) );
$has_gradients_support = wp_array_get( $color_support, array( 'gradients' ), false );
if ( ! $block_type->attributes ) {
$block_type->attributes = array();
}
if ( $has_text_colors_support && ! array_key_exists( 'style', $block_type->attributes ) ) {
$block_type->attributes['style'] = array(
'type' => 'object',
);
}
if ( $has_background_colors_support && ! array_key_exists( 'backgroundColor', $block_type->attributes ) ) {
$block_type->attributes['backgroundColor'] = array(
'type' => 'string',
);
}
if ( $has_text_colors_support && ! array_key_exists( 'textColor', $block_type->attributes ) ) {
$block_type->attributes['textColor'] = array(
'type' => 'string',
);
}
if ( $has_gradients_support && ! array_key_exists( 'gradient', $block_type->attributes ) ) {
$block_type->attributes['gradient'] = array(
'type' => 'string',
);
}
}
/**
* Add CSS classes and inline styles for colors to the incoming attributes array.
* This will be applied to the block markup in the front-end.
*
* @param array $attributes Comprehensive list of attributes to be applied.
* @param array $block_attributes Block attributes.
* @param WP_Block_Type $block_type Block type.
*
* @return array Colors CSS classes and inline styles.
*/
function wp_apply_colors_support( $attributes, $block_attributes, $block_type ) {
$color_support = wp_array_get( $block_type->supports, array( '__experimentalColor' ), false );
$has_text_colors_support = true === $color_support || ( is_array( $color_support ) && wp_array_get( $color_support, array( 'text' ), true ) );
$has_background_colors_support = true === $color_support || ( is_array( $color_support ) && wp_array_get( $color_support, array( 'background' ), true ) );
$has_link_colors_support = wp_array_get( $color_support, array( 'linkColor' ), false );
$has_gradients_support = wp_array_get( $color_support, array( 'gradients' ), false );
// Text Colors.
// Check support for text colors.
if ( $has_text_colors_support ) {
$has_named_text_color = array_key_exists( 'textColor', $block_attributes );
$has_custom_text_color = isset( $block_attributes['style']['color']['text'] );
// Apply required generic class.
if ( $has_custom_text_color || $has_named_text_color ) {
$attributes['css_classes'][] = 'has-text-color';
}
// Apply color class or inline style.
if ( $has_named_text_color ) {
$attributes['css_classes'][] = sprintf( 'has-%s-color', $block_attributes['textColor'] );
} elseif ( $has_custom_text_color ) {
$attributes['inline_styles'][] = sprintf( 'color: %s;', $block_attributes['style']['color']['text'] );
}
}
// Link Colors.
if ( $has_link_colors_support ) {
$has_link_color = isset( $block_attributes['style']['color']['link'] );
// Apply required class and style.
if ( $has_link_color ) {
$attributes['css_classes'][] = 'has-link-color';
// If link is a named color.
if ( strpos( $block_attributes['style']['color']['link'], 'var:preset|color|' ) !== false ) {
// Get the name from the string and add proper styles.
$index_to_splice = strrpos( $block_attributes['style']['color']['link'], '|' ) + 1;
$link_color_name = substr( $block_attributes['style']['color']['link'], $index_to_splice );
$attributes['inline_styles'][] = sprintf( '--wp--style--color--link:var(--wp--preset--color--%s);', $link_color_name );
} else {
$attributes['inline_styles'][] = sprintf( '--wp--style--color--link: %s;', $block_attributes['style']['color']['link'] );
}
}
}
// Background Colors.
if ( $has_background_colors_support ) {
$has_named_background_color = array_key_exists( 'backgroundColor', $block_attributes );
$has_custom_background_color = isset( $block_attributes['style']['color']['background'] );
// Apply required background class.
if ( $has_custom_background_color || $has_named_background_color ) {
$attributes['css_classes'][] = 'has-background';
}
// Apply background color classes or styles.
if ( $has_named_background_color ) {
$attributes['css_classes'][] = sprintf( 'has-%s-background-color', $block_attributes['backgroundColor'] );
} elseif ( $has_custom_background_color ) {
$attributes['inline_styles'][] = sprintf( 'background-color: %s;', $block_attributes['style']['color']['background'] );
}
}
// Gradients.
if ( $has_gradients_support ) {
$has_named_gradient = array_key_exists( 'gradient', $block_attributes );
$has_custom_gradient = isset( $block_attributes['style']['color']['gradient'] );
if ( $has_named_gradient || $has_custom_gradient ) {
$attributes['css_classes'][] = 'has-background';
}
// Apply required background class.
if ( $has_named_gradient ) {
$attributes['css_classes'][] = sprintf( 'has-%s-gradient-background', $block_attributes['gradient'] );
} elseif ( $has_custom_gradient ) {
$attributes['inline_styles'][] = sprintf( 'background: %s;', $block_attributes['style']['color']['gradient'] );
}
}
return $attributes;
}

View File

@ -0,0 +1,54 @@
<?php
/**
* Custom classname block support flag.
*
* @package WordPress
*/
/**
* Registers the custom classname block attribute for block types that support it.
*
* @param WP_Block_Type $block_type Block Type.
*/
function wp_register_custom_classname_support( $block_type ) {
$has_custom_classname_support = true;
if ( property_exists( $block_type, 'supports' ) ) {
$has_custom_classname_support = wp_array_get( $block_type->supports, array( 'customClassName' ), true );
}
if ( $has_custom_classname_support ) {
if ( ! $block_type->attributes ) {
$block_type->attributes = array();
}
if ( ! array_key_exists( 'className', $block_type->attributes ) ) {
$block_type->attributes['className'] = array(
'type' => 'string',
);
}
}
}
/**
* Add the custom classnames to the output.
*
* @param array $attributes Comprehensive list of attributes to be applied.
* @param array $block_attributes Block attributes.
* @param WP_Block_Type $block_type Block Type.
*
* @return array Block CSS classes and inline styles.
*/
function wp_apply_custom_classname_support( $attributes, $block_attributes, $block_type ) {
$has_custom_classname_support = true;
if ( property_exists( $block_type, 'supports' ) ) {
$has_custom_classname_support = wp_array_get( $block_type->supports, array( 'customClassName' ), true );
}
if ( $has_custom_classname_support ) {
$has_custom_classnames = array_key_exists( 'className', $block_attributes );
if ( $has_custom_classnames ) {
$attributes['css_classes'][] = $block_attributes['className'];
}
}
return $attributes;
}

View File

@ -0,0 +1,57 @@
<?php
/**
* Generated classname block support flag.
*
* @package WordPress
*/
/**
* Get the generated classname from a given block name.
*
* @param string $block_name Block Name.
* @return string Generated classname.
*/
function wp_get_block_default_classname( $block_name ) {
// Generated HTML classes for blocks follow the `wp-block-{name}` nomenclature.
// Blocks provided by WordPress drop the prefixes 'core/' or 'core-' (historically used in 'core-embed/').
$classname = 'wp-block-' . preg_replace(
'/^core-/',
'',
str_replace( '/', '-', $block_name )
);
/**
* Filters the default block className for server rendered blocks.
*
* @param string $class_name The current applied classname.
* @param string $block_name The block name.
*/
$classname = apply_filters( 'block_default_classname', $classname, $block_name );
return $classname;
}
/**
* Add the generated classnames to the output.
*
* @param array $attributes Comprehensive list of attributes to be applied.
* @param array $block_attributes Block attributes.
* @param WP_Block_Type $block_type Block Type.
*
* @return array Block CSS classes and inline styles.
*/
function wp_apply_generated_classname_support( $attributes, $block_attributes, $block_type ) {
$has_generated_classname_support = true;
if ( property_exists( $block_type, 'supports' ) ) {
$has_generated_classname_support = wp_array_get( $block_type->supports, array( 'className' ), true );
}
if ( $has_generated_classname_support ) {
$block_classname = wp_get_block_default_classname( $block_type->name );
if ( $block_classname ) {
$attributes['css_classes'][] = $block_classname;
}
}
return $attributes;
}

View File

@ -0,0 +1,137 @@
<?php
/**
* Block support flags.
*
* @package WordPress
*/
// Require all the block supports mechanisms.
require __DIR__ . '/align.php';
require __DIR__ . '/colors.php';
require __DIR__ . '/custom-classname.php';
require __DIR__ . '/generated-classname.php';
require __DIR__ . '/typography.php';
/**
* Filter the registered blocks to apply the block supports attributes registration.
*/
function wp_register_block_supports() {
$block_registry = WP_Block_Type_Registry::get_instance();
$registered_block_types = $block_registry->get_all_registered();
// Ideally we need a hook to extend the block registration
// instead of mutating the block type.
foreach ( $registered_block_types as $block_type ) {
wp_register_alignment_support( $block_type );
wp_register_colors_support( $block_type );
wp_register_typography_support( $block_type );
wp_register_custom_classname_support( $block_type );
}
}
add_action( 'init', 'wp_register_block_supports', 21 );
/**
* Filters the frontend output of blocks and apply the block support flags transformations.
*
* @param string $block_content rendered block content.
* @param array $block block object.
* @return string filtered block content.
*/
function wp_apply_block_supports( $block_content, $block ) {
if ( ! isset( $block['attrs'] ) ) {
return $block_content;
}
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
// If no render_callback, assume styles have been previously handled.
if ( ! $block_type || ! $block_type->render_callback ) {
return $block_content;
}
$attributes = array();
$attributes = wp_apply_generated_classname_support( $attributes, $block['attrs'], $block_type );
$attributes = wp_apply_colors_support( $attributes, $block['attrs'], $block_type );
$attributes = wp_apply_typography_support( $attributes, $block['attrs'], $block_type );
$attributes = wp_apply_alignment_support( $attributes, $block['attrs'], $block_type );
$attributes = wp_apply_custom_classname_support( $attributes, $block['attrs'], $block_type );
if ( ! count( $attributes ) ) {
return $block_content;
}
$dom = new DOMDocument( '1.0', 'utf-8' );
// Suppress DOMDocument::loadHTML warnings from polluting the front-end.
$previous = libxml_use_internal_errors( true );
// We need to wrap the block in order to handle UTF-8 properly.
$wrapped_block_html =
'<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body>'
. $block_content
. '</body></html>';
$success = $dom->loadHTML( $wrapped_block_html, LIBXML_HTML_NODEFDTD | LIBXML_COMPACT );
// Clear errors and reset the use_errors setting.
libxml_clear_errors();
libxml_use_internal_errors( $previous );
if ( ! $success ) {
return $block_content;
}
// Structure is like `<html><head/><body/></html>`, so body is the `lastChild` of our document.
$body_element = $dom->documentElement->lastChild; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
$xpath = new DOMXPath( $dom );
$block_root = $xpath->query( './*', $body_element )[0];
// phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
if ( empty( $block_root ) ) {
return $block_content;
}
// Merge and dedupe new and existing classes and styles.
$current_classes = explode( ' ', trim( $block_root->getAttribute( 'class' ) ) );
$classes_to_add = array_key_exists( 'css_classes', $attributes ) ? $attributes['css_classes'] : array();
$new_classes = array_unique( array_filter( array_merge( $current_classes, $classes_to_add ) ) );
$current_styles = preg_split( '/\s*;\s*/', trim( $block_root->getAttribute( 'style' ) ) );
$styles_to_add = array_key_exists( 'inline_styles', $attributes ) ? $attributes['inline_styles'] : array();
$new_styles = array_unique( array_map( 'wp_normalize_css_rule', array_filter( array_merge( $current_styles, $styles_to_add ) ) ) );
// Apply new styles and classes.
if ( ! empty( $new_classes ) ) {
// `DOMElement::setAttribute` handles attribute value escaping.
$block_root->setAttribute( 'class', implode( ' ', $new_classes ) );
}
if ( ! empty( $new_styles ) ) {
// `DOMElement::setAttribute` handles attribute value escaping.
$block_root->setAttribute( 'style', implode( '; ', $new_styles ) . ';' );
}
// Avoid using `$dom->saveHtml( $node )` because the node results may not produce consistent
// whitespace for PHP < 7.3. Saving the root HTML `$dom->saveHtml()` prevents this behavior.
$full_html = $dom->saveHtml();
// Find the <body> open/close tags. The open tag needs to be adjusted so we get inside the tag
// and not the tag itself.
$start = strpos( $full_html, '<body>', 0 ) + strlen( '<body>' );
$end = strpos( $full_html, '</body>', $start );
return trim( substr( $full_html, $start, $end - $start ) );
}
add_filter( 'render_block', 'wp_apply_block_supports', 10, 2 );
/**
* Normalizes spacing in a string representing a CSS rule
*
* @example
* 'color :red;' becomes 'color:red'
*
* @param string $css_rule_string CSS rule.
* @return string Normalized CSS rule.
*/
function wp_normalize_css_rule( $css_rule_string ) {
return trim( implode( ': ', preg_split( '/\s*:\s*/', $css_rule_string, 2 ) ), ';' );
}

View File

@ -0,0 +1,121 @@
<?php
/**
* Typography block support flag.
*
* @package WordPress
*/
/**
* Registers the style and typography block attributes for block types that support it.
*
* @param WP_Block_Type $block_type Block Type.
*/
function wp_register_typography_support( $block_type ) {
$has_font_size_support = false;
if ( property_exists( $block_type, 'supports' ) ) {
$has_font_size_support = wp_array_get( $block_type->supports, array( '__experimentalFontSize' ), false );
}
$has_font_style_support = false;
if ( property_exists( $block_type, 'supports' ) ) {
$has_font_style_support = wp_array_get( $block_type->supports, array( '__experimentalFontStyle' ), false );
}
$has_line_height_support = false;
if ( property_exists( $block_type, 'supports' ) ) {
$has_line_height_support = wp_array_get( $block_type->supports, array( '__experimentalLineHeight' ), false );
}
if ( ! $block_type->attributes ) {
$block_type->attributes = array();
}
if ( ( $has_font_size_support || $has_font_style_support || $has_line_height_support ) && ! array_key_exists( 'style', $block_type->attributes ) ) {
$block_type->attributes['style'] = array(
'type' => 'object',
);
}
if ( $has_font_size_support && ! array_key_exists( 'fontSize', $block_type->attributes ) ) {
$block_type->attributes['fontSize'] = array(
'type' => 'string',
);
}
}
/**
* Add CSS classes and inline styles for font sizes to the incoming attributes array.
* This will be applied to the block markup in the front-end.
*
* @param array $attributes Comprehensive list of attributes to be applied.
* @param array $block_attributes Block attributes.
* @param WP_Block_Type $block_type Block type.
*
* @return array Font size CSS classes and inline styles.
*/
function wp_apply_typography_support( $attributes, $block_attributes, $block_type ) {
$has_font_size_support = false;
if ( property_exists( $block_type, 'supports' ) ) {
$has_font_size_support = wp_array_get( $block_type->supports, array( '__experimentalFontSize' ), false );
}
$has_font_style_support = false;
if ( property_exists( $block_type, 'supports' ) ) {
$has_font_style_support = wp_array_get( $block_type->supports, array( '__experimentalFontStyle' ), false );
}
$has_line_height_support = false;
if ( property_exists( $block_type, 'supports' ) ) {
$has_line_height_support = wp_array_get( $block_type->supports, array( '__experimentalLineHeight' ), false );
}
// Font Size.
if ( $has_font_size_support ) {
$has_named_font_size = array_key_exists( 'fontSize', $block_attributes );
$has_custom_font_size = isset( $block_attributes['style']['typography']['fontSize'] );
// Apply required class or style.
if ( $has_named_font_size ) {
$attributes['css_classes'][] = sprintf( 'has-%s-font-size', $block_attributes['fontSize'] );
} elseif ( $has_custom_font_size ) {
$attributes['inline_styles'][] = sprintf( 'font-size: %spx;', $block_attributes['style']['typography']['fontSize'] );
}
}
// Font Styles e.g. bold, italic, underline & strikethrough.
if ( $has_font_style_support ) {
$has_font_styles = isset( $block_attributes['style']['typography']['fontStyles'] );
// Apply required CSS classes.
if ( $has_font_styles ) {
$attributes['css_classes'][] = 'has-font-style';
// CSS class names chosen to be more explicit than generic `has-<something>-font-style`.
$font_style_classes = array(
'bold' => 'has-bold-font-weight',
'italic' => 'has-italic-font-style',
'underline' => 'has-underline-text-decoration',
'strikethrough' => 'has-strikethrough-text-decoration',
);
$style_selections = $block_attributes['style']['typography']['fontStyles'];
foreach ( $style_selections as $style => $turned_on ) {
if ( $turned_on ) {
$attributes['css_classes'][] = $font_style_classes[ $style ];
}
}
}
}
// Line Height.
if ( $has_line_height_support ) {
$has_line_height = isset( $block_attributes['style']['typography']['lineHeight'] );
// Add the style (no classes for line-height).
if ( $has_line_height ) {
$attributes['inline_styles'][] = sprintf( 'line-height: %s;', $block_attributes['style']['typography']['lineHeight'] );
}
}
return $attributes;
}

View File

@ -17,15 +17,7 @@
function render_block_core_archives( $attributes ) { function render_block_core_archives( $attributes ) {
$show_post_count = ! empty( $attributes['showPostCounts'] ); $show_post_count = ! empty( $attributes['showPostCounts'] );
$class = 'wp-block-archives'; $class = '';
if ( isset( $attributes['align'] ) ) {
$class .= " align{$attributes['align']}";
}
if ( isset( $attributes['className'] ) ) {
$class .= " {$attributes['className']}";
}
if ( ! empty( $attributes['displayAsDropdown'] ) ) { if ( ! empty( $attributes['displayAsDropdown'] ) ) {
@ -66,7 +58,7 @@ function render_block_core_archives( $attributes ) {
break; break;
} }
$label = esc_attr( $label ); $label = esc_html( $label );
$block_content = '<label class="screen-reader-text" for="' . $dropdown_id . '">' . $title . '</label> $block_content = '<label class="screen-reader-text" for="' . $dropdown_id . '">' . $title . '</label>
<select id="' . $dropdown_id . '" name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;"> <select id="' . $dropdown_id . '" name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;">

View File

@ -2,19 +2,6 @@
"name": "core/archives", "name": "core/archives",
"category": "widgets", "category": "widgets",
"attributes": { "attributes": {
"align": {
"type": "string",
"enum": [
"left",
"center",
"right",
"wide",
"full"
]
},
"className": {
"type": "string"
},
"displayAsDropdown": { "displayAsDropdown": {
"type": "boolean", "type": "boolean",
"default": false "default": false

View File

@ -31,12 +31,8 @@ function render_block_core_calendar( $attributes ) {
} }
} }
$custom_class_name = empty( $attributes['className'] ) ? '' : ' ' . $attributes['className'];
$align_class_name = empty( $attributes['align'] ) ? '' : ' ' . "align{$attributes['align']}";
$output = sprintf( $output = sprintf(
'<div class="%1$s">%2$s</div>', '<div>%1$s</div>',
esc_attr( 'wp-block-calendar' . $custom_class_name . $align_class_name ),
get_calendar( true, false ) get_calendar( true, false )
); );

View File

@ -2,19 +2,6 @@
"name": "core/calendar", "name": "core/calendar",
"category": "widgets", "category": "widgets",
"attributes": { "attributes": {
"align": {
"type": "string",
"enum": [
"left",
"center",
"right",
"wide",
"full"
]
},
"className": {
"type": "string"
},
"month": { "month": {
"type": "integer" "type": "integer"
}, },

View File

@ -33,7 +33,13 @@ function render_block_core_categories( $attributes ) {
$type = 'dropdown'; $type = 'dropdown';
if ( ! is_admin() ) { if ( ! is_admin() ) {
$wrapper_markup .= build_dropdown_script_block_core_categories( $id ); // Inject the dropdown script immediately after the select dropdown.
$items_markup = preg_replace(
'#(?<=</select>)#',
build_dropdown_script_block_core_categories( $id ),
$items_markup,
1
);
} }
} else { } else {
$wrapper_markup = '<ul class="%1$s">%2$s</ul>'; $wrapper_markup = '<ul class="%1$s">%2$s</ul>';
@ -41,15 +47,7 @@ function render_block_core_categories( $attributes ) {
$type = 'list'; $type = 'list';
} }
$class = "wp-block-categories wp-block-categories-{$type}"; $class = "wp-block-categories-{$type}";
if ( isset( $attributes['align'] ) ) {
$class .= " align{$attributes['align']}";
}
if ( isset( $attributes['className'] ) ) {
$class .= " {$attributes['className']}";
}
return sprintf( return sprintf(
$wrapper_markup, $wrapper_markup,

View File

@ -2,19 +2,6 @@
"name": "core/categories", "name": "core/categories",
"category": "widgets", "category": "widgets",
"attributes": { "attributes": {
"align": {
"type": "string",
"enum": [
"left",
"center",
"right",
"wide",
"full"
]
},
"className": {
"type": "string"
},
"displayAsDropdown": { "displayAsDropdown": {
"type": "boolean", "type": "boolean",
"default": false "default": false

View File

@ -4,13 +4,12 @@
"attributes": { "attributes": {
"content": { "content": {
"type": "string", "type": "string",
"source": "text", "source": "html",
"selector": "code" "selector": "code"
} }
}, },
"supports": { "supports": {
"anchor": true, "anchor": true,
"html": false,
"lightBlockWrapper": true "lightBlockWrapper": true
} }
} }

View File

@ -68,8 +68,7 @@
"default": true "default": true
}, },
"linkTo": { "linkTo": {
"type": "string", "type": "string"
"default": "none"
}, },
"sizeSlug": { "sizeSlug": {
"type": "string", "type": "string",

View File

@ -18,6 +18,7 @@
"__experimentalColor": { "__experimentalColor": {
"gradients": true, "gradients": true,
"linkColor": true "linkColor": true
} },
"__experimentalPadding": true
} }
} }

View File

@ -60,8 +60,7 @@
"type": "string" "type": "string"
}, },
"linkDestination": { "linkDestination": {
"type": "string", "type": "string"
"default": "none"
}, },
"linkTarget": { "linkTarget": {
"type": "string", "type": "string",

View File

@ -116,34 +116,28 @@ function render_block_core_latest_comments( $attributes = array() ) {
} }
} }
$class = 'wp-block-latest-comments'; $classnames = array();
if ( ! empty( $attributes['className'] ) ) {
$class .= ' ' . $attributes['className'];
}
if ( isset( $attributes['align'] ) ) {
$class .= " align{$attributes['align']}";
}
if ( $attributes['displayAvatar'] ) { if ( $attributes['displayAvatar'] ) {
$class .= ' has-avatars'; $classnames[] = 'has-avatars';
} }
if ( $attributes['displayDate'] ) { if ( $attributes['displayDate'] ) {
$class .= ' has-dates'; $classnames[] = 'has-dates';
} }
if ( $attributes['displayExcerpt'] ) { if ( $attributes['displayExcerpt'] ) {
$class .= ' has-excerpts'; $classnames[] = 'has-excerpts';
} }
if ( empty( $comments ) ) { if ( empty( $comments ) ) {
$class .= ' no-comments'; $classnames[] = 'no-comments';
} }
$classnames = esc_attr( $class ); $class = esc_attr( implode( ' ', $classnames ) );
return ! empty( $comments ) ? sprintf( return ! empty( $comments ) ? sprintf(
'<ol class="%1$s">%2$s</ol>', '<ol class="%1$s">%2$s</ol>',
$classnames, $class,
$list_items_markup $list_items_markup
) : sprintf( ) : sprintf(
'<div class="%1$s">%2$s</div>', '<div class="%1$s">%2$s</div>',
$classnames, $class,
__( 'No comments to show.' ) __( 'No comments to show.' )
); );
} }

View File

@ -2,19 +2,6 @@
"name": "core/latest-comments", "name": "core/latest-comments",
"category": "widgets", "category": "widgets",
"attributes": { "attributes": {
"align": {
"type": "string",
"enum": [
"left",
"center",
"right",
"wide",
"full"
]
},
"className": {
"type": "string"
},
"commentsToShow": { "commentsToShow": {
"type": "number", "type": "number",
"default": 5, "default": 5,

View File

@ -58,6 +58,7 @@ function render_block_core_latest_posts( $attributes ) {
$list_items_markup = ''; $list_items_markup = '';
foreach ( $recent_posts as $post ) { foreach ( $recent_posts as $post ) {
$post_link = esc_url( get_permalink( $post ) );
$list_items_markup .= '<li>'; $list_items_markup .= '<li>';
@ -75,16 +76,24 @@ function render_block_core_latest_posts( $attributes ) {
$image_classes .= ' align' . $attributes['featuredImageAlign']; $image_classes .= ' align' . $attributes['featuredImageAlign'];
} }
$featured_image = get_the_post_thumbnail(
$post,
$attributes['featuredImageSizeSlug'],
array(
'style' => $image_style,
)
);
if ( $attributes['addLinkToFeaturedImage'] ) {
$featured_image = sprintf(
'<a href="%1$s">%2$s</a>',
$post_link,
$featured_image
);
}
$list_items_markup .= sprintf( $list_items_markup .= sprintf(
'<div class="%1$s">%2$s</div>', '<div class="%1$s">%2$s</div>',
$image_classes, $image_classes,
get_the_post_thumbnail( $featured_image
$post,
$attributes['featuredImageSizeSlug'],
array(
'style' => $image_style,
)
)
); );
} }
@ -94,7 +103,7 @@ function render_block_core_latest_posts( $attributes ) {
} }
$list_items_markup .= sprintf( $list_items_markup .= sprintf(
'<a href="%1$s">%2$s</a>', '<a href="%1$s">%2$s</a>',
esc_url( get_permalink( $post ) ), $post_link,
$title $title
); );
@ -144,10 +153,7 @@ function render_block_core_latest_posts( $attributes ) {
remove_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 ); remove_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 );
$class = 'wp-block-latest-posts wp-block-latest-posts__list'; $class = 'wp-block-latest-posts__list';
if ( isset( $attributes['align'] ) ) {
$class .= ' align' . $attributes['align'];
}
if ( isset( $attributes['postLayout'] ) && 'grid' === $attributes['postLayout'] ) { if ( isset( $attributes['postLayout'] ) && 'grid' === $attributes['postLayout'] ) {
$class .= ' is-grid'; $class .= ' is-grid';
@ -165,10 +171,6 @@ function render_block_core_latest_posts( $attributes ) {
$class .= ' has-author'; $class .= ' has-author';
} }
if ( isset( $attributes['className'] ) ) {
$class .= ' ' . $attributes['className'];
}
return sprintf( return sprintf(
'<ul class="%1$s">%2$s</ul>', '<ul class="%1$s">%2$s</ul>',
esc_attr( $class ), esc_attr( $class ),

View File

@ -2,19 +2,6 @@
"name": "core/latest-posts", "name": "core/latest-posts",
"category": "widgets", "category": "widgets",
"attributes": { "attributes": {
"align": {
"type": "string",
"enum": [
"left",
"center",
"right",
"wide",
"full"
]
},
"className": {
"type": "string"
},
"categories": { "categories": {
"type": "array", "type": "array",
"items": { "items": {
@ -87,6 +74,10 @@
"featuredImageSizeHeight": { "featuredImageSizeHeight": {
"type": "number", "type": "number",
"default": null "default": null
},
"addLinkToFeaturedImage": {
"type": "boolean",
"default": false
} }
}, },
"supports": { "supports": {

View File

@ -11,10 +11,7 @@
"source": "html", "source": "html",
"selector": "ol,ul", "selector": "ol,ul",
"multiline": "li", "multiline": "li",
"__unstableMultilineWrapperTags": [ "__unstableMultilineWrapperTags": [ "ol", "ul" ],
"ol",
"ul"
],
"default": "" "default": ""
}, },
"type": { "type": {
@ -30,6 +27,9 @@
"supports": { "supports": {
"anchor": true, "anchor": true,
"className": false, "className": false,
"__experimentalColor": {
"gradients": true
},
"__unstablePasteTextInline": true, "__unstablePasteTextInline": true,
"lightBlockWrapper": true "lightBlockWrapper": true
} }

View File

@ -63,6 +63,9 @@
"type": "number", "type": "number",
"default": 50 "default": 50
}, },
"mediaSizeSlug": {
"type": "string"
},
"isStackedOnMobile": { "isStackedOnMobile": {
"type": "boolean", "type": "boolean",
"default": true "default": true
@ -79,10 +82,7 @@
}, },
"supports": { "supports": {
"anchor": true, "anchor": true,
"align": [ "align": [ "wide", "full" ],
"wide",
"full"
],
"html": false, "html": false,
"lightBlockWrapper": true, "lightBlockWrapper": true,
"__experimentalColor": { "__experimentalColor": {

View File

@ -35,11 +35,6 @@
}, },
"__experimentalFontSize": true, "__experimentalFontSize": true,
"__experimentalLineHeight": true, "__experimentalLineHeight": true,
"__experimentalFeatures": {
"typography": {
"dropCap": true
}
},
"__experimentalSelector": "p", "__experimentalSelector": "p",
"__unstablePasteTextInline": true "__unstablePasteTextInline": true
} }

View File

@ -20,6 +20,7 @@
} }
}, },
"supports": { "supports": {
"anchor": true "anchor": true,
"lightBlockWrapper": true
} }
} }

View File

@ -79,24 +79,16 @@ function render_block_core_rss( $attributes ) {
$list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>"; $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
} }
$class = 'wp-block-rss'; $classnames = array();
if ( isset( $attributes['align'] ) ) {
$class .= ' align' . $attributes['align'];
}
if ( isset( $attributes['blockLayout'] ) && 'grid' === $attributes['blockLayout'] ) { if ( isset( $attributes['blockLayout'] ) && 'grid' === $attributes['blockLayout'] ) {
$class .= ' is-grid'; $classnames[] = 'is-grid';
} }
if ( isset( $attributes['columns'] ) && 'grid' === $attributes['blockLayout'] ) { if ( isset( $attributes['columns'] ) && 'grid' === $attributes['blockLayout'] ) {
$class .= ' columns-' . $attributes['columns']; $classnames[] = 'columns-' . $attributes['columns'];
} }
if ( isset( $attributes['className'] ) ) { return sprintf( '<ul class="%s">%s</ul>', esc_attr( implode( ' ', $classnames ) ), $list_items );
$class .= ' ' . $attributes['className'];
}
return sprintf( '<ul class="%s">%s</ul>', esc_attr( $class ), $list_items );
} }
/** /**

View File

@ -2,19 +2,6 @@
"name": "core/rss", "name": "core/rss",
"category": "widgets", "category": "widgets",
"attributes": { "attributes": {
"align": {
"type": "string",
"enum": [
"left",
"center",
"right",
"wide",
"full"
]
},
"className": {
"type": "string"
},
"columns": { "columns": {
"type": "number", "type": "number",
"default": 2 "default": 2

View File

@ -27,51 +27,79 @@ function render_block_core_search( $attributes ) {
) )
); );
$input_id = 'wp-block-search__input-' . ++$instance_id; $input_id = 'wp-block-search__input-' . ++$instance_id;
$label_markup = ''; $classnames = classnames_for_block_core_search( $attributes );
$button_markup = ''; $show_label = ( ! empty( $attributes['showLabel'] ) ) ? true : false;
$use_icon_button = ( ! empty( $attributes['buttonUseIcon'] ) ) ? true : false;
$show_input = ( ! empty( $attributes['buttonPosition'] ) && 'button-only' === $attributes['buttonPosition'] ) ? false : true;
$show_button = ( ! empty( $attributes['buttonPosition'] ) && 'no-button' === $attributes['buttonPosition'] ) ? false : true;
$label_markup = '';
$input_markup = '';
$button_markup = '';
$width_styles = '';
if ( ! empty( $attributes['label'] ) ) { if ( $show_label ) {
$label_markup = sprintf( if ( ! empty( $attributes['label'] ) ) {
'<label for="%s" class="wp-block-search__label">%s</label>', $label_markup = sprintf(
'<label for="%s" class="wp-block-search__label">%s</label>',
$input_id,
$attributes['label']
);
} else {
$label_markup = sprintf(
'<label for="%s" class="wp-block-search__label screen-reader-text">%s</label>',
$input_id,
__( 'Search' )
);
}
}
if ( $show_input ) {
$input_markup = sprintf(
'<input type="search" id="%s" class="wp-block-search__input" name="s" value="%s" placeholder="%s" required />',
$input_id, $input_id,
$attributes['label'] esc_attr( get_search_query() ),
); esc_attr( $attributes['placeholder'] )
} else {
$label_markup = sprintf(
'<label for="%s" class="wp-block-search__label screen-reader-text">%s</label>',
$input_id,
__( 'Search' )
); );
} }
$input_markup = sprintf( if ( $show_button ) {
'<input type="search" id="%s" class="wp-block-search__input" name="s" value="%s" placeholder="%s" required />', $button_internal_markup = '';
$input_id,
esc_attr( get_search_query() ), if ( ! $use_icon_button ) {
esc_attr( $attributes['placeholder'] ) if ( ! empty( $attributes['buttonText'] ) ) {
); $button_internal_markup = $attributes['buttonText'];
}
} else {
$button_internal_markup =
'<svg id="search-icon" class="search-icon" viewBox="0 0 24 24">
<path d="M13.5 6C10.5 6 8 8.5 8 11.5c0 1.1.3 2.1.9 3l-3.4 3 1 1.1 3.4-2.9c1 .9 2.2 1.4 3.6 1.4 3 0 5.5-2.5 5.5-5.5C19 8.5 16.5 6 13.5 6zm0 9.5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"></path>
</svg>';
}
if ( ! empty( $attributes['buttonText'] ) ) {
$button_markup = sprintf( $button_markup = sprintf(
'<button type="submit" class="wp-block-search__button">%s</button>', '<button type="submit" class="wp-block-search__button">%s</button>',
$attributes['buttonText'] $button_internal_markup
); );
} }
$class = 'wp-block-search'; if ( ! empty( $attributes['width'] ) && ! empty( $attributes['widthUnit'] ) ) {
if ( isset( $attributes['className'] ) ) { if ( ! empty( $attributes['buttonPosition'] ) && 'button-only' !== $attributes['buttonPosition'] ) {
$class .= ' ' . $attributes['className']; $width_styles = ' style="width: ' . $attributes['width'] . $attributes['widthUnit'] . ';"';
} }
if ( isset( $attributes['align'] ) ) {
$class .= ' align' . $attributes['align'];
} }
$field_markup = sprintf(
'<div class="wp-block-search__inside-wrapper"%s>%s</div>',
$width_styles,
$input_markup . $button_markup
);
return sprintf( return sprintf(
'<form class="%s" role="search" method="get" action="%s">%s</form>', '<form role="search" method="get" action="%s" class="%s">%s</form>',
esc_attr( $class ),
esc_url( home_url( '/' ) ), esc_url( home_url( '/' ) ),
$label_markup . $input_markup . $button_markup $classnames,
$label_markup . $field_markup
); );
} }
@ -87,3 +115,44 @@ function register_block_core_search() {
); );
} }
add_action( 'init', 'register_block_core_search' ); add_action( 'init', 'register_block_core_search' );
/**
* Builds the correct top level classnames for the 'core/search' block.
*
* @param array $attributes The block attributes.
*
* @return string The classnames used in the block.
*/
function classnames_for_block_core_search( $attributes ) {
$classnames = array();
if ( ! empty( $attributes['buttonPosition'] ) ) {
if ( 'button-inside' === $attributes['buttonPosition'] ) {
$classnames[] = 'wp-block-search__button-inside';
}
if ( 'button-outside' === $attributes['buttonPosition'] ) {
$classnames[] = 'wp-block-search__button-outside';
}
if ( 'no-button' === $attributes['buttonPosition'] ) {
$classnames[] = 'wp-block-search__no-button';
}
if ( 'button-only' === $attributes['buttonPosition'] ) {
$classnames[] = 'wp-block-search__button-only';
}
}
if ( isset( $attributes['buttonUseIcon'] ) ) {
if ( ! empty( $attributes['buttonPosition'] ) && 'no-button' !== $attributes['buttonPosition'] ) {
if ( $attributes['buttonUseIcon'] ) {
$classnames[] = 'wp-block-search__icon-button';
} else {
$classnames[] = 'wp-block-search__text-button';
}
}
}
return implode( ' ', $classnames );
}

View File

@ -2,32 +2,38 @@
"name": "core/search", "name": "core/search",
"category": "widgets", "category": "widgets",
"attributes": { "attributes": {
"align": {
"type": "string",
"enum": [
"left",
"center",
"right",
"wide",
"full"
]
},
"className": {
"type": "string"
},
"label": { "label": {
"type": "string" "type": "string"
}, },
"showLabel": {
"type": "bool",
"default": true
},
"placeholder": { "placeholder": {
"type": "string", "type": "string",
"default": "" "default": ""
}, },
"width": {
"type": "number"
},
"widthUnit": {
"type": "string"
},
"buttonText": { "buttonText": {
"type": "string" "type": "string"
},
"buttonPosition": {
"type": "string",
"default": "button-outside"
},
"buttonUseIcon": {
"type": "bool",
"default": false
} }
}, },
"supports": { "supports": {
"align": true, "align": [ "left", "center", "right" ],
"html": false "html": false,
"lightBlockWrapper": true
} }
} }

View File

@ -8,11 +8,15 @@
/** /**
* Renders the `core/social-link` block on server. * Renders the `core/social-link` block on server.
* *
* @param array $attributes The block attributes. * @param Array $attributes The block attributes.
* @param String $content InnerBlocks content of the Block.
* @param WPBlock $block Block object.
* *
* @return string Rendered HTML of the referenced block. * @return string Rendered HTML of the referenced block.
*/ */
function render_block_core_social_link( $attributes ) { function render_block_core_social_link( $attributes, $content, $block ) {
$open_in_new_tab = $block->context['openInNewTab'];
$service = ( isset( $attributes['service'] ) ) ? $attributes['service'] : 'Icon'; $service = ( isset( $attributes['service'] ) ) ? $attributes['service'] : 'Icon';
$url = ( isset( $attributes['url'] ) ) ? $attributes['url'] : false; $url = ( isset( $attributes['url'] ) ) ? $attributes['url'] : false;
$label = ( isset( $attributes['label'] ) ) ? $attributes['label'] : block_core_social_link_get_name( $service ); $label = ( isset( $attributes['label'] ) ) ? $attributes['label'] : block_core_social_link_get_name( $service );
@ -23,8 +27,13 @@ function render_block_core_social_link( $attributes ) {
return ''; return '';
} }
$attribute = '';
if ( $open_in_new_tab ) {
$attribute = 'rel="noopener nofollow" target="_blank"';
}
$icon = block_core_social_link_get_icon( $service ); $icon = block_core_social_link_get_icon( $service );
return '<li class="wp-social-link wp-social-link-' . esc_attr( $service ) . esc_attr( $class_name ) . '"><a href="' . esc_url( $url ) . '" aria-label="' . esc_attr( $label ) . '"> ' . $icon . '</a></li>'; return '<li class="wp-social-link wp-social-link-' . esc_attr( $service ) . esc_attr( $class_name ) . '"><a href="' . esc_url( $url ) . '" aria-label="' . esc_attr( $label ) . '" ' . $attribute . '> ' . $icon . '</a></li>';
} }
/** /**

View File

@ -15,6 +15,9 @@
"type": "string" "type": "string"
} }
}, },
"usesContext": [
"openInNewTab"
],
"supports": { "supports": {
"reusable": false, "reusable": false,
"html": false, "html": false,

View File

@ -1,6 +1,15 @@
{ {
"name": "core/social-links", "name": "core/social-links",
"category": "widgets", "category": "widgets",
"attributes": {
"openInNewTab": {
"type": "boolean",
"default": false
}
},
"providesContext": {
"openInNewTab": "openInNewTab"
},
"supports": { "supports": {
"align": [ "align": [
"left", "left",

View File

@ -13,20 +13,11 @@
* @return string Returns the tag cloud for selected taxonomy. * @return string Returns the tag cloud for selected taxonomy.
*/ */
function render_block_core_tag_cloud( $attributes ) { function render_block_core_tag_cloud( $attributes ) {
$class = isset( $attributes['align'] ) ? $args = array(
"wp-block-tag-cloud align{$attributes['align']}" :
'wp-block-tag-cloud';
if ( isset( $attributes['className'] ) ) {
$class .= ' ' . $attributes['className'];
}
$args = array(
'echo' => false, 'echo' => false,
'taxonomy' => $attributes['taxonomy'], 'taxonomy' => $attributes['taxonomy'],
'show_count' => $attributes['showTagCounts'], 'show_count' => $attributes['showTagCounts'],
); );
$tag_cloud = wp_tag_cloud( $args ); $tag_cloud = wp_tag_cloud( $args );
if ( ! $tag_cloud ) { if ( ! $tag_cloud ) {
@ -41,8 +32,7 @@ function render_block_core_tag_cloud( $attributes ) {
} }
return sprintf( return sprintf(
'<p class="%1$s">%2$s</p>', '<p>%1$s</p>',
esc_attr( $class ),
$tag_cloud $tag_cloud
); );
} }

View File

@ -2,19 +2,6 @@
"name": "core/tag-cloud", "name": "core/tag-cloud",
"category": "widgets", "category": "widgets",
"attributes": { "attributes": {
"align": {
"type": "string",
"enum": [
"left",
"center",
"right",
"wide",
"full"
]
},
"className": {
"type": "string"
},
"taxonomy": { "taxonomy": {
"type": "string", "type": "string",
"default": "post_tag" "default": "post_tag"

View File

@ -10,7 +10,7 @@
* *
* Holds the block structure in memory * Holds the block structure in memory
* *
* @since 3.8.0 * @since 5.0.0
*/ */
class WP_Block_Parser_Block { class WP_Block_Parser_Block {
/** /**
@ -18,7 +18,7 @@ class WP_Block_Parser_Block {
* *
* @example "core/paragraph" * @example "core/paragraph"
* *
* @since 3.8.0 * @since 5.0.0
* @var string * @var string
*/ */
public $blockName; public $blockName;
@ -29,7 +29,7 @@ class WP_Block_Parser_Block {
* @example null * @example null
* @example array( 'columns' => 3 ) * @example array( 'columns' => 3 )
* *
* @since 3.8.0 * @since 5.0.0
* @var array|null * @var array|null
*/ */
public $attrs; public $attrs;
@ -37,7 +37,7 @@ class WP_Block_Parser_Block {
/** /**
* List of inner blocks (of this same class) * List of inner blocks (of this same class)
* *
* @since 3.8.0 * @since 5.0.0
* @var WP_Block_Parser_Block[] * @var WP_Block_Parser_Block[]
*/ */
public $innerBlocks; public $innerBlocks;
@ -48,7 +48,7 @@ class WP_Block_Parser_Block {
* *
* @example "...Just <!-- wp:test /--> testing..." -> "Just testing..." * @example "...Just <!-- wp:test /--> testing..." -> "Just testing..."
* *
* @since 3.8.0 * @since 5.0.0
* @var string * @var string
*/ */
public $innerHTML; public $innerHTML;
@ -72,7 +72,7 @@ class WP_Block_Parser_Block {
* *
* Will populate object properties from the provided arguments. * Will populate object properties from the provided arguments.
* *
* @since 3.8.0 * @since 5.0.0
* *
* @param string $name Name of block. * @param string $name Name of block.
* @param array $attrs Optional set of attributes from block comment delimiters. * @param array $attrs Optional set of attributes from block comment delimiters.
@ -95,13 +95,13 @@ class WP_Block_Parser_Block {
* Holds partial blocks in memory while parsing * Holds partial blocks in memory while parsing
* *
* @internal * @internal
* @since 3.8.0 * @since 5.0.0
*/ */
class WP_Block_Parser_Frame { class WP_Block_Parser_Frame {
/** /**
* Full or partial block * Full or partial block
* *
* @since 3.8.0 * @since 5.0.0
* @var WP_Block_Parser_Block * @var WP_Block_Parser_Block
*/ */
public $block; public $block;
@ -109,7 +109,7 @@ class WP_Block_Parser_Frame {
/** /**
* Byte offset into document for start of parse token * Byte offset into document for start of parse token
* *
* @since 3.8.0 * @since 5.0.0
* @var int * @var int
*/ */
public $token_start; public $token_start;
@ -117,7 +117,7 @@ class WP_Block_Parser_Frame {
/** /**
* Byte length of entire parse token string * Byte length of entire parse token string
* *
* @since 3.8.0 * @since 5.0.0
* @var int * @var int
*/ */
public $token_length; public $token_length;
@ -126,7 +126,7 @@ class WP_Block_Parser_Frame {
* Byte offset into document for after parse token ends * Byte offset into document for after parse token ends
* (used during reconstruction of stack into parse production) * (used during reconstruction of stack into parse production)
* *
* @since 3.8.0 * @since 5.0.0
* @var int * @var int
*/ */
public $prev_offset; public $prev_offset;
@ -134,7 +134,7 @@ class WP_Block_Parser_Frame {
/** /**
* Byte offset into document where leading HTML before token starts * Byte offset into document where leading HTML before token starts
* *
* @since 3.8.0 * @since 5.0.0
* @var int * @var int
*/ */
public $leading_html_start; public $leading_html_start;
@ -144,7 +144,7 @@ class WP_Block_Parser_Frame {
* *
* Will populate object properties from the provided arguments. * Will populate object properties from the provided arguments.
* *
* @since 3.8.0 * @since 5.0.0
* *
* @param WP_Block_Parser_Block $block Full or partial block. * @param WP_Block_Parser_Block $block Full or partial block.
* @param int $token_start Byte offset into document for start of parse token. * @param int $token_start Byte offset into document for start of parse token.
@ -166,7 +166,7 @@ class WP_Block_Parser_Frame {
* *
* Parses a document and constructs a list of parsed block objects * Parses a document and constructs a list of parsed block objects
* *
* @since 3.8.0 * @since 5.0.0
* @since 4.0.0 returns arrays not objects, all attributes are arrays * @since 4.0.0 returns arrays not objects, all attributes are arrays
*/ */
class WP_Block_Parser { class WP_Block_Parser {
@ -175,7 +175,7 @@ class WP_Block_Parser {
* *
* @example "Pre-text\n<!-- wp:paragraph -->This is inside a block!<!-- /wp:paragraph -->" * @example "Pre-text\n<!-- wp:paragraph -->This is inside a block!<!-- /wp:paragraph -->"
* *
* @since 3.8.0 * @since 5.0.0
* @var string * @var string
*/ */
public $document; public $document;
@ -183,7 +183,7 @@ class WP_Block_Parser {
/** /**
* Tracks parsing progress through document * Tracks parsing progress through document
* *
* @since 3.8.0 * @since 5.0.0
* @var int * @var int
*/ */
public $offset; public $offset;
@ -191,7 +191,7 @@ class WP_Block_Parser {
/** /**
* List of parsed blocks * List of parsed blocks
* *
* @since 3.8.0 * @since 5.0.0
* @var WP_Block_Parser_Block[] * @var WP_Block_Parser_Block[]
*/ */
public $output; public $output;
@ -199,7 +199,7 @@ class WP_Block_Parser {
/** /**
* Stack of partially-parsed structures in memory during parse * Stack of partially-parsed structures in memory during parse
* *
* @since 3.8.0 * @since 5.0.0
* @var WP_Block_Parser_Frame[] * @var WP_Block_Parser_Frame[]
*/ */
public $stack; public $stack;
@ -219,7 +219,7 @@ class WP_Block_Parser {
* parse. In contrast to the specification parser this does not * parse. In contrast to the specification parser this does not
* return an error on invalid inputs. * return an error on invalid inputs.
* *
* @since 3.8.0 * @since 5.0.0
* *
* @param string $document Input document being parsed. * @param string $document Input document being parsed.
* @return WP_Block_Parser_Block[] * @return WP_Block_Parser_Block[]
@ -249,7 +249,7 @@ class WP_Block_Parser {
* or breaking out of a level of nesting. * or breaking out of a level of nesting.
* *
* @internal * @internal
* @since 3.8.0 * @since 5.0.0
* @return bool * @return bool
*/ */
function proceed() { function proceed() {
@ -394,7 +394,7 @@ class WP_Block_Parser {
* Returns the type of the find: kind of find, block information, attributes * Returns the type of the find: kind of find, block information, attributes
* *
* @internal * @internal
* @since 3.8.0 * @since 5.0.0
* @since 4.6.1 fixed a bug in attribute parsing which caused catastrophic backtracking on invalid block comments * @since 4.6.1 fixed a bug in attribute parsing which caused catastrophic backtracking on invalid block comments
* @return array * @return array
*/ */
@ -482,7 +482,7 @@ class WP_Block_Parser {
* to the output list as a freeform block. * to the output list as a freeform block.
* *
* @internal * @internal
* @since 3.8.0 * @since 5.0.0
* @param null $length how many bytes of document text to output. * @param null $length how many bytes of document text to output.
*/ */
function add_freeform( $length = null ) { function add_freeform( $length = null ) {
@ -500,7 +500,7 @@ class WP_Block_Parser {
* a new block to the output list. * a new block to the output list.
* *
* @internal * @internal
* @since 3.8.0 * @since 5.0.0
* @param WP_Block_Parser_Block $block The block to add to the output. * @param WP_Block_Parser_Block $block The block to add to the output.
* @param int $token_start Byte offset into the document where the first token for the block starts. * @param int $token_start Byte offset into the document where the first token for the block starts.
* @param int $token_length Byte length of entire block from start of opening token to end of closing token. * @param int $token_length Byte length of entire block from start of opening token to end of closing token.
@ -524,7 +524,7 @@ class WP_Block_Parser {
* Pushes the top block from the parsing stack to the output list. * Pushes the top block from the parsing stack to the output list.
* *
* @internal * @internal
* @since 3.8.0 * @since 5.0.0
* @param int|null $end_offset byte offset into document for where we should stop sending text output as HTML. * @param int|null $end_offset byte offset into document for where we should stop sending text output as HTML.
*/ */
function add_block_from_stack( $end_offset = null ) { function add_block_from_stack( $end_offset = null ) {

View File

@ -179,6 +179,7 @@ require ABSPATH . WPINC . '/class-wp-user-meta-session-tokens.php';
require ABSPATH . WPINC . '/class-wp-metadata-lazyloader.php'; require ABSPATH . WPINC . '/class-wp-metadata-lazyloader.php';
require ABSPATH . WPINC . '/general-template.php'; require ABSPATH . WPINC . '/general-template.php';
require ABSPATH . WPINC . '/link-template.php'; require ABSPATH . WPINC . '/link-template.php';
require ABSPATH . WPINC . '/array.php';
require ABSPATH . WPINC . '/author-template.php'; require ABSPATH . WPINC . '/author-template.php';
require ABSPATH . WPINC . '/post.php'; require ABSPATH . WPINC . '/post.php';
require ABSPATH . WPINC . '/class-walker-page.php'; require ABSPATH . WPINC . '/class-walker-page.php';
@ -291,6 +292,7 @@ require ABSPATH . WPINC . '/class-wp-block-parser.php';
require ABSPATH . WPINC . '/blocks.php'; require ABSPATH . WPINC . '/blocks.php';
require ABSPATH . WPINC . '/blocks/index.php'; require ABSPATH . WPINC . '/blocks/index.php';
require ABSPATH . WPINC . '/block-patterns.php'; require ABSPATH . WPINC . '/block-patterns.php';
require ABSPATH . WPINC . '/block-supports/index.php';
$GLOBALS['wp_embed'] = new WP_Embed(); $GLOBALS['wp_embed'] = new WP_Embed();

View File

@ -8,7 +8,7 @@ const childProcess = require( 'child_process' );
// Config // Config
// This should be updated every time we update the WordPress packages. // This should be updated every time we update the WordPress packages.
const GUTENBERG_VERSION = '@wordpress/block-editor@4.3.0'; const GUTENBERG_VERSION = '@wordpress/block-editor@5.0.1';
// Utils // Utils
/** /**

View File

@ -1 +1 @@
<div class="wp-block-archives wp-block-archives-list">No archives to show.</div> <div class="wp-block-archives-list wp-block-archives">No archives to show.</div>

View File

@ -1 +1 @@
<div class="wp-block-archives wp-block-archives-list">No archives to show.</div> <div class="wp-block-archives-list wp-block-archives">No archives to show.</div>

View File

@ -1 +1 @@
<ul class="wp-block-categories wp-block-categories-list"><li class="cat-item-none">No categories</li></ul> <ul class="wp-block-categories-list wp-block-categories"><li class="cat-item-none">No categories</li></ul>

View File

@ -1 +1 @@
<div class="wp-block-latest-comments has-avatars has-dates has-excerpts no-comments">No comments to show.</div> <div class="has-avatars has-dates has-excerpts no-comments wp-block-latest-comments">No comments to show.</div>

View File

@ -1 +1 @@
<ul class="wp-block-latest-posts wp-block-latest-posts__list"></ul> <ul class="wp-block-latest-posts__list wp-block-latest-posts"></ul>

View File

@ -1 +1 @@
<ul class="wp-block-latest-posts wp-block-latest-posts__list has-dates"></ul> <ul class="wp-block-latest-posts__list has-dates wp-block-latest-posts"></ul>