WP_HTML_Unsupported_Exception

Exception thrown when the HTML processor encounters unsupported markup.

Source: wp-includes/html-api/class-wp-html-unsupported-exception.php
Since: 6.4.0
Since: 6.7.0 Gained contextual debugging information
Access: private
Extends: Exception


Overview

The HTML API aims to operate in compliance with the HTML5 specification but does not implement the full specification. When it encounters markup it cannot handle safely, it throws this exception rather than producing incorrect output.

This exception is caught internally by the processor and causes parsing to stop gracefully.


Properties

token_name

public $token_name;

Type: string

Normalized name of the matched token when the exception was raised. This doesn’t necessarily mean the token itself was unsupported — it may have triggered an unsupported code path.


token_at

public $token_at;

Type: int

Byte offset into the input HTML where the parser was when the exception was raised.


token

public $token;

Type: string

Full raw text of the matched token. Unlike token_name, this preserves original casing, duplicated attributes, and other syntactic variations.


stack_of_open_elements

public $stack_of_open_elements = array();

Type: string[]

List of element names that were open when the exception was raised. Useful for understanding the parsing context.


active_formatting_elements

public $active_formatting_elements = array();

Type: string[]

List of active formatting element names when the exception was raised.


Methods

__construct()

Creates an unsupported exception with context.

public function __construct(
    string $message,
    string $token_name,
    int $token_at,
    string $token,
    array $stack_of_open_elements,
    array $active_formatting_elements
)
Parameter Type Description
$message string Explanation of what is unsupported
$token_name string Normalized token name
$token_at int Byte offset of token
$token string Raw token text
$stack_of_open_elements string[] Open element names
$active_formatting_elements string[] Formatting element names

Usage Example

$processor = WP_HTML_Processor::create_fragment( $html );

while ( $processor->next_tag() ) {
    // Process tags...
}

// Check if parsing stopped due to unsupported markup
if ( $processor->get_last_error() ) {
    $exception = $processor->get_unsupported_exception();
    
    if ( $exception ) {
        echo "Unsupported: " . $exception->getMessage() . "n";
        echo "Token: " . $exception->token_name . "n";
        echo "At byte: " . $exception->token_at . "n";
        echo "Raw: " . $exception->token . "n";
        echo "Stack: " . implode( ' > ', $exception->stack_of_open_elements ) . "n";
    }
}

Common Causes

Adoption Agency Algorithm

Complex tag nesting that requires the adoption agency algorithm:

<p><b>Bold <i>Both</b> Italic</i></p>

Foster Parenting

Tables with improperly nested content:

<table><div>This content needs foster parenting</div></table>

Unsupported Elements

Some elements may trigger unsupported code paths in certain contexts.


Debugging Parse Failures

The exception provides all context needed to reproduce and debug failures:

$exception = $processor->get_unsupported_exception();

if ( $exception ) {
    // Show context around the failure
    $html = $processor->get_updated_html();
    $context_start = max( 0, $exception->token_at - 50 );
    $context = substr( $html, $context_start, 100 );
    
    echo "Context: ...{$context}...n";
    echo "Stack: " . implode( ' > ', $exception->stack_of_open_elements ) . "n";
    echo "Formatting: " . implode( ', ', $exception->active_formatting_elements ) . "n";
}