From ef3039872ad4bc9d332a1e4aec8c37db929ba821 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Mon, 18 Sep 2023 20:13:36 +0200 Subject: [PATCH 1/9] serialize_blocks: Move callback invocation around --- src/wp-includes/blocks.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index bef4ea3bce6e8..9d65020ccd2f4 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -856,15 +856,15 @@ function get_comment_delimited_block_content( $block_name, $block_attributes, $b * @return string String of rendered HTML. */ function serialize_block( $block, $callback = null ) { - if ( is_callable( $callback ) ) { - $block = call_user_func( $callback, $block ); - } - $block_content = ''; $index = 0; foreach ( $block['innerContent'] as $chunk ) { - $block_content .= is_string( $chunk ) ? $chunk : serialize_block( $block['innerBlocks'][ $index++ ], $callback ); + $inner_block = $block['innerBlocks'][ $index++ ]; + if ( is_callable( $callback ) ) { + $inner_block = call_user_func( $callback, $inner_block ); + } + $block_content .= is_string( $chunk ) ? $chunk : serialize_block( $inner_block, $callback ); } if ( ! is_array( $block['attrs'] ) ) { @@ -892,6 +892,9 @@ function serialize_block( $block, $callback = null ) { function serialize_blocks( $blocks, $callback = null ) { $result = ''; foreach ( $blocks as $block ) { + if ( is_callable( $callback ) ) { + $block = call_user_func( $callback, $block ); + } $result .= serialize_block( $block, $callback ); } return $result; From 7d457acf936648d793844db4abf9ddebc27ed409 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Mon, 18 Sep 2023 20:14:14 +0200 Subject: [PATCH 2/9] Pass parent to callback --- src/wp-includes/blocks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 9d65020ccd2f4..2849442195008 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -862,7 +862,7 @@ function serialize_block( $block, $callback = null ) { foreach ( $block['innerContent'] as $chunk ) { $inner_block = $block['innerBlocks'][ $index++ ]; if ( is_callable( $callback ) ) { - $inner_block = call_user_func( $callback, $inner_block ); + $inner_block = call_user_func( $callback, $inner_block, $block ); } $block_content .= is_string( $chunk ) ? $chunk : serialize_block( $inner_block, $callback ); } From 1314cbd40bda820b1e61146cf2ab07e9a56f258c Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Mon, 18 Sep 2023 20:23:46 +0200 Subject: [PATCH 3/9] Ugh, fix --- src/wp-includes/blocks.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 2849442195008..4c53d182ce48c 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -860,11 +860,15 @@ function serialize_block( $block, $callback = null ) { $index = 0; foreach ( $block['innerContent'] as $chunk ) { - $inner_block = $block['innerBlocks'][ $index++ ]; - if ( is_callable( $callback ) ) { - $inner_block = call_user_func( $callback, $inner_block, $block ); + if ( is_string( $chunk ) ) { + $block_content .= $chunk; + } else { + $inner_block = $block['innerBlocks'][ $index++ ]; + if ( is_callable( $callback ) ) { + $inner_block = call_user_func( $callback, $inner_block, $block ); + } + $block_content .= serialize_block( $inner_block, $callback ); } - $block_content .= is_string( $chunk ) ? $chunk : serialize_block( $inner_block, $callback ); } if ( ! is_array( $block['attrs'] ) ) { From 2c6309c49704c362561a3ee8684cad40b3c2c294 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Mon, 18 Sep 2023 20:25:17 +0200 Subject: [PATCH 4/9] Increment later --- src/wp-includes/blocks.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 4c53d182ce48c..66a4bc732cab0 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -863,10 +863,11 @@ function serialize_block( $block, $callback = null ) { if ( is_string( $chunk ) ) { $block_content .= $chunk; } else { - $inner_block = $block['innerBlocks'][ $index++ ]; + $inner_block = $block['innerBlocks'][ $index ]; if ( is_callable( $callback ) ) { $inner_block = call_user_func( $callback, $inner_block, $block ); } + $index++; $block_content .= serialize_block( $inner_block, $callback ); } } From 5b0c8e1aab0b796a96da13fc54fd94e03ef90d5e Mon Sep 17 00:00:00 2001 From: Bernie Reiter <96308+ockham@users.noreply.github.com> Date: Tue, 19 Sep 2023 09:30:20 +0200 Subject: [PATCH 5/9] Pass block index to callback --- src/wp-includes/blocks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 66a4bc732cab0..6773700da25c7 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -865,7 +865,7 @@ function serialize_block( $block, $callback = null ) { } else { $inner_block = $block['innerBlocks'][ $index ]; if ( is_callable( $callback ) ) { - $inner_block = call_user_func( $callback, $inner_block, $block ); + $inner_block = call_user_func( $callback, $inner_block, $block, $index ); } $index++; $block_content .= serialize_block( $inner_block, $callback ); From 681613dcba1d2aa2e37472ff5ea1ea3b43dd0126 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Tue, 19 Sep 2023 09:31:10 +0200 Subject: [PATCH 6/9] Rename index to block_index --- src/wp-includes/blocks.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 6773700da25c7..f2cdf90409d4b 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -858,16 +858,16 @@ function get_comment_delimited_block_content( $block_name, $block_attributes, $b function serialize_block( $block, $callback = null ) { $block_content = ''; - $index = 0; + $block_index = 0; foreach ( $block['innerContent'] as $chunk ) { if ( is_string( $chunk ) ) { $block_content .= $chunk; } else { - $inner_block = $block['innerBlocks'][ $index ]; + $inner_block = $block['innerBlocks'][ $block_index ]; if ( is_callable( $callback ) ) { - $inner_block = call_user_func( $callback, $inner_block, $block, $index ); + $inner_block = call_user_func( $callback, $inner_block, $block, $block_index ); } - $index++; + $block_index++; $block_content .= serialize_block( $inner_block, $callback ); } } From bf9ee4ce3e3178bb3141ab371fd436ddd920d22e Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Tue, 19 Sep 2023 09:32:20 +0200 Subject: [PATCH 7/9] Pass chunk_index to callback --- src/wp-includes/blocks.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index f2cdf90409d4b..ee789763f034a 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -859,13 +859,13 @@ function serialize_block( $block, $callback = null ) { $block_content = ''; $block_index = 0; - foreach ( $block['innerContent'] as $chunk ) { + foreach ( $block['innerContent'] as $chunk_index => $chunk ) { if ( is_string( $chunk ) ) { $block_content .= $chunk; } else { $inner_block = $block['innerBlocks'][ $block_index ]; if ( is_callable( $callback ) ) { - $inner_block = call_user_func( $callback, $inner_block, $block, $block_index ); + $inner_block = call_user_func( $callback, $inner_block, $block, $block_index, $chunk_index ); } $block_index++; $block_content .= serialize_block( $inner_block, $callback ); From 1098ef22ab0e049a85b49849d09038724a91d7cc Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Tue, 19 Sep 2023 09:33:59 +0200 Subject: [PATCH 8/9] Add PHPDoc explanation --- src/wp-includes/blocks.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index ee789763f034a..c6e4f12c47131 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -853,6 +853,7 @@ function get_comment_delimited_block_content( $block_name, $block_attributes, $b * * @param array $block A representative array of a single parsed block object. See WP_Block_Parser_Block. * @param callable|null $callback Optional. Callback to run on each block in the tree before serialization. Default null. + * It is called with the following arguments: $block, $parent_block, $block_index, $chunk_index. * @return string String of rendered HTML. */ function serialize_block( $block, $callback = null ) { @@ -892,6 +893,7 @@ function serialize_block( $block, $callback = null ) { * * @param array[] $blocks An array of representative arrays of parsed block objects. See serialize_block(). * @param callable|null $callback Optional. Callback to run on each block in the tree before serialization. Default null. + * It is called with the following arguments: $block, $parent_block, $block_index, $chunk_index. * @return string String of rendered HTML. */ function serialize_blocks( $blocks, $callback = null ) { From 04a8d1a0c5deda3e37412296433c2b740645b357 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Tue, 19 Sep 2023 09:36:49 +0200 Subject: [PATCH 9/9] Add explanatory comment --- src/wp-includes/blocks.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index c6e4f12c47131..59888736f7c5d 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -900,6 +900,7 @@ function serialize_blocks( $blocks, $callback = null ) { $result = ''; foreach ( $blocks as $block ) { if ( is_callable( $callback ) ) { + // At the top level, there is no parent block, block index, or chunk index to pass to the callback. $block = call_user_func( $callback, $block ); } $result .= serialize_block( $block, $callback );