diff --git a/wp-includes/html-api/class-wp-html-processor.php b/wp-includes/html-api/class-wp-html-processor.php index 68bd3418f2..c8e898389c 100644 --- a/wp-includes/html-api/class-wp-html-processor.php +++ b/wp-includes/html-api/class-wp-html-processor.php @@ -626,6 +626,37 @@ class WP_HTML_Processor extends WP_HTML_Tag_Processor { $this->insert_html_element( $this->current_token ); return true; + /* + * > Any other start tag + */ + case '+SPAN': + $this->reconstruct_active_formatting_elements(); + $this->insert_html_element( $this->current_token ); + return true; + + /* + * Any other end tag + */ + case '-SPAN': + foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) { + // > If node is an HTML element with the same tag name as the token, then: + if ( $item->node_name === $tag_name ) { + $this->generate_implied_end_tags( $tag_name ); + + // > If node is not the current node, then this is a parse error. + + $this->state->stack_of_open_elements->pop_until( $tag_name ); + return true; + } + + // > Otherwise, if node is in the special category, then this is a parse error; ignore the token, and return. + if ( self::is_special( $item->node_name ) ) { + return $this->step(); + } + } + // Execution should not reach here; if it does then something went wrong. + return false; + default: $this->last_error = self::ERROR_UNSUPPORTED; throw new WP_HTML_Unsupported_Exception( "Cannot process {$tag_name} element." ); @@ -873,7 +904,7 @@ class WP_HTML_Processor extends WP_HTML_Tag_Processor { * * @since 6.4.0 * - * @throws Exception + * @throws WP_HTML_Unsupported_Exception * * @see https://html.spec.whatwg.org/#generate-implied-end-tags * @@ -893,6 +924,26 @@ class WP_HTML_Processor extends WP_HTML_Tag_Processor { } } + /* + * Closes elements that have implied end tags, thoroughly. + * + * See the HTML specification for an explanation why this is + * different from {@see WP_HTML_Processor::generate_implied_end_tags}. + * + * @since 6.4.0 + * + * @see https://html.spec.whatwg.org/#generate-implied-end-tags + */ + private function generate_implied_end_tags_thoroughly() { + $elements_with_implied_end_tags = array( + 'P', + ); + + while ( in_array( $this->state->stack_of_open_elements->current_node(), $elements_with_implied_end_tags, true ) ) { + $this->state->stack_of_open_elements->pop(); + } + } + /** * Reconstructs the active formatting elements. * diff --git a/wp-includes/version.php b/wp-includes/version.php index c754fddf6a..8e0bc25952 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.4-alpha-56329'; +$wp_version = '6.4-alpha-56331'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.