Skip to content
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
Block Settings/Support: Use Tag Processor to inject class name on wra…
…pper.

When we introduced #42124 new block supports behavior we did so with a
PCRE replacement that opened the possibility for a few bugs related to
processing the HTML attributes. It was noted in that PR that this would
be a good candidate for the `WP_HTML_Tag_Processor`.

In this patch we're performing that replacement as follow-up work. This
should improve the reliability and hopefully the readability of what is
being done to the HTML as it renders.
  • Loading branch information
dmsnell committed Jan 11, 2023
commit b187df818db92099c12803fe58a9622e53f0d37b
25 changes: 5 additions & 20 deletions lib/block-supports/elements.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,29 +49,14 @@ function gutenberg_render_elements_support( $block_content, $block ) {
return $block_content;
}

$class_name = gutenberg_get_elements_class_name( $block );

// Like the layout hook this assumes the hook only applies to blocks with a single wrapper.
// Retrieve the opening tag of the first HTML element.
$html_element_matches = array();
preg_match( '/<[^>]+>/', $block_content, $html_element_matches, PREG_OFFSET_CAPTURE );
$first_element = $html_element_matches[0][0];
// If the first HTML element has a class attribute just add the new class
// as we do on layout and duotone.
if ( str_contains( $first_element, 'class="' ) ) {
$content = preg_replace(
'/' . preg_quote( 'class="', '/' ) . '/',
'class="' . $class_name . ' ',
$block_content,
1
);
} else {
// If the first HTML element has no class attribute we should inject the attribute before the attribute at the end.
$first_element_offset = $html_element_matches[0][1];
$content = substr_replace( $block_content, ' class="' . $class_name . '"', $first_element_offset + strlen( $first_element ) - 1, 0 );
// Add the class name to the first element, presuming it's the wrapper, if it exists.
$tags = new WP_HTML_Tag_Processor( $block_content );
if ( $tags->next_tag() ) {
$tags->add_class( gutenberg_get_elements_class_name( $block ) );
}

return $content;
return $tags->get_updated_html();
}

/**
Expand Down
25 changes: 5 additions & 20 deletions lib/block-supports/settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,29 +43,14 @@ function _gutenberg_add_block_level_presets_class( $block_content, $block ) {
return $block_content;
}

$class_name = _gutenberg_get_presets_class_name( $block );

// Like the layout hook this assumes the hook only applies to blocks with a single wrapper.
// Retrieve the opening tag of the first HTML element.
$html_element_matches = array();
preg_match( '/<[^>]+>/', $block_content, $html_element_matches, PREG_OFFSET_CAPTURE );
$first_element = $html_element_matches[0][0];
// If the first HTML element has a class attribute just add the new class
// as we do on layout and duotone.
if ( strpos( $first_element, 'class="' ) !== false ) {
$content = preg_replace(
'/' . preg_quote( 'class="', '/' ) . '/',
'class="' . $class_name . ' ',
$block_content,
1
);
} else {
// If the first HTML element has no class attribute we should inject the attribute before the attribute at the end.
$first_element_offset = $html_element_matches[0][1];
$content = substr_replace( $block_content, ' class="' . $class_name . '"', $first_element_offset + strlen( $first_element ) - 1, 0 );
// Add the class name to the first element, presuming it's the wrapper, if it exists.
$tags = new WP_HTML_Tag_Processor( $block_content );
if ( $tags->next_tag() ) {
$tags->add_class( _gutenberg_get_presets_class_name( $block ) );
}

return $content;
return $tags->get_updated_html();
}

/**
Expand Down