@diplodoc/transform 4.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/CHANGELOG.diplodoc.md +38 -0
- package/CHANGELOG.md +404 -0
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/README.ru.md +36 -0
- package/dist/css/yfm.css +736 -0
- package/dist/css/yfm.css.map +7 -0
- package/dist/css/yfm.min.css +2 -0
- package/dist/css/yfm.min.css.map +7 -0
- package/dist/js/code.d.ts +1 -0
- package/dist/js/cut.d.ts +1 -0
- package/dist/js/index.d.ts +5 -0
- package/dist/js/polyfill.d.ts +1 -0
- package/dist/js/tabs.d.ts +1 -0
- package/dist/js/term/index.d.ts +1 -0
- package/dist/js/term/utils.d.ts +10 -0
- package/dist/js/utils.d.ts +2 -0
- package/dist/js/yfm.js +432 -0
- package/dist/js/yfm.js.map +7 -0
- package/dist/js/yfm.min.js +2 -0
- package/dist/js/yfm.min.js.map +7 -0
- package/lib/getObject.d.ts +2 -0
- package/lib/getObject.js +11 -0
- package/lib/getObject.js.map +1 -0
- package/lib/headings.d.ts +4 -0
- package/lib/headings.js +73 -0
- package/lib/headings.js.map +1 -0
- package/lib/highlight.d.ts +3 -0
- package/lib/highlight.js +29 -0
- package/lib/highlight.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +35 -0
- package/lib/index.js.map +1 -0
- package/lib/liquid/conditions.d.ts +4 -0
- package/lib/liquid/conditions.js +181 -0
- package/lib/liquid/conditions.js.map +1 -0
- package/lib/liquid/cycles.d.ts +4 -0
- package/lib/liquid/cycles.js +160 -0
- package/lib/liquid/cycles.js.map +1 -0
- package/lib/liquid/errors.d.ts +3 -0
- package/lib/liquid/errors.js +13 -0
- package/lib/liquid/errors.js.map +1 -0
- package/lib/liquid/evaluation.d.ts +3 -0
- package/lib/liquid/evaluation.js +138 -0
- package/lib/liquid/evaluation.js.map +1 -0
- package/lib/liquid/filters.d.ts +9 -0
- package/lib/liquid/filters.js +22 -0
- package/lib/liquid/filters.js.map +1 -0
- package/lib/liquid/index.d.ts +9 -0
- package/lib/liquid/index.js +87 -0
- package/lib/liquid/index.js.map +1 -0
- package/lib/liquid/lexical.d.ts +14 -0
- package/lib/liquid/lexical.js +79 -0
- package/lib/liquid/lexical.js.map +1 -0
- package/lib/liquid/services/argv.d.ts +15 -0
- package/lib/liquid/services/argv.js +17 -0
- package/lib/liquid/services/argv.js.map +1 -0
- package/lib/liquid/sourceMap.d.ts +24 -0
- package/lib/liquid/sourceMap.js +56 -0
- package/lib/liquid/sourceMap.js.map +1 -0
- package/lib/liquid/substitutions.d.ts +2 -0
- package/lib/liquid/substitutions.js +36 -0
- package/lib/liquid/substitutions.js.map +1 -0
- package/lib/liquid/utils.d.ts +8 -0
- package/lib/liquid/utils.js +24 -0
- package/lib/liquid/utils.js.map +1 -0
- package/lib/log.d.ts +18 -0
- package/lib/log.js +54 -0
- package/lib/log.js.map +1 -0
- package/lib/md.d.ts +14 -0
- package/lib/md.js +96 -0
- package/lib/md.js.map +1 -0
- package/lib/plugins/anchors/collect.d.ts +5 -0
- package/lib/plugins/anchors/collect.js +81 -0
- package/lib/plugins/anchors/collect.js.map +1 -0
- package/lib/plugins/anchors/constants.d.ts +2 -0
- package/lib/plugins/anchors/constants.js +6 -0
- package/lib/plugins/anchors/constants.js.map +1 -0
- package/lib/plugins/anchors/index.d.ts +7 -0
- package/lib/plugins/anchors/index.js +134 -0
- package/lib/plugins/anchors/index.js.map +1 -0
- package/lib/plugins/changelog/collect.d.ts +8 -0
- package/lib/plugins/changelog/collect.js +50 -0
- package/lib/plugins/changelog/collect.js.map +1 -0
- package/lib/plugins/changelog/index.d.ts +6 -0
- package/lib/plugins/changelog/index.js +131 -0
- package/lib/plugins/changelog/index.js.map +1 -0
- package/lib/plugins/changelog/types.d.ts +10 -0
- package/lib/plugins/changelog/types.js +3 -0
- package/lib/plugins/changelog/types.js.map +1 -0
- package/lib/plugins/checkbox/checkbox.d.ts +7 -0
- package/lib/plugins/checkbox/checkbox.js +91 -0
- package/lib/plugins/checkbox/checkbox.js.map +1 -0
- package/lib/plugins/checkbox/index.d.ts +8 -0
- package/lib/plugins/checkbox/index.js +12 -0
- package/lib/plugins/checkbox/index.js.map +1 -0
- package/lib/plugins/code.d.ts +3 -0
- package/lib/plugins/code.js +61 -0
- package/lib/plugins/code.js.map +1 -0
- package/lib/plugins/cut.d.ts +3 -0
- package/lib/plugins/cut.js +70 -0
- package/lib/plugins/cut.js.map +1 -0
- package/lib/plugins/deflist.d.ts +3 -0
- package/lib/plugins/deflist.js +8 -0
- package/lib/plugins/deflist.js.map +1 -0
- package/lib/plugins/file/const.d.ts +27 -0
- package/lib/plugins/file/const.js +47 -0
- package/lib/plugins/file/const.js.map +1 -0
- package/lib/plugins/file/file.d.ts +8 -0
- package/lib/plugins/file/file.js +63 -0
- package/lib/plugins/file/file.js.map +1 -0
- package/lib/plugins/file/index.d.ts +4 -0
- package/lib/plugins/file/index.js +9 -0
- package/lib/plugins/file/index.js.map +1 -0
- package/lib/plugins/images/collect.d.ts +8 -0
- package/lib/plugins/images/collect.js +43 -0
- package/lib/plugins/images/collect.js.map +1 -0
- package/lib/plugins/images/index.d.ts +10 -0
- package/lib/plugins/images/index.js +81 -0
- package/lib/plugins/images/index.js.map +1 -0
- package/lib/plugins/imsize/const.d.ts +7 -0
- package/lib/plugins/imsize/const.js +12 -0
- package/lib/plugins/imsize/const.js.map +1 -0
- package/lib/plugins/imsize/helpers.d.ts +6 -0
- package/lib/plugins/imsize/helpers.js +64 -0
- package/lib/plugins/imsize/helpers.js.map +1 -0
- package/lib/plugins/imsize/index.d.ts +8 -0
- package/lib/plugins/imsize/index.js +12 -0
- package/lib/plugins/imsize/index.js.map +1 -0
- package/lib/plugins/imsize/plugin.d.ts +3 -0
- package/lib/plugins/imsize/plugin.js +188 -0
- package/lib/plugins/imsize/plugin.js.map +1 -0
- package/lib/plugins/includes/collect.d.ts +8 -0
- package/lib/plugins/includes/collect.js +49 -0
- package/lib/plugins/includes/collect.js.map +1 -0
- package/lib/plugins/includes/index.d.ts +8 -0
- package/lib/plugins/includes/index.js +98 -0
- package/lib/plugins/includes/index.js.map +1 -0
- package/lib/plugins/links/collect.d.ts +7 -0
- package/lib/plugins/links/collect.js +74 -0
- package/lib/plugins/links/collect.js.map +1 -0
- package/lib/plugins/links/constants.d.ts +1 -0
- package/lib/plugins/links/constants.js +5 -0
- package/lib/plugins/links/constants.js.map +1 -0
- package/lib/plugins/links/index.d.ts +24 -0
- package/lib/plugins/links/index.js +178 -0
- package/lib/plugins/links/index.js.map +1 -0
- package/lib/plugins/meta.d.ts +3 -0
- package/lib/plugins/meta.js +8 -0
- package/lib/plugins/meta.js.map +1 -0
- package/lib/plugins/monospace.d.ts +3 -0
- package/lib/plugins/monospace.js +109 -0
- package/lib/plugins/monospace.js.map +1 -0
- package/lib/plugins/notes.d.ts +3 -0
- package/lib/plugins/notes.js +103 -0
- package/lib/plugins/notes.js.map +1 -0
- package/lib/plugins/sup.d.ts +3 -0
- package/lib/plugins/sup.js +8 -0
- package/lib/plugins/sup.js.map +1 -0
- package/lib/plugins/table/index.d.ts +3 -0
- package/lib/plugins/table/index.js +215 -0
- package/lib/plugins/table/index.js.map +1 -0
- package/lib/plugins/tabs.d.ts +4 -0
- package/lib/plugins/tabs.js +4 -0
- package/lib/plugins/tabs.js.map +1 -0
- package/lib/plugins/term/constants.d.ts +1 -0
- package/lib/plugins/term/constants.js +5 -0
- package/lib/plugins/term/constants.js.map +1 -0
- package/lib/plugins/term/index.d.ts +3 -0
- package/lib/plugins/term/index.js +108 -0
- package/lib/plugins/term/index.js.map +1 -0
- package/lib/plugins/term/termDefinitions.d.ts +4 -0
- package/lib/plugins/term/termDefinitions.js +125 -0
- package/lib/plugins/term/termDefinitions.js.map +1 -0
- package/lib/plugins/typings.d.ts +12 -0
- package/lib/plugins/typings.js +3 -0
- package/lib/plugins/typings.js.map +1 -0
- package/lib/plugins/utils.d.ts +6 -0
- package/lib/plugins/utils.js +30 -0
- package/lib/plugins/utils.js.map +1 -0
- package/lib/plugins/video/const.d.ts +10 -0
- package/lib/plugins/video/const.js +22 -0
- package/lib/plugins/video/const.js.map +1 -0
- package/lib/plugins/video/index.d.ts +8 -0
- package/lib/plugins/video/index.js +104 -0
- package/lib/plugins/video/index.js.map +1 -0
- package/lib/plugins/video/parsers.d.ts +6 -0
- package/lib/plugins/video/parsers.js +64 -0
- package/lib/plugins/video/parsers.js.map +1 -0
- package/lib/plugins/video/types.d.ts +34 -0
- package/lib/plugins/video/types.js +3 -0
- package/lib/plugins/video/types.js.map +1 -0
- package/lib/plugins/video/utils.d.ts +2 -0
- package/lib/plugins/video/utils.js +25 -0
- package/lib/plugins/video/utils.js.map +1 -0
- package/lib/plugins.d.ts +3 -0
- package/lib/plugins.js +36 -0
- package/lib/plugins.js.map +1 -0
- package/lib/sanitize.d.ts +12 -0
- package/lib/sanitize.js +572 -0
- package/lib/sanitize.js.map +1 -0
- package/lib/title.d.ts +7 -0
- package/lib/title.js +18 -0
- package/lib/title.js.map +1 -0
- package/lib/typings.d.ts +57 -0
- package/lib/typings.js +3 -0
- package/lib/typings.js.map +1 -0
- package/lib/utils.d.ts +13 -0
- package/lib/utils.js +79 -0
- package/lib/utils.js.map +1 -0
- package/lib/utilsFS.d.ts +27 -0
- package/lib/utilsFS.js +89 -0
- package/lib/utilsFS.js.map +1 -0
- package/lib/yfmlint/index.d.ts +26 -0
- package/lib/yfmlint/index.js +72 -0
- package/lib/yfmlint/index.js.map +1 -0
- package/lib/yfmlint/markdownlint-custom-rule/index.d.ts +9 -0
- package/lib/yfmlint/markdownlint-custom-rule/index.js +22 -0
- package/lib/yfmlint/markdownlint-custom-rule/index.js.map +1 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm001.d.ts +2 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm001.js +28 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm001.js.map +1 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm002.d.ts +2 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm002.js +33 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm002.js.map +1 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm003.d.ts +2 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm003.js +33 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm003.js.map +1 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm004.d.ts +2 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm004.js +28 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm004.js.map +1 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm005.d.ts +2 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm005.js +28 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm005.js.map +1 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm006.d.ts +2 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm006.js +28 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm006.js.map +1 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm007.d.ts +2 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm007.js +29 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm007.js.map +1 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm008.d.ts +2 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm008.js +28 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm008.js.map +1 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm009.d.ts +2 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm009.js +47 -0
- package/lib/yfmlint/markdownlint-custom-rule/yfm009.js.map +1 -0
- package/lib/yfmlint/typings.d.ts +12 -0
- package/lib/yfmlint/typings.js +3 -0
- package/lib/yfmlint/typings.js.map +1 -0
- package/lib/yfmlint/utils.d.ts +9 -0
- package/lib/yfmlint/utils.js +22 -0
- package/lib/yfmlint/utils.js.map +1 -0
- package/lib/yfmlint/yfmlint.d.ts +3 -0
- package/lib/yfmlint/yfmlint.js +69 -0
- package/lib/yfmlint/yfmlint.js.map +1 -0
- package/package.json +106 -0
- package/src/.eslintrc +10 -0
- package/src/js/code.ts +65 -0
- package/src/js/cut.ts +57 -0
- package/src/js/index.ts +6 -0
- package/src/js/polyfill.js +27 -0
- package/src/js/term/index.ts +79 -0
- package/src/js/term/utils.ts +151 -0
- package/src/js/utils.ts +9 -0
- package/src/scss/_anchor.scss +33 -0
- package/src/scss/_code.scss +23 -0
- package/src/scss/_common.scss +407 -0
- package/src/scss/_cut.scss +42 -0
- package/src/scss/_file.scss +35 -0
- package/src/scss/_highlight.scss +96 -0
- package/src/scss/_note.scss +73 -0
- package/src/scss/_print.scss +20 -0
- package/src/scss/_term.scss +79 -0
- package/src/scss/_variables.scss +16 -0
- package/src/scss/yfm.scss +11 -0
- package/src/transform/getObject.ts +10 -0
- package/src/transform/headings.ts +88 -0
- package/src/transform/highlight.ts +33 -0
- package/src/transform/index.ts +50 -0
- package/src/transform/liquid/conditions.ts +259 -0
- package/src/transform/liquid/cycles.ts +244 -0
- package/src/transform/liquid/errors.ts +10 -0
- package/src/transform/liquid/evaluation.ts +145 -0
- package/src/transform/liquid/filters.ts +19 -0
- package/src/transform/liquid/index.ts +141 -0
- package/src/transform/liquid/lexical.ts +86 -0
- package/src/transform/liquid/services/argv.ts +23 -0
- package/src/transform/liquid/sourceMap.ts +72 -0
- package/src/transform/liquid/substitutions.ts +40 -0
- package/src/transform/liquid/utils.ts +30 -0
- package/src/transform/log.ts +60 -0
- package/src/transform/md.ts +123 -0
- package/src/transform/plugins/anchors/collect.ts +101 -0
- package/src/transform/plugins/anchors/constants.ts +2 -0
- package/src/transform/plugins/anchors/index.ts +166 -0
- package/src/transform/plugins/changelog/collect.ts +66 -0
- package/src/transform/plugins/changelog/index.ts +164 -0
- package/src/transform/plugins/changelog/types.ts +10 -0
- package/src/transform/plugins/checkbox/checkbox.ts +107 -0
- package/src/transform/plugins/checkbox/index.ts +15 -0
- package/src/transform/plugins/code.ts +79 -0
- package/src/transform/plugins/cut.ts +98 -0
- package/src/transform/plugins/deflist.ts +5 -0
- package/src/transform/plugins/file/README.md +34 -0
- package/src/transform/plugins/file/const.ts +46 -0
- package/src/transform/plugins/file/file.ts +82 -0
- package/src/transform/plugins/file/index.ts +10 -0
- package/src/transform/plugins/images/collect.ts +60 -0
- package/src/transform/plugins/images/index.ts +119 -0
- package/src/transform/plugins/imsize/const.ts +7 -0
- package/src/transform/plugins/imsize/helpers.ts +75 -0
- package/src/transform/plugins/imsize/index.ts +14 -0
- package/src/transform/plugins/imsize/plugin.ts +214 -0
- package/src/transform/plugins/includes/collect.ts +73 -0
- package/src/transform/plugins/includes/index.ts +127 -0
- package/src/transform/plugins/links/collect.ts +92 -0
- package/src/transform/plugins/links/constants.ts +1 -0
- package/src/transform/plugins/links/index.ts +218 -0
- package/src/transform/plugins/meta.ts +5 -0
- package/src/transform/plugins/monospace.ts +141 -0
- package/src/transform/plugins/notes.ts +134 -0
- package/src/transform/plugins/sup.ts +5 -0
- package/src/transform/plugins/table/index.ts +290 -0
- package/src/transform/plugins/tabs.ts +3 -0
- package/src/transform/plugins/term/constants.ts +1 -0
- package/src/transform/plugins/term/index.ts +139 -0
- package/src/transform/plugins/term/termDefinitions.ts +177 -0
- package/src/transform/plugins/typings.ts +14 -0
- package/src/transform/plugins/utils.ts +38 -0
- package/src/transform/plugins/video/const.ts +20 -0
- package/src/transform/plugins/video/index.ts +134 -0
- package/src/transform/plugins/video/parsers.ts +65 -0
- package/src/transform/plugins/video/types.ts +27 -0
- package/src/transform/plugins/video/utils.ts +24 -0
- package/src/transform/plugins.ts +35 -0
- package/src/transform/sanitize.ts +596 -0
- package/src/transform/title.ts +22 -0
- package/src/transform/typings.ts +64 -0
- package/src/transform/utils.ts +91 -0
- package/src/transform/utilsFS.ts +128 -0
- package/src/transform/yfmlint/README.md +48 -0
- package/src/transform/yfmlint/index.ts +124 -0
- package/src/transform/yfmlint/markdownlint-custom-rule/index.ts +9 -0
- package/src/transform/yfmlint/markdownlint-custom-rule/yfm001.ts +36 -0
- package/src/transform/yfmlint/markdownlint-custom-rule/yfm002.ts +33 -0
- package/src/transform/yfmlint/markdownlint-custom-rule/yfm003.ts +33 -0
- package/src/transform/yfmlint/markdownlint-custom-rule/yfm004.ts +27 -0
- package/src/transform/yfmlint/markdownlint-custom-rule/yfm005.ts +27 -0
- package/src/transform/yfmlint/markdownlint-custom-rule/yfm006.ts +26 -0
- package/src/transform/yfmlint/markdownlint-custom-rule/yfm007.ts +28 -0
- package/src/transform/yfmlint/markdownlint-custom-rule/yfm008.ts +26 -0
- package/src/transform/yfmlint/markdownlint-custom-rule/yfm009.ts +54 -0
- package/src/transform/yfmlint/typings.ts +13 -0
- package/src/transform/yfmlint/utils.ts +31 -0
- package/src/transform/yfmlint/yfmlint.ts +73 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import Token from 'markdown-it/lib/token';
|
|
2
|
+
|
|
3
|
+
export function isLocalUrl(url: string) {
|
|
4
|
+
return !/^(?:[a-z]+:)?\/\//i.test(url);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function findBlockTokens(tokens: Token[], id: string) {
|
|
8
|
+
let blockTokens: Token[] = [];
|
|
9
|
+
let i = 0,
|
|
10
|
+
startToken,
|
|
11
|
+
start,
|
|
12
|
+
end;
|
|
13
|
+
while (i < tokens.length) {
|
|
14
|
+
const token = tokens[i];
|
|
15
|
+
|
|
16
|
+
if (typeof start === 'number' && startToken) {
|
|
17
|
+
if (startToken.type === 'paragraph_open' && token.type === 'paragraph_close') {
|
|
18
|
+
end = i + 1;
|
|
19
|
+
break;
|
|
20
|
+
} else if (startToken.type === 'heading_open') {
|
|
21
|
+
if (token.type === 'heading_open' && token.tag === startToken.tag) {
|
|
22
|
+
end = i;
|
|
23
|
+
break;
|
|
24
|
+
} else if (i === tokens.length - 1) {
|
|
25
|
+
end = tokens.length;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (
|
|
31
|
+
(token.type === 'paragraph_open' || token.type === 'heading_open') &&
|
|
32
|
+
token.attrGet('id') === id &&
|
|
33
|
+
typeof start === 'undefined'
|
|
34
|
+
) {
|
|
35
|
+
startToken = token;
|
|
36
|
+
start = i;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
i++;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (typeof start === 'number' && typeof end === 'number') {
|
|
43
|
+
blockTokens = tokens.slice(start, end);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return blockTokens;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function headingInfo(tokens: Token[], idx: number) {
|
|
50
|
+
const openToken = tokens[idx];
|
|
51
|
+
const inlineToken = tokens[idx + 1];
|
|
52
|
+
|
|
53
|
+
let lastTextToken,
|
|
54
|
+
i = 0;
|
|
55
|
+
while (inlineToken.children && i < inlineToken.children.length) {
|
|
56
|
+
const token = inlineToken.children[i];
|
|
57
|
+
|
|
58
|
+
if (token.type === 'text') {
|
|
59
|
+
lastTextToken = token;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
i++;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const level = Number.parseInt(openToken.tag.slice(1), 10);
|
|
66
|
+
const title = (lastTextToken && lastTextToken.content) || inlineToken.content;
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
level,
|
|
70
|
+
title,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function isExternalHref(href: string) {
|
|
75
|
+
return href.startsWith('http') || href.startsWith('//');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function transformLinkToOriginalArticle(opts: {root: string; currentPath: string}) {
|
|
79
|
+
const {root, currentPath} = opts;
|
|
80
|
+
|
|
81
|
+
return currentPath.replace(root, '').replace(/\.(md|ya?ml|html)$/i, '');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function getHrefTokenAttr(token: Token) {
|
|
85
|
+
let href = token.attrGet('href') || '';
|
|
86
|
+
try {
|
|
87
|
+
href = decodeURI(href);
|
|
88
|
+
} catch (e) {}
|
|
89
|
+
|
|
90
|
+
return href;
|
|
91
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import _, {Dictionary} from 'lodash';
|
|
2
|
+
import {readFileSync, statSync} from 'fs';
|
|
3
|
+
|
|
4
|
+
import {parse, resolve, join, sep} from 'path';
|
|
5
|
+
|
|
6
|
+
import liquid from './liquid';
|
|
7
|
+
import {StateCore} from './typings';
|
|
8
|
+
|
|
9
|
+
const filesCache: Record<string, string> = {};
|
|
10
|
+
|
|
11
|
+
export function isFileExists(file: string) {
|
|
12
|
+
try {
|
|
13
|
+
const stats = statSync(file);
|
|
14
|
+
|
|
15
|
+
return stats.isFile();
|
|
16
|
+
} catch (e) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function resolveRelativePath(fromPath: string, relativePath: string) {
|
|
22
|
+
const {dir: fromDir} = parse(fromPath);
|
|
23
|
+
|
|
24
|
+
return resolve(fromDir, relativePath);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type GetFileTokensOpts = {
|
|
28
|
+
getVarsPerFile?: (path: string) => Record<string, string>;
|
|
29
|
+
vars?: Record<string, unknown>;
|
|
30
|
+
disableLiquid?: boolean;
|
|
31
|
+
disableLint?: boolean;
|
|
32
|
+
lintMarkdown?: (opts: {input: string; path: string; sourceMap?: Dictionary<string>}) => void;
|
|
33
|
+
disableTitleRefSubstitution?: boolean;
|
|
34
|
+
disableCircularError?: boolean;
|
|
35
|
+
inheritVars?: boolean;
|
|
36
|
+
conditionsInCode?: boolean;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export function getFileTokens(path: string, state: StateCore, options: GetFileTokensOpts) {
|
|
40
|
+
const {
|
|
41
|
+
getVarsPerFile,
|
|
42
|
+
vars,
|
|
43
|
+
disableLiquid,
|
|
44
|
+
disableLint,
|
|
45
|
+
lintMarkdown,
|
|
46
|
+
disableTitleRefSubstitution,
|
|
47
|
+
disableCircularError,
|
|
48
|
+
inheritVars = true,
|
|
49
|
+
conditionsInCode,
|
|
50
|
+
} = options;
|
|
51
|
+
let content;
|
|
52
|
+
|
|
53
|
+
const builtVars = (getVarsPerFile && !inheritVars ? getVarsPerFile(path) : vars) || {};
|
|
54
|
+
|
|
55
|
+
if (filesCache[path]) {
|
|
56
|
+
content = filesCache[path];
|
|
57
|
+
} else {
|
|
58
|
+
content = readFileSync(path, 'utf8');
|
|
59
|
+
filesCache[path] = content;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let sourceMap;
|
|
63
|
+
|
|
64
|
+
if (!disableLiquid) {
|
|
65
|
+
const liquidResult = liquid(content, builtVars, path, {
|
|
66
|
+
withSourceMap: true,
|
|
67
|
+
conditionsInCode,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
content = liquidResult.output;
|
|
71
|
+
sourceMap = liquidResult.sourceMap;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!disableLint && lintMarkdown) {
|
|
75
|
+
lintMarkdown({
|
|
76
|
+
input: content,
|
|
77
|
+
path,
|
|
78
|
+
sourceMap,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const meta = state.md.meta;
|
|
83
|
+
const tokens = state.md.parse(content, {
|
|
84
|
+
...state.env,
|
|
85
|
+
path,
|
|
86
|
+
disableTitleRefSubstitution,
|
|
87
|
+
disableCircularError,
|
|
88
|
+
});
|
|
89
|
+
state.md.meta = meta;
|
|
90
|
+
|
|
91
|
+
return tokens;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export const getFullIncludePath = (includePath: string, root: string, path: string) => {
|
|
95
|
+
let fullIncludePath;
|
|
96
|
+
if (includePath.startsWith(sep)) {
|
|
97
|
+
fullIncludePath = join(root, includePath);
|
|
98
|
+
} else {
|
|
99
|
+
fullIncludePath = resolveRelativePath(path, includePath);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return fullIncludePath;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export function getSinglePageAnchorId(args: {
|
|
106
|
+
root: string;
|
|
107
|
+
currentPath: string;
|
|
108
|
+
pathname?: string;
|
|
109
|
+
hash?: string | null;
|
|
110
|
+
}) {
|
|
111
|
+
const {root, currentPath, pathname, hash} = args;
|
|
112
|
+
let resultAnchor = currentPath;
|
|
113
|
+
|
|
114
|
+
if (pathname) {
|
|
115
|
+
resultAnchor = resolveRelativePath(currentPath, pathname);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
resultAnchor = resultAnchor
|
|
119
|
+
.replace(root, '')
|
|
120
|
+
.replace(/\.(md|ya?ml|html)$/i, '')
|
|
121
|
+
.replace(new RegExp(_.escapeRegExp(sep), 'gi'), '_');
|
|
122
|
+
|
|
123
|
+
if (hash) {
|
|
124
|
+
resultAnchor = resultAnchor + '_' + hash.slice(1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return `#${resultAnchor}`;
|
|
128
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# YFM rules
|
|
2
|
+
|
|
3
|
+
[All markdownlint rules](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md)
|
|
4
|
+
|
|
5
|
+
## YFM001 - Inline code line length
|
|
6
|
+
|
|
7
|
+
Tags: line_length
|
|
8
|
+
|
|
9
|
+
Aliases: inline-code-length
|
|
10
|
+
|
|
11
|
+
Parameters: maximum
|
|
12
|
+
|
|
13
|
+
This rule is triggered when there are lines that are longer than the
|
|
14
|
+
configured `value` (default: 100 characters).
|
|
15
|
+
|
|
16
|
+
## YFM002 - No header found in the file for the link text
|
|
17
|
+
|
|
18
|
+
Tags: links
|
|
19
|
+
|
|
20
|
+
Aliases: no-header-found-for-link
|
|
21
|
+
|
|
22
|
+
This rule is triggered when there are no headers in the file referenced by the link.
|
|
23
|
+
|
|
24
|
+
## YFM003 - Link is unreachable
|
|
25
|
+
|
|
26
|
+
Tags: links
|
|
27
|
+
|
|
28
|
+
Aliases: unreachable-link
|
|
29
|
+
|
|
30
|
+
This rule is triggered when there is no file referenced by the link.
|
|
31
|
+
|
|
32
|
+
## YFM004 - Table not closed
|
|
33
|
+
|
|
34
|
+
Tags: table
|
|
35
|
+
|
|
36
|
+
Aliases: table-not-closed
|
|
37
|
+
|
|
38
|
+
This rule is triggered when table don't have close token.
|
|
39
|
+
|
|
40
|
+
## YFM005 - Tab list not closed
|
|
41
|
+
|
|
42
|
+
Tags: tab
|
|
43
|
+
|
|
44
|
+
Aliases: tab-list-not-closed
|
|
45
|
+
|
|
46
|
+
This rule is triggered when tab list don't have close token.
|
|
47
|
+
|
|
48
|
+
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import {Rule, sync} from 'markdownlint';
|
|
2
|
+
import merge from 'lodash/merge';
|
|
3
|
+
import union from 'lodash/union';
|
|
4
|
+
import attrs from 'markdown-it-attrs';
|
|
5
|
+
import baseDefaultLintConfig from './yfmlint';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
yfm001,
|
|
9
|
+
yfm002,
|
|
10
|
+
yfm003,
|
|
11
|
+
yfm004,
|
|
12
|
+
yfm005,
|
|
13
|
+
yfm006,
|
|
14
|
+
yfm007,
|
|
15
|
+
yfm008,
|
|
16
|
+
} from './markdownlint-custom-rule';
|
|
17
|
+
|
|
18
|
+
import {errorToString, getLogLevel} from './utils';
|
|
19
|
+
import {Options} from './typings';
|
|
20
|
+
import {Dictionary} from 'lodash';
|
|
21
|
+
import {Logger, LogLevels} from '../log';
|
|
22
|
+
import {yfm009} from './markdownlint-custom-rule/yfm009';
|
|
23
|
+
|
|
24
|
+
const defaultLintRules = [yfm001, yfm002, yfm003, yfm004, yfm005, yfm006, yfm007, yfm008, yfm009];
|
|
25
|
+
|
|
26
|
+
const lintCache = new Set();
|
|
27
|
+
|
|
28
|
+
function yfmlint(opts: Options) {
|
|
29
|
+
const {input, plugins: customPlugins, pluginOptions, customLintRules, sourceMap} = opts;
|
|
30
|
+
const {path = 'input', log} = pluginOptions;
|
|
31
|
+
|
|
32
|
+
pluginOptions.isLintRun = true;
|
|
33
|
+
|
|
34
|
+
const {
|
|
35
|
+
LogLevels: {ERROR, WARN, DISABLED},
|
|
36
|
+
} = log;
|
|
37
|
+
|
|
38
|
+
if (lintCache.has(path)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
lintCache.add(path);
|
|
43
|
+
|
|
44
|
+
const defaultLintConfig = opts.defaultLintConfig || baseDefaultLintConfig;
|
|
45
|
+
|
|
46
|
+
let lintConfig = defaultLintConfig;
|
|
47
|
+
if (opts.lintConfig) {
|
|
48
|
+
lintConfig = merge({}, defaultLintConfig, opts.lintConfig);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let lintRules = defaultLintRules;
|
|
52
|
+
if (customLintRules) {
|
|
53
|
+
lintRules = union(lintRules, customLintRules);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const plugins = customPlugins && [attrs, ...customPlugins];
|
|
57
|
+
const preparedPlugins = plugins && plugins.map((plugin) => [plugin, pluginOptions]);
|
|
58
|
+
|
|
59
|
+
let result;
|
|
60
|
+
try {
|
|
61
|
+
result = sync({
|
|
62
|
+
strings: {[path]: input},
|
|
63
|
+
markdownItPlugins: preparedPlugins,
|
|
64
|
+
handleRuleFailures: true,
|
|
65
|
+
config: lintConfig,
|
|
66
|
+
customRules: lintRules,
|
|
67
|
+
});
|
|
68
|
+
} catch {}
|
|
69
|
+
|
|
70
|
+
const errors = result && result[path];
|
|
71
|
+
if (!errors) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const logLevelsConfig = lintConfig['log-levels'];
|
|
76
|
+
|
|
77
|
+
for (const error of errors) {
|
|
78
|
+
const message = errorToString(path, error, sourceMap);
|
|
79
|
+
const logLevel = getLogLevel({
|
|
80
|
+
logLevelsConfig,
|
|
81
|
+
ruleNames: error.ruleNames,
|
|
82
|
+
defaultLevel: WARN,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
switch (logLevel) {
|
|
86
|
+
case ERROR:
|
|
87
|
+
log.error(message);
|
|
88
|
+
break;
|
|
89
|
+
case WARN:
|
|
90
|
+
log.warn(message);
|
|
91
|
+
break;
|
|
92
|
+
case DISABLED:
|
|
93
|
+
default:
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export = yfmlint;
|
|
100
|
+
|
|
101
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
102
|
+
namespace yfmlint {
|
|
103
|
+
export interface LintMarkdownFunctionOptions {
|
|
104
|
+
input: string;
|
|
105
|
+
path: string;
|
|
106
|
+
sourceMap?: Dictionary<string>;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface PluginOptions {
|
|
110
|
+
log: Logger;
|
|
111
|
+
path?: string;
|
|
112
|
+
disableLint?: boolean;
|
|
113
|
+
lintMarkdown?: (opts: LintMarkdownFunctionOptions) => void;
|
|
114
|
+
[key: string]: unknown;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface LintConfig {
|
|
118
|
+
default?: boolean;
|
|
119
|
+
'log-levels': Record<string, LogLevels>;
|
|
120
|
+
[x: string]: unknown;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type LintRule = Rule;
|
|
124
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export {yfm001} from './yfm001';
|
|
2
|
+
export {yfm002} from './yfm002';
|
|
3
|
+
export {yfm003} from './yfm003';
|
|
4
|
+
export {yfm004} from './yfm004';
|
|
5
|
+
export {yfm005} from './yfm005';
|
|
6
|
+
export {yfm006} from './yfm006';
|
|
7
|
+
export {yfm007} from './yfm007';
|
|
8
|
+
export {yfm008} from './yfm008';
|
|
9
|
+
export {yfm009} from './yfm009';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// @ts-expect-error
|
|
2
|
+
import {addErrorDetailIf, filterTokens, forEachInlineCodeSpan} from 'markdownlint-rule-helpers';
|
|
3
|
+
|
|
4
|
+
import {MarkdownItToken, Rule} from 'markdownlint';
|
|
5
|
+
|
|
6
|
+
export const yfm001: Rule = {
|
|
7
|
+
names: ['YFM001', 'inline-code-length'],
|
|
8
|
+
description: 'Inline code length',
|
|
9
|
+
tags: ['line_length'],
|
|
10
|
+
function: function YFM001(params, onError) {
|
|
11
|
+
const {config} = params;
|
|
12
|
+
const maxLength = Number(config.maximum || 100);
|
|
13
|
+
|
|
14
|
+
filterTokens(params, 'inline', (token: MarkdownItToken) => {
|
|
15
|
+
if (!token.children?.some((child) => child.type === 'code_inline') || !token.map) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const tokenLines = params.lines.slice(token.map[0], token.map[1]);
|
|
20
|
+
forEachInlineCodeSpan(tokenLines.join('\n'), (code: string, currentLine: number) => {
|
|
21
|
+
if (code.length <= maxLength) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
addErrorDetailIf(
|
|
26
|
+
onError,
|
|
27
|
+
token.lineNumber + currentLine,
|
|
28
|
+
maxLength,
|
|
29
|
+
code.length,
|
|
30
|
+
null,
|
|
31
|
+
code,
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {Rule} from 'markdownlint';
|
|
2
|
+
|
|
3
|
+
export const yfm002: Rule = {
|
|
4
|
+
names: ['YFM002', 'no-header-found-for-link'],
|
|
5
|
+
description: 'No header found in the file for the link text',
|
|
6
|
+
tags: ['links'],
|
|
7
|
+
function: function YFM002(params, onError) {
|
|
8
|
+
const {config} = params;
|
|
9
|
+
if (!config) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
params.tokens
|
|
14
|
+
.filter((token) => {
|
|
15
|
+
return token.type === 'inline';
|
|
16
|
+
})
|
|
17
|
+
.forEach((inline) => {
|
|
18
|
+
inline.children
|
|
19
|
+
?.filter((child) => {
|
|
20
|
+
return child.type === 'link_open';
|
|
21
|
+
})
|
|
22
|
+
.forEach((link) => {
|
|
23
|
+
// @ts-expect-error bad markdownlint typings
|
|
24
|
+
if (link.attrGet('YFM002')) {
|
|
25
|
+
onError({
|
|
26
|
+
lineNumber: link.lineNumber,
|
|
27
|
+
context: link.line,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {Rule} from 'markdownlint';
|
|
2
|
+
|
|
3
|
+
export const yfm003: Rule = {
|
|
4
|
+
names: ['YFM003', 'unreachable-link'],
|
|
5
|
+
description: 'Link is unreachable',
|
|
6
|
+
tags: ['links'],
|
|
7
|
+
function: function YFM003(params, onError) {
|
|
8
|
+
const {config} = params;
|
|
9
|
+
if (!config) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
params.tokens
|
|
14
|
+
.filter((token) => {
|
|
15
|
+
return token.type === 'inline';
|
|
16
|
+
})
|
|
17
|
+
.forEach((inline) => {
|
|
18
|
+
inline.children
|
|
19
|
+
?.filter((child) => {
|
|
20
|
+
return child.type === 'link_open';
|
|
21
|
+
})
|
|
22
|
+
.forEach((link) => {
|
|
23
|
+
// @ts-expect-error bad markdownlint typings
|
|
24
|
+
if (link.attrGet('YFM003')) {
|
|
25
|
+
onError({
|
|
26
|
+
lineNumber: link.lineNumber,
|
|
27
|
+
context: link.line,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {Rule} from 'markdownlint';
|
|
2
|
+
|
|
3
|
+
export const yfm004: Rule = {
|
|
4
|
+
names: ['YFM004', 'table-not-closed'],
|
|
5
|
+
description: 'Table not closed',
|
|
6
|
+
tags: ['table'],
|
|
7
|
+
function: function YFM004(params, onError) {
|
|
8
|
+
const {config} = params;
|
|
9
|
+
if (!config) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
params.tokens
|
|
14
|
+
.filter((token) => {
|
|
15
|
+
return token.type === '__yfm_lint';
|
|
16
|
+
})
|
|
17
|
+
.forEach((table) => {
|
|
18
|
+
// @ts-expect-error bad markdownlint typings
|
|
19
|
+
if (table.attrGet('YFM004')) {
|
|
20
|
+
onError({
|
|
21
|
+
lineNumber: table.lineNumber,
|
|
22
|
+
context: table.line,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {Rule} from 'markdownlint';
|
|
2
|
+
|
|
3
|
+
export const yfm005: Rule = {
|
|
4
|
+
names: ['YFM005', 'tab-list-not-closed'],
|
|
5
|
+
description: 'Tab list not closed',
|
|
6
|
+
tags: ['tab'],
|
|
7
|
+
function: function YFM005(params, onError) {
|
|
8
|
+
const {config} = params;
|
|
9
|
+
if (!config) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
params.tokens
|
|
14
|
+
.filter((token) => {
|
|
15
|
+
return token.type === 'paragraph_open';
|
|
16
|
+
})
|
|
17
|
+
.forEach((table) => {
|
|
18
|
+
// @ts-expect-error bad markdownlint typings
|
|
19
|
+
if (table.attrGet('YFM005')) {
|
|
20
|
+
onError({
|
|
21
|
+
lineNumber: table.lineNumber,
|
|
22
|
+
context: table.line,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import {Rule} from 'markdownlint';
|
|
2
|
+
|
|
3
|
+
export const yfm006: Rule = {
|
|
4
|
+
names: ['YFM006', 'term-definition-duplicated'],
|
|
5
|
+
description: 'Term definition duplicated',
|
|
6
|
+
tags: ['term'],
|
|
7
|
+
function: function YFM006(params, onError) {
|
|
8
|
+
const {config} = params;
|
|
9
|
+
if (!config) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
params.tokens
|
|
13
|
+
.filter((token) => {
|
|
14
|
+
return token.type === '__yfm_lint';
|
|
15
|
+
})
|
|
16
|
+
.forEach((term) => {
|
|
17
|
+
// @ts-expect-error bad markdownlint typings
|
|
18
|
+
if (term.attrGet('YFM006')) {
|
|
19
|
+
onError({
|
|
20
|
+
lineNumber: term.lineNumber,
|
|
21
|
+
context: term.line,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {Rule} from 'markdownlint';
|
|
2
|
+
|
|
3
|
+
export const yfm007: Rule = {
|
|
4
|
+
names: ['YFM007', 'term-used-without-definition'],
|
|
5
|
+
description: 'Term used without definition',
|
|
6
|
+
tags: ['term'],
|
|
7
|
+
function: function YFM007(params, onError) {
|
|
8
|
+
const {config} = params;
|
|
9
|
+
if (!config) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
params.tokens.forEach((el) =>
|
|
13
|
+
el.children
|
|
14
|
+
?.filter((token) => {
|
|
15
|
+
return token.type === '__yfm_lint';
|
|
16
|
+
})
|
|
17
|
+
.forEach((term) => {
|
|
18
|
+
// @ts-expect-error bad markdownlint typings
|
|
19
|
+
if (term.attrGet('YFM007')) {
|
|
20
|
+
onError({
|
|
21
|
+
lineNumber: term.lineNumber,
|
|
22
|
+
context: term.line,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}),
|
|
26
|
+
);
|
|
27
|
+
},
|
|
28
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import {Rule} from 'markdownlint';
|
|
2
|
+
|
|
3
|
+
export const yfm008: Rule = {
|
|
4
|
+
names: ['YFM008', 'term-inside-definition-not-allowed'],
|
|
5
|
+
description: 'Term inside definition not allowed',
|
|
6
|
+
tags: ['term'],
|
|
7
|
+
function: function YFM008(params, onError) {
|
|
8
|
+
const {config} = params;
|
|
9
|
+
if (!config) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
params.tokens
|
|
13
|
+
.filter((token) => {
|
|
14
|
+
return token.type === '__yfm_lint';
|
|
15
|
+
})
|
|
16
|
+
.forEach((term) => {
|
|
17
|
+
// @ts-expect-error bad markdownlint typings
|
|
18
|
+
if (term.attrGet('YFM008')) {
|
|
19
|
+
onError({
|
|
20
|
+
lineNumber: term.lineNumber,
|
|
21
|
+
context: term.line,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
};
|