@electron/lint-roller 2.3.0 → 3.0.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/README.md +1 -5
- package/dist/bin/lint-markdown-api-history.js +136 -60
- package/dist/bin/lint-markdown-api-history.js.map +1 -1
- package/dist/bin/lint-markdown-links.js +62 -45
- package/dist/bin/lint-markdown-links.js.map +1 -1
- package/dist/bin/lint-markdown-standard.js +55 -36
- package/dist/bin/lint-markdown-standard.js.map +1 -1
- package/dist/bin/lint-markdown-ts-check.js +66 -47
- package/dist/bin/lint-markdown-ts-check.js.map +1 -1
- package/dist/lib/helpers.js +14 -23
- package/dist/lib/helpers.js.map +1 -1
- package/dist/lib/markdown.d.ts +21 -1
- package/dist/lib/markdown.js +121 -136
- package/dist/lib/markdown.js.map +1 -1
- package/lib/markdown.ts +3 -28
- package/markdownlint-rules/emd002.mjs +9 -11
- package/markdownlint-rules/emd003.mjs +9 -8
- package/markdownlint-rules/emd004.mjs +31 -0
- package/markdownlint-rules/index.mjs +5 -0
- package/package.json +17 -23
- package/dist/bin/markdownlint-cli-wrapper.d.ts +0 -2
- package/dist/bin/markdownlint-cli-wrapper.js +0 -16
- package/dist/bin/markdownlint-cli-wrapper.js.map +0 -1
- package/markdownlint-rules/emd002.js +0 -9908
- package/markdownlint-rules/emd003.js +0 -9905
- package/markdownlint-rules/emd004.js +0 -30
- package/markdownlint-rules/index.js +0 -5
package/dist/lib/markdown.js
CHANGED
|
@@ -1,27 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const path = require("node:path");
|
|
12
|
-
const glob = require("glob");
|
|
13
|
-
const MarkdownIt = require("markdown-it");
|
|
14
|
-
const vscode_markdown_languageservice_1 = require("@dsanders11/vscode-markdown-languageservice");
|
|
15
|
-
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
16
|
-
const vscode_languageserver_textdocument_1 = require("vscode-languageserver-textdocument");
|
|
17
|
-
const vscode_uri_1 = require("vscode-uri");
|
|
18
|
-
const helpers_1 = require("./helpers");
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as glob from 'glob';
|
|
4
|
+
import MarkdownIt from 'markdown-it';
|
|
5
|
+
import { githubSlugifier, resolveInternalDocumentLink, HrefKind, MdLinkKind, } from '@dsanders11/vscode-markdown-languageservice';
|
|
6
|
+
import { visit } from 'unist-util-visit';
|
|
7
|
+
import { fromMarkdown } from 'mdast-util-from-markdown';
|
|
8
|
+
import { Emitter } from 'vscode-languageserver';
|
|
9
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
10
|
+
import { URI } from 'vscode-uri';
|
|
19
11
|
// Helper function from `vscode-markdown-languageservice` codebase
|
|
20
12
|
function tryDecodeUri(str) {
|
|
21
13
|
try {
|
|
22
14
|
return decodeURI(str);
|
|
23
15
|
}
|
|
24
|
-
catch
|
|
16
|
+
catch {
|
|
25
17
|
return str;
|
|
26
18
|
}
|
|
27
19
|
}
|
|
@@ -29,14 +21,14 @@ function tryDecodeUri(str) {
|
|
|
29
21
|
function createHref(sourceDocUri, link, workspace) {
|
|
30
22
|
if (/^[a-z-][a-z-]+:/i.test(link)) {
|
|
31
23
|
// Looks like a uri
|
|
32
|
-
return { kind:
|
|
24
|
+
return { kind: HrefKind.External, uri: URI.parse(tryDecodeUri(link)) };
|
|
33
25
|
}
|
|
34
|
-
const resolved =
|
|
26
|
+
const resolved = resolveInternalDocumentLink(sourceDocUri, link, workspace);
|
|
35
27
|
if (!resolved) {
|
|
36
28
|
return undefined;
|
|
37
29
|
}
|
|
38
30
|
return {
|
|
39
|
-
kind:
|
|
31
|
+
kind: HrefKind.Internal,
|
|
40
32
|
path: resolved.resource,
|
|
41
33
|
fragment: resolved.linkFragment,
|
|
42
34
|
};
|
|
@@ -51,39 +43,30 @@ function positionToRange(position) {
|
|
|
51
43
|
};
|
|
52
44
|
}
|
|
53
45
|
const mdIt = MarkdownIt({ html: true });
|
|
54
|
-
class MarkdownParser {
|
|
55
|
-
|
|
56
|
-
this.slugifier = vscode_markdown_languageservice_1.githubSlugifier;
|
|
57
|
-
}
|
|
46
|
+
export class MarkdownParser {
|
|
47
|
+
slugifier = githubSlugifier;
|
|
58
48
|
async tokenize(document) {
|
|
59
49
|
return mdIt.parse(document.getText(), {});
|
|
60
50
|
}
|
|
61
51
|
}
|
|
62
|
-
|
|
63
|
-
|
|
52
|
+
export class DocsWorkspace {
|
|
53
|
+
documentCache;
|
|
54
|
+
root;
|
|
55
|
+
globs;
|
|
56
|
+
ignoreGlobs;
|
|
64
57
|
constructor(root, globs, ignoreGlobs = []) {
|
|
65
|
-
//
|
|
66
|
-
// These events are defined to fulfill the interface, but are never emitted
|
|
67
|
-
// by this implementation since it's not meant for watching a workspace
|
|
68
|
-
//
|
|
69
|
-
_DocsWorkspace_onDidChangeMarkdownDocument.set(this, new vscode_languageserver_1.Emitter());
|
|
70
|
-
this.onDidChangeMarkdownDocument = __classPrivateFieldGet(this, _DocsWorkspace_onDidChangeMarkdownDocument, "f").event;
|
|
71
|
-
_DocsWorkspace_onDidCreateMarkdownDocument.set(this, new vscode_languageserver_1.Emitter());
|
|
72
|
-
this.onDidCreateMarkdownDocument = __classPrivateFieldGet(this, _DocsWorkspace_onDidCreateMarkdownDocument, "f").event;
|
|
73
|
-
_DocsWorkspace_onDidDeleteMarkdownDocument.set(this, new vscode_languageserver_1.Emitter());
|
|
74
|
-
this.onDidDeleteMarkdownDocument = __classPrivateFieldGet(this, _DocsWorkspace_onDidDeleteMarkdownDocument, "f").event;
|
|
75
58
|
this.documentCache = new Map();
|
|
76
59
|
this.root = root;
|
|
77
60
|
this.globs = globs;
|
|
78
61
|
this.ignoreGlobs = ignoreGlobs;
|
|
79
62
|
}
|
|
80
63
|
get workspaceFolders() {
|
|
81
|
-
return [
|
|
64
|
+
return [URI.file(this.root)];
|
|
82
65
|
}
|
|
83
66
|
async getAllMarkdownDocuments() {
|
|
84
67
|
const files = this.globs.flatMap((pattern) => glob.sync(pattern, { ignore: this.ignoreGlobs, absolute: true, cwd: this.root }));
|
|
85
68
|
for (const file of files) {
|
|
86
|
-
const document =
|
|
69
|
+
const document = TextDocument.create(URI.file(file).toString(), 'markdown', 1, fs.readFileSync(file, 'utf8'));
|
|
87
70
|
this.documentCache.set(file, document);
|
|
88
71
|
}
|
|
89
72
|
return this.documentCache.values();
|
|
@@ -100,10 +83,10 @@ class DocsWorkspace {
|
|
|
100
83
|
async openMarkdownDocument(resource) {
|
|
101
84
|
if (!this.documentCache.has(resource.fsPath)) {
|
|
102
85
|
try {
|
|
103
|
-
const document =
|
|
86
|
+
const document = TextDocument.create(resource.toString(), 'markdown', 1, fs.readFileSync(resource.fsPath, 'utf8'));
|
|
104
87
|
this.documentCache.set(resource.fsPath, document);
|
|
105
88
|
}
|
|
106
|
-
catch
|
|
89
|
+
catch {
|
|
107
90
|
return undefined;
|
|
108
91
|
}
|
|
109
92
|
}
|
|
@@ -119,122 +102,125 @@ class DocsWorkspace {
|
|
|
119
102
|
async readDirectory() {
|
|
120
103
|
throw new Error('Not implemented');
|
|
121
104
|
}
|
|
105
|
+
//
|
|
106
|
+
// These events are defined to fulfill the interface, but are never emitted
|
|
107
|
+
// by this implementation since it's not meant for watching a workspace
|
|
108
|
+
//
|
|
109
|
+
#onDidChangeMarkdownDocument = new Emitter();
|
|
110
|
+
onDidChangeMarkdownDocument = this.#onDidChangeMarkdownDocument.event;
|
|
111
|
+
#onDidCreateMarkdownDocument = new Emitter();
|
|
112
|
+
onDidCreateMarkdownDocument = this.#onDidCreateMarkdownDocument.event;
|
|
113
|
+
#onDidDeleteMarkdownDocument = new Emitter();
|
|
114
|
+
onDidDeleteMarkdownDocument = this.#onDidDeleteMarkdownDocument.event;
|
|
122
115
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
class MarkdownLinkComputer {
|
|
116
|
+
export class MarkdownLinkComputer {
|
|
117
|
+
workspace;
|
|
126
118
|
constructor(workspace) {
|
|
127
|
-
_MarkdownLinkComputer_instances.add(this);
|
|
128
119
|
this.workspace = workspace;
|
|
129
120
|
}
|
|
130
121
|
async getAllLinks(document) {
|
|
131
|
-
const { fromMarkdown } = (await (0, helpers_1.dynamicImport)('mdast-util-from-markdown'));
|
|
132
122
|
const tree = fromMarkdown(document.getText());
|
|
133
123
|
const links = [
|
|
134
|
-
...(await
|
|
135
|
-
...(await
|
|
136
|
-
...(await
|
|
124
|
+
...(await this.#getInlineLinks(document, tree)),
|
|
125
|
+
...(await this.#getReferenceLinks(document, tree)),
|
|
126
|
+
...(await this.#getLinkDefinitions(document, tree)),
|
|
137
127
|
];
|
|
138
128
|
return links;
|
|
139
129
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
},
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
return links;
|
|
172
|
-
}, _MarkdownLinkComputer_getReferenceLinks = async function _MarkdownLinkComputer_getReferenceLinks(document, tree) {
|
|
173
|
-
const { visit } = (await (0, helpers_1.dynamicImport)('unist-util-visit'));
|
|
174
|
-
const links = [];
|
|
175
|
-
visit(tree, (node) => ['imageReference', 'linkReference'].includes(node.type), (node) => {
|
|
176
|
-
const link = node;
|
|
177
|
-
const range = positionToRange(link.position);
|
|
178
|
-
// NOTE - These haven't been implemented properly, but their
|
|
179
|
-
// values aren't used for the link linting use-case
|
|
180
|
-
const targetRange = range;
|
|
181
|
-
const hrefRange = range;
|
|
182
|
-
links.push({
|
|
183
|
-
kind: vscode_markdown_languageservice_1.MdLinkKind.Link,
|
|
184
|
-
href: {
|
|
185
|
-
kind: vscode_markdown_languageservice_1.HrefKind.Reference,
|
|
186
|
-
ref: link.label,
|
|
187
|
-
},
|
|
188
|
-
source: {
|
|
189
|
-
hrefText: link.label,
|
|
190
|
-
resource: vscode_uri_1.URI.parse(document.uri),
|
|
191
|
-
range,
|
|
192
|
-
targetRange,
|
|
193
|
-
hrefRange,
|
|
194
|
-
fragmentRange: undefined,
|
|
195
|
-
pathText: link.label,
|
|
196
|
-
},
|
|
130
|
+
async #getInlineLinks(document, tree) {
|
|
131
|
+
const documentUri = URI.parse(document.uri);
|
|
132
|
+
const links = [];
|
|
133
|
+
visit(tree, (node) => node.type === 'link', (node) => {
|
|
134
|
+
const link = node;
|
|
135
|
+
const href = createHref(documentUri, link.url, this.workspace);
|
|
136
|
+
if (href) {
|
|
137
|
+
const range = positionToRange(link.position);
|
|
138
|
+
// NOTE - These haven't been implemented properly, but their
|
|
139
|
+
// values aren't used for the link linting use-case
|
|
140
|
+
const targetRange = range;
|
|
141
|
+
const hrefRange = range;
|
|
142
|
+
const fragmentRange = undefined;
|
|
143
|
+
links.push({
|
|
144
|
+
kind: MdLinkKind.Link,
|
|
145
|
+
href,
|
|
146
|
+
source: {
|
|
147
|
+
hrefText: link.url,
|
|
148
|
+
resource: documentUri,
|
|
149
|
+
range,
|
|
150
|
+
targetRange,
|
|
151
|
+
hrefRange,
|
|
152
|
+
fragmentRange,
|
|
153
|
+
pathText: link.url.split('#')[0],
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
197
157
|
});
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const definition = node;
|
|
206
|
-
const href = createHref(documentUri, definition.url, this.workspace);
|
|
207
|
-
if (href) {
|
|
208
|
-
const range = positionToRange(definition.position);
|
|
158
|
+
return links;
|
|
159
|
+
}
|
|
160
|
+
async #getReferenceLinks(document, tree) {
|
|
161
|
+
const links = [];
|
|
162
|
+
visit(tree, (node) => ['imageReference', 'linkReference'].includes(node.type), (node) => {
|
|
163
|
+
const link = node;
|
|
164
|
+
const range = positionToRange(link.position);
|
|
209
165
|
// NOTE - These haven't been implemented properly, but their
|
|
210
166
|
// values aren't used for the link linting use-case
|
|
211
167
|
const targetRange = range;
|
|
212
168
|
const hrefRange = range;
|
|
213
|
-
const fragmentRange = undefined;
|
|
214
169
|
links.push({
|
|
215
|
-
kind:
|
|
216
|
-
href
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
text: definition.label,
|
|
170
|
+
kind: MdLinkKind.Link,
|
|
171
|
+
href: {
|
|
172
|
+
kind: HrefKind.Reference,
|
|
173
|
+
ref: link.label,
|
|
220
174
|
},
|
|
221
175
|
source: {
|
|
222
|
-
hrefText:
|
|
223
|
-
resource:
|
|
176
|
+
hrefText: link.label,
|
|
177
|
+
resource: URI.parse(document.uri),
|
|
224
178
|
range,
|
|
225
179
|
targetRange,
|
|
226
180
|
hrefRange,
|
|
227
|
-
fragmentRange,
|
|
228
|
-
pathText:
|
|
181
|
+
fragmentRange: undefined,
|
|
182
|
+
pathText: link.label,
|
|
229
183
|
},
|
|
230
184
|
});
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
185
|
+
});
|
|
186
|
+
return links;
|
|
187
|
+
}
|
|
188
|
+
async #getLinkDefinitions(document, tree) {
|
|
189
|
+
const documentUri = URI.parse(document.uri);
|
|
190
|
+
const links = [];
|
|
191
|
+
visit(tree, (node) => node.type === 'definition', (node) => {
|
|
192
|
+
const definition = node;
|
|
193
|
+
const href = createHref(documentUri, definition.url, this.workspace);
|
|
194
|
+
if (href) {
|
|
195
|
+
const range = positionToRange(definition.position);
|
|
196
|
+
// NOTE - These haven't been implemented properly, but their
|
|
197
|
+
// values aren't used for the link linting use-case
|
|
198
|
+
const targetRange = range;
|
|
199
|
+
const hrefRange = range;
|
|
200
|
+
const fragmentRange = undefined;
|
|
201
|
+
links.push({
|
|
202
|
+
kind: MdLinkKind.Definition,
|
|
203
|
+
href,
|
|
204
|
+
ref: {
|
|
205
|
+
range,
|
|
206
|
+
text: definition.label,
|
|
207
|
+
},
|
|
208
|
+
source: {
|
|
209
|
+
hrefText: definition.url,
|
|
210
|
+
resource: documentUri,
|
|
211
|
+
range,
|
|
212
|
+
targetRange,
|
|
213
|
+
hrefRange,
|
|
214
|
+
fragmentRange,
|
|
215
|
+
pathText: definition.url.split('#')[0],
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
return links;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
export async function getCodeBlocks(content) {
|
|
238
224
|
const tree = fromMarkdown(content);
|
|
239
225
|
const codeBlocks = [];
|
|
240
226
|
visit(tree, (node) => node.type === 'code', (node) => {
|
|
@@ -242,5 +228,4 @@ async function getCodeBlocks(content) {
|
|
|
242
228
|
});
|
|
243
229
|
return codeBlocks;
|
|
244
230
|
}
|
|
245
|
-
exports.getCodeBlocks = getCodeBlocks;
|
|
246
231
|
//# sourceMappingURL=markdown.js.map
|
package/dist/lib/markdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../lib/markdown.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../lib/markdown.ts"],"names":[],"mappings":"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"}
|
package/lib/markdown.ts
CHANGED
|
@@ -2,7 +2,7 @@ import * as fs from 'node:fs';
|
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
|
|
4
4
|
import * as glob from 'glob';
|
|
5
|
-
import
|
|
5
|
+
import MarkdownIt from 'markdown-it';
|
|
6
6
|
import {
|
|
7
7
|
githubSlugifier,
|
|
8
8
|
resolveInternalDocumentLink,
|
|
@@ -17,16 +17,14 @@ import {
|
|
|
17
17
|
MdLink,
|
|
18
18
|
MdLinkKind,
|
|
19
19
|
} from '@dsanders11/vscode-markdown-languageservice';
|
|
20
|
+
import { visit } from 'unist-util-visit';
|
|
21
|
+
import { fromMarkdown } from 'mdast-util-from-markdown';
|
|
20
22
|
import { Emitter, Range } from 'vscode-languageserver';
|
|
21
23
|
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
22
24
|
import { URI } from 'vscode-uri';
|
|
23
25
|
|
|
24
|
-
import { dynamicImport } from './helpers';
|
|
25
|
-
|
|
26
26
|
import type { Code, Definition, ImageReference, Link, LinkReference } from 'mdast';
|
|
27
|
-
import type { fromMarkdown as FromMarkdownFunction } from 'mdast-util-from-markdown';
|
|
28
27
|
import type { Node, Position } from 'unist';
|
|
29
|
-
import type { visit as VisitFunction } from 'unist-util-visit';
|
|
30
28
|
|
|
31
29
|
export type { Code };
|
|
32
30
|
|
|
@@ -186,10 +184,6 @@ export class MarkdownLinkComputer implements IMdLinkComputer {
|
|
|
186
184
|
}
|
|
187
185
|
|
|
188
186
|
async getAllLinks(document: ITextDocument): Promise<MdLink[]> {
|
|
189
|
-
const { fromMarkdown } = (await dynamicImport('mdast-util-from-markdown')) as {
|
|
190
|
-
fromMarkdown: typeof FromMarkdownFunction;
|
|
191
|
-
};
|
|
192
|
-
|
|
193
187
|
const tree = fromMarkdown(document.getText());
|
|
194
188
|
|
|
195
189
|
const links = [
|
|
@@ -202,10 +196,6 @@ export class MarkdownLinkComputer implements IMdLinkComputer {
|
|
|
202
196
|
}
|
|
203
197
|
|
|
204
198
|
async #getInlineLinks(document: ITextDocument, tree: Node): Promise<MdLink[]> {
|
|
205
|
-
const { visit } = (await dynamicImport('unist-util-visit')) as {
|
|
206
|
-
visit: typeof VisitFunction;
|
|
207
|
-
};
|
|
208
|
-
|
|
209
199
|
const documentUri = URI.parse(document.uri);
|
|
210
200
|
const links: MdLink[] = [];
|
|
211
201
|
|
|
@@ -246,10 +236,6 @@ export class MarkdownLinkComputer implements IMdLinkComputer {
|
|
|
246
236
|
}
|
|
247
237
|
|
|
248
238
|
async #getReferenceLinks(document: ITextDocument, tree: Node): Promise<MdLink[]> {
|
|
249
|
-
const { visit } = (await dynamicImport('unist-util-visit')) as {
|
|
250
|
-
visit: typeof VisitFunction;
|
|
251
|
-
};
|
|
252
|
-
|
|
253
239
|
const links: MdLink[] = [];
|
|
254
240
|
|
|
255
241
|
visit(
|
|
@@ -287,10 +273,6 @@ export class MarkdownLinkComputer implements IMdLinkComputer {
|
|
|
287
273
|
}
|
|
288
274
|
|
|
289
275
|
async #getLinkDefinitions(document: ITextDocument, tree: Node): Promise<MdLink[]> {
|
|
290
|
-
const { visit } = (await dynamicImport('unist-util-visit')) as {
|
|
291
|
-
visit: typeof VisitFunction;
|
|
292
|
-
};
|
|
293
|
-
|
|
294
276
|
const documentUri = URI.parse(document.uri);
|
|
295
277
|
const links: MdLink[] = [];
|
|
296
278
|
|
|
@@ -336,13 +318,6 @@ export class MarkdownLinkComputer implements IMdLinkComputer {
|
|
|
336
318
|
}
|
|
337
319
|
|
|
338
320
|
export async function getCodeBlocks(content: string): Promise<Code[]> {
|
|
339
|
-
const { fromMarkdown } = (await dynamicImport('mdast-util-from-markdown')) as {
|
|
340
|
-
fromMarkdown: typeof FromMarkdownFunction;
|
|
341
|
-
};
|
|
342
|
-
const { visit } = (await dynamicImport('unist-util-visit')) as {
|
|
343
|
-
visit: typeof VisitFunction;
|
|
344
|
-
};
|
|
345
|
-
|
|
346
321
|
const tree = fromMarkdown(content);
|
|
347
322
|
|
|
348
323
|
const codeBlocks: Code[] = [];
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { addError, filterTokens } from 'markdownlint/helpers';
|
|
2
|
-
|
|
3
1
|
import { fromMarkdown } from 'mdast-util-from-markdown';
|
|
4
2
|
import { visit } from 'unist-util-visit';
|
|
5
3
|
|
|
@@ -11,7 +9,9 @@ export const tags = ['brackets'];
|
|
|
11
9
|
const UNESCAPED_REGEX = /(?<!\\)<(?!\s)/g;
|
|
12
10
|
|
|
13
11
|
function EMD002(params, onError) {
|
|
14
|
-
|
|
12
|
+
const tokens = params.parsers.markdownit.tokens.filter((token) => token.type === 'inline');
|
|
13
|
+
|
|
14
|
+
for (const token of tokens) {
|
|
15
15
|
for (const childToken of token.children) {
|
|
16
16
|
// childToken.line has the raw content, but may also contain
|
|
17
17
|
// more content than just childToken.content. Since we need
|
|
@@ -41,19 +41,17 @@ function EMD002(params, onError) {
|
|
|
41
41
|
const matches = rawContent.matchAll(UNESCAPED_REGEX);
|
|
42
42
|
|
|
43
43
|
for (const match of matches) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
[node.position.start.offset + 1 + match.index, 1],
|
|
50
|
-
);
|
|
44
|
+
onError({
|
|
45
|
+
lineNumber: childToken.lineNumber,
|
|
46
|
+
detail: 'Unescaped opening angle bracket',
|
|
47
|
+
range: [node.position.start.offset + 1 + match.index, 1],
|
|
48
|
+
});
|
|
51
49
|
}
|
|
52
50
|
},
|
|
53
51
|
);
|
|
54
52
|
}
|
|
55
53
|
}
|
|
56
|
-
}
|
|
54
|
+
}
|
|
57
55
|
}
|
|
58
56
|
|
|
59
57
|
export { EMD002 as function };
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { addError, filterTokens } from 'markdownlint/helpers';
|
|
2
|
-
|
|
3
1
|
import { fromMarkdown } from 'mdast-util-from-markdown';
|
|
4
2
|
import { visit } from 'unist-util-visit';
|
|
5
3
|
|
|
@@ -11,7 +9,9 @@ export const tags = ['braces'];
|
|
|
11
9
|
const UNESCAPED_REGEX = /(?<!\\){/g;
|
|
12
10
|
|
|
13
11
|
function EMD003(params, onError) {
|
|
14
|
-
|
|
12
|
+
const tokens = params.parsers.markdownit.tokens.filter((token) => token.type === 'inline');
|
|
13
|
+
|
|
14
|
+
for (const token of tokens) {
|
|
15
15
|
for (const childToken of token.children) {
|
|
16
16
|
// childToken.line has the raw content, but may also contain
|
|
17
17
|
// more content than just childToken.content. Since we need
|
|
@@ -40,16 +40,17 @@ function EMD003(params, onError) {
|
|
|
40
40
|
const matches = rawContent.matchAll(UNESCAPED_REGEX);
|
|
41
41
|
|
|
42
42
|
for (const match of matches) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
onError({
|
|
44
|
+
lineNumber: childToken.lineNumber,
|
|
45
|
+
detail: 'Unescaped opening curly brace',
|
|
46
|
+
range: [node.position.start.offset + 1 + match.index, 1],
|
|
47
|
+
});
|
|
47
48
|
}
|
|
48
49
|
},
|
|
49
50
|
);
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
|
-
}
|
|
53
|
+
}
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
export { EMD003 as function };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const names = ['EMD004', 'no-newline-in-links'];
|
|
2
|
+
export const description = 'Newlines inside link text';
|
|
3
|
+
export const tags = ['newline', 'links'];
|
|
4
|
+
export const parser = 'markdownit';
|
|
5
|
+
|
|
6
|
+
function EMD004(params, onError) {
|
|
7
|
+
const tokens = params.parsers.markdownit.tokens.filter((token) => token.type === 'inline');
|
|
8
|
+
|
|
9
|
+
for (const token of tokens) {
|
|
10
|
+
const { children } = token;
|
|
11
|
+
let { lineNumber } = token;
|
|
12
|
+
let inLink = false;
|
|
13
|
+
for (const child of children) {
|
|
14
|
+
const { type } = child;
|
|
15
|
+
if (type === 'link_open') {
|
|
16
|
+
inLink = true;
|
|
17
|
+
} else if (type === 'link_close') {
|
|
18
|
+
inLink = false;
|
|
19
|
+
} else if (type === 'softbreak') {
|
|
20
|
+
if (inLink) {
|
|
21
|
+
onError({ lineNumber });
|
|
22
|
+
break;
|
|
23
|
+
} else {
|
|
24
|
+
lineNumber++;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { EMD004 as function };
|