Skip to content

Commit

Permalink
Bits: Introduce the ability to store and render bits
Browse files Browse the repository at this point in the history
  • Loading branch information
dmsnell committed Jun 15, 2024
1 parent dc6c8c8 commit ae96143
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/wp-includes/blocks.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
77 changes: 77 additions & 0 deletions src/wp-includes/html-api/class-wp-bits.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php

function wp_replace_bits( $content ) {
$processor = new class ( $content ) extends WP_HTML_Tag_Processor {
private $deferred_updates = array();

public function replace_token( $new_content ) {
$this->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( '<b>bl<em>ar</em>g</b>' );
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(
'~<//wp:([^>]+)>~',
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( '~^<//wp:([^>]+)>$~', $text ) ) {
$processor->replace_token( '<b>Bla<em>rg</em>!</b>' );
break;
}

$new_value = preg_replace_callback(
'~<//wp:([^>]+)>~',
static function ( $bit ) {
return 'blarg';
},
$text
);

$processor->replace_token( "<!--{$new_value}-->" );
break;
}
}
$processor->flush_updates();
$content = $processor->get_updated_html();

return $content;
}
1 change: 1 addition & 0 deletions src/wp-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down

0 comments on commit ae96143

Please sign in to comment.