@master/css-language-service 2.0.0-rc.60 → 2.0.0-rc.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/utils/beautify-css.cjs +1 -1
- package/dist/utils/beautify-css.mjs +1 -1
- package/dist/utils/get-pseudo-class-completion-items.cjs +10 -8
- package/dist/utils/get-pseudo-class-completion-items.mjs +10 -8
- package/dist/utils/get-pseudo-element-completion-items.cjs +2 -2
- package/dist/utils/get-pseudo-element-completion-items.mjs +2 -2
- package/dist/utils/get-query-completion-items.cjs +61 -71
- package/dist/utils/get-query-completion-items.mjs +62 -72
- package/dist/utils/get-range.cjs +15 -13
- package/dist/utils/get-range.mjs +15 -13
- package/dist/utils/query-syntax-completions.cjs +1 -1
- package/dist/utils/query-syntax-completions.mjs +1 -1
- package/dist/utils/sort-completion-items.cjs +3 -1
- package/dist/utils/sort-completion-items.mjs +3 -1
- package/package.json +1 -1
|
@@ -4,7 +4,7 @@ var beautifyCss = require('js-beautify/js/lib/beautify-css');
|
|
|
4
4
|
|
|
5
5
|
// @ts-expect-error
|
|
6
6
|
function beautifyCSS(text) {
|
|
7
|
-
return beautifyCss.css_beautify(text, {
|
|
7
|
+
return beautifyCss.css_beautify(text.replace(/@(media|container|supports|layer)\(/g, '@$1 ('), {
|
|
8
8
|
newline_between_rules: false,
|
|
9
9
|
indent_size: 2
|
|
10
10
|
});
|
|
@@ -2,7 +2,7 @@ import { css_beautify } from 'js-beautify/js/lib/beautify-css';
|
|
|
2
2
|
|
|
3
3
|
// @ts-expect-error
|
|
4
4
|
function beautifyCSS(text) {
|
|
5
|
-
return css_beautify(text, {
|
|
5
|
+
return css_beautify(text.replace(/@(media|container|supports|layer)\(/g, '@$1 ('), {
|
|
6
6
|
newline_between_rules: false,
|
|
7
7
|
indent_size: 2
|
|
8
8
|
});
|
|
@@ -30,18 +30,20 @@ function getPseudoClassCompletionItems(css$1 = new css.MasterCSS(), syntax) {
|
|
|
30
30
|
generatedCSS: css.generateCSS([
|
|
31
31
|
syntax + name.slice(1)
|
|
32
32
|
], css$1),
|
|
33
|
-
docs: '/guide/
|
|
33
|
+
docs: '/guide/selectors'
|
|
34
34
|
}),
|
|
35
35
|
kind,
|
|
36
36
|
data
|
|
37
37
|
};
|
|
38
38
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
const selectors = {
|
|
40
|
+
...css$1.config.selectors,
|
|
41
|
+
':of': ':of'
|
|
42
|
+
};
|
|
43
|
+
for(const name in selectors){
|
|
44
|
+
if (name.startsWith('::')) continue;
|
|
45
|
+
const value = selectors[name];
|
|
46
|
+
const data = pseudoClassDataList.find((data)=>value.startsWith(data.name));
|
|
45
47
|
let sortText = name.startsWith(':-') ? 'yyyy' + name.slice(2) : 'yy' + name.replace(/^:/, '');
|
|
46
48
|
if (sortText.endsWith('()')) sortText = 'y' + sortText;
|
|
47
49
|
const completionItem = {
|
|
@@ -50,7 +52,7 @@ function getPseudoClassCompletionItems(css$1 = new css.MasterCSS(), syntax) {
|
|
|
50
52
|
generatedCSS: css.generateCSS([
|
|
51
53
|
syntax + name.slice(1)
|
|
52
54
|
], css$1),
|
|
53
|
-
docs: '/guide/
|
|
55
|
+
docs: '/guide/selectors'
|
|
54
56
|
}),
|
|
55
57
|
sortText,
|
|
56
58
|
kind,
|
|
@@ -28,18 +28,20 @@ function getPseudoClassCompletionItems(css = new MasterCSS(), syntax) {
|
|
|
28
28
|
generatedCSS: generateCSS([
|
|
29
29
|
syntax + name.slice(1)
|
|
30
30
|
], css),
|
|
31
|
-
docs: '/guide/
|
|
31
|
+
docs: '/guide/selectors'
|
|
32
32
|
}),
|
|
33
33
|
kind,
|
|
34
34
|
data
|
|
35
35
|
};
|
|
36
36
|
});
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
const selectors = {
|
|
38
|
+
...css.config.selectors,
|
|
39
|
+
':of': ':of'
|
|
40
|
+
};
|
|
41
|
+
for(const name in selectors){
|
|
42
|
+
if (name.startsWith('::')) continue;
|
|
43
|
+
const value = selectors[name];
|
|
44
|
+
const data = pseudoClassDataList.find((data)=>value.startsWith(data.name));
|
|
43
45
|
let sortText = name.startsWith(':-') ? 'yyyy' + name.slice(2) : 'yy' + name.replace(/^:/, '');
|
|
44
46
|
if (sortText.endsWith('()')) sortText = 'y' + sortText;
|
|
45
47
|
const completionItem = {
|
|
@@ -48,7 +50,7 @@ function getPseudoClassCompletionItems(css = new MasterCSS(), syntax) {
|
|
|
48
50
|
generatedCSS: generateCSS([
|
|
49
51
|
syntax + name.slice(1)
|
|
50
52
|
], css),
|
|
51
|
-
docs: '/guide/
|
|
53
|
+
docs: '/guide/selectors'
|
|
52
54
|
}),
|
|
53
55
|
sortText,
|
|
54
56
|
kind,
|
|
@@ -21,7 +21,7 @@ function getPseudoElementCompletionItems(css$1 = new css.MasterCSS(), syntax) {
|
|
|
21
21
|
generatedCSS: css.generateCSS([
|
|
22
22
|
syntax + name.slice(2)
|
|
23
23
|
], css$1),
|
|
24
|
-
docs: '/guide/
|
|
24
|
+
docs: '/guide/selectors'
|
|
25
25
|
}),
|
|
26
26
|
kind,
|
|
27
27
|
data
|
|
@@ -41,7 +41,7 @@ function getPseudoElementCompletionItems(css$1 = new css.MasterCSS(), syntax) {
|
|
|
41
41
|
generatedCSS: css.generateCSS([
|
|
42
42
|
syntax + name.slice(2)
|
|
43
43
|
], css$1),
|
|
44
|
-
docs: '/guide/
|
|
44
|
+
docs: '/guide/selectors'
|
|
45
45
|
}),
|
|
46
46
|
sortText,
|
|
47
47
|
kind,
|
|
@@ -19,7 +19,7 @@ function getPseudoElementCompletionItems(css = new MasterCSS(), syntax) {
|
|
|
19
19
|
generatedCSS: generateCSS([
|
|
20
20
|
syntax + name.slice(2)
|
|
21
21
|
], css),
|
|
22
|
-
docs: '/guide/
|
|
22
|
+
docs: '/guide/selectors'
|
|
23
23
|
}),
|
|
24
24
|
kind,
|
|
25
25
|
data
|
|
@@ -39,7 +39,7 @@ function getPseudoElementCompletionItems(css = new MasterCSS(), syntax) {
|
|
|
39
39
|
generatedCSS: generateCSS([
|
|
40
40
|
syntax + name.slice(2)
|
|
41
41
|
], css),
|
|
42
|
-
docs: '/guide/
|
|
42
|
+
docs: '/guide/selectors'
|
|
43
43
|
}),
|
|
44
44
|
sortText,
|
|
45
45
|
kind,
|
|
@@ -10,90 +10,80 @@ function getQueryCompletionItems(css$1 = new css.MasterCSS(), triggerCharacter =
|
|
|
10
10
|
const atDataList = cssDataProvider.provideAtDirectives();
|
|
11
11
|
const completionItems = [];
|
|
12
12
|
if (!css.QUERY_COMPARISON_OPERATORS.includes(triggerCharacter)) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
generatedCSS: css.generateCSS([
|
|
31
|
-
syntax + 'supports()'
|
|
32
|
-
], css$1),
|
|
33
|
-
docs: '/guide/syntax#at-rules'
|
|
34
|
-
})
|
|
13
|
+
[
|
|
14
|
+
'media',
|
|
15
|
+
'container',
|
|
16
|
+
'supports'
|
|
17
|
+
].forEach((name)=>{
|
|
18
|
+
completionItems.push({
|
|
19
|
+
label: triggerCharacter + name + '()',
|
|
20
|
+
filterText: name + '()',
|
|
21
|
+
insertText: name + '()',
|
|
22
|
+
sortText: name + '()',
|
|
23
|
+
documentation: getCssDataDocumentation.getCSSDataDocumentation(atDataList.find(({ name })=>name === '@' + name), {
|
|
24
|
+
generatedCSS: css.generateCSS([
|
|
25
|
+
syntax + name + '()'
|
|
26
|
+
], css$1),
|
|
27
|
+
docs: '/guide/at'
|
|
28
|
+
})
|
|
29
|
+
});
|
|
35
30
|
});
|
|
36
31
|
}
|
|
37
|
-
|
|
32
|
+
const handleNumberNodes = (atRule, token)=>{
|
|
33
|
+
const numberNode = css.getSingleAtNumberRuleNode(atRule.nodes);
|
|
34
|
+
if (numberNode) {
|
|
35
|
+
const prevComparisonCharacter = syntax.charAt(syntax.length - 2);
|
|
36
|
+
const comparisonCharacter = prevComparisonCharacter === '>' || prevComparisonCharacter === '<' ? prevComparisonCharacter + triggerCharacter : triggerCharacter;
|
|
37
|
+
const text = css.generateAt(css.parseAt(comparisonCharacter + token, css$1));
|
|
38
|
+
completionItems.push({
|
|
39
|
+
label: comparisonCharacter + token,
|
|
40
|
+
sortText: vscodeLanguageserverProtocol.CompletionItemKind.Keyword + comparisonCharacter + String(Math.round(numberNode.value)).padStart(12, '0'),
|
|
41
|
+
filterText: token,
|
|
42
|
+
insertText: token,
|
|
43
|
+
detail: text,
|
|
44
|
+
kind: vscodeLanguageserverProtocol.CompletionItemKind.Keyword,
|
|
45
|
+
documentation: getCssDataDocumentation.getCSSDataDocumentation(undefined, {
|
|
46
|
+
generatedCSS: css.generateCSS([
|
|
47
|
+
syntax + token
|
|
48
|
+
], css$1),
|
|
49
|
+
docs: '/guide/at'
|
|
50
|
+
})
|
|
51
|
+
});
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
css$1.atRules.forEach((atRule, token)=>{
|
|
38
56
|
const completionItem = {
|
|
39
|
-
filterText:
|
|
40
|
-
insertText:
|
|
57
|
+
filterText: token,
|
|
58
|
+
insertText: token,
|
|
41
59
|
documentation: getCssDataDocumentation.getCSSDataDocumentation(undefined, {
|
|
42
60
|
generatedCSS: css.generateCSS([
|
|
43
|
-
syntax +
|
|
61
|
+
syntax + token
|
|
44
62
|
], css$1),
|
|
45
|
-
docs: '/guide/
|
|
63
|
+
docs: '/guide/at'
|
|
46
64
|
})
|
|
47
65
|
};
|
|
48
66
|
if ([
|
|
49
67
|
css.AT_SIGN,
|
|
50
68
|
...css.QUERY_LOGICAL_OPERATORS
|
|
51
69
|
].includes(triggerCharacter)) {
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
});
|
|
68
|
-
} else {
|
|
69
|
-
completionItems.push({
|
|
70
|
-
...completionItem,
|
|
71
|
-
label: triggerCharacter + name,
|
|
72
|
-
detail: value,
|
|
73
|
-
sortText: name,
|
|
74
|
-
kind: vscodeLanguageserverProtocol.CompletionItemKind.Keyword
|
|
75
|
-
});
|
|
76
|
-
}
|
|
70
|
+
if (handleNumberNodes(atRule, token)) return;
|
|
71
|
+
const text = css.generateAt(css.parseAt(triggerCharacter + token, css$1));
|
|
72
|
+
completionItems.push({
|
|
73
|
+
...completionItem,
|
|
74
|
+
label: triggerCharacter + token,
|
|
75
|
+
detail: text,
|
|
76
|
+
sortText: vscodeLanguageserverProtocol.CompletionItemKind.Keyword + token,
|
|
77
|
+
kind: vscodeLanguageserverProtocol.CompletionItemKind.Keyword,
|
|
78
|
+
documentation: getCssDataDocumentation.getCSSDataDocumentation(undefined, {
|
|
79
|
+
generatedCSS: css.generateCSS([
|
|
80
|
+
syntax + token
|
|
81
|
+
], css$1),
|
|
82
|
+
docs: '/guide/at'
|
|
83
|
+
})
|
|
84
|
+
});
|
|
77
85
|
} else if (css.QUERY_COMPARISON_OPERATORS.includes(triggerCharacter)) {
|
|
78
|
-
|
|
79
|
-
const prevComparisonCharacter = syntax.charAt(syntax.length - 2);
|
|
80
|
-
const comparisonCharacter = prevComparisonCharacter === '>' || prevComparisonCharacter === '<' ? prevComparisonCharacter + triggerCharacter : triggerCharacter;
|
|
81
|
-
completionItems.push({
|
|
82
|
-
...completionItem,
|
|
83
|
-
label: comparisonCharacter + name,
|
|
84
|
-
sortText: comparisonCharacter + String(value).padStart(8, '0'),
|
|
85
|
-
filterText: name,
|
|
86
|
-
insertText: name,
|
|
87
|
-
documentation: getCssDataDocumentation.getCSSDataDocumentation(undefined, {
|
|
88
|
-
generatedCSS: css.generateCSS([
|
|
89
|
-
syntax + name
|
|
90
|
-
], css$1),
|
|
91
|
-
docs: '/guide/syntax#at-rules'
|
|
92
|
-
}),
|
|
93
|
-
detail: `screen width ${comparisonCharacter} ${value}px`,
|
|
94
|
-
kind: vscodeLanguageserverProtocol.CompletionItemKind.Keyword
|
|
95
|
-
});
|
|
96
|
-
}
|
|
86
|
+
handleNumberNodes(atRule, token);
|
|
97
87
|
}
|
|
98
88
|
});
|
|
99
89
|
return sortCompletionItems(completionItems);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MasterCSS, AT_SIGN, QUERY_COMPARISON_OPERATORS, generateCSS, QUERY_LOGICAL_OPERATORS } from '@master/css';
|
|
1
|
+
import { MasterCSS, AT_SIGN, QUERY_COMPARISON_OPERATORS, generateCSS, QUERY_LOGICAL_OPERATORS, generateAt, parseAt, getSingleAtNumberRuleNode } from '@master/css';
|
|
2
2
|
import { CompletionItemKind } from 'vscode-languageserver-protocol';
|
|
3
3
|
import sortCompletionItems from './sort-completion-items.mjs';
|
|
4
4
|
import { getCSSDataDocumentation } from './get-css-data-documentation.mjs';
|
|
@@ -8,90 +8,80 @@ function getQueryCompletionItems(css = new MasterCSS(), triggerCharacter = AT_SI
|
|
|
8
8
|
const atDataList = cssDataProvider.provideAtDirectives();
|
|
9
9
|
const completionItems = [];
|
|
10
10
|
if (!QUERY_COMPARISON_OPERATORS.includes(triggerCharacter)) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
generatedCSS: generateCSS([
|
|
29
|
-
syntax + 'supports()'
|
|
30
|
-
], css),
|
|
31
|
-
docs: '/guide/syntax#at-rules'
|
|
32
|
-
})
|
|
11
|
+
[
|
|
12
|
+
'media',
|
|
13
|
+
'container',
|
|
14
|
+
'supports'
|
|
15
|
+
].forEach((name)=>{
|
|
16
|
+
completionItems.push({
|
|
17
|
+
label: triggerCharacter + name + '()',
|
|
18
|
+
filterText: name + '()',
|
|
19
|
+
insertText: name + '()',
|
|
20
|
+
sortText: name + '()',
|
|
21
|
+
documentation: getCSSDataDocumentation(atDataList.find(({ name })=>name === '@' + name), {
|
|
22
|
+
generatedCSS: generateCSS([
|
|
23
|
+
syntax + name + '()'
|
|
24
|
+
], css),
|
|
25
|
+
docs: '/guide/at'
|
|
26
|
+
})
|
|
27
|
+
});
|
|
33
28
|
});
|
|
34
29
|
}
|
|
35
|
-
|
|
30
|
+
const handleNumberNodes = (atRule, token)=>{
|
|
31
|
+
const numberNode = getSingleAtNumberRuleNode(atRule.nodes);
|
|
32
|
+
if (numberNode) {
|
|
33
|
+
const prevComparisonCharacter = syntax.charAt(syntax.length - 2);
|
|
34
|
+
const comparisonCharacter = prevComparisonCharacter === '>' || prevComparisonCharacter === '<' ? prevComparisonCharacter + triggerCharacter : triggerCharacter;
|
|
35
|
+
const text = generateAt(parseAt(comparisonCharacter + token, css));
|
|
36
|
+
completionItems.push({
|
|
37
|
+
label: comparisonCharacter + token,
|
|
38
|
+
sortText: CompletionItemKind.Keyword + comparisonCharacter + String(Math.round(numberNode.value)).padStart(12, '0'),
|
|
39
|
+
filterText: token,
|
|
40
|
+
insertText: token,
|
|
41
|
+
detail: text,
|
|
42
|
+
kind: CompletionItemKind.Keyword,
|
|
43
|
+
documentation: getCSSDataDocumentation(undefined, {
|
|
44
|
+
generatedCSS: generateCSS([
|
|
45
|
+
syntax + token
|
|
46
|
+
], css),
|
|
47
|
+
docs: '/guide/at'
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
css.atRules.forEach((atRule, token)=>{
|
|
36
54
|
const completionItem = {
|
|
37
|
-
filterText:
|
|
38
|
-
insertText:
|
|
55
|
+
filterText: token,
|
|
56
|
+
insertText: token,
|
|
39
57
|
documentation: getCSSDataDocumentation(undefined, {
|
|
40
58
|
generatedCSS: generateCSS([
|
|
41
|
-
syntax +
|
|
59
|
+
syntax + token
|
|
42
60
|
], css),
|
|
43
|
-
docs: '/guide/
|
|
61
|
+
docs: '/guide/at'
|
|
44
62
|
})
|
|
45
63
|
};
|
|
46
64
|
if ([
|
|
47
65
|
AT_SIGN,
|
|
48
66
|
...QUERY_LOGICAL_OPERATORS
|
|
49
67
|
].includes(triggerCharacter)) {
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
});
|
|
66
|
-
} else {
|
|
67
|
-
completionItems.push({
|
|
68
|
-
...completionItem,
|
|
69
|
-
label: triggerCharacter + name,
|
|
70
|
-
detail: value,
|
|
71
|
-
sortText: name,
|
|
72
|
-
kind: CompletionItemKind.Keyword
|
|
73
|
-
});
|
|
74
|
-
}
|
|
68
|
+
if (handleNumberNodes(atRule, token)) return;
|
|
69
|
+
const text = generateAt(parseAt(triggerCharacter + token, css));
|
|
70
|
+
completionItems.push({
|
|
71
|
+
...completionItem,
|
|
72
|
+
label: triggerCharacter + token,
|
|
73
|
+
detail: text,
|
|
74
|
+
sortText: CompletionItemKind.Keyword + token,
|
|
75
|
+
kind: CompletionItemKind.Keyword,
|
|
76
|
+
documentation: getCSSDataDocumentation(undefined, {
|
|
77
|
+
generatedCSS: generateCSS([
|
|
78
|
+
syntax + token
|
|
79
|
+
], css),
|
|
80
|
+
docs: '/guide/at'
|
|
81
|
+
})
|
|
82
|
+
});
|
|
75
83
|
} else if (QUERY_COMPARISON_OPERATORS.includes(triggerCharacter)) {
|
|
76
|
-
|
|
77
|
-
const prevComparisonCharacter = syntax.charAt(syntax.length - 2);
|
|
78
|
-
const comparisonCharacter = prevComparisonCharacter === '>' || prevComparisonCharacter === '<' ? prevComparisonCharacter + triggerCharacter : triggerCharacter;
|
|
79
|
-
completionItems.push({
|
|
80
|
-
...completionItem,
|
|
81
|
-
label: comparisonCharacter + name,
|
|
82
|
-
sortText: comparisonCharacter + String(value).padStart(8, '0'),
|
|
83
|
-
filterText: name,
|
|
84
|
-
insertText: name,
|
|
85
|
-
documentation: getCSSDataDocumentation(undefined, {
|
|
86
|
-
generatedCSS: generateCSS([
|
|
87
|
-
syntax + name
|
|
88
|
-
], css),
|
|
89
|
-
docs: '/guide/syntax#at-rules'
|
|
90
|
-
}),
|
|
91
|
-
detail: `screen width ${comparisonCharacter} ${value}px`,
|
|
92
|
-
kind: CompletionItemKind.Keyword
|
|
93
|
-
});
|
|
94
|
-
}
|
|
84
|
+
handleNumberNodes(atRule, token);
|
|
95
85
|
}
|
|
96
86
|
});
|
|
97
87
|
return sortCompletionItems(completionItems);
|
package/dist/utils/get-range.cjs
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
// todo: unstable range calculation
|
|
4
3
|
function getRange(searchString, doc) {
|
|
5
4
|
const text = doc.getText();
|
|
6
|
-
const regex = new RegExp(`(\\b(?:className|class)\\s
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
5
|
+
const regex = new RegExp(`(\\b(?:className|class)\\s*=\\s*(['"\`]))(.*?)\\2`, 'gs');
|
|
6
|
+
let match;
|
|
7
|
+
while((match = regex.exec(text)) !== null){
|
|
8
|
+
match[0];
|
|
9
|
+
const attrStartIndex = match.index + match[1].length;
|
|
10
|
+
const className = match[3];
|
|
11
|
+
const relativeIndex = className.indexOf(searchString);
|
|
12
|
+
if (relativeIndex !== -1) {
|
|
13
|
+
const absoluteIndex = attrStartIndex + relativeIndex;
|
|
14
|
+
return {
|
|
15
|
+
start: doc.positionAt(absoluteIndex),
|
|
16
|
+
end: doc.positionAt(absoluteIndex + searchString.length)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
18
19
|
}
|
|
20
|
+
throw new Error(`Cannot find "${searchString}" in any class attribute.`);
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
module.exports = getRange;
|
package/dist/utils/get-range.mjs
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
// todo: unstable range calculation
|
|
2
1
|
function getRange(searchString, doc) {
|
|
3
2
|
const text = doc.getText();
|
|
4
|
-
const regex = new RegExp(`(\\b(?:className|class)\\s
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
3
|
+
const regex = new RegExp(`(\\b(?:className|class)\\s*=\\s*(['"\`]))(.*?)\\2`, 'gs');
|
|
4
|
+
let match;
|
|
5
|
+
while((match = regex.exec(text)) !== null){
|
|
6
|
+
match[0];
|
|
7
|
+
const attrStartIndex = match.index + match[1].length;
|
|
8
|
+
const className = match[3];
|
|
9
|
+
const relativeIndex = className.indexOf(searchString);
|
|
10
|
+
if (relativeIndex !== -1) {
|
|
11
|
+
const absoluteIndex = attrStartIndex + relativeIndex;
|
|
12
|
+
return {
|
|
13
|
+
start: doc.positionAt(absoluteIndex),
|
|
14
|
+
end: doc.positionAt(absoluteIndex + searchString.length)
|
|
15
|
+
};
|
|
16
|
+
}
|
|
16
17
|
}
|
|
18
|
+
throw new Error(`Cannot find "${searchString}" in any class attribute.`);
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
export { getRange as default };
|
|
@@ -102,7 +102,7 @@ function querySyntaxCompletions(q = '', css$1 = new css.MasterCSS()) {
|
|
|
102
102
|
generatedCSS: css.generateCSS([
|
|
103
103
|
field + '.class'
|
|
104
104
|
], css$1),
|
|
105
|
-
docs: '/guide/
|
|
105
|
+
docs: '/guide/selectors'
|
|
106
106
|
}),
|
|
107
107
|
kind: vscodeLanguageserverProtocol.CompletionItemKind.Class
|
|
108
108
|
});
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@master/css-language-service","type":"module","scripts":{"build":"techor build \"src/**/*.ts\"","dev":"pnpm build --watch","type-check":"tsc --noEmit","lint":"eslint","test":"vitest"},"description":"Master CSS Language Service","author":"Aoyue Design LLC.","license":"MIT","repository":{"type":"git","url":"https://github.com/master-co/css.git","directory":"packages/language-service"},"dependencies":{"@babel/parser":"^7.26.3","@master/css":"^2.0.0-rc.
|
|
1
|
+
{"name":"@master/css-language-service","type":"module","scripts":{"build":"techor build \"src/**/*.ts\"","dev":"pnpm build --watch","type-check":"tsc --noEmit","lint":"eslint","test":"vitest"},"description":"Master CSS Language Service","author":"Aoyue Design LLC.","license":"MIT","repository":{"type":"git","url":"https://github.com/master-co/css.git","directory":"packages/language-service"},"dependencies":{"@babel/parser":"^7.26.3","@master/css":"^2.0.0-rc.62","@techor/extend":"^3.2.0","color-convert":"^2.0.1","color-rgba":"^3.0.0","color-space":"^2.0.1","culori":"^4.0.1","js-beautify":"^1.15.1","lodash.escaperegexp":"^4.1.2","minimatch":"^10.0.1","pex-color":"^2.2.0","vscode-css-languageservice":"^6.3.2","vscode-languageserver-protocol":"^3.17.5","vscode-languageserver-textdocument":"^1.0.12"},"devDependencies":{"@types/chroma-js":"^2.4.5","@types/color-convert":"^2.0.4","@types/color-rgba":"^2.1.3","@types/culori":"^2.1.1","@types/lodash.escaperegexp":"^4.1.9","@types/vscode":"^1.96.0","shared":"^2.0.0-rc.62","vscode-languageserver":"^9.0.1"},"sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.mjs","jsnext:main":"./dist/index.mjs","esnext":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"files":["dist"],"publishConfig":{"access":"public","provenance":true},"version":"2.0.0-rc.62"}
|