Skip to content

Commit 4efc6fa

Browse files
authored
fix(language-core): match classname before ) (#4887)
1 parent c6a4e36 commit 4efc6fa

File tree

2 files changed

+17
-16
lines changed

2 files changed

+17
-16
lines changed

packages/language-core/lib/utils/parseCssClassNames.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { clearComments } from './parseCssVars';
1+
import { commentReg, fillBlank } from './parseCssVars';
22

3-
const cssClassNameReg = /(?=(\.[a-z_][-\w]*)[\s.,+~>:#[{])/gi;
3+
const cssClassNameReg = /(?=(\.[a-z_][-\w]*)[\s.,+~>:#)[{])/gi;
4+
const fragmentReg = /(?<={)[^{]*(?=(?<!\\);)/g;
45

5-
export function* parseCssClassNames(styleContent: string) {
6-
styleContent = clearComments(styleContent);
7-
const matches = styleContent.matchAll(cssClassNameReg);
6+
export function* parseCssClassNames(css: string) {
7+
css = fillBlank(css, commentReg, fragmentReg);
8+
const matches = css.matchAll(cssClassNameReg);
89
for (const match of matches) {
910
const matchText = match[1];
1011
if (matchText) {
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
// https://github.com/vuejs/core/blob/main/packages/compiler-sfc/src/cssVars.ts#L47-L61
22

33
const vBindCssVarReg = /\bv-bind\(\s*(?:'([^']+)'|"([^"]+)"|([a-z_]\w*))\s*\)/gi;
4-
const commentReg1 = /\/\*([\s\S]*?)\*\//g;
5-
const commentReg2 = /\/\/([\s\S]*?)\n/g;
4+
export const commentReg = /(?<=\/\*)[\s\S]*?(?=\*\/)|(?<=\/\/)[\s\S]*?(?=\n)/g;
65

7-
export function* parseCssVars(styleContent: string) {
8-
styleContent = clearComments(styleContent);
9-
const matchs = styleContent.matchAll(vBindCssVarReg);
6+
export function* parseCssVars(css: string) {
7+
css = fillBlank(css, commentReg);
8+
const matchs = css.matchAll(vBindCssVarReg);
109
for (const match of matchs) {
1110
const matchText = match.slice(1).find(t => t);
1211
if (matchText) {
13-
const offset = match.index + styleContent.slice(match.index).indexOf(matchText);
12+
const offset = match.index + css.slice(match.index).indexOf(matchText);
1413
yield { offset, text: matchText };
1514
}
1615
}
1716
}
1817

19-
export function clearComments(css: string) {
20-
return css
21-
.replace(commentReg1, match => `/*${' '.repeat(match.length - 4)}*/`)
22-
.replace(commentReg2, match => `//${' '.repeat(match.length - 3)}\n`);
23-
}
18+
export function fillBlank(css: string, ...regs: RegExp[]) {
19+
for (const reg of regs) {
20+
css = css.replace(reg, (match) => ' '.repeat(match.length));
21+
}
22+
return css;
23+
}

0 commit comments

Comments
 (0)