Skip to content

Commit

Permalink
Block Settings/Support: Use Tag Processor to inject class name on wra…
Browse files Browse the repository at this point in the history
…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
1 parent fb98795 commit b187df8
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 40 deletions.
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

1 comment on commit b187df8

@github-actions
Copy link

Choose a reason for hiding this comment

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

Flaky tests detected in b187df8.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/3897843961
📝 Reported issues:

Please sign in to comment.