From 54d0e32507ccdef00b45e2b95c59201f66e35a8d Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Tue, 19 Jul 2022 17:06:08 +0800 Subject: [PATCH] fix(preset-mini): bracket curly match, close #1300 --- .../src/utils/handlers/handlers.ts | 29 ++++++++++++++----- test/handler.test.ts | 8 +++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/preset-mini/src/utils/handlers/handlers.ts b/packages/preset-mini/src/utils/handlers/handlers.ts index 8e789db536..ae53c1be66 100644 --- a/packages/preset-mini/src/utils/handlers/handlers.ts +++ b/packages/preset-mini/src/utils/handlers/handlers.ts @@ -102,14 +102,29 @@ function bracketWithType(str: string, type?: string) { else if (type && match[1] === type) base = str.slice(match[0].length, -1) - if (base !== undefined) { - return base - .replace(/(url\(.*?\))/g, v => v.replace(/_/g, '\\_')) - .replace(/([^\\])_/g, '$1 ') - .replace(/(?:calc|clamp|max|min)\((.*)/g, (v) => { - return v.replace(/(-?\d*\.?\d(?!\b-.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([+\-/*])/g, '$1 $2 ') - }) + if (!base) + return + + let curly = 0 + for (const i of base) { + if (i === '[') { + curly += 1 + } + else if (i === ']') { + curly -= 1 + if (curly < 0) + return + } } + if (curly) + return + + return base + .replace(/(url\(.*?\))/g, v => v.replace(/_/g, '\\_')) + .replace(/([^\\])_/g, '$1 ') + .replace(/(?:calc|clamp|max|min)\((.*)/g, (v) => { + return v.replace(/(-?\d*\.?\d(?!\b-.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([+\-/*])/g, '$1 $2 ') + }) } } diff --git a/test/handler.test.ts b/test/handler.test.ts index ce1ef778f9..3d2cdb5004 100644 --- a/test/handler.test.ts +++ b/test/handler.test.ts @@ -12,4 +12,12 @@ describe('value handler', () => { expect(h.bracket('[calc(1/2)]')).eql('calc(1 / 2)') expect(h.bracket('[calc(1*2)]')).eql('calc(1 * 2)') }) + + it('bracket curly', () => { + expect(h.bracket('[foo][bar]')).eql(undefined) + expect(h.bracket('[[]]')).eql('[]') + expect(h.bracket('[]]')).eql(undefined) + expect(h.bracket('[]][[]]]]')).eql(undefined) + expect(h.bracket('[[][[[]]]]')).eql('[][[[]]]') + }) })