@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 ADDED
@@ -0,0 +1,4 @@
1
+ import type { MLASTNode } from '@markuplint/ml-ast';
2
+ import debug from 'debug';
3
+ export declare const log: debug.Debugger;
4
+ export declare function domLog(nodeList: readonly (MLASTNode | null)[]): void;
package/lib/debug.js ADDED
@@ -0,0 +1,6 @@
1
+ import debug from 'debug';
2
+ import { nodeListToDebugMaps } from './debugger.js';
3
+ export const log = debug('ml-parser');
4
+ export function domLog(nodeList) {
5
+ log('Parse result: %O', nodeListToDebugMaps(nodeList, true));
6
+ }
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
  };
@@ -1,5 +1,4 @@
1
1
  export declare function scriptParser(script: string): ScriptTokenType[];
2
- export declare function removeQuote(str: string): string;
3
2
  export type ScriptTokenType = {
4
3
  type: 'Identifier' | 'Boolean' | 'Numeric' | 'String' | 'Template' | 'Punctuator';
5
4
  value: string;
@@ -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-dev.23+d6f2aa9bc",
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-dev.23+d6f2aa9bc",
31
- "@markuplint/ml-spec": "4.0.0-dev.23+d6f2aa9bc",
32
- "@markuplint/types": "4.0.0-dev.23+d6f2aa9bc",
33
- "@types/uuid": "^9.0.7",
34
- "espree": "^9.6.1",
35
- "type-fest": "^4.9.0",
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": "d6f2aa9bc287768466f23b5340e4e0eecfa30d59"
39
+ "gitHead": "3fdeb45cb69ed52b3a215a7520cea1181601443f"
39
40
  }