From 83eb9dac64109eb43c906dd5ea73d7b2bdc076a3 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Tue, 27 Jan 2026 23:50:32 +0800 Subject: [PATCH] fix: avoid duplicating escaped characters when parsing styles (#17554) * fix and test * changeset * format * increment index and escape early instead --- .changeset/true-berries-behave.md | 5 +++++ .../src/compiler/phases/1-parse/read/style.js | 4 ++++ packages/svelte/tests/css-parse.test.ts | 15 +++++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 .changeset/true-berries-behave.md diff --git a/.changeset/true-berries-behave.md b/.changeset/true-berries-behave.md new file mode 100644 index 0000000000..0b9df87c4f --- /dev/null +++ b/.changeset/true-berries-behave.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: avoid duplicating escaped characters in CSS AST diff --git a/packages/svelte/src/compiler/phases/1-parse/read/style.js b/packages/svelte/src/compiler/phases/1-parse/read/style.js index c88a3707c1..55647b2c94 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/style.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/style.js @@ -508,8 +508,12 @@ function read_value(parser) { if (escaped) { value += '\\' + char; escaped = false; + parser.index++; + continue; } else if (char === '\\') { escaped = true; + parser.index++; + continue; } else if (char === quote_mark) { quote_mark = null; } else if (char === ')') { diff --git a/packages/svelte/tests/css-parse.test.ts b/packages/svelte/tests/css-parse.test.ts index fcb9bdc010..4d8ef8601b 100644 --- a/packages/svelte/tests/css-parse.test.ts +++ b/packages/svelte/tests/css-parse.test.ts @@ -135,4 +135,19 @@ describe('parseCss', () => { } } }); + + it('parses escaped characters', () => { + const ast = parseCss("div { background: url('./example.png?\\''); }"); + assert.equal(ast.type, 'StyleSheet'); + assert.equal(ast.children.length, 1); + const rule = ast.children[0]; + assert.equal(rule.type, 'Rule'); + if (rule.type === 'Rule') { + const declaration = rule.block.children[0]; + assert.equal(declaration.type, 'Declaration'); + if (declaration.type === 'Declaration') { + assert.equal(declaration.value, "url('./example.png?\\'')"); + } + } + }); });