PHP code example of automattic / block-delimiter
1. Go to this page and download the library: Download automattic/block-delimiter library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
automattic / block-delimiter example snippets
use Automattic\Block_Delimiter;
$post_content = '<!-- wp:paragraph -->
<p>Hello world!</p>
<!-- /wp:paragraph -->
<!-- wp:image {"id":123} -->
<figure><img src="example.jpg" /></figure>
<!-- /wp:image -->';
foreach ( Block_Delimiter::scan_delimiters( $post_content ) as $where => $delimiter ) {
// $where is an array: [ byte_offset, byte_length ]
// $delimiter is a Block_Delimiter instance
echo "Found block: " . $delimiter->allocate_and_return_block_type() . "\n";
echo "Type: " . $delimiter->get_delimiter_type() . "\n";
}
use Automattic\Block_Delimiter;
$post_content = '<!-- wp:paragraph -->
<p>Welcome to my blog!</p>
<!-- /wp:paragraph -->
<!-- wp:image {"id":456} -->
<figure><img src="photo.jpg" /></figure>
<!-- /wp:image -->
<!-- wp:gallery {"ids":[789,101]} -->
<figure class="wp-block-gallery">...</figure>
<!-- /wp:gallery -->';
// Find the first image block
foreach ( Block_Delimiter::scan_delimiters( $post_content ) as $delimiter ) {
if ( ! $delimiter->is_block_type( 'image' ) ) {
continue;
}
if ( Block_Delimiter::OPENER === $delimiter->get_delimiter_type() ) {
$attributes = $delimiter->allocate_and_return_parsed_attributes();
if ( isset( $attributes['id'] ) ) {
echo "Found image with ID: " . $attributes['id'];
break;
}
}
}
use Automattic\Block_Delimiter;
$post_content = '<!-- wp:paragraph {"fontSize":"large"} -->
<p class="has-large-font-size">This paragraph has a large font size.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>This paragraph has no custom font size.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph {"fontSize":"small","textColor":"primary"} -->
<p class="has-primary-color has-small-font-size">This paragraph has a small font size and primary color.</p>
<!-- /wp:paragraph -->';
foreach ( Block_Delimiter::scan_delimiters( $post_content ) as $delimiter ) {
if ( $delimiter->is_block_type( 'core/paragraph' ) &&
Block_Delimiter::OPENER === $delimiter->get_delimiter_type() ) {
$attributes = $delimiter->allocate_and_return_parsed_attributes();
if ( isset( $attributes['fontSize'] ) ) {
echo "Paragraph with font size: " . $attributes['fontSize'] . "\n";
}
}
}
use Automattic\Block_Delimiter;
$post_content = '<!-- wp:heading {"level":2} -->
<h2>My Blog Post</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Introduction paragraph.</p>
<!-- /wp:paragraph -->
<!-- wp:image {"id":123} -->
<figure><img src="hero.jpg" /></figure>
<!-- /wp:image -->
<!-- wp:paragraph -->
<p>Another paragraph.</p>
<!-- /wp:paragraph -->
<!-- wp:list -->
<ul><li>Item 1</li><li>Item 2</li></ul>
<!-- /wp:list -->';
function get_block_types_in( string $html ): array {
$block_types = [];
foreach ( Block_Delimiter::scan_delimiters( $html ) as $delimiter ) {
if ( Block_Delimiter::OPENER === $delimiter->get_delimiter_type() ) {
$block_types[ $delimiter->allocate_and_return_block_type() ] = true;
}
}
$block_types = array_keys( $block_types );
sort( $block_types );
return $block_types;
}
$block_types = get_block_types_in( $post_content );
print_r( $block_types );
use Automattic\Block_Delimiter;
$post_content = '<!-- wp:paragraph -->
<p>First paragraph.</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":3} -->
<h3>Section Title</h3>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Second paragraph with more content.</p>
<!-- /wp:paragraph -->';
function extract_block( string $block_name, string $html ): ?string {
$depth = 0;
$starts_at = null;
foreach ( Block_Delimiter::scan_delimiters( $html ) as $where => $delimiter ) {
if ( ! $delimiter->is_block_type( $block_name ) ) {
continue;
}
switch ( $delimiter->get_delimiter_type() ) {
case Block_Delimiter::VOID:
return substr( $html, $where[0], $where[1] );
case Block_Delimiter::OPENER:
$depth++;
$starts_at = $starts_at ?? $where[0];
break;
case Block_Delimiter::CLOSER:
if ( --$depth === 0 ) {
return substr( $html, $starts_at, $where[0] + $where[1] - $starts_at );
}
}
}
return null;
}
$heading_block = extract_block( 'heading', $post_content );
echo $heading_block;
use Automattic\Block_Delimiter;
$post_content = '<!-- wp:paragraph -->
<p>Some text content.</p>
<!-- /wp:paragraph -->
<!-- wp:image {"id":123} -->
<figure class="wp-block-image"><img src="photo1.jpg" /></figure>
<!-- /wp:image -->
<!-- wp:paragraph -->
<p>More text content.</p>
<!-- /wp:paragraph -->
<!-- wp:image {"id":456} -->
<figure class="wp-block-image"><img src="photo2.jpg" /></figure>
<!-- /wp:image -->';
function add_css_class_to_images( string $post_content, string $css_class ): string {
$output = '';
$starts_at = null;
$was_at = 0;
foreach ( Block_Delimiter::scan_delimiters( $post_content ) as $where => $delimiter ) {
if ( ! $delimiter->is_block_type( 'image' ) ) {
continue;
}
list( $at, $length ) = $where;
if ( Block_Delimiter::OPENER === $delimiter->get_delimiter_type() ) {
$starts_at = $at + $length;
} elseif ( Block_Delimiter::CLOSER === $delimiter->get_delimiter_type() ) {
// Copy untouched content before this block
$output .= substr( $post_content, $was_at, $starts_at - $was_at );
// Transform the block content
$block_content = substr( $post_content, $starts_at, $at - $starts_at );
$output .= add_css_class( $block_content, $css_class );
$was_at = $at;
}
}
// Add any remaining content
$output .= substr( $post_content, $was_at );
return $output;
}
function add_css_class( string $html, string $css_class ): string {
// Simple example - add class to figure elements
return str_replace( 'class="wp-block-image"', 'class="wp-block-image ' . $css_class . '"', $html );
}
$modified_content = add_css_class_to_images( $post_content, 'custom-image-style' );
echo $modified_content;
use Automattic\Block_Delimiter;
$post_content = '<!-- wp:paragraph {"invalid": json} -->
<p>This block has invalid JSON attributes.</p>
<!-- /wp:paragraph -->
<!-- wp:image -->
<figure><img src="valid.jpg" /></figure>
<!-- /wp:image -->';
foreach ( Block_Delimiter::scan_delimiters( $post_content ) as $delimiter ) {
if ( Block_Delimiter::OPENER === $delimiter->get_delimiter_type() ) {
$attributes = $delimiter->allocate_and_return_parsed_attributes();
if ( null === $attributes && $delimiter->get_last_json_error() !== JSON_ERROR_NONE ) {
echo "Invalid JSON in " . $delimiter->allocate_and_return_block_type() . " block\n";
} elseif ( is_array( $attributes ) ) {
echo "Valid " . $delimiter->allocate_and_return_block_type() . " block\n";
} else {
echo "No attributes in " . $delimiter->allocate_and_return_block_type() . " block\n";
}
}
}
// Check for incomplete input
$incomplete_content = '<!-- wp:paragraph';
$delimiter = Block_Delimiter::next_delimiter( $incomplete_content, 0 );
if ( null === $delimiter ) {
$error = Block_Delimiter::get_last_error();
if ( Block_Delimiter::INCOMPLETE_INPUT === $error ) {
echo "Document appears to be truncated\n";
}
}