From ae96143ac825b079cd9a2b8836b798914e74147c Mon Sep 17 00:00:00 2001 From: Dennis Snell Date: Sun, 14 Apr 2024 20:34:17 +0200 Subject: [PATCH] Bits: Introduce the ability to store and render bits --- src/wp-includes/blocks.php | 2 + src/wp-includes/html-api/class-wp-bits.php | 77 ++++++++++++++++++++++ src/wp-settings.php | 1 + 3 files changed, 80 insertions(+) create mode 100644 src/wp-includes/html-api/class-wp-bits.php diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index decc4896c378a..032e08ffc7502 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -2057,6 +2057,8 @@ function render_block( $parsed_block ) { * } */ function parse_blocks( $content ) { + $content = wp_replace_bits( $content ); + /** * Filter to allow plugins to replace the server-side block parser. * diff --git a/src/wp-includes/html-api/class-wp-bits.php b/src/wp-includes/html-api/class-wp-bits.php new file mode 100644 index 0000000000000..a7652bf64da1c --- /dev/null +++ b/src/wp-includes/html-api/class-wp-bits.php @@ -0,0 +1,77 @@ +set_bookmark( 'here' ); + $here = $this->bookmarks['here']; + + $this->deferred_updates[] = new WP_HTML_Text_Replacement( + $here->start, + $here->length, + $new_content + ); + } + + public function flush_updates() { + foreach ( $this->deferred_updates as $update ) { + $this->lexical_updates[] = $update; + } + } + }; + + while ( $processor->next_token() ) { + switch ( $processor->get_token_type() ) { + case '#funky-comment': + $processor->replace_token( 'blarg' ); + break; + + case '#tag': + foreach ( $processor->get_attribute_names_with_prefix( '' ) ?? [] as $name ) { + $value = $processor->get_attribute( $name ); + if ( is_string( $value ) ) { + $new_value = preg_replace_callback( + '~]+)>~', + static function ( $bit ) { + return 'blarg'; + }, + $value + ); + + if ( $new_value !== $value ) { + $processor->set_attribute( $name, $new_value ); + } + } + } + break; + + case '#comment': + if ( WP_HTML_Tag_Processor::COMMENT_AS_HTML_COMMENT !== $processor->get_comment_type() ) { + break; + } + + $text = $processor->get_modifiable_text(); + if ( 1 === preg_match( '~^]+)>$~', $text ) ) { + $processor->replace_token( 'Blarg!' ); + break; + } + + $new_value = preg_replace_callback( + '~]+)>~', + static function ( $bit ) { + return 'blarg'; + }, + $text + ); + + $processor->replace_token( "" ); + break; + } + } + $processor->flush_updates(); + $content = $processor->get_updated_html(); + + return $content; +} diff --git a/src/wp-settings.php b/src/wp-settings.php index a682c2a50380a..2e343f5d6ac06 100644 --- a/src/wp-settings.php +++ b/src/wp-settings.php @@ -262,6 +262,7 @@ require ABSPATH . WPINC . '/html-api/class-wp-html-stack-event.php'; require ABSPATH . WPINC . '/html-api/class-wp-html-processor-state.php'; require ABSPATH . WPINC . '/html-api/class-wp-html-processor.php'; +require ABSPATH . WPINC . '/html-api/class-wp-bits.php'; require ABSPATH . WPINC . '/class-wp-http.php'; require ABSPATH . WPINC . '/class-wp-http-streams.php'; require ABSPATH . WPINC . '/class-wp-http-curl.php';