mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-06-28 22:30:04 +00:00
Block Editor: Update @wordpress dependencies.
Changes of note: - Includes the new Annotations API package. - `wp-polyfill-ecmascript.js` is renamed to `wp-polyfill.js`. - `strip_dynamic_blocks()` has been removed in favor of `excerpt_remove_blocks()`. - The PHP block parser is now syncing from the `block-serialization-default-parser` package. - `do_blocks()` uses the new parser. - The `do_block` filter has been removed from `do_blocks()`, in favor of a `render_block` filter in `render_block()`. Also, a little cleanup to `render_block()`. Always normalize `$block['attrs’]` to array in `’render_block’` filter. Props pento, azaozz. Merges [43884] and [43888] to trunk. See #45145, #45190, #45264, #45282. git-svn-id: https://develop.svn.wordpress.org/trunk@44261 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -48,11 +48,26 @@ class WP_Block_Parser_Block {
|
||||
*/
|
||||
public $innerHTML;
|
||||
|
||||
function __construct( $name, $attrs, $innerBlocks, $innerHTML ) {
|
||||
$this->blockName = $name;
|
||||
$this->attrs = $attrs;
|
||||
$this->innerBlocks = $innerBlocks;
|
||||
$this->innerHTML = $innerHTML;
|
||||
/**
|
||||
* List of string fragments and null markers where inner blocks were found
|
||||
*
|
||||
* @example array(
|
||||
* 'innerHTML' => 'BeforeInnerAfter',
|
||||
* 'innerBlocks' => array( block, block ),
|
||||
* 'innerContent' => array( 'Before', null, 'Inner', null, 'After' ),
|
||||
* )
|
||||
*
|
||||
* @since 4.2.0
|
||||
* @var array
|
||||
*/
|
||||
public $innerContent;
|
||||
|
||||
function __construct( $name, $attrs, $innerBlocks, $innerHTML, $innerContent ) {
|
||||
$this->blockName = $name;
|
||||
$this->attrs = $attrs;
|
||||
$this->innerBlocks = $innerBlocks;
|
||||
$this->innerHTML = $innerHTML;
|
||||
$this->innerContent = $innerContent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,6 +173,14 @@ class WP_Block_Parser {
|
||||
*/
|
||||
public $stack;
|
||||
|
||||
/**
|
||||
* Empty associative array, here due to PHP quirks
|
||||
*
|
||||
* @since 4.4.0
|
||||
* @var array empty associative array
|
||||
*/
|
||||
public $empty_attrs;
|
||||
|
||||
/**
|
||||
* Parses a document and returns a list of block structures
|
||||
*
|
||||
@@ -171,10 +194,11 @@ class WP_Block_Parser {
|
||||
* @return WP_Block_Parser_Block[]
|
||||
*/
|
||||
function parse( $document ) {
|
||||
$this->document = $document;
|
||||
$this->offset = 0;
|
||||
$this->output = array();
|
||||
$this->stack = array();
|
||||
$this->document = $document;
|
||||
$this->offset = 0;
|
||||
$this->output = array();
|
||||
$this->stack = array();
|
||||
$this->empty_attrs = json_decode( '{}', true );
|
||||
|
||||
do {
|
||||
// twiddle our thumbs
|
||||
@@ -254,14 +278,14 @@ class WP_Block_Parser {
|
||||
);
|
||||
}
|
||||
|
||||
$this->output[] = (array) new WP_Block_Parser_Block( $block_name, $attrs, array(), '' );
|
||||
$this->output[] = (array) new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() );
|
||||
$this->offset = $start_offset + $token_length;
|
||||
return true;
|
||||
}
|
||||
|
||||
// otherwise we found an inner block
|
||||
$this->add_inner_block(
|
||||
new WP_Block_Parser_Block( $block_name, $attrs, array(), '' ),
|
||||
new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ),
|
||||
$start_offset,
|
||||
$token_length
|
||||
);
|
||||
@@ -273,7 +297,7 @@ class WP_Block_Parser {
|
||||
array_push(
|
||||
$this->stack,
|
||||
new WP_Block_Parser_Frame(
|
||||
new WP_Block_Parser_Block( $block_name, $attrs, array(), '' ),
|
||||
new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ),
|
||||
$start_offset,
|
||||
$token_length,
|
||||
$start_offset + $token_length,
|
||||
@@ -310,16 +334,11 @@ class WP_Block_Parser {
|
||||
* otherwise we're nested and we have to close out the current
|
||||
* block and add it as a new innerBlock to the parent
|
||||
*/
|
||||
$stack_top = array_pop( $this->stack );
|
||||
|
||||
$html = substr( $this->document, $stack_top->prev_offset, $start_offset - $stack_top->prev_offset );
|
||||
if ( $stack_top->block->innerBlocks ) {
|
||||
$stack_top->block->innerBlocks[] = (array) $this->freeform( $html );
|
||||
} else {
|
||||
$stack_top->block->innerHTML = $html;
|
||||
}
|
||||
|
||||
$stack_top->prev_offset = $start_offset + $token_length;
|
||||
$stack_top = array_pop( $this->stack );
|
||||
$html = substr( $this->document, $stack_top->prev_offset, $start_offset - $stack_top->prev_offset );
|
||||
$stack_top->block->innerHTML .= $html;
|
||||
$stack_top->block->innerContent[] = $html;
|
||||
$stack_top->prev_offset = $start_offset + $token_length;
|
||||
|
||||
$this->add_inner_block(
|
||||
$stack_top->block,
|
||||
@@ -359,7 +378,7 @@ class WP_Block_Parser {
|
||||
* match back in PHP to see which one it was.
|
||||
*/
|
||||
$has_match = preg_match(
|
||||
'/<!--\s+(?<closer>\/)?wp:(?<namespace>[a-z][a-z0-9_-]*\/)?(?<name>[a-z][a-z0-9_-]*)\s+(?<attrs>{(?:(?!}\s+-->).)+?}\s+)?(?<void>\/)?-->/s',
|
||||
'/<!--\s+(?<closer>\/)?wp:(?<namespace>[a-z][a-z0-9_-]*\/)?(?<name>[a-z][a-z0-9_-]*)\s+(?<attrs>{(?:[^}]+|}+(?=})|(?!}\s+-->).)*?}\s+)?(?<void>\/)?-->/s',
|
||||
$this->document,
|
||||
$matches,
|
||||
PREG_OFFSET_CAPTURE,
|
||||
@@ -387,7 +406,7 @@ class WP_Block_Parser {
|
||||
*/
|
||||
$attrs = $has_attrs
|
||||
? json_decode( $matches['attrs'][0], /* as-associative */ true )
|
||||
: json_decode( '{}', /* don't ask why, just verify in PHP */ false );
|
||||
: $this->empty_attrs;
|
||||
|
||||
/*
|
||||
* This state isn't allowed
|
||||
@@ -417,8 +436,8 @@ class WP_Block_Parser {
|
||||
* @param string $innerHTML HTML content of block
|
||||
* @return WP_Block_Parser_Block freeform block object
|
||||
*/
|
||||
static function freeform( $innerHTML ) {
|
||||
return new WP_Block_Parser_Block( null, array(), array(), $innerHTML );
|
||||
function freeform( $innerHTML ) {
|
||||
return new WP_Block_Parser_Block( null, $this->empty_attrs, array(), $innerHTML, array( $innerHTML ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -452,9 +471,16 @@ class WP_Block_Parser {
|
||||
*/
|
||||
function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_length, $last_offset = null ) {
|
||||
$parent = $this->stack[ count( $this->stack ) - 1 ];
|
||||
$parent->block->innerBlocks[] = (array) $this->freeform( substr( $this->document, $parent->prev_offset, $token_start - $parent->prev_offset ) );
|
||||
$parent->block->innerBlocks[] = (array) $block;
|
||||
$parent->prev_offset = $last_offset ? $last_offset : $token_start + $token_length;
|
||||
$html = substr( $this->document, $parent->prev_offset, $token_start - $parent->prev_offset );
|
||||
|
||||
if ( ! empty( $html ) ) {
|
||||
$parent->block->innerHTML .= $html;
|
||||
$parent->block->innerContent[] = $html;
|
||||
}
|
||||
|
||||
$parent->block->innerContent[] = null;
|
||||
$parent->prev_offset = $last_offset ? $last_offset : $token_start + $token_length;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -472,10 +498,9 @@ class WP_Block_Parser {
|
||||
? substr( $this->document, $prev_offset, $end_offset - $prev_offset )
|
||||
: substr( $this->document, $prev_offset );
|
||||
|
||||
if ( $stack_top->block->innerBlocks ) {
|
||||
$stack_top->block->innerBlocks[] = (array) $this->freeform( $html );
|
||||
} else {
|
||||
$stack_top->block->innerHTML = $html;
|
||||
if ( ! empty( $html ) ) {
|
||||
$stack_top->block->innerHTML .= $html;
|
||||
$stack_top->block->innerContent[] = $html;
|
||||
}
|
||||
|
||||
if ( isset( $stack_top->leading_html_start ) ) {
|
||||
|
||||
Reference in New Issue
Block a user