Make WordPress Core

Changeset 56274

07/20/2023 01:41:21 PM (7 months ago)
Bernhard Reiter

HTML-API: Introduce minimal HTML Processor.

This patch introduces the first of many iterations on the evolution of the HTML API, the HTML Processor, which is built in order to understand HTML structure including nesting, misnesting, and complicated semantic rules.

In the first iteration, the HTML Processor is arbitrarily limited to a minimal subset of functionality so that we can review it, ship it, test it, and collect feedback before moving forward. This means that this patch is more or less an extension to the Tag Processor query language, providing the ability not only to scan for a tag of a given name, but also to find an HTML element in a specific nesting path.

The HTML Processor also aborts any time it encounters:

  • a tag that isn't a P, DIV, FIGURE, FIGCAPTION, IMG, STRONG, B, EM, I, A, BIG, CODE, FONT, SMALL, STRIKE, TT, or U tag. this limit exists because many HTML elements require specific rules and we are trying to limit the number of rules introduced at once. this work is targeted at existing work in places like the image block.
  • certain misnesting constructs that evoke complicated resolution inside the HTML spec. where possible and where simple to do reliably, certain parse errors are handled. in most cases the HTML Processor aborts.

The structure of the HTML Processor is established in this patch. Further spec-compliance comes through filling out more of the same kind and nature of code as is found in this patch. Certain critical HTML algorithms are partially supported, and where support requires more than is present, the HTML Processor acknowledges this and refuses to operate.

In this patch are explorations for how to verify that new HTML support is fully added (instead of allowing for partial updates that leave some code paths non-compliant). Performance is hard to measure since support is so limited at the current time, but it should generally follow the performance of the Tag Processor somewhat close as the overhead is minimized as much as practical.

Props dmsnell, zieladam, costdev.
Fixes #58517.

9 added
2 edited


  • trunk/src/wp-includes/html-api/class-wp-html-tag-processor.php

    r56133 r56274  
    523523     *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
    524524     * }
    525      * @return boolean Whether a tag was matched.
     525     * @return bool Whether a tag was matched.
    526526     */
    527527    public function next_tag( $query = null ) {
    674674        }
    676         if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= self::MAX_BOOKMARKS ) {
     676        if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
    677677            _doing_it_wrong(
    678678                __METHOD__,
    15391539        }
    1541         if ( ++$this->seek_count > self::MAX_SEEK_OPS ) {
     1541        if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
    15421542            _doing_it_wrong(
    15431543                __METHOD__,
    22222222     * @since 6.2.0
    22232223     *
    2224      * @return boolean Whether the given tag and its attribute match the search criteria.
     2224     * @return bool Whether the given tag and its attribute match the search criteria.
    22252225     */
    22262226    private function matches() {
  • trunk/src/wp-settings.php

    r56241 r56274  
    240240require ABSPATH . WPINC . '/html-api/class-wp-html-text-replacement.php';
    241241require ABSPATH . WPINC . '/html-api/class-wp-html-tag-processor.php';
     242require ABSPATH . WPINC . '/html-api/class-wp-html-unsupported-exception.php';
     243require ABSPATH . WPINC . '/html-api/class-wp-html-active-formatting-elements.php';
     244require ABSPATH . WPINC . '/html-api/class-wp-html-open-elements.php';
     245require ABSPATH . WPINC . '/html-api/class-wp-html-token.php';
     246require ABSPATH . WPINC . '/html-api/class-wp-html-processor-state.php';
     247require ABSPATH . WPINC . '/html-api/class-wp-html-processor.php';
    242248require ABSPATH . WPINC . '/class-wp-http.php';
    243249require ABSPATH . WPINC . '/class-wp-http-streams.php';
Note: See TracChangeset for help on using the changeset viewer.