@markuplint/parser-utils 4.0.0-dev.10 → 4.0.0-dev.12
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/LICENSE +1 -1
- package/lib/attr-tokenizer.d.ts +16 -4
- package/lib/attr-tokenizer.js +164 -70
- package/lib/const.d.ts +2 -1
- package/lib/const.js +2 -1
- package/lib/debugger.d.ts +3 -2
- package/lib/debugger.js +35 -19
- package/lib/enums.d.ts +16 -0
- package/lib/enums.js +18 -0
- package/lib/get-location.d.ts +4 -13
- package/lib/get-location.js +10 -21
- package/lib/ignore-block.d.ts +3 -2
- package/lib/ignore-block.js +62 -124
- package/lib/ignore-front-matter.d.ts +4 -1
- package/lib/ignore-front-matter.js +12 -3
- package/lib/index.d.ts +3 -16
- package/lib/index.js +3 -16
- package/lib/parser-error.d.ts +1 -0
- package/lib/parser-error.js +1 -0
- package/lib/parser.d.ts +108 -0
- package/lib/parser.js +1076 -0
- package/lib/script-parser.d.ts +1 -1
- package/lib/script-parser.js +1 -1
- package/lib/sort-nodes.d.ts +2 -0
- package/lib/sort-nodes.js +18 -0
- package/lib/types.d.ts +34 -0
- package/package.json +9 -5
- package/lib/attr-parser.d.ts +0 -25
- package/lib/attr-parser.js +0 -188
- package/lib/create-token.d.ts +0 -4
- package/lib/create-token.js +0 -29
- package/lib/flatten-nodes.d.ts +0 -2
- package/lib/flatten-nodes.js +0 -247
- package/lib/get-space-before.d.ts +0 -1
- package/lib/get-space-before.js +0 -8
- package/lib/parse-attr.d.ts +0 -24
- package/lib/parse-attr.js +0 -144
- package/lib/remove-deprecated-node.d.ts +0 -7
- package/lib/remove-deprecated-node.js +0 -39
- package/lib/siblings-correction.d.ts +0 -9
- package/lib/siblings-correction.js +0 -21
- package/lib/tag-parser.d.ts +0 -10
- package/lib/tag-parser.js +0 -152
- package/lib/tag-splitter.d.ts +0 -7
- package/lib/tag-splitter.js +0 -96
- package/lib/walker.d.ts +0 -2
- package/lib/walker.js +0 -18
package/lib/ignore-block.js
CHANGED
|
@@ -1,21 +1,10 @@
|
|
|
1
1
|
import { MASK_CHAR } from './const.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { siblingsCorrection } from './siblings-correction.js';
|
|
2
|
+
import { getCol, getLine } from './get-location.js';
|
|
3
|
+
import { ParserError } from './parser-error.js';
|
|
5
4
|
export function ignoreBlock(source, tags, maskChar = MASK_CHAR) {
|
|
6
5
|
let replaced = source;
|
|
7
6
|
const stack = [];
|
|
8
7
|
for (const tag of tags) {
|
|
9
|
-
// Replace tags in attributes
|
|
10
|
-
const attr = maskText(prepend(tag.start, '(?<=(?:"|\'))'), append(tag.end, '(?=(?:"|\'))'), replaced, (startTag, taggedCode, endTag) => {
|
|
11
|
-
const mask = maskChar.repeat(startTag.length) +
|
|
12
|
-
taggedCode.replaceAll(/[^\n]/g, maskChar) +
|
|
13
|
-
maskChar.repeat((endTag ?? '').length);
|
|
14
|
-
return mask;
|
|
15
|
-
});
|
|
16
|
-
replaced = attr.replaced;
|
|
17
|
-
stack.push(...attr.stack.map(res => ({ ...res, type: tag.type })));
|
|
18
|
-
// Replace tags in other nodes
|
|
19
8
|
const text = maskText(tag.start, tag.end, replaced, (startTag, taggedCode, endTag) => {
|
|
20
9
|
const mask = maskChar.repeat(startTag.length) +
|
|
21
10
|
taggedCode.replaceAll(/[^\n]/g, maskChar) +
|
|
@@ -49,6 +38,7 @@ function maskText(start, end, replaced, masking) {
|
|
|
49
38
|
startTag,
|
|
50
39
|
taggedCode,
|
|
51
40
|
endTag: endTag ?? null,
|
|
41
|
+
resolved: false,
|
|
52
42
|
});
|
|
53
43
|
/**
|
|
54
44
|
* It will not replace line breaks because detects line number.
|
|
@@ -62,106 +52,41 @@ function maskText(start, end, replaced, masking) {
|
|
|
62
52
|
}
|
|
63
53
|
export function restoreNode(
|
|
64
54
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
65
|
-
nodeList,
|
|
66
|
-
|
|
55
|
+
parser, nodeList,
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
57
|
+
ignoreBlock, throwErrorWhenTagHasUnresolved = true) {
|
|
58
|
+
const newNodeList = [...nodeList];
|
|
67
59
|
const { source, stack, maskChar } = ignoreBlock;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
uuid: uuid(),
|
|
90
|
-
type: 'text',
|
|
91
|
-
raw,
|
|
92
|
-
startOffset,
|
|
93
|
-
endOffset,
|
|
94
|
-
startLine,
|
|
95
|
-
endLine,
|
|
96
|
-
startCol,
|
|
97
|
-
endCol,
|
|
98
|
-
};
|
|
99
|
-
if (node.prevNode?.nextNode) {
|
|
100
|
-
node.prevNode.nextNode = textNode;
|
|
101
|
-
}
|
|
102
|
-
if (node.nextNode?.prevNode) {
|
|
103
|
-
node.nextNode.prevNode = textNode;
|
|
104
|
-
}
|
|
105
|
-
insertList.push(textNode);
|
|
106
|
-
}
|
|
107
|
-
if (body) {
|
|
108
|
-
const offset = node.startOffset + pointer + above.length;
|
|
109
|
-
const { raw, startOffset, endOffset, startLine, endLine, startCol, endCol } = sliceFragment(source, offset, offset + body.length);
|
|
110
|
-
const bodyNode = {
|
|
111
|
-
uuid: uuid(),
|
|
112
|
-
type: 'psblock',
|
|
113
|
-
nodeName: `#ps:${tag.type}`,
|
|
114
|
-
raw,
|
|
115
|
-
parentNode: node.parentNode,
|
|
116
|
-
prevNode: null,
|
|
117
|
-
nextNode: null,
|
|
118
|
-
isFragment: node.isFragment,
|
|
119
|
-
isGhost: false,
|
|
120
|
-
startOffset,
|
|
121
|
-
endOffset,
|
|
122
|
-
startLine,
|
|
123
|
-
endLine,
|
|
124
|
-
startCol,
|
|
125
|
-
endCol,
|
|
126
|
-
};
|
|
127
|
-
if (node.prevNode?.nextNode) {
|
|
128
|
-
node.prevNode.nextNode = bodyNode;
|
|
129
|
-
}
|
|
130
|
-
if (node.nextNode?.prevNode) {
|
|
131
|
-
node.nextNode.prevNode = bodyNode;
|
|
132
|
-
}
|
|
133
|
-
insertList.push(bodyNode);
|
|
134
|
-
}
|
|
135
|
-
text = below;
|
|
136
|
-
pointer = start + body.length;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
if (text) {
|
|
140
|
-
const offset = node.endOffset - text.length;
|
|
141
|
-
const { raw, startOffset, endOffset, startLine, endLine, startCol, endCol } = sliceFragment(source, offset, offset + text.length);
|
|
142
|
-
const textNode = {
|
|
143
|
-
...node,
|
|
144
|
-
uuid: uuid(),
|
|
145
|
-
type: 'text',
|
|
146
|
-
raw,
|
|
147
|
-
startOffset,
|
|
148
|
-
endOffset,
|
|
149
|
-
startLine,
|
|
150
|
-
endLine,
|
|
151
|
-
startCol,
|
|
152
|
-
endCol,
|
|
153
|
-
};
|
|
154
|
-
insertList.push(textNode);
|
|
155
|
-
}
|
|
156
|
-
siblingsCorrection(insertList);
|
|
157
|
-
if (parentNode) {
|
|
158
|
-
parentNode.childNodes = insertList;
|
|
159
|
-
}
|
|
160
|
-
nodeList.splice(index, 1, ...insertList);
|
|
60
|
+
if (stack.length === 0) {
|
|
61
|
+
return newNodeList;
|
|
62
|
+
}
|
|
63
|
+
for (const tag of stack) {
|
|
64
|
+
const node = newNodeList.find(node => node.startOffset === tag.index);
|
|
65
|
+
if (!node) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const raw = `${tag.startTag}${tag.taggedCode}${tag.endTag ?? ''}`;
|
|
69
|
+
const token = parser.createToken(raw, node.startOffset, node.startLine, node.startCol);
|
|
70
|
+
const psNode = {
|
|
71
|
+
...token,
|
|
72
|
+
type: 'psblock',
|
|
73
|
+
depth: node.depth,
|
|
74
|
+
nodeName: `#ps:${tag.type}`,
|
|
75
|
+
parentNode: node.parentNode,
|
|
76
|
+
childNodes: [],
|
|
77
|
+
isBogus: false,
|
|
78
|
+
};
|
|
79
|
+
if (node.type !== 'doctype' && node.parentNode?.childNodes) {
|
|
80
|
+
parser.replaceChild(node.parentNode, node, psNode);
|
|
161
81
|
}
|
|
82
|
+
const index = newNodeList.indexOf(node);
|
|
83
|
+
newNodeList.splice(index, 1, psNode);
|
|
84
|
+
tag.resolved = true;
|
|
85
|
+
}
|
|
86
|
+
for (const node of newNodeList) {
|
|
162
87
|
if (node.type === 'starttag') {
|
|
163
88
|
for (const attr of node.attributes) {
|
|
164
|
-
if (attr.type === '
|
|
89
|
+
if (attr.type === 'spread' || attr.value.raw === '' || !hasIgnoreBlock(attr.value.raw, maskChar)) {
|
|
165
90
|
continue;
|
|
166
91
|
}
|
|
167
92
|
for (const tag of stack) {
|
|
@@ -171,14 +96,39 @@ nodeList, ignoreBlock) {
|
|
|
171
96
|
const offset = tag.index - attr.value.startOffset;
|
|
172
97
|
const above = attr.value.raw.slice(0, offset);
|
|
173
98
|
const below = attr.value.raw.slice(offset + length);
|
|
174
|
-
attr.value
|
|
175
|
-
attr
|
|
99
|
+
parser.updateRaw(attr.value, above + raw + below);
|
|
100
|
+
parser.updateAttr(attr, { isDynamicValue: true });
|
|
101
|
+
tag.resolved = true;
|
|
176
102
|
}
|
|
103
|
+
parser.updateRaw(attr, attr.name.raw +
|
|
104
|
+
attr.spacesBeforeEqual.raw +
|
|
105
|
+
attr.equal.raw +
|
|
106
|
+
attr.spacesAfterEqual.raw +
|
|
107
|
+
attr.startQuote.raw +
|
|
108
|
+
attr.value.raw +
|
|
109
|
+
attr.endQuote.raw);
|
|
177
110
|
}
|
|
111
|
+
// Update node raw
|
|
112
|
+
const length = attr.raw.length;
|
|
113
|
+
const offset = attr.startOffset - node.startOffset;
|
|
114
|
+
const above = node.raw.slice(0, offset);
|
|
115
|
+
const below = node.raw.slice(offset + length);
|
|
116
|
+
parser.updateRaw(node, above + attr.raw + below);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (throwErrorWhenTagHasUnresolved) {
|
|
121
|
+
for (const tag of stack) {
|
|
122
|
+
if (!tag.resolved) {
|
|
123
|
+
throw new ParserError('Parsing failed. Unsupported syntax detected', {
|
|
124
|
+
line: getLine(source, tag.index),
|
|
125
|
+
col: getCol(source, tag.index),
|
|
126
|
+
raw: tag.startTag + tag.taggedCode + (tag.endTag ?? ''),
|
|
127
|
+
});
|
|
178
128
|
}
|
|
179
129
|
}
|
|
180
130
|
}
|
|
181
|
-
return
|
|
131
|
+
return newNodeList;
|
|
182
132
|
}
|
|
183
133
|
function snap(str, reg) {
|
|
184
134
|
const matched = reg.exec(str);
|
|
@@ -197,18 +147,6 @@ function removeGlobalOption(reg) {
|
|
|
197
147
|
}
|
|
198
148
|
return new RegExp(reg.source, reg.ignoreCase ? 'i' : '');
|
|
199
149
|
}
|
|
200
|
-
function prepend(reg, str) {
|
|
201
|
-
if (typeof reg === 'string') {
|
|
202
|
-
return new RegExp(str + escapeRegExpForStr(reg));
|
|
203
|
-
}
|
|
204
|
-
return new RegExp(str + reg.source, reg.ignoreCase ? 'i' : '');
|
|
205
|
-
}
|
|
206
|
-
function append(reg, str) {
|
|
207
|
-
if (typeof reg === 'string') {
|
|
208
|
-
return new RegExp(escapeRegExpForStr(reg) + str);
|
|
209
|
-
}
|
|
210
|
-
return new RegExp(reg.source + str, reg.ignoreCase ? 'i' : '');
|
|
211
|
-
}
|
|
212
150
|
function hasIgnoreBlock(textContent, maskChar) {
|
|
213
151
|
return textContent.includes(maskChar);
|
|
214
152
|
}
|
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
export function ignoreFrontMatter(code) {
|
|
2
2
|
const reStart = /^(?:\s*\n)?---\r?\n/.exec(code);
|
|
3
3
|
if (!reStart) {
|
|
4
|
-
return
|
|
4
|
+
return {
|
|
5
|
+
code,
|
|
6
|
+
frontMatter: null,
|
|
7
|
+
};
|
|
5
8
|
}
|
|
6
9
|
const startPoint = reStart[0].length;
|
|
7
10
|
const afterStart = code.slice(startPoint);
|
|
8
11
|
const reEnd = /\r?\n---\r?\n/.exec(afterStart);
|
|
9
12
|
if (!reEnd) {
|
|
10
|
-
return
|
|
13
|
+
return {
|
|
14
|
+
code,
|
|
15
|
+
frontMatter: null,
|
|
16
|
+
};
|
|
11
17
|
}
|
|
12
18
|
const endPoint = startPoint + reEnd.index + reEnd[0].length;
|
|
13
19
|
const frontMatter = code.slice(0, endPoint);
|
|
14
20
|
const afterCode = code.slice(endPoint);
|
|
15
21
|
const masked = frontMatter.replaceAll(/[^\n\r]/g, ' ');
|
|
16
|
-
return
|
|
22
|
+
return {
|
|
23
|
+
code: masked + afterCode,
|
|
24
|
+
frontMatter,
|
|
25
|
+
};
|
|
17
26
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,20 +1,7 @@
|
|
|
1
|
-
export * from './attr-parser.js';
|
|
2
|
-
export * from './attr-tokenizer.js';
|
|
3
|
-
export * from './const.js';
|
|
4
|
-
export * from './create-token.js';
|
|
5
1
|
export * from './debugger.js';
|
|
6
|
-
export * from './
|
|
7
|
-
export * from './detect-element-type.js';
|
|
8
|
-
export * from './flatten-nodes.js';
|
|
9
|
-
export * from './get-location.js';
|
|
10
|
-
export * from './get-space-before.js';
|
|
2
|
+
export * from './enums.js';
|
|
11
3
|
export * from './idl-attributes.js';
|
|
12
|
-
export * from './ignore-block.js';
|
|
13
|
-
export * from './ignore-front-matter.js';
|
|
14
|
-
export * from './parse-attr.js';
|
|
15
4
|
export * from './parser-error.js';
|
|
16
|
-
export * from './
|
|
5
|
+
export * from './parser.js';
|
|
17
6
|
export * from './script-parser.js';
|
|
18
|
-
export * from './
|
|
19
|
-
export * from './tag-splitter.js';
|
|
20
|
-
export * from './walker.js';
|
|
7
|
+
export * from './types.js';
|
package/lib/index.js
CHANGED
|
@@ -1,20 +1,7 @@
|
|
|
1
|
-
export * from './attr-parser.js';
|
|
2
|
-
export * from './attr-tokenizer.js';
|
|
3
|
-
export * from './const.js';
|
|
4
|
-
export * from './create-token.js';
|
|
5
1
|
export * from './debugger.js';
|
|
6
|
-
export * from './
|
|
7
|
-
export * from './detect-element-type.js';
|
|
8
|
-
export * from './flatten-nodes.js';
|
|
9
|
-
export * from './get-location.js';
|
|
10
|
-
export * from './get-space-before.js';
|
|
2
|
+
export * from './enums.js';
|
|
11
3
|
export * from './idl-attributes.js';
|
|
12
|
-
export * from './ignore-block.js';
|
|
13
|
-
export * from './ignore-front-matter.js';
|
|
14
|
-
export * from './parse-attr.js';
|
|
15
4
|
export * from './parser-error.js';
|
|
16
|
-
export * from './
|
|
5
|
+
export * from './parser.js';
|
|
17
6
|
export * from './script-parser.js';
|
|
18
|
-
export * from './
|
|
19
|
-
export * from './tag-splitter.js';
|
|
20
|
-
export * from './walker.js';
|
|
7
|
+
export * from './types.js';
|
package/lib/parser-error.d.ts
CHANGED
package/lib/parser-error.js
CHANGED
package/lib/parser.d.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { Token, ChildToken, QuoteSet, ParseOptions, ParserOptions, Tokenized } from './types.js';
|
|
2
|
+
import type { EndTagType, MLASTDocument, MLASTParentNode, MLParser, ParserAuthoredElementNameDistinguishing, MLASTElement, MLASTElementCloseTag, MLASTToken, MLASTNodeTreeItem, MLASTTag, MLASTText, MLASTAttr, MLASTChildNode, MLASTSpreadAttr, ElementType, Walker, MLASTHTMLAttr } from '@markuplint/ml-ast';
|
|
3
|
+
import { AttrState } from './enums.js';
|
|
4
|
+
import { ParserError } from './parser-error.js';
|
|
5
|
+
export declare abstract class Parser<Node extends {} = {}, State extends unknown = null> implements MLParser {
|
|
6
|
+
#private;
|
|
7
|
+
state: State;
|
|
8
|
+
get authoredElementName(): ParserAuthoredElementNameDistinguishing | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Detect value as a true if its attribute is booleanish value and omitted.
|
|
11
|
+
*
|
|
12
|
+
* Ex:
|
|
13
|
+
* ```jsx
|
|
14
|
+
* <Component aria-hidden />
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* In the above, the `aria-hidden` is `true`.
|
|
18
|
+
*/
|
|
19
|
+
get booleanish(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* The end tag omittable type.
|
|
22
|
+
*
|
|
23
|
+
* - `"xml"`: Must need an end tag or must self-close
|
|
24
|
+
* - `"omittable"`: May omit
|
|
25
|
+
* - `"never"`: Never need
|
|
26
|
+
*/
|
|
27
|
+
get endTag(): EndTagType;
|
|
28
|
+
get rawCode(): string;
|
|
29
|
+
get tagNameCaseSensitive(): boolean;
|
|
30
|
+
constructor(options?: ParserOptions, defaultState?: State);
|
|
31
|
+
tokenize(): Tokenized<Node, State>;
|
|
32
|
+
beforeParse(rawCode: string, options?: ParseOptions): string;
|
|
33
|
+
parse(rawCode: string, options?: ParseOptions): MLASTDocument;
|
|
34
|
+
afterParse(nodeList: readonly MLASTNodeTreeItem[], options?: ParseOptions): readonly MLASTNodeTreeItem[];
|
|
35
|
+
parseError(error: any): ParserError;
|
|
36
|
+
traverse(originNodes: readonly Node[], parentNode: MLASTParentNode | null | undefined, depth: number): {
|
|
37
|
+
childNodes: readonly MLASTChildNode[];
|
|
38
|
+
siblings: readonly MLASTNodeTreeItem[];
|
|
39
|
+
};
|
|
40
|
+
afterTraverse(nodeTree: readonly MLASTNodeTreeItem[]): readonly MLASTNodeTreeItem[];
|
|
41
|
+
nodeize(originNode: Node, parentNode: MLASTParentNode | null, depth: number): readonly MLASTNodeTreeItem[];
|
|
42
|
+
afterNodeize(siblings: readonly MLASTNodeTreeItem[], parentNode: MLASTParentNode | null, depth: number): {
|
|
43
|
+
siblings: MLASTChildNode[];
|
|
44
|
+
ancestors: MLASTNodeTreeItem[];
|
|
45
|
+
};
|
|
46
|
+
flattenNodes(nodeTree: readonly MLASTNodeTreeItem[]): readonly MLASTNodeTreeItem[];
|
|
47
|
+
afterFlattenNodes(nodeList: readonly MLASTNodeTreeItem[], options?: {
|
|
48
|
+
readonly exposeInvalidNode?: boolean;
|
|
49
|
+
readonly exposeWhiteSpace?: boolean;
|
|
50
|
+
readonly concatText?: boolean;
|
|
51
|
+
}): readonly MLASTNodeTreeItem[];
|
|
52
|
+
visitDoctype(token: ChildToken & {
|
|
53
|
+
readonly name: string;
|
|
54
|
+
readonly publicId: string;
|
|
55
|
+
readonly systemId: string;
|
|
56
|
+
}): readonly MLASTNodeTreeItem[];
|
|
57
|
+
visitComment(token: ChildToken, options?: {
|
|
58
|
+
readonly isBogus?: boolean;
|
|
59
|
+
}): readonly MLASTNodeTreeItem[];
|
|
60
|
+
visitText(token: ChildToken, options?: {
|
|
61
|
+
readonly researchTags?: boolean;
|
|
62
|
+
readonly invalidTagAsText?: boolean;
|
|
63
|
+
}): readonly MLASTNodeTreeItem[];
|
|
64
|
+
visitElement(token: ChildToken & {
|
|
65
|
+
readonly nodeName: string;
|
|
66
|
+
readonly namespace: string;
|
|
67
|
+
}, childNodes?: readonly Node[], options?: {
|
|
68
|
+
readonly createEndTagToken?: (startTag: MLASTElement) => ChildToken | null;
|
|
69
|
+
readonly namelessFragment?: boolean;
|
|
70
|
+
readonly overwriteProps?: Partial<MLASTElement>;
|
|
71
|
+
}): readonly MLASTNodeTreeItem[];
|
|
72
|
+
visitPsBlock(token: ChildToken & {
|
|
73
|
+
readonly nodeName: string;
|
|
74
|
+
}, childNodes?: readonly Node[], originBlockNode?: Node): readonly MLASTNodeTreeItem[];
|
|
75
|
+
visitChildren(children: readonly Node[], parentNode: MLASTParentNode | null): readonly MLASTNodeTreeItem[];
|
|
76
|
+
visitSpreadAttr(token: Token): MLASTSpreadAttr | null;
|
|
77
|
+
visitAttr(token: Token, options?: {
|
|
78
|
+
readonly quoteSet?: readonly QuoteSet[];
|
|
79
|
+
readonly quoteInValueChars?: readonly QuoteSet[];
|
|
80
|
+
readonly endOfUnquotedValueChars?: readonly string[];
|
|
81
|
+
readonly startState?: AttrState;
|
|
82
|
+
}): MLASTAttr & {
|
|
83
|
+
__rightText?: string;
|
|
84
|
+
};
|
|
85
|
+
parseCodeFragment(token: ChildToken, options?: {
|
|
86
|
+
readonly namelessFragment?: boolean;
|
|
87
|
+
}): (MLASTTag | MLASTText)[];
|
|
88
|
+
updateLocation(node: MLASTNodeTreeItem, props: Partial<Pick<MLASTNodeTreeItem, 'startOffset' | 'startLine' | 'startCol' | 'depth'>>): void;
|
|
89
|
+
/**
|
|
90
|
+
* Set new raw code to target node.
|
|
91
|
+
*
|
|
92
|
+
* Replace the raw code and update the start/end offset/line/column.
|
|
93
|
+
*
|
|
94
|
+
* @param node target node
|
|
95
|
+
* @param raw new raw code
|
|
96
|
+
*/
|
|
97
|
+
updateRaw(node: MLASTToken, raw: string): void;
|
|
98
|
+
updateElement(el: MLASTElement, props: Partial<Pick<MLASTElement, 'nodeName' | 'elementType'>>): void;
|
|
99
|
+
updateElement(el: MLASTElementCloseTag, props: Partial<Pick<MLASTElementCloseTag, 'nodeName'>>): void;
|
|
100
|
+
updateAttr(attr: MLASTHTMLAttr, props: Partial<Pick<MLASTHTMLAttr, 'isDynamicValue' | 'isDirective' | 'potentialName' | 'potentialValue' | 'valueType' | 'candidate' | 'isDuplicatable'>>): void;
|
|
101
|
+
detectElementType(nodeName: string, defaultPattern?: ParserAuthoredElementNameDistinguishing): ElementType;
|
|
102
|
+
createToken(token: Token): MLASTToken;
|
|
103
|
+
createToken(token: string, startOffset: number, startLine: number, startCol: number): MLASTToken;
|
|
104
|
+
sliceFragment(start: number, end?: number): Token;
|
|
105
|
+
walk<Node extends MLASTNodeTreeItem>(nodeList: readonly Node[], walker: Walker<Node>, depth?: number): void;
|
|
106
|
+
appendChild(parentNode: MLASTParentNode | null, ...childNodes: readonly MLASTChildNode[]): void;
|
|
107
|
+
replaceChild(parentNode: MLASTParentNode, oldChildNode: MLASTChildNode, newChildNode: MLASTChildNode): void;
|
|
108
|
+
}
|