From 07a35d5d41e7af66889ba951f3ce2ac4e5cfd80d Mon Sep 17 00:00:00 2001 From: dmsnell Date: Thu, 23 May 2024 23:37:12 +0000 Subject: [PATCH] HTML API: Add method to report depth of currently-matched node. The HTML Processor maintains a stack of open elements, where every element, every `#text` node, every HTML comment, and other node is pushed and popped while traversing the document. The "depth" of each of these nodes represents how deep that stack is where the node appears. Unfortunately this information isn't exposed to calling code, which has led different projects to attempt to calculate this value externally. This isn't always trivial, but the HTML Processor could make it so by exposing the internal knowledge in a new method. In this patch the `get_current_depth()` method returns just that. Since the processor always exists within a context, the depth includes nesting from the always-present html element and also the body, since currently the HTML Processor only supports parsing in the IN BODY context. This means that the depth reported for the `DIV` in `
` is 3, not 1, because its breadcrumbs path is `HTML > BODY > DIV`. Developed in https://github.com/WordPress/wordpress-develop/pull/6589 Discussed in https://core.trac.wordpress.org/ticket/61255 Fixes #61255. Props dmsnell, jonsurrell. Built from https://develop.svn.wordpress.org/trunk@58191 git-svn-id: http://core.svn.wordpress.org/trunk@57654 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- .../html-api/class-wp-html-processor.php | 29 +++++++++++++++++++ wp-includes/version.php | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/wp-includes/html-api/class-wp-html-processor.php b/wp-includes/html-api/class-wp-html-processor.php index 3b2efce1c9..e3100abc69 100644 --- a/wp-includes/html-api/class-wp-html-processor.php +++ b/wp-includes/html-api/class-wp-html-processor.php @@ -623,6 +623,35 @@ class WP_HTML_Processor extends WP_HTML_Tag_Processor { return $breadcrumbs; } + /** + * Returns the nesting depth of the current location in the document. + * + * Example: + * + * $processor = WP_HTML_Processor::create_fragment( '

' ); + * // The processor starts in the BODY context, meaning it has depth from the start: HTML > BODY. + * 2 === $processor->get_current_depth(); + * + * // Opening the DIV element increases the depth. + * $processor->next_token(); + * 3 === $processor->get_current_depth(); + * + * // Opening the P element increases the depth. + * $processor->next_token(); + * 4 === $processor->get_current_depth(); + * + * // The P element is closed during `next_token()` so the depth is decreased to reflect that. + * $processor->next_token(); + * 3 === $processor->get_current_depth(); + * + * @since 6.6.0 + * + * @return int Nesting-depth of current location in the document. + */ + public function get_current_depth() { + return $this->state->stack_of_open_elements->count(); + } + /** * Parses next element in the 'in body' insertion mode. * diff --git a/wp-includes/version.php b/wp-includes/version.php index 35cb8ebfd9..1cfc031679 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.6-alpha-58190'; +$wp_version = '6.6-alpha-58191'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.