@f12io/maple-language-core 0.0.2
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/README.md +42 -0
- package/dist/LanguageService.d.ts +104 -0
- package/dist/LanguageService.js +16 -0
- package/dist/LanguageService.js.map +1 -0
- package/dist/extractor.helper.d.ts +66 -0
- package/dist/extractor.helper.js +319 -0
- package/dist/extractor.helper.js.map +1 -0
- package/dist/formatter.d.ts +26 -0
- package/dist/formatter.js +206 -0
- package/dist/formatter.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/language-definitions.d.ts +9 -0
- package/dist/language-definitions.js +35 -0
- package/dist/language-definitions.js.map +1 -0
- package/dist/languages/AngularLanguageService.d.ts +6 -0
- package/dist/languages/AngularLanguageService.js +66 -0
- package/dist/languages/AngularLanguageService.js.map +1 -0
- package/dist/languages/BaseLanguageService.d.ts +80 -0
- package/dist/languages/BaseLanguageService.js +409 -0
- package/dist/languages/BaseLanguageService.js.map +1 -0
- package/dist/languages/HtmlLanguageService.d.ts +5 -0
- package/dist/languages/HtmlLanguageService.js +29 -0
- package/dist/languages/HtmlLanguageService.js.map +1 -0
- package/dist/languages/JavascriptLanguageService.d.ts +10 -0
- package/dist/languages/JavascriptLanguageService.js +95 -0
- package/dist/languages/JavascriptLanguageService.js.map +1 -0
- package/dist/languages/PhpLanguageService.d.ts +22 -0
- package/dist/languages/PhpLanguageService.js +242 -0
- package/dist/languages/PhpLanguageService.js.map +1 -0
- package/dist/languages/RazorLanguageService.d.ts +33 -0
- package/dist/languages/RazorLanguageService.js +338 -0
- package/dist/languages/RazorLanguageService.js.map +1 -0
- package/dist/languages/ReactLanguageService.d.ts +6 -0
- package/dist/languages/ReactLanguageService.js +31 -0
- package/dist/languages/ReactLanguageService.js.map +1 -0
- package/dist/languages/SvelteLanguageService.d.ts +9 -0
- package/dist/languages/SvelteLanguageService.js +65 -0
- package/dist/languages/SvelteLanguageService.js.map +1 -0
- package/dist/languages/TwigLanguageService.d.ts +4 -0
- package/dist/languages/TwigLanguageService.js +12 -0
- package/dist/languages/TwigLanguageService.js.map +1 -0
- package/dist/languages/VueLanguageService.d.ts +6 -0
- package/dist/languages/VueLanguageService.js +36 -0
- package/dist/languages/VueLanguageService.js.map +1 -0
- package/dist/regex.d.ts +63 -0
- package/dist/regex.js +92 -0
- package/dist/regex.js.map +1 -0
- package/dist/registry.d.ts +7 -0
- package/dist/registry.js +86 -0
- package/dist/registry.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatClasses = formatClasses;
|
|
4
|
+
exports.computeFormattingEdits = computeFormattingEdits;
|
|
5
|
+
exports.applyTextEdits = applyTextEdits;
|
|
6
|
+
exports.formatText = formatText;
|
|
7
|
+
const maple_1 = require("@f12io/maple");
|
|
8
|
+
const regex_1 = require("./regex");
|
|
9
|
+
const registry_1 = require("./registry");
|
|
10
|
+
function getIndentFromIndex(text, index) {
|
|
11
|
+
const lineStart = text.lastIndexOf('\n', index) + 1;
|
|
12
|
+
const lineText = text.substring(lineStart, index);
|
|
13
|
+
const match = lineText.match(regex_1.INDENT_WHITESPACE_REGEX);
|
|
14
|
+
return match ? match[0] : '';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Formats a maple class string: wraps onto multiple lines when it exceeds
|
|
18
|
+
* `maxClassesPerLine`, grouping classes by property type, and recursing into
|
|
19
|
+
* interpolation expressions via the language service.
|
|
20
|
+
*/
|
|
21
|
+
function formatClasses(classStr, baseIndent, maxClassesPerLine, service) {
|
|
22
|
+
const tokens = service.tokenizeClassesWithIndices(classStr);
|
|
23
|
+
if (tokens.length === 0)
|
|
24
|
+
return '';
|
|
25
|
+
if (tokens.length <= 1 && maxClassesPerLine >= 1) {
|
|
26
|
+
if (tokens.length === 1 && tokens[0].hasInterpolation) {
|
|
27
|
+
// Do not return early, allow interpolation formatting
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
return tokens.length === 1 ? tokens[0].value : '';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const lines = [];
|
|
34
|
+
let currentLine = { classes: [], hasExpression: false };
|
|
35
|
+
let lastPropType = null;
|
|
36
|
+
for (const token of tokens) {
|
|
37
|
+
const cls = token.value;
|
|
38
|
+
let propType = -1;
|
|
39
|
+
try {
|
|
40
|
+
const parsed = (0, maple_1.parseClass)(cls);
|
|
41
|
+
propType = parsed?.propType ?? -1;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
propType = -1;
|
|
45
|
+
}
|
|
46
|
+
const isNewType = tokens.length > maxClassesPerLine &&
|
|
47
|
+
lastPropType !== null &&
|
|
48
|
+
lastPropType !== propType;
|
|
49
|
+
const isOverLimit = currentLine.classes.length >= maxClassesPerLine;
|
|
50
|
+
const isExpression = token.hasInterpolation;
|
|
51
|
+
if (currentLine.classes.length > 0 &&
|
|
52
|
+
(isNewType || isOverLimit || isExpression || currentLine.hasExpression)) {
|
|
53
|
+
lines.push(currentLine);
|
|
54
|
+
currentLine = { classes: [], hasExpression: false };
|
|
55
|
+
}
|
|
56
|
+
if (isExpression) {
|
|
57
|
+
const formattedCls = service.formatInterpolation(cls, baseIndent, maxClassesPerLine, (value, indent, maxClasses) => formatClasses(value, indent, maxClasses, service));
|
|
58
|
+
currentLine.classes.push(formattedCls);
|
|
59
|
+
currentLine.hasExpression = true;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
currentLine.classes.push(cls);
|
|
63
|
+
}
|
|
64
|
+
lastPropType = propType;
|
|
65
|
+
}
|
|
66
|
+
if (currentLine.classes.length > 0) {
|
|
67
|
+
lines.push(currentLine);
|
|
68
|
+
}
|
|
69
|
+
// Property-type boundaries can strand a single class on its own line
|
|
70
|
+
// (e.g. `fx` between an opacity and an alias). Merge singleton lines into
|
|
71
|
+
// the previous line when it has room, otherwise into the next one.
|
|
72
|
+
// Expression lines stay isolated by design.
|
|
73
|
+
for (let i = 0; i < lines.length; i++) {
|
|
74
|
+
const line = lines[i];
|
|
75
|
+
if (line.classes.length !== 1 || line.hasExpression)
|
|
76
|
+
continue;
|
|
77
|
+
const prev = lines[i - 1];
|
|
78
|
+
const next = lines[i + 1];
|
|
79
|
+
if (prev &&
|
|
80
|
+
!prev.hasExpression &&
|
|
81
|
+
prev.classes.length < maxClassesPerLine) {
|
|
82
|
+
prev.classes.push(...line.classes);
|
|
83
|
+
lines.splice(i, 1);
|
|
84
|
+
i--;
|
|
85
|
+
}
|
|
86
|
+
else if (next &&
|
|
87
|
+
!next.hasExpression &&
|
|
88
|
+
next.classes.length < maxClassesPerLine) {
|
|
89
|
+
next.classes.unshift(...line.classes);
|
|
90
|
+
lines.splice(i, 1);
|
|
91
|
+
i--;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (lines.length === 1) {
|
|
95
|
+
return lines[0].classes.join(' ');
|
|
96
|
+
}
|
|
97
|
+
const indent = baseIndent + ' ';
|
|
98
|
+
return ('\n' +
|
|
99
|
+
lines.map((line) => indent + line.classes.join(' ')).join('\n') +
|
|
100
|
+
'\n' +
|
|
101
|
+
baseIndent);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Computes formatting replacements for every maple region in the document —
|
|
105
|
+
* class attributes, opt-in expressions, and framework-specific regions — as
|
|
106
|
+
* plain offsets, usable from any host (VS Code, Prettier, CLI).
|
|
107
|
+
*/
|
|
108
|
+
function computeFormattingEdits(text, service, maxClassesPerLine) {
|
|
109
|
+
const edits = [];
|
|
110
|
+
const formatClassesFn = (value, indent, max) => formatClasses(value, indent, max, service);
|
|
111
|
+
// The same regions extraction consumes; when regions overlap (e.g.
|
|
112
|
+
// /* maple */ clsx(...), or clsx inside a className expression) the
|
|
113
|
+
// outermost one formats everything inside it.
|
|
114
|
+
const regions = service.collectRegions(text);
|
|
115
|
+
regions.sort((a, b) => a.start - b.start || b.end - a.end);
|
|
116
|
+
let lastKeptEnd = -1;
|
|
117
|
+
for (const region of regions) {
|
|
118
|
+
if (region.start < lastKeptEnd)
|
|
119
|
+
continue;
|
|
120
|
+
lastKeptEnd = region.end;
|
|
121
|
+
const allowMultiline = region.allowMultilineLiterals !== false;
|
|
122
|
+
const baseIndent = getIndentFromIndex(text, region.anchor);
|
|
123
|
+
if (region.kind === 'class-text') {
|
|
124
|
+
const innerString = text.substring(region.start, region.end);
|
|
125
|
+
const formatted = formatClassesFn(innerString, baseIndent, maxClassesPerLine);
|
|
126
|
+
if (formatted === innerString)
|
|
127
|
+
continue;
|
|
128
|
+
if (formatted.includes('\n') && !allowMultiline)
|
|
129
|
+
continue;
|
|
130
|
+
edits.push({ start: region.start, end: region.end, newText: formatted });
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// Expression regions: structured expressions (ternaries, concatenations)
|
|
134
|
+
// get the same treatment as interpolations inside class attributes.
|
|
135
|
+
const regionText = text.substring(region.start, region.end).trim();
|
|
136
|
+
const regionTextStart = region.start +
|
|
137
|
+
text.substring(region.start, region.end).indexOf(regionText);
|
|
138
|
+
const structured = service.formatExpression(regionText, baseIndent, maxClassesPerLine, formatClassesFn);
|
|
139
|
+
if (structured !== undefined) {
|
|
140
|
+
if (structured !== regionText &&
|
|
141
|
+
(allowMultiline || !structured.includes('\n'))) {
|
|
142
|
+
edits.push({
|
|
143
|
+
start: regionTextStart,
|
|
144
|
+
end: regionTextStart + regionText.length,
|
|
145
|
+
newText: structured,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
// Otherwise format each string literal on its own.
|
|
151
|
+
let i = region.start;
|
|
152
|
+
while (i < region.end) {
|
|
153
|
+
const literal = service.matchStringLiteral(text, i);
|
|
154
|
+
if (!literal) {
|
|
155
|
+
i++;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
i = literal.endIndex;
|
|
159
|
+
const innerString = text.substring(literal.contentStart, literal.contentEnd);
|
|
160
|
+
const formatted = formatClassesFn(innerString, baseIndent, maxClassesPerLine);
|
|
161
|
+
if (formatted === innerString)
|
|
162
|
+
continue;
|
|
163
|
+
// Keep the original delimiters for single-line results; multi-line
|
|
164
|
+
// results need delimiters that legally contain newlines (or none
|
|
165
|
+
// exist and the string is left untouched).
|
|
166
|
+
let open = literal.rawDelimiter;
|
|
167
|
+
let close = literal.rawDelimiter === '`' ? '`' : literal.rawDelimiter.slice(-1);
|
|
168
|
+
if (formatted.includes('\n')) {
|
|
169
|
+
if (!allowMultiline)
|
|
170
|
+
continue;
|
|
171
|
+
const delimiters = service.getMultilineStringDelimiters(literal.rawDelimiter, innerString);
|
|
172
|
+
if (!delimiters)
|
|
173
|
+
continue;
|
|
174
|
+
open = delimiters.open;
|
|
175
|
+
close = delimiters.close;
|
|
176
|
+
}
|
|
177
|
+
edits.push({
|
|
178
|
+
start: literal.start,
|
|
179
|
+
end: literal.endIndex,
|
|
180
|
+
newText: open + formatted + close,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return edits;
|
|
185
|
+
}
|
|
186
|
+
/** Applies non-overlapping replacements to a string. */
|
|
187
|
+
function applyTextEdits(text, edits) {
|
|
188
|
+
const sorted = [...edits].sort((a, b) => b.start - a.start);
|
|
189
|
+
let result = text;
|
|
190
|
+
for (const edit of sorted) {
|
|
191
|
+
result =
|
|
192
|
+
result.substring(0, edit.start) + edit.newText + result.substring(edit.end);
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Formats every maple region in a document and returns the new text.
|
|
198
|
+
* Convenience entry point for non-editor hosts (Prettier plugin, CLI).
|
|
199
|
+
*/
|
|
200
|
+
function formatText(text, languageId, maxClassesPerLine) {
|
|
201
|
+
const service = registry_1.LanguageServiceRegistry.getService(languageId);
|
|
202
|
+
if (!service)
|
|
203
|
+
return text;
|
|
204
|
+
return applyTextEdits(text, computeFormattingEdits(text, service, maxClassesPerLine));
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":";;AAwBA,sCA8GC;AAOD,wDAgHC;AAGD,wCAWC;AAMD,gCAWC;AA5RD,wCAA0C;AAC1C,mCAAkD;AAElD,yCAAqD;AASrD,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAa;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,+BAAuB,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAC3B,QAAgB,EAChB,UAAkB,EAClB,iBAAyB,EACzB,OAAyB;IAEzB,MAAM,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACtD,sDAAsD;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAOD,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,WAAW,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACpE,IAAI,YAAY,GAAkB,IAAI,CAAC;IAEvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,GAAG,CAAC,CAAC;YAC/B,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,CAAC,CAAC,CAAC;QAChB,CAAC;QAED,MAAM,SAAS,GACb,MAAM,CAAC,MAAM,GAAG,iBAAiB;YACjC,YAAY,KAAK,IAAI;YACrB,YAAY,KAAK,QAAQ,CAAC;QAC5B,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,IAAI,iBAAiB,CAAC;QACpE,MAAM,YAAY,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAE5C,IACE,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,SAAS,IAAI,WAAW,IAAI,YAAY,IAAI,WAAW,CAAC,aAAa,CAAC,EACvE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,WAAW,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QACtD,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAC9C,GAAG,EACH,UAAU,EACV,iBAAiB,EACjB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAC5B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CACpD,CAAC;YACF,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvC,WAAW,CAAC,aAAa,GAAG,IAAI,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,YAAY,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IAED,qEAAqE;IACrE,0EAA0E;IAC1E,mEAAmE;IACnE,4CAA4C;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa;YAAE,SAAS;QAE9D,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,IACE,IAAI;YACJ,CAAC,IAAI,CAAC,aAAa;YACnB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,iBAAiB,EACvC,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IACL,IAAI;YACJ,CAAC,IAAI,CAAC,aAAa;YACnB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,iBAAiB,EACvC,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YACtC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnB,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACjC,OAAO,CACL,IAAI;QACJ,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/D,IAAI;QACJ,UAAU,CACX,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CACpC,IAAY,EACZ,OAAyB,EACzB,iBAAyB;IAEzB,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,GAAW,EAAE,EAAE,CACrE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAE7C,mEAAmE;IACnE,oEAAoE;IACpE,8CAA8C;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3D,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;IAErB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,GAAG,WAAW;YAAE,SAAS;QACzC,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC;QAEzB,MAAM,cAAc,GAAG,MAAM,CAAC,sBAAsB,KAAK,KAAK,CAAC;QAC/D,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3D,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,eAAe,CAC/B,WAAW,EACX,UAAU,EACV,iBAAiB,CAClB,CAAC;YACF,IAAI,SAAS,KAAK,WAAW;gBAAE,SAAS;YACxC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc;gBAAE,SAAS;YAE1D,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,oEAAoE;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACnE,MAAM,eAAe,GACnB,MAAM,CAAC,KAAK;YACZ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CACzC,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,eAAe,CAChB,CAAC;QACF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,IACE,UAAU,KAAK,UAAU;gBACzB,CAAC,cAAc,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAC9C,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC;oBACT,KAAK,EAAE,eAAe;oBACtB,GAAG,EAAE,eAAe,GAAG,UAAU,CAAC,MAAM;oBACxC,OAAO,EAAE,UAAU;iBACpB,CAAC,CAAC;YACL,CAAC;YACD,SAAS;QACX,CAAC;QAED,mDAAmD;QACnD,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACrB,OAAO,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;YAErB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAChC,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,UAAU,CACnB,CAAC;YAEF,MAAM,SAAS,GAAG,eAAe,CAC/B,WAAW,EACX,UAAU,EACV,iBAAiB,CAClB,CAAC;YACF,IAAI,SAAS,KAAK,WAAW;gBAAE,SAAS;YAExC,mEAAmE;YACnE,iEAAiE;YACjE,2CAA2C;YAC3C,IAAI,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;YAChC,IAAI,KAAK,GACP,OAAO,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,cAAc;oBAAE,SAAS;gBAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,4BAA4B,CACrD,OAAO,CAAC,YAAY,EACpB,WAAW,CACZ,CAAC;gBACF,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAC1B,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;gBACvB,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;YAC3B,CAAC;YAED,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,GAAG,EAAE,OAAO,CAAC,QAAQ;gBACrB,OAAO,EAAE,IAAI,GAAG,SAAS,GAAG,KAAK;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wDAAwD;AACxD,SAAgB,cAAc,CAC5B,IAAY,EACZ,KAA6B;IAE7B,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM;YACJ,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CACxB,IAAY,EACZ,UAAkB,EAClB,iBAAyB;IAEzB,MAAM,OAAO,GAAG,kCAAuB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,cAAc,CACnB,IAAI,EACJ,sBAAsB,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,CAAC,CACzD,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @f12io/maple-language-core
|
|
3
|
+
*
|
|
4
|
+
* Editor-agnostic language tooling for the Maple CSS engine: region
|
|
5
|
+
* discovery, string grammar, class extraction, and the layout engine used by
|
|
6
|
+
* both the VS Code extension and the Prettier plugin.
|
|
7
|
+
*/
|
|
8
|
+
export * from './LanguageService';
|
|
9
|
+
export { LanguageServiceRegistry } from './registry';
|
|
10
|
+
export { applyTextEdits, computeFormattingEdits, formatClasses, formatText, } from './formatter';
|
|
11
|
+
export type { TextReplacement } from './formatter';
|
|
12
|
+
export { BaseLanguageService, type InterpolationContext, type InterpolationMatch, } from './languages/BaseLanguageService';
|
|
13
|
+
export * from './regex';
|
|
14
|
+
export * from './language-definitions';
|
|
15
|
+
export { findClosingQuote, findOptInRegions, getDisabledBlocks, getExactWordRangeAtPosition, getTagNameBackwards, isCommentedOut, isLineDisabled, isQuote, MAX_SCAN_LENGTH, pushInstance, shouldSkipMatch, skipStringLiteral, type OptInRegion, } from './extractor.helper';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @f12io/maple-language-core
|
|
4
|
+
*
|
|
5
|
+
* Editor-agnostic language tooling for the Maple CSS engine: region
|
|
6
|
+
* discovery, string grammar, class extraction, and the layout engine used by
|
|
7
|
+
* both the VS Code extension and the Prettier plugin.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.skipStringLiteral = exports.shouldSkipMatch = exports.pushInstance = exports.MAX_SCAN_LENGTH = exports.isQuote = exports.isLineDisabled = exports.isCommentedOut = exports.getTagNameBackwards = exports.getExactWordRangeAtPosition = exports.getDisabledBlocks = exports.findOptInRegions = exports.findClosingQuote = exports.BaseLanguageService = exports.formatText = exports.formatClasses = exports.computeFormattingEdits = exports.applyTextEdits = exports.LanguageServiceRegistry = void 0;
|
|
25
|
+
__exportStar(require("./LanguageService"), exports);
|
|
26
|
+
var registry_1 = require("./registry");
|
|
27
|
+
Object.defineProperty(exports, "LanguageServiceRegistry", { enumerable: true, get: function () { return registry_1.LanguageServiceRegistry; } });
|
|
28
|
+
var formatter_1 = require("./formatter");
|
|
29
|
+
Object.defineProperty(exports, "applyTextEdits", { enumerable: true, get: function () { return formatter_1.applyTextEdits; } });
|
|
30
|
+
Object.defineProperty(exports, "computeFormattingEdits", { enumerable: true, get: function () { return formatter_1.computeFormattingEdits; } });
|
|
31
|
+
Object.defineProperty(exports, "formatClasses", { enumerable: true, get: function () { return formatter_1.formatClasses; } });
|
|
32
|
+
Object.defineProperty(exports, "formatText", { enumerable: true, get: function () { return formatter_1.formatText; } });
|
|
33
|
+
var BaseLanguageService_1 = require("./languages/BaseLanguageService");
|
|
34
|
+
Object.defineProperty(exports, "BaseLanguageService", { enumerable: true, get: function () { return BaseLanguageService_1.BaseLanguageService; } });
|
|
35
|
+
__exportStar(require("./regex"), exports);
|
|
36
|
+
__exportStar(require("./language-definitions"), exports);
|
|
37
|
+
var extractor_helper_1 = require("./extractor.helper");
|
|
38
|
+
Object.defineProperty(exports, "findClosingQuote", { enumerable: true, get: function () { return extractor_helper_1.findClosingQuote; } });
|
|
39
|
+
Object.defineProperty(exports, "findOptInRegions", { enumerable: true, get: function () { return extractor_helper_1.findOptInRegions; } });
|
|
40
|
+
Object.defineProperty(exports, "getDisabledBlocks", { enumerable: true, get: function () { return extractor_helper_1.getDisabledBlocks; } });
|
|
41
|
+
Object.defineProperty(exports, "getExactWordRangeAtPosition", { enumerable: true, get: function () { return extractor_helper_1.getExactWordRangeAtPosition; } });
|
|
42
|
+
Object.defineProperty(exports, "getTagNameBackwards", { enumerable: true, get: function () { return extractor_helper_1.getTagNameBackwards; } });
|
|
43
|
+
Object.defineProperty(exports, "isCommentedOut", { enumerable: true, get: function () { return extractor_helper_1.isCommentedOut; } });
|
|
44
|
+
Object.defineProperty(exports, "isLineDisabled", { enumerable: true, get: function () { return extractor_helper_1.isLineDisabled; } });
|
|
45
|
+
Object.defineProperty(exports, "isQuote", { enumerable: true, get: function () { return extractor_helper_1.isQuote; } });
|
|
46
|
+
Object.defineProperty(exports, "MAX_SCAN_LENGTH", { enumerable: true, get: function () { return extractor_helper_1.MAX_SCAN_LENGTH; } });
|
|
47
|
+
Object.defineProperty(exports, "pushInstance", { enumerable: true, get: function () { return extractor_helper_1.pushInstance; } });
|
|
48
|
+
Object.defineProperty(exports, "shouldSkipMatch", { enumerable: true, get: function () { return extractor_helper_1.shouldSkipMatch; } });
|
|
49
|
+
Object.defineProperty(exports, "skipStringLiteral", { enumerable: true, get: function () { return extractor_helper_1.skipStringLiteral; } });
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;AAEH,oDAAkC;AAClC,uCAAqD;AAA5C,mHAAA,uBAAuB,OAAA;AAChC,yCAKqB;AAJnB,2GAAA,cAAc,OAAA;AACd,mHAAA,sBAAsB,OAAA;AACtB,0GAAA,aAAa,OAAA;AACb,uGAAA,UAAU,OAAA;AAGZ,uEAIyC;AAHvC,0HAAA,mBAAmB,OAAA;AAIrB,0CAAwB;AACxB,yDAAuC;AACvC,uDAc4B;AAb1B,oHAAA,gBAAgB,OAAA;AAChB,oHAAA,gBAAgB,OAAA;AAChB,qHAAA,iBAAiB,OAAA;AACjB,+HAAA,2BAA2B,OAAA;AAC3B,uHAAA,mBAAmB,OAAA;AACnB,kHAAA,cAAc,OAAA;AACd,kHAAA,cAAc,OAAA;AACd,2GAAA,OAAO,OAAA;AACP,mHAAA,eAAe,OAAA;AACf,gHAAA,YAAY,OAAA;AACZ,mHAAA,eAAe,OAAA;AACf,qHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const LANGUAGE_DEFINITIONS: {
|
|
2
|
+
id: string;
|
|
3
|
+
extensions: string[];
|
|
4
|
+
}[];
|
|
5
|
+
export declare const SUPPORTED_LANGUAGES: string[];
|
|
6
|
+
export declare const SUPPORTED_EXTENSIONS: string[];
|
|
7
|
+
export declare const SUPPORTED_FILES_GLOB: string;
|
|
8
|
+
export declare const getLanguageIdFromExtension: (ext?: string) => string;
|
|
9
|
+
export declare const getLanguageIdFromFileName: (fileName?: string) => string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLanguageIdFromFileName = exports.getLanguageIdFromExtension = exports.SUPPORTED_FILES_GLOB = exports.SUPPORTED_EXTENSIONS = exports.SUPPORTED_LANGUAGES = exports.LANGUAGE_DEFINITIONS = void 0;
|
|
4
|
+
exports.LANGUAGE_DEFINITIONS = [
|
|
5
|
+
{ id: 'html', extensions: ['html'] },
|
|
6
|
+
{ id: 'javascriptreact', extensions: ['jsx'] },
|
|
7
|
+
{ id: 'typescriptreact', extensions: ['tsx'] },
|
|
8
|
+
{ id: 'vue', extensions: ['vue'] },
|
|
9
|
+
{ id: 'svelte', extensions: ['svelte'] },
|
|
10
|
+
{ id: 'typescript', extensions: ['ts'] },
|
|
11
|
+
{ id: 'javascript', extensions: ['js'] },
|
|
12
|
+
{ id: 'razor', extensions: ['razor'] },
|
|
13
|
+
{ id: 'aspnetcorerazor', extensions: ['cshtml'] },
|
|
14
|
+
{ id: 'php', extensions: ['php'] },
|
|
15
|
+
{ id: 'twig', extensions: ['twig'] },
|
|
16
|
+
];
|
|
17
|
+
exports.SUPPORTED_LANGUAGES = exports.LANGUAGE_DEFINITIONS.map((lang) => lang.id);
|
|
18
|
+
exports.SUPPORTED_EXTENSIONS = exports.LANGUAGE_DEFINITIONS.flatMap((lang) => lang.extensions);
|
|
19
|
+
exports.SUPPORTED_FILES_GLOB = `**/*.{${exports.SUPPORTED_EXTENSIONS.join(',')}}`;
|
|
20
|
+
const getLanguageIdFromExtension = (ext) => {
|
|
21
|
+
if (!ext)
|
|
22
|
+
return 'html';
|
|
23
|
+
const lowerExt = ext.toLowerCase();
|
|
24
|
+
const language = exports.LANGUAGE_DEFINITIONS.find((lang) => lang.extensions.includes(lowerExt));
|
|
25
|
+
return language ? language.id : 'html';
|
|
26
|
+
};
|
|
27
|
+
exports.getLanguageIdFromExtension = getLanguageIdFromExtension;
|
|
28
|
+
const getLanguageIdFromFileName = (fileName) => {
|
|
29
|
+
if (!fileName)
|
|
30
|
+
return 'html';
|
|
31
|
+
const ext = fileName.split('.').pop();
|
|
32
|
+
return (0, exports.getLanguageIdFromExtension)(ext);
|
|
33
|
+
};
|
|
34
|
+
exports.getLanguageIdFromFileName = getLanguageIdFromFileName;
|
|
35
|
+
//# sourceMappingURL=language-definitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-definitions.js","sourceRoot":"","sources":["../src/language-definitions.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG;IAClC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE;IACpC,EAAE,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE;IAC9C,EAAE,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE;IAC9C,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE;IAClC,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;IACxC,EAAE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE;IACxC,EAAE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE;IACxC,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;IACtC,EAAE,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;IACjD,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE;IAClC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE;CACrC,CAAC;AAEW,QAAA,mBAAmB,GAAG,4BAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAElE,QAAA,oBAAoB,GAAG,4BAAoB,CAAC,OAAO,CAC9D,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAC1B,CAAC;AAEW,QAAA,oBAAoB,GAAG,SAAS,4BAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAExE,MAAM,0BAA0B,GAAG,CAAC,GAAY,EAAU,EAAE;IACjE,IAAI,CAAC,GAAG;QAAE,OAAO,MAAM,CAAC;IACxB,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAEnC,MAAM,QAAQ,GAAG,4BAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACnC,CAAC;IAEF,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC,CAAC;AATW,QAAA,0BAA0B,8BASrC;AAEK,MAAM,yBAAyB,GAAG,CAAC,QAAiB,EAAU,EAAE;IACrE,IAAI,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACtC,OAAO,IAAA,kCAA0B,EAAC,GAAG,CAAC,CAAC;AACzC,CAAC,CAAC;AAJW,QAAA,yBAAyB,6BAIpC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AngularLanguageService = void 0;
|
|
4
|
+
const extractor_helper_1 = require("../extractor.helper");
|
|
5
|
+
const regex_1 = require("../regex");
|
|
6
|
+
const BaseLanguageService_1 = require("./BaseLanguageService");
|
|
7
|
+
class AngularLanguageService extends BaseLanguageService_1.BaseLanguageService {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.languageIds = ['html', 'typescript'];
|
|
11
|
+
}
|
|
12
|
+
collectRegions(text) {
|
|
13
|
+
// Note: the base attribute/opt-in regions are contributed by
|
|
14
|
+
// HtmlLanguageService in the same composite; this service adds only the
|
|
15
|
+
// Angular-specific constructs.
|
|
16
|
+
const regions = [];
|
|
17
|
+
// Template expressions: [ngClass]="...", [class.x]="..."
|
|
18
|
+
for (const match of text.matchAll(regex_1.ANGULAR_VUE_EXPR_REGEX)) {
|
|
19
|
+
const quote = match[1];
|
|
20
|
+
const exprStart = match.index + match[0].length;
|
|
21
|
+
const closingQuoteIndex = (0, extractor_helper_1.findClosingQuote)(text, exprStart, quote);
|
|
22
|
+
if (closingQuoteIndex === -1)
|
|
23
|
+
continue;
|
|
24
|
+
regions.push({
|
|
25
|
+
start: exprStart,
|
|
26
|
+
end: closingQuoteIndex,
|
|
27
|
+
kind: 'expression',
|
|
28
|
+
anchor: match.index,
|
|
29
|
+
// Angular template expressions support neither template literals nor
|
|
30
|
+
// multi-line strings
|
|
31
|
+
allowMultilineLiterals: false,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// Component decorators: host: { class: '...' }
|
|
35
|
+
for (const match of text.matchAll(regex_1.HOST_REGEX)) {
|
|
36
|
+
const hostObj = match[1];
|
|
37
|
+
const hostStart = match.index + match[0].indexOf(hostObj);
|
|
38
|
+
for (const hcMatch of hostObj.matchAll(regex_1.HOST_CLASS_REGEX)) {
|
|
39
|
+
const quoteIdx = hcMatch[0].indexOf(hcMatch[1]);
|
|
40
|
+
const start = hostStart + hcMatch.index + quoteIdx + 1;
|
|
41
|
+
regions.push({
|
|
42
|
+
start,
|
|
43
|
+
end: start + hcMatch[2].length,
|
|
44
|
+
kind: 'class-text',
|
|
45
|
+
anchor: match.index,
|
|
46
|
+
// The class list lives inside a TS string literal
|
|
47
|
+
allowMultilineLiterals: false,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Specific class bindings: [class.name]
|
|
52
|
+
for (const match of text.matchAll(regex_1.SPECIFIC_CLASS_REGEX)) {
|
|
53
|
+
const start = match.index + match[0].indexOf(match[1]);
|
|
54
|
+
regions.push({
|
|
55
|
+
start,
|
|
56
|
+
end: start + match[1].length,
|
|
57
|
+
kind: 'class-text',
|
|
58
|
+
anchor: match.index,
|
|
59
|
+
allowMultilineLiterals: false,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return regions;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.AngularLanguageService = AngularLanguageService;
|
|
66
|
+
//# sourceMappingURL=AngularLanguageService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AngularLanguageService.js","sourceRoot":"","sources":["../../src/languages/AngularLanguageService.ts"],"names":[],"mappings":";;;AAAA,0DAAuD;AAEvD,oCAKkB;AAClB,+DAA4D;AAE5D,MAAa,sBAAuB,SAAQ,yCAAmB;IAA/D;;QACE,gBAAW,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IA2DvC,CAAC;IAzDQ,cAAc,CAAC,IAAY;QAChC,6DAA6D;QAC7D,wEAAwE;QACxE,+BAA+B;QAC/B,MAAM,OAAO,GAAuB,EAAE,CAAC;QAEvC,yDAAyD;QACzD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,8BAAsB,CAAC,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAChD,MAAM,iBAAiB,GAAG,IAAA,mCAAgB,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACnE,IAAI,iBAAiB,KAAK,CAAC,CAAC;gBAAE,SAAS;YAEvC,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,iBAAiB;gBACtB,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,KAAK,CAAC,KAAK;gBACnB,qEAAqE;gBACrE,qBAAqB;gBACrB,sBAAsB,EAAE,KAAK;aAC9B,CAAC,CAAC;QACL,CAAC;QAED,+CAA+C;QAC/C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE1D,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,wBAAgB,CAAC,EAAE,CAAC;gBACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,MAAM,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK;oBACL,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM;oBAC9B,IAAI,EAAE,YAAY;oBAClB,MAAM,EAAE,KAAK,CAAC,KAAK;oBACnB,kDAAkD;oBAClD,sBAAsB,EAAE,KAAK;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,4BAAoB,CAAC,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK;gBACL,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC5B,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,KAAK,CAAC,KAAK;gBACnB,sBAAsB,EAAE,KAAK;aAC9B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AA5DD,wDA4DC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { ClassInstance, ILanguageService, MapleRegion, StringLiteralMatch, Token } from '../LanguageService';
|
|
2
|
+
export interface InterpolationMatch {
|
|
3
|
+
innerExprStart: number;
|
|
4
|
+
innerExprEnd: number;
|
|
5
|
+
endIndex: number;
|
|
6
|
+
/**
|
|
7
|
+
* The matched range is literal text (e.g. Razor's `@@` or C#'s `{{` escape):
|
|
8
|
+
* consume it verbatim without splitting the instance or extracting an
|
|
9
|
+
* expression from it.
|
|
10
|
+
*/
|
|
11
|
+
isLiteral?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface InterpolationContext {
|
|
14
|
+
/**
|
|
15
|
+
* Opening delimiter of the enclosing interpolated string (e.g. `$"`, `$@"`
|
|
16
|
+
* or `` ` ``) while extracting its contents; undefined at the top level of
|
|
17
|
+
* markup attributes. Services interpret the delimiters they own (e.g. Razor
|
|
18
|
+
* treats braces as expression holes inside `$"`/`$@"` strings).
|
|
19
|
+
*/
|
|
20
|
+
stringDelimiter?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare abstract class BaseLanguageService implements ILanguageService {
|
|
23
|
+
abstract languageIds: Array<string>;
|
|
24
|
+
extractClasses(text: string): Array<ClassInstance>;
|
|
25
|
+
/**
|
|
26
|
+
* Reports every maple region this language knows about. Subclasses add
|
|
27
|
+
* framework-specific regions on top of the base set (class attributes and
|
|
28
|
+
* opt-in comments).
|
|
29
|
+
*/
|
|
30
|
+
collectRegions(text: string): Array<MapleRegion>;
|
|
31
|
+
/**
|
|
32
|
+
* Extracts maple classes from an `expression` region: every string literal
|
|
33
|
+
* is class text (interpolated ones recurse through the language-specific
|
|
34
|
+
* extractor), plus unquoted object keys when the region asks for them.
|
|
35
|
+
*/
|
|
36
|
+
protected extractExpressionRegion(text: string, region: MapleRegion, instances: Array<ClassInstance>, disabledBlocks: Array<{
|
|
37
|
+
start: number;
|
|
38
|
+
end: number;
|
|
39
|
+
}>): void;
|
|
40
|
+
/**
|
|
41
|
+
* Scans a bracketed region starting at `openIndex`, skipping string
|
|
42
|
+
* literals via `matchStringLiteral` (so template literals and interpolated
|
|
43
|
+
* strings are opaque). Returns the index after the matching close, or -1.
|
|
44
|
+
*/
|
|
45
|
+
protected parseBalancedExpression(text: string, openIndex: number): number;
|
|
46
|
+
protected extractAttributeClasses(value: string, offset: number, text: string, matchIndex: number, instances: Array<ClassInstance>, disabledBlocks?: Array<{
|
|
47
|
+
start: number;
|
|
48
|
+
end: number;
|
|
49
|
+
}>, stringDelimiter?: string): void;
|
|
50
|
+
protected parseInterpolation(value: string, index: number, context?: InterpolationContext): InterpolationMatch | undefined;
|
|
51
|
+
getRenderedClassText(word: string): string;
|
|
52
|
+
formatExpression(expr: string, baseIndent: string, maxClassesPerLine: number, formatClassesFn: (value: string, indent: string, maxClasses: number) => string): string | undefined;
|
|
53
|
+
matchStringLiteral(text: string, index: number): StringLiteralMatch | undefined;
|
|
54
|
+
getMultilineStringDelimiters(rawQuote: string, content: string): {
|
|
55
|
+
open: string;
|
|
56
|
+
close: string;
|
|
57
|
+
} | undefined;
|
|
58
|
+
tokenizeClassesWithIndices(str: string): Array<Token>;
|
|
59
|
+
formatInterpolation(cls: string, baseIndent: string, maxClassesPerLine: number, formatClassesFn: (value: string, indent: string, maxClasses: number) => string): string;
|
|
60
|
+
protected parseTernaryArms(expr: string): {
|
|
61
|
+
condition: string;
|
|
62
|
+
consequent: string;
|
|
63
|
+
alternate: string;
|
|
64
|
+
} | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Scans a JS template literal starting at the backtick and returns the
|
|
67
|
+
* index after the closing backtick, honoring `${...}` holes (which may
|
|
68
|
+
* contain nested strings and template literals).
|
|
69
|
+
*/
|
|
70
|
+
protected skipTemplateLiteral(expr: string, index: number): number;
|
|
71
|
+
protected skipStringAt(expr: string, index: number): number;
|
|
72
|
+
/**
|
|
73
|
+
* Scans a bracketed region starting at `openIndex` (which must hold the
|
|
74
|
+
* opening char), skipping string literals via the language-specific
|
|
75
|
+
* `skipStringAt`. Returns the index just after the matching close, or -1
|
|
76
|
+
* when unbalanced.
|
|
77
|
+
*/
|
|
78
|
+
protected parseBalanced(expr: string, openIndex: number): number;
|
|
79
|
+
private skipBalanced;
|
|
80
|
+
}
|