@markuplint/parser-utils 4.0.0-dev.23 → 4.0.0-rc.0
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/lib/debug.d.ts +4 -0
- package/lib/debug.js +6 -0
- package/lib/debugger.js +6 -0
- package/lib/parser.d.ts +5 -1
- package/lib/parser.js +47 -3
- package/lib/script-parser.d.ts +0 -1
- package/lib/script-parser.js +0 -10
- package/package.json +9 -8
package/lib/debug.d.ts
ADDED
package/lib/debug.js
ADDED
package/lib/debugger.js
CHANGED
|
@@ -24,6 +24,12 @@ export function attributesToDebugMaps(attributes) {
|
|
|
24
24
|
if (n.potentialName != null) {
|
|
25
25
|
r.push(` potentialName: ${visibleWhiteSpace(n.potentialName)}`);
|
|
26
26
|
}
|
|
27
|
+
if (n.potentialValue != null) {
|
|
28
|
+
r.push(` potentialValue: ${visibleWhiteSpace(n.potentialValue)}`);
|
|
29
|
+
}
|
|
30
|
+
if (n.valueType != null) {
|
|
31
|
+
r.push(` valueType: ${visibleWhiteSpace(n.valueType)}`);
|
|
32
|
+
}
|
|
27
33
|
if (n.candidate) {
|
|
28
34
|
r.push(` candidate: ${visibleWhiteSpace(n.candidate)}`);
|
|
29
35
|
}
|
package/lib/parser.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ export declare abstract class Parser<Node extends {} = {}, State extends unknown
|
|
|
28
28
|
get rawCode(): string;
|
|
29
29
|
get tagNameCaseSensitive(): boolean;
|
|
30
30
|
constructor(options?: ParserOptions, defaultState?: State);
|
|
31
|
-
tokenize(): Tokenized<Node, State>;
|
|
31
|
+
tokenize(options?: ParseOptions): Tokenized<Node, State>;
|
|
32
32
|
beforeParse(rawCode: string, options?: ParseOptions): string;
|
|
33
33
|
parse(rawCode: string, options?: ParseOptions): MLASTDocument;
|
|
34
34
|
afterParse(nodeList: readonly MLASTNodeTreeItem[], options?: ParseOptions): readonly MLASTNodeTreeItem[];
|
|
@@ -102,6 +102,10 @@ export declare abstract class Parser<Node extends {} = {}, State extends unknown
|
|
|
102
102
|
createToken(token: Token): MLASTToken;
|
|
103
103
|
createToken(token: string, startOffset: number, startLine: number, startCol: number): MLASTToken;
|
|
104
104
|
sliceFragment(start: number, end?: number): Token;
|
|
105
|
+
getOffsetsFromCode(startLine: number, startCol: number, endLine: number, endCol: number): {
|
|
106
|
+
offset: number;
|
|
107
|
+
endOffset: number;
|
|
108
|
+
};
|
|
105
109
|
walk<Node extends MLASTNodeTreeItem>(nodeList: readonly Node[], walker: Walker<Node>, depth?: number): void;
|
|
106
110
|
appendChild(parentNode: MLASTParentNode | null, ...childNodes: readonly MLASTChildNode[]): void;
|
|
107
111
|
replaceChild(parentNode: MLASTParentNode, oldChildNode: MLASTChildNode, newChildNode: MLASTChildNode): void;
|
package/lib/parser.js
CHANGED
|
@@ -9,11 +9,12 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
10
10
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
11
|
};
|
|
12
|
-
var _Parser_instances, _Parser_booleanish, _Parser_defaultState, _Parser_endTagType, _Parser_ignoreTags, _Parser_maskChar, _Parser_tagNameCaseSensitive, _Parser_selfCloseType, _Parser_spaceChars, _Parser_rawTextElements, _Parser_authoredElementName, _Parser_originalRawCode, _Parser_rawCode, _Parser_defaultDepth, _Parser_walkMethodSequentailPrevNode, _Parser_arrayize, _Parser_concatText, _Parser_concatTextNodes, _Parser_convertIntoInvalidNode, _Parser_createOffsetSpaces, _Parser_createRemnantNode, _Parser_exposeRemnantNodes, _Parser_getEndLocation, _Parser_orphanEndTagToBogusMark, _Parser_pairing, _Parser_parseEndTag, _Parser_parseStartTag, _Parser_parseTag, _Parser_removeChild, _Parser_removeDeprecatedNode, _Parser_removeOffsetSpaces, _Parser_reset, _Parser_setRawCode, _Parser_siblingsCorrection;
|
|
12
|
+
var _Parser_instances, _Parser_booleanish, _Parser_defaultState, _Parser_endTagType, _Parser_ignoreTags, _Parser_maskChar, _Parser_tagNameCaseSensitive, _Parser_selfCloseType, _Parser_spaceChars, _Parser_rawTextElements, _Parser_authoredElementName, _Parser_originalRawCode, _Parser_rawCode, _Parser_defaultDepth, _Parser_walkMethodSequentailPrevNode, _Parser_arrayize, _Parser_concatText, _Parser_concatTextNodes, _Parser_convertIntoInvalidNode, _Parser_createOffsetSpaces, _Parser_createRemnantNode, _Parser_exposeRemnantNodes, _Parser_getEndLocation, _Parser_orphanEndTagToBogusMark, _Parser_pairing, _Parser_parseEndTag, _Parser_parseStartTag, _Parser_parseTag, _Parser_removeChild, _Parser_removeDeprecatedNode, _Parser_removeOffsetSpaces, _Parser_reset, _Parser_setRawCode, _Parser_siblingsCorrection, _Parser_trimText;
|
|
13
13
|
import { isVoidElement as detectVoidElement } from '@markuplint/ml-spec';
|
|
14
14
|
import { v4 as uuid } from 'uuid';
|
|
15
15
|
import { attrTokenizer } from './attr-tokenizer.js';
|
|
16
16
|
import { defaultSpaces } from './const.js';
|
|
17
|
+
import { domLog } from './debug.js';
|
|
17
18
|
import { detectElementType } from './detect-element-type.js';
|
|
18
19
|
import { AttrState, TagState } from './enums.js';
|
|
19
20
|
import { getCol, getEndCol, getEndLine, getLine } from './get-location.js';
|
|
@@ -81,7 +82,7 @@ export class Parser {
|
|
|
81
82
|
__classPrivateFieldSet(this, _Parser_defaultState, defaultState ?? null, "f");
|
|
82
83
|
this.state = structuredClone(__classPrivateFieldGet(this, _Parser_defaultState, "f"));
|
|
83
84
|
}
|
|
84
|
-
tokenize() {
|
|
85
|
+
tokenize(options) {
|
|
85
86
|
return {
|
|
86
87
|
ast: [],
|
|
87
88
|
isFragment: false,
|
|
@@ -106,7 +107,7 @@ export class Parser {
|
|
|
106
107
|
}
|
|
107
108
|
const blocks = ignoreBlock(this.rawCode, __classPrivateFieldGet(this, _Parser_ignoreTags, "f"), __classPrivateFieldGet(this, _Parser_maskChar, "f"));
|
|
108
109
|
__classPrivateFieldGet(this, _Parser_instances, "m", _Parser_setRawCode).call(this, blocks.replaced);
|
|
109
|
-
const tokenized = this.tokenize();
|
|
110
|
+
const tokenized = this.tokenize(options);
|
|
110
111
|
const ast = tokenized.ast;
|
|
111
112
|
const isFragment = tokenized.isFragment;
|
|
112
113
|
__classPrivateFieldSet(this, _Parser_defaultDepth, options?.depth ?? __classPrivateFieldGet(this, _Parser_defaultDepth, "f"), "f");
|
|
@@ -140,6 +141,7 @@ export class Parser {
|
|
|
140
141
|
}
|
|
141
142
|
nodeList = [fmNode, ...newNodeList];
|
|
142
143
|
}
|
|
144
|
+
domLog(nodeList);
|
|
143
145
|
__classPrivateFieldGet(this, _Parser_instances, "m", _Parser_reset).call(this);
|
|
144
146
|
return {
|
|
145
147
|
raw: rawCode,
|
|
@@ -225,6 +227,7 @@ export class Parser {
|
|
|
225
227
|
if (concatText) {
|
|
226
228
|
nodeList = __classPrivateFieldGet(this, _Parser_instances, "m", _Parser_concatText).call(this, nodeList);
|
|
227
229
|
}
|
|
230
|
+
nodeList = __classPrivateFieldGet(this, _Parser_instances, "m", _Parser_trimText).call(this, nodeList);
|
|
228
231
|
return nodeList;
|
|
229
232
|
}
|
|
230
233
|
visitDoctype(token) {
|
|
@@ -579,6 +582,28 @@ export class Parser {
|
|
|
579
582
|
startCol: getCol(this.rawCode, start),
|
|
580
583
|
};
|
|
581
584
|
}
|
|
585
|
+
getOffsetsFromCode(startLine, startCol, endLine, endCol) {
|
|
586
|
+
const lines = __classPrivateFieldGet(this, _Parser_rawCode, "f").split('\n');
|
|
587
|
+
let offset = 0;
|
|
588
|
+
let endOffset = 0;
|
|
589
|
+
for (let i = 0; i < startLine - 1; i++) {
|
|
590
|
+
const line = lines[i];
|
|
591
|
+
if (line == null) {
|
|
592
|
+
continue;
|
|
593
|
+
}
|
|
594
|
+
offset += line.length + 1;
|
|
595
|
+
}
|
|
596
|
+
offset += startCol - 1;
|
|
597
|
+
for (let i = 0; i < endLine - 1; i++) {
|
|
598
|
+
const line = lines[i];
|
|
599
|
+
if (line == null) {
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
endOffset += line.length + 1;
|
|
603
|
+
}
|
|
604
|
+
endOffset += endCol - 1;
|
|
605
|
+
return { offset, endOffset };
|
|
606
|
+
}
|
|
582
607
|
walk(nodeList, walker, depth = 0) {
|
|
583
608
|
for (const node of nodeList) {
|
|
584
609
|
walker(node, __classPrivateFieldGet(this, _Parser_walkMethodSequentailPrevNode, "f"), depth);
|
|
@@ -1073,4 +1098,23 @@ _Parser_booleanish = new WeakMap(), _Parser_defaultState = new WeakMap(), _Parse
|
|
|
1073
1098
|
newNodes.push(node);
|
|
1074
1099
|
}
|
|
1075
1100
|
return newNodes;
|
|
1101
|
+
}, _Parser_trimText = function _Parser_trimText(nodeList) {
|
|
1102
|
+
const newNodeList = [];
|
|
1103
|
+
let prevNode = null;
|
|
1104
|
+
for (const node of nodeList) {
|
|
1105
|
+
if (prevNode?.type === 'text' &&
|
|
1106
|
+
// Empty node
|
|
1107
|
+
node.startOffset !== node.endOffset) {
|
|
1108
|
+
const prevNodeEndOffset = prevNode.endOffset;
|
|
1109
|
+
const nodeStartOffset = node.startOffset;
|
|
1110
|
+
if (prevNodeEndOffset > nodeStartOffset) {
|
|
1111
|
+
const prevNodeRaw = prevNode.raw;
|
|
1112
|
+
const prevNodeTrimmedRaw = prevNodeRaw.slice(0, nodeStartOffset - prevNode.startOffset);
|
|
1113
|
+
this.updateRaw(prevNode, prevNodeTrimmedRaw);
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
newNodeList.push(node);
|
|
1117
|
+
prevNode = node;
|
|
1118
|
+
}
|
|
1119
|
+
return newNodeList;
|
|
1076
1120
|
};
|
package/lib/script-parser.d.ts
CHANGED
package/lib/script-parser.js
CHANGED
|
@@ -10,13 +10,3 @@ export function scriptParser(script) {
|
|
|
10
10
|
value: token.value,
|
|
11
11
|
}));
|
|
12
12
|
}
|
|
13
|
-
export function removeQuote(str) {
|
|
14
|
-
const quote = str[0];
|
|
15
|
-
if (quote !== '"' && quote !== "'" && quote !== '`') {
|
|
16
|
-
return str;
|
|
17
|
-
}
|
|
18
|
-
if (str.at(-1) !== quote) {
|
|
19
|
-
return str;
|
|
20
|
-
}
|
|
21
|
-
return str.slice(1, -1);
|
|
22
|
-
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@markuplint/parser-utils",
|
|
3
|
-
"version": "4.0.0-
|
|
3
|
+
"version": "4.0.0-rc.0",
|
|
4
4
|
"description": "Utility module for markuplint parser plugin",
|
|
5
5
|
"repository": "git@github.com:markuplint/markuplint.git",
|
|
6
6
|
"author": "Yusuke Hirao <yusukehirao@me.com>",
|
|
@@ -27,13 +27,14 @@
|
|
|
27
27
|
"clean": "tsc --build --clean"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@markuplint/ml-ast": "4.0.0-
|
|
31
|
-
"@markuplint/ml-spec": "4.0.0-
|
|
32
|
-
"@markuplint/types": "4.0.0-
|
|
33
|
-
"@types/uuid": "^9.0.
|
|
34
|
-
"
|
|
35
|
-
"
|
|
30
|
+
"@markuplint/ml-ast": "4.0.0-rc.0",
|
|
31
|
+
"@markuplint/ml-spec": "4.0.0-rc.0",
|
|
32
|
+
"@markuplint/types": "4.0.0-rc.0",
|
|
33
|
+
"@types/uuid": "^9.0.8",
|
|
34
|
+
"debug": "^4.3.4",
|
|
35
|
+
"espree": "^10.0.0",
|
|
36
|
+
"type-fest": "^4.10.2",
|
|
36
37
|
"uuid": "^9.0.1"
|
|
37
38
|
},
|
|
38
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "3fdeb45cb69ed52b3a215a7520cea1181601443f"
|
|
39
40
|
}
|