<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[57179] trunk/src/wp-includes/html-api: HTML API: Track spans of text with (offset, length) instead of (start, end).</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/57179">57179</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/57179","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>zieladam</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2023-12-10 13:17:29 +0000 (Sun, 10 Dec 2023)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>HTML API: Track spans of text with (offset, length) instead of (start, end).

Updates the internal representation of the text span coordinates. The mixture of (offset, length) and (start, end) coordinates becomes confusing, this commit replaces it with a (offset, length) pair. There should be no functional or behavioral changes in this patch. For the internal helper classes this patch introduces breaking changes, but those classes are marked private and should not be used outside of the HTML API itself.

Props dmsnell.
Fixes <a href="https://core.trac.wordpress.org/ticket/59993">#59993</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpincludeshtmlapiclasswphtmlattributetokenphp">trunk/src/wp-includes/html-api/class-wp-html-attribute-token.php</a></li>
<li><a href="#trunksrcwpincludeshtmlapiclasswphtmlspanphp">trunk/src/wp-includes/html-api/class-wp-html-span.php</a></li>
<li><a href="#trunksrcwpincludeshtmlapiclasswphtmltagprocessorphp">trunk/src/wp-includes/html-api/class-wp-html-tag-processor.php</a></li>
<li><a href="#trunksrcwpincludeshtmlapiclasswphtmltextreplacementphp">trunk/src/wp-includes/html-api/class-wp-html-text-replacement.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpincludeshtmlapiclasswphtmlattributetokenphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/html-api/class-wp-html-attribute-token.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/html-api/class-wp-html-attribute-token.php  2023-12-10 10:34:12 UTC (rev 57178)
+++ trunk/src/wp-includes/html-api/class-wp-html-attribute-token.php    2023-12-10 13:17:29 UTC (rev 57179)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -15,6 +15,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @access private
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @see WP_HTML_Tag_Processor
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -23,6 +24,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * Attribute name.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var string
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public $name;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -31,6 +33,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * Attribute value.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public $value_starts_at;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -39,6 +42,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * How many bytes the value occupies in the input HTML.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public $value_length;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -47,22 +51,43 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * The string offset where the attribute name starts.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public $start;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * The string offset after the attribute value or its name.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * Byte length of text spanning the attribute inside a tag.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @since 6.2.0
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * This span starts at the first character of the attribute name
+        * and it ends after one of three cases:
+        *
+        *  - at the end of the attribute name for boolean attributes.
+        *  - at the end of the value for unquoted attributes.
+        *  - at the final single or double quote for quoted attributes.
+        *
+        * Example:
+        *
+        *     <div class="post">
+        *          ------------ length is 12, including quotes
+        *
+        *     <input type="checked" checked id="selector">
+        *                           ------- length is 6
+        *
+        *     <a rel=noopener>
+        *        ------------ length is 11
+        *
+        * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
+        *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public $end;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ public $length;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Whether the attribute is a boolean attribute with value `true`.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var bool
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public $is_true;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -71,20 +96,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * Constructor.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><span class="cx" style="display: block; padding: 0 10px">         * @param string $name         Attribute name.
</span><span class="cx" style="display: block; padding: 0 10px">         * @param int    $value_start  Attribute value.
</span><span class="cx" style="display: block; padding: 0 10px">         * @param int    $value_length Number of bytes attribute value spans.
</span><span class="cx" style="display: block; padding: 0 10px">         * @param int    $start        The string offset where the attribute name starts.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param int    $end          The string offset after the attribute value or its name.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
</ins><span class="cx" style="display: block; padding: 0 10px">          * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function __construct( $name, $value_start, $value_length, $start, $end, $is_true ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->name            = $name;
</span><span class="cx" style="display: block; padding: 0 10px">                $this->value_starts_at = $value_start;
</span><span class="cx" style="display: block; padding: 0 10px">                $this->value_length    = $value_length;
</span><span class="cx" style="display: block; padding: 0 10px">                $this->start           = $start;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->end             = $end;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->length          = $length;
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->is_true         = $is_true;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="trunksrcwpincludeshtmlapiclasswphtmlspanphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/html-api/class-wp-html-span.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/html-api/class-wp-html-span.php     2023-12-10 10:34:12 UTC (rev 57178)
+++ trunk/src/wp-includes/html-api/class-wp-html-span.php       2023-12-10 13:17:29 UTC (rev 57179)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -18,6 +18,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @access private
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 6.5.0 Replaced `end` with `length` to more closely align with `substr()`.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @see WP_HTML_Tag_Processor
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -26,17 +27,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * Byte offset into document where span begins.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public $start;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * Byte offset into document where span ends.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * Byte length of this span.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @since 6.2.0
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @since 6.5.0
+        *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public $end;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ public $length;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Constructor.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -43,11 +46,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param int $start Byte offset into document where replacement span begins.
-        * @param int $end   Byte offset into document where replacement span ends.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param int $start  Byte offset into document where replacement span begins.
+        * @param int $length Byte length of span.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function __construct( $start, $end ) {
-               $this->start = $start;
-               $this->end   = $end;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ public function __construct( $start, $length ) {
+               $this->start  = $start;
+               $this->length = $length;
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="trunksrcwpincludeshtmlapiclasswphtmltagprocessorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/html-api/class-wp-html-tag-processor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/html-api/class-wp-html-tag-processor.php    2023-12-10 10:34:12 UTC (rev 57178)
+++ trunk/src/wp-includes/html-api/class-wp-html-tag-processor.php      2023-12-10 13:17:29 UTC (rev 57179)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -329,47 +329,68 @@
</span><span class="cx" style="display: block; padding: 0 10px">        private $bytes_already_parsed = 0;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * Byte offset in input document where current tag name starts.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * Byte offset in input document where current token starts.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><span class="cx" style="display: block; padding: 0 10px">         * Example:
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         *     <div id="test">...
</span><span class="cx" style="display: block; padding: 0 10px">         *     01234
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         *      - tag name starts at 1
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  *     - token starts at 0
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @since 6.2.0
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @since 6.5.0
+        *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int|null
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        private $tag_name_starts_at;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ private $token_starts_at;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * Byte length of current tag name.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * Byte length of current token.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><span class="cx" style="display: block; padding: 0 10px">         * Example:
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         *     <div id="test">...
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *     012345678901234
+        *     - token length is 14 - 0 = 14
+        *
+        *     a <!-- comment --> is a token.
+        *     0123456789 123456789 123456789
+        *     - token length is 17 - 2 = 15
+        *
+        * @since 6.5.0
+        *
+        * @var int|null
+        */
+       private $token_length;
+
+       /**
+        * Byte offset in input document where current tag name starts.
+        *
+        * Example:
+        *
+        *     <div id="test">...
</ins><span class="cx" style="display: block; padding: 0 10px">          *     01234
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         *      --- tag name length is 3
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  *      - tag name starts at 1
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int|null
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        private $tag_name_length;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ private $tag_name_starts_at;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * Byte offset in input document where current tag token ends.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * Byte length of current tag name.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><span class="cx" style="display: block; padding: 0 10px">         * Example:
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         *     <div id="test">...
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         *     0         1   |
-        *     01234567890123456
-        *      --- tag name ends at 14
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  *     01234
+        *      --- tag name length is 3
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int|null
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        private $tag_ends_at;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ private $tag_name_length;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -388,14 +409,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
</span><span class="cx" style="display: block; padding: 0 10px">         *     //                 ^ parsing will continue from this point.
</span><span class="cx" style="display: block; padding: 0 10px">         *     $this->attributes = array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         *         'id' => new WP_HTML_Attribute_Match( 'id', null, 6, 17 )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
</ins><span class="cx" style="display: block; padding: 0 10px">          *     );
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         *     // When picking up parsing again, or when asking to find the
</span><span class="cx" style="display: block; padding: 0 10px">         *     // `class` attribute we will continue and add to this array.
</span><span class="cx" style="display: block; padding: 0 10px">         *     $this->attributes = array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         *         'id'    => new WP_HTML_Attribute_Match( 'id', null, 6, 17 ),
-        *         'class' => new WP_HTML_Attribute_Match( 'class', 'outline', 18, 32 )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
+        *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
</ins><span class="cx" style="display: block; padding: 0 10px">          *     );
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         *     // Note that only the `class` attribute value is stored in the index.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -484,9 +505,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         *     // Replace an attribute stored with a new value, indices
</span><span class="cx" style="display: block; padding: 0 10px">         *     // sourced from the lazily-parsed HTML recognizer.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         *     $start = $attributes['src']->start;
-        *     $end   = $attributes['src']->end;
-        *     $modifications[] = new WP_HTML_Text_Replacement( $start, $end, $new_value );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  *     $start  = $attributes['src']->start;
+        *     $length = $attributes['src']->length;
+        *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><span class="cx" style="display: block; padding: 0 10px">         *     // Correspondingly, something like this will appear in this array.
</span><span class="cx" style="display: block; padding: 0 10px">         *     $lexical_updates = array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -566,7 +587,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( false === $tag_ends_at ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                return false;
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $this->tag_ends_at          = $tag_ends_at;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $this->token_length         = $tag_ends_at - $this->token_starts_at;
</ins><span class="cx" style="display: block; padding: 0 10px">                         $this->bytes_already_parsed = $tag_ends_at;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        // Finally, check if the parsed tag and its attributes match the search query.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -808,10 +829,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        return false;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->bookmarks[ $name ] = new WP_HTML_Span(
-                       $this->tag_name_starts_at - ( $this->is_closing_tag ? 2 : 1 ),
-                       $this->tag_ends_at
-               );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                return true;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -875,7 +893,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                while ( false !== $at && $at < $doc_length ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $at = strpos( $this->html, '</', $at );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        // If there is no possible tag closer then fail.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 // Fail if there is no possible tag closer.
</ins><span class="cx" style="display: block; padding: 0 10px">                         if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $this->bytes_already_parsed = $doc_length;
</span><span class="cx" style="display: block; padding: 0 10px">                                return false;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1093,6 +1111,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                return false;
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        $this->token_starts_at = $at;
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         if ( '/' === $this->html[ $at + 1 ] ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $this->is_closing_tag = true;
</span><span class="cx" style="display: block; padding: 0 10px">                                ++$at;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1381,7 +1401,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                $value_start,
</span><span class="cx" style="display: block; padding: 0 10px">                                $value_length,
</span><span class="cx" style="display: block; padding: 0 10px">                                $attribute_start,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $attribute_end,
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $attribute_end - $attribute_start,
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ! $has_value
</span><span class="cx" style="display: block; padding: 0 10px">                        );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1396,7 +1416,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 * an array when encountering duplicates avoids needless allocations in the
</span><span class="cx" style="display: block; padding: 0 10px">                 * normative case of parsing tags with no duplicate attributes.
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( null === $this->duplicate_attributes ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
</span><span class="cx" style="display: block; padding: 0 10px">                } elseif ( ! array_key_exists( $comparable_name, $this->duplicate_attributes ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1424,9 +1444,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        private function after_tag() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->get_updated_html();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $this->token_starts_at      = null;
+               $this->token_length         = null;
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->tag_name_starts_at   = null;
</span><span class="cx" style="display: block; padding: 0 10px">                $this->tag_name_length      = null;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->tag_ends_at          = null;
</del><span class="cx" style="display: block; padding: 0 10px">                 $this->is_closing_tag       = null;
</span><span class="cx" style="display: block; padding: 0 10px">                $this->attributes           = array();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->duplicate_attributes = null;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1606,7 +1627,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $bytes_already_copied = 0;
</span><span class="cx" style="display: block; padding: 0 10px">                $output_buffer        = '';
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $this->lexical_updates as $diff ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $shift = strlen( $diff->text ) - ( $diff->end - $diff->start );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $shift = strlen( $diff->text ) - $diff->length;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        // Adjust the cursor position by however much an update affects it.
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( $diff->start <= $this->bytes_already_parsed ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1620,7 +1641,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        $output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
</span><span class="cx" style="display: block; padding: 0 10px">                        $output_buffer       .= $diff->text;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $bytes_already_copied = $diff->end;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $bytes_already_copied = $diff->start + $diff->length;
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->html = $output_buffer . substr( $this->html, $bytes_already_copied );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1630,6 +1651,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 * replacements adjust offsets in the input document.
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        $bookmark_end   = $bookmark->start + $bookmark->length;
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         /*
</span><span class="cx" style="display: block; padding: 0 10px">                         * Each lexical update which appears before the bookmark's endpoints
</span><span class="cx" style="display: block; padding: 0 10px">                         * might shift the offsets for those endpoints. Loop through each change
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1640,28 +1663,30 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $tail_delta = 0;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        foreach ( $this->lexical_updates as $diff ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( $bookmark->start < $diff->start && $bookmark->end < $diff->start ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $diff_end = $diff->start + $diff->length;
+
+                               if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                         break;
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( $bookmark->start >= $diff->start && $bookmark->end < $diff->end ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                         $this->release_bookmark( $bookmark_name );
</span><span class="cx" style="display: block; padding: 0 10px">                                        continue 2;
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $delta = strlen( $diff->text ) - ( $diff->end - $diff->start );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $delta = strlen( $diff->text ) - $diff->length;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( $bookmark->start >= $diff->start ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        $head_delta += $delta;
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( $bookmark->end >= $diff->end ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         if ( $bookmark_end >= $diff_end ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                         $tail_delta += $delta;
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $bookmark->start += $head_delta;
-                       $bookmark->end   += $tail_delta;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $bookmark->start  += $head_delta;
+                       $bookmark->length += $tail_delta - $head_delta;
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->lexical_updates = array();
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1743,7 +1768,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 * This code should be unreachable, because it implies the two replacements
</span><span class="cx" style="display: block; padding: 0 10px">                 * start at the same location and contain the same text.
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return $a->end - $b->end;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         return $a->length - $b->length;
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1971,7 +1996,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        return false;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return '/' === $this->html[ $this->tag_ends_at - 1 ];
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         /*
+                * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
+                *
+                * Example:
+                *
+                *     <figure />
+                *             ^ this appears one character before the end of the closing ">".
+                */
+               return '/' === $this->html[ $this->token_starts_at + $this->token_length - 1 ];
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2101,7 +2134,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $existing_attribute                        = $this->attributes[ $comparable_name ];
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
</span><span class="cx" style="display: block; padding: 0 10px">                                $existing_attribute->start,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $existing_attribute->end,
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $existing_attribute->length,
</ins><span class="cx" style="display: block; padding: 0 10px">                                 $updated_attribute
</span><span class="cx" style="display: block; padding: 0 10px">                        );
</span><span class="cx" style="display: block; padding: 0 10px">                } else {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2119,7 +2152,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                         */
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
</span><span class="cx" style="display: block; padding: 0 10px">                                $this->tag_name_starts_at + $this->tag_name_length,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $this->tag_name_starts_at + $this->tag_name_length,
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         0,
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ' ' . $updated_attribute
</span><span class="cx" style="display: block; padding: 0 10px">                        );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2194,7 +2227,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><span class="cx" style="display: block; padding: 0 10px">                $this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->attributes[ $name ]->start,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $this->attributes[ $name ]->end,
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $this->attributes[ $name ]->length,
</ins><span class="cx" style="display: block; padding: 0 10px">                         ''
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2203,7 +2236,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        foreach ( $this->duplicate_attributes[ $name ] as $attribute_token ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $this->lexical_updates[] = new WP_HTML_Text_Replacement(
</span><span class="cx" style="display: block; padding: 0 10px">                                        $attribute_token->start,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        $attribute_token->end,
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 $attribute_token->length,
</ins><span class="cx" style="display: block; padding: 0 10px">                                         ''
</span><span class="cx" style="display: block; padding: 0 10px">                                );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2289,7 +2322,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 * Keep track of the position right before the current tag. This will
</span><span class="cx" style="display: block; padding: 0 10px">                 * be necessary for reparsing the current tag after updating the HTML.
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $before_current_tag = $this->tag_name_starts_at - 1;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $before_current_tag = $this->token_starts_at;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                /*
</span><span class="cx" style="display: block; padding: 0 10px">                 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2325,7 +2358,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $tag_ends_at                = strpos( $this->html, '>', $this->bytes_already_parsed );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->tag_ends_at          = $tag_ends_at;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->token_length         = $tag_ends_at - $this->token_starts_at;
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->bytes_already_parsed = $tag_ends_at;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                return $this->html;
</span></span></pre></div>
<a id="trunksrcwpincludeshtmlapiclasswphtmltextreplacementphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/html-api/class-wp-html-text-replacement.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/html-api/class-wp-html-text-replacement.php 2023-12-10 10:34:12 UTC (rev 57178)
+++ trunk/src/wp-includes/html-api/class-wp-html-text-replacement.php   2023-12-10 13:17:29 UTC (rev 57179)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -15,6 +15,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @access private
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @see WP_HTML_Tag_Processor
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -23,22 +24,25 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * Byte offset into document where replacement span begins.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public $start;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * Byte offset into document where replacement span ends.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * Byte length of span being replaced.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @since 6.2.0
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @since 6.5.0
+        *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var int
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public $end;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ public $length;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Span of text to insert in document to replace existing content from start to end.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
</ins><span class="cx" style="display: block; padding: 0 10px">          * @var string
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public $text;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -48,13 +52,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 6.2.0
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param int    $start Byte offset into document where replacement span begins.
-        * @param int    $end   Byte offset into document where replacement span ends.
-        * @param string $text  Span of text to insert in document to replace existing content from start to end.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param int    $start  Byte offset into document where replacement span begins.
+        * @param int    $length Byte length of span in document being replaced.
+        * @param string $text   Span of text to insert in document to replace existing content from start to end.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function __construct( $start, $end, $text ) {
-               $this->start = $start;
-               $this->end   = $end;
-               $this->text  = $text;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ public function __construct( $start, $length, $text ) {
+               $this->start  = $start;
+               $this->length = $length;
+               $this->text   = $text;
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre>
</div>
</div>

</body>
</html>