This release fixes a regression introduced in 2.9.0 which changed the behavior of Cursor::match() for certain regular expression patterns.
Changed
- Improved performance of reading single characters from multibyte lines
- Improved performance of locating the next non-space character on lines without tabs
- Optimized
Cursor::advanceToNextNonSpaceOrNewline()to scan the line in place instead of copying everything left in the block on every call - Optimized inline link destination parsing to scan the line in place, so its cost follows the length of the destination rather than the length of everything left in the block
Fixed
- Fixed a regression introduced in 2.9.0 where
Cursor::match()treated text before the cursor as part of the match subject (#1145). Patterns were matched against the whole line at an offset, which silently changed the meaning of\b,\B,\A, lookbehinds, a^anywhere other than the very start of the pattern, and a leading^combined with themmodifier.match()once again matches against the remainder, exactly as it did in 2.8; the core parsers keep the optimized in-place matching via a new internal method with PCRE's native offset semantics, anchoring their patterns at the cursor with\G - Fixed heading permalinks rendered with
aria-hidden="true"remaining in the keyboard tab order; they are now also giventabindex="-1", as a focusable element removed from the accessibility tree has no accessible name to announce when focused (WCAG 4.1.2) - Fixed cloning a node breaking the link from the original node's children back to their parent, silently corrupting the document that node belonged to; detaching or inserting around those children afterwards could drop nodes from the tree
- Fixed cloned nodes sharing their
datawith the node they were cloned from, so that setting an attribute on either one also set it on the other