From b6f5d196e1746110369dec53cfa75cdfe80bda5e Mon Sep 17 00:00:00 2001 From: edwinhuish Date: Fri, 10 Jan 2025 01:55:55 +0800 Subject: [PATCH] fix: #32 Unexpected multiline highlight --- package.json | 2 +- src/handler/modules/common.ts | 65 ++++++++++++++++++++++++----------- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 6593f06..c5deae6 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "publisher": "edwinhuish", "name": "better-comments-next", "displayName": "Better Comments Next", - "version": "3.3.29", + "version": "3.3.30", "description": "Improve your code commenting by annotating with alert, informational, TODOs, and more!", "author": { "name": "Edwin Xu" diff --git a/src/handler/modules/common.ts b/src/handler/modules/common.ts index 3991ed6..e250504 100644 --- a/src/handler/modules/common.ts +++ b/src/handler/modules/common.ts @@ -156,7 +156,7 @@ export class CommonHandler extends Handler { `([ \\t]*(${mark})[ \\t])((${multilineTags.join('|')})([\\s\\S]*?(?=\\n\\s*${mark}[ \\t](${allTags.join('|')})|\\n\\s*${mark}\\s*\\r?\\n|$)))`, 'gi', ); - const m2Exp = new RegExp(`(^|[ \\t]*(${mark}))([^\\n]*?(?=\\r?\\n|$))`, 'gi'); + const m2Exp = new RegExp(`(^|[ \\t]*(${mark})([ \\t]*))([^\\n]*?(?=\\r?\\n|$))`, 'gi'); // Find the matched multiline let m1: RegExpExecArray | null; @@ -171,6 +171,11 @@ export class CommonHandler extends Handler { while ((m2 = m2Exp.exec(m1[3]))) { this.verifyTaskID(taskID); + const m2Space = m2[3]; + if (m2.index !== 0 && m2Space.length <= 1) { + break; + } + const m2StartSince = m1Start + m1[1].length + m2.index; const m2Start = m2StartSince + m2[1].length; const m2End = m2StartSince + m2[0].length; @@ -235,7 +240,9 @@ export class CommonHandler extends Handler { const lineTags = configuration.getLineTagsEscaped(); const allTags = configuration.getAllTagsEscaped(); - const m1Exp = new RegExp(`(^[ \\t]|\\n[ \\t]*)(${multilineTags.join('|')})([\\s\\S]*?)(?=\\n\\s*(${allTags.join('|')})|\\n\\s*\\n|$)`, 'gi'); + const m1Exp = new RegExp(`(^([ \\t])|\\n([ \\t]*))(${multilineTags.join('|')})([\\s\\S]*?)(?=\\n\\s*(${allTags.join('|')})|\\n\\s*\\n|$)`, 'gi'); + // eslint-disable-next-line regexp/no-unused-capturing-group, regexp/no-super-linear-backtracking + const m2Exp = /((\n|^)([ \t]*))([^\n]*)(?=\n|$)/g; const lineExp = new RegExp(`(^[ \\t]|\\n[ \\t]*)(${lineTags.join('|')})([^\\n]*?)(?=\\n|$)`, 'gi'); @@ -290,20 +297,32 @@ export class CommonHandler extends Handler { this.verifyTaskID(taskID); const m1Start = contentStart + m1.index; - const tagName = m1[2].toLowerCase(); - - const m2Start = m1Start + m1[1].length; - const m2End = m1Start + m1[0].length; - // store processed range - lineProcessed.push([m2Start, m2End]); - - const startPos = editor.document.positionAt(m2Start); - const endPos = editor.document.positionAt(m2End); - const range = new vscode.Range(startPos, endPos); - - const opt = tagRanges.get(tagName) || []; - opt.push(range); - tagRanges.set(tagName, opt); + const tagName = m1[4].toLowerCase(); + const m1Space = m1[2] || m1[3] || ''; + + // Find decoration range + let m2: RegExpExecArray | null; + while ((m2 = m2Exp.exec(m1[0]))) { + this.verifyTaskID(taskID); + const m2Space = m2[3] || ''; + if (m2.index !== 0 && m2Space.length <= m1Space.length) { + break; + } + + const m2StartSince = m1Start + m2.index; + const m2Start = m2StartSince + m2[1].length; + const m2End = m2StartSince + m2[0].length; + // store processed range + lineProcessed.push([m2Start, m2End]); + + const startPos = editor.document.positionAt(m2Start); + const endPos = editor.document.positionAt(m2End); + const range = new vscode.Range(startPos, endPos); + + const opt = tagRanges.get(tagName) || []; + opt.push(range); + tagRanges.set(tagName, opt); + } } } @@ -373,10 +392,10 @@ export class CommonHandler extends Handler { */ const blockExp = new RegExp(`((^|\\n)\\s*(${start}))\\s([\\s\\S]*?)(${end})`, 'g'); const m1Exp = new RegExp( - `(^[ \\t]|([ \\t]*(${pre})[ \\t]))((${multilineTags.join('|')})([\\s\\S]*?))(?=\\n\\s*${pre}[ \\t](${allTags.join('|')})|\\n\\s*${pre}\\s*\\n|$)`, + `(^[ \\t]|([ \\t]*(${pre})([ \\t])))((${multilineTags.join('|')})([\\s\\S]*?))(?=\\n\\s*${pre}[ \\t](${allTags.join('|')})|\\n\\s*${pre}\\s*\\n|$)`, 'gi', ); - const m2Exp = new RegExp(`(^|[ \\t]*(${pre}))([^\\n]*?)(\\n|$)`, 'gi'); + const m2Exp = new RegExp(`(^|[ \\t]*(${pre})([ \\t]*))([^\\n]*?)(\\n|$)`, 'gi'); const lineExp = new RegExp(`(^|[ \\t]*(${pre})[ \\t])(${lineTags.join('|')})([^\\n]*?)(\\n|$)`, 'gi'); let block: RegExpExecArray | null; @@ -404,13 +423,19 @@ export class CommonHandler extends Handler { this.verifyTaskID(taskID); const m1Start = contentStart + m1.index; - const tagName = m1[5].toLowerCase(); + const tagName = m1[6].toLowerCase(); + const m1Space = m1[4] || ''; // Find decoration range let m2: RegExpExecArray | null; - while ((m2 = m2Exp.exec(m1[4]))) { + while ((m2 = m2Exp.exec(m1[5]))) { this.verifyTaskID(taskID); + const m2Space = m2[3] || ''; + if (m2.index !== 0 && m2Space.length <= m1Space.length) { + break; + } + const m2StartSince = m1Start + m1[1].length + m2.index; const m2Start = m2StartSince + m2[1].length; const m2End = m2StartSince + m2[0].length;