fix: use lookbehind in highlightSpans to fix adjacent spans and start-of-line#18
Merged
Merged
Conversation
…-of-line The old pattern ([^`])`([^`]+?)` required consuming a preceding character as group 1, which caused two bugs: - Issue #2: spans at the start of a line were never matched because there was no preceding character to consume. - Issue #3: adjacent spans like `foo`(`bar`) were broken because the pattern consumed the last char of the first span ('o' from 'foo') and then treated that span's closing backtick as the opening of a new span, capturing '(' as the highlighted content. Replace the consuming group with a negative lookbehind (?<!['`'\\]) so the opening backtick is matched without consuming any preceding character. This fixes both bugs and also subsumes escape handling: a backtick preceded by \ is no longer treated as an opening delimiter. Closes #2 Closes #3
c7b6995 to
d5088bc
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
([^\])with a negative lookbehind(?<!['`'\])inhighlightBlockSpans`highlightSpans.test.tswith 8 tests covering both bugs and surrounding edge casesRoot cause (both bugs share the same origin)
The old pattern
([^\])`([^\`]+?)`consumed one character before the opening backtick as group 1 (e`). This caused:Issue #2 – no preceding character at start of line → no match at all.
Issue #3 – with adjacent spans like
`foo`(`bar`):o(last char offoo) ase, then treatedfoo's closing backtick as the opening of a new span[^\]+?then matched(`, which was "highlighted" — the bugFix
The lookbehind also naturally handles the escape case:
\`is no longer treated as an opening delimiter, so the separateif (e === '\\') return m.slice(1)branch is no longer needed.Closes #2
Closes #3