@dougis/markdown-lint-mcp 1.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.md +80 -0
- package/CONTRIBUTING.md +474 -0
- package/LICENSE +21 -0
- package/README.md +240 -0
- package/USAGE.md +40 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/index.d.ts +22 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +144 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/md001.d.ts +25 -0
- package/dist/rules/md001.d.ts.map +1 -0
- package/dist/rules/md001.js +79 -0
- package/dist/rules/md001.js.map +1 -0
- package/dist/rules/md003.d.ts +41 -0
- package/dist/rules/md003.d.ts.map +1 -0
- package/dist/rules/md003.js +130 -0
- package/dist/rules/md003.js.map +1 -0
- package/dist/rules/md004.d.ts +28 -0
- package/dist/rules/md004.d.ts.map +1 -0
- package/dist/rules/md004.js +79 -0
- package/dist/rules/md004.js.map +1 -0
- package/dist/rules/md005.d.ts +21 -0
- package/dist/rules/md005.d.ts.map +1 -0
- package/dist/rules/md005.js +88 -0
- package/dist/rules/md005.js.map +1 -0
- package/dist/rules/md007.d.ts +21 -0
- package/dist/rules/md007.d.ts.map +1 -0
- package/dist/rules/md007.js +66 -0
- package/dist/rules/md007.js.map +1 -0
- package/dist/rules/md009.d.ts +35 -0
- package/dist/rules/md009.d.ts.map +1 -0
- package/dist/rules/md009.js +122 -0
- package/dist/rules/md009.js.map +1 -0
- package/dist/rules/md010.d.ts +34 -0
- package/dist/rules/md010.d.ts.map +1 -0
- package/dist/rules/md010.js +75 -0
- package/dist/rules/md010.js.map +1 -0
- package/dist/rules/md011.d.ts +30 -0
- package/dist/rules/md011.d.ts.map +1 -0
- package/dist/rules/md011.js +123 -0
- package/dist/rules/md011.js.map +1 -0
- package/dist/rules/md012.d.ts +33 -0
- package/dist/rules/md012.d.ts.map +1 -0
- package/dist/rules/md012.js +125 -0
- package/dist/rules/md012.js.map +1 -0
- package/dist/rules/md013.d.ts +26 -0
- package/dist/rules/md013.d.ts.map +1 -0
- package/dist/rules/md013.js +32 -0
- package/dist/rules/md013.js.map +1 -0
- package/dist/rules/md014.d.ts +29 -0
- package/dist/rules/md014.d.ts.map +1 -0
- package/dist/rules/md014.js +176 -0
- package/dist/rules/md014.js.map +1 -0
- package/dist/rules/md018.d.ts +22 -0
- package/dist/rules/md018.d.ts.map +1 -0
- package/dist/rules/md018.js +27 -0
- package/dist/rules/md018.js.map +1 -0
- package/dist/rules/md019.d.ts +22 -0
- package/dist/rules/md019.d.ts.map +1 -0
- package/dist/rules/md019.js +27 -0
- package/dist/rules/md019.js.map +1 -0
- package/dist/rules/md020.d.ts +22 -0
- package/dist/rules/md020.d.ts.map +1 -0
- package/dist/rules/md020.js +27 -0
- package/dist/rules/md020.js.map +1 -0
- package/dist/rules/md021.d.ts +22 -0
- package/dist/rules/md021.d.ts.map +1 -0
- package/dist/rules/md021.js +27 -0
- package/dist/rules/md021.js.map +1 -0
- package/dist/rules/md022.d.ts +21 -0
- package/dist/rules/md022.d.ts.map +1 -0
- package/dist/rules/md022.js +43 -0
- package/dist/rules/md022.js.map +1 -0
- package/dist/rules/md023.d.ts +21 -0
- package/dist/rules/md023.d.ts.map +1 -0
- package/dist/rules/md023.js +34 -0
- package/dist/rules/md023.js.map +1 -0
- package/dist/rules/md024.d.ts +30 -0
- package/dist/rules/md024.d.ts.map +1 -0
- package/dist/rules/md024.js +123 -0
- package/dist/rules/md024.js.map +1 -0
- package/dist/rules/md025.d.ts +34 -0
- package/dist/rules/md025.d.ts.map +1 -0
- package/dist/rules/md025.js +134 -0
- package/dist/rules/md025.js.map +1 -0
- package/dist/rules/md026.d.ts +21 -0
- package/dist/rules/md026.d.ts.map +1 -0
- package/dist/rules/md026.js +31 -0
- package/dist/rules/md026.js.map +1 -0
- package/dist/rules/md027.d.ts +22 -0
- package/dist/rules/md027.d.ts.map +1 -0
- package/dist/rules/md027.js +27 -0
- package/dist/rules/md027.js.map +1 -0
- package/dist/rules/md028.d.ts +37 -0
- package/dist/rules/md028.d.ts.map +1 -0
- package/dist/rules/md028.js +84 -0
- package/dist/rules/md028.js.map +1 -0
- package/dist/rules/md029.d.ts +30 -0
- package/dist/rules/md029.d.ts.map +1 -0
- package/dist/rules/md029.js +36 -0
- package/dist/rules/md029.js.map +1 -0
- package/dist/rules/md030.d.ts +28 -0
- package/dist/rules/md030.d.ts.map +1 -0
- package/dist/rules/md030.js +76 -0
- package/dist/rules/md030.js.map +1 -0
- package/dist/rules/md031.d.ts +22 -0
- package/dist/rules/md031.d.ts.map +1 -0
- package/dist/rules/md031.js +55 -0
- package/dist/rules/md031.js.map +1 -0
- package/dist/rules/md032.d.ts +21 -0
- package/dist/rules/md032.d.ts.map +1 -0
- package/dist/rules/md032.js +69 -0
- package/dist/rules/md032.js.map +1 -0
- package/dist/rules/md033.d.ts +28 -0
- package/dist/rules/md033.d.ts.map +1 -0
- package/dist/rules/md033.js +34 -0
- package/dist/rules/md033.js.map +1 -0
- package/dist/rules/md034.d.ts +28 -0
- package/dist/rules/md034.d.ts.map +1 -0
- package/dist/rules/md034.js +100 -0
- package/dist/rules/md034.js.map +1 -0
- package/dist/rules/md035.d.ts +23 -0
- package/dist/rules/md035.d.ts.map +1 -0
- package/dist/rules/md035.js +52 -0
- package/dist/rules/md035.js.map +1 -0
- package/dist/rules/md036.d.ts +34 -0
- package/dist/rules/md036.d.ts.map +1 -0
- package/dist/rules/md036.js +112 -0
- package/dist/rules/md036.js.map +1 -0
- package/dist/rules/md037.d.ts +28 -0
- package/dist/rules/md037.d.ts.map +1 -0
- package/dist/rules/md037.js +122 -0
- package/dist/rules/md037.js.map +1 -0
- package/dist/rules/md038.d.ts +28 -0
- package/dist/rules/md038.d.ts.map +1 -0
- package/dist/rules/md038.js +62 -0
- package/dist/rules/md038.js.map +1 -0
- package/dist/rules/md039.d.ts +21 -0
- package/dist/rules/md039.d.ts.map +1 -0
- package/dist/rules/md039.js +34 -0
- package/dist/rules/md039.js.map +1 -0
- package/dist/rules/md040.d.ts +21 -0
- package/dist/rules/md040.d.ts.map +1 -0
- package/dist/rules/md040.js +46 -0
- package/dist/rules/md040.js.map +1 -0
- package/dist/rules/md041.d.ts +33 -0
- package/dist/rules/md041.d.ts.map +1 -0
- package/dist/rules/md041.js +92 -0
- package/dist/rules/md041.js.map +1 -0
- package/dist/rules/md042.d.ts +22 -0
- package/dist/rules/md042.d.ts.map +1 -0
- package/dist/rules/md042.js +50 -0
- package/dist/rules/md042.js.map +1 -0
- package/dist/rules/md043.d.ts +39 -0
- package/dist/rules/md043.d.ts.map +1 -0
- package/dist/rules/md043.js +116 -0
- package/dist/rules/md043.js.map +1 -0
- package/dist/rules/md044.d.ts +40 -0
- package/dist/rules/md044.d.ts.map +1 -0
- package/dist/rules/md044.js +167 -0
- package/dist/rules/md044.js.map +1 -0
- package/dist/rules/md045.d.ts +22 -0
- package/dist/rules/md045.d.ts.map +1 -0
- package/dist/rules/md045.js +57 -0
- package/dist/rules/md045.js.map +1 -0
- package/dist/rules/md046.d.ts +23 -0
- package/dist/rules/md046.d.ts.map +1 -0
- package/dist/rules/md046.js +174 -0
- package/dist/rules/md046.js.map +1 -0
- package/dist/rules/md047.d.ts +22 -0
- package/dist/rules/md047.d.ts.map +1 -0
- package/dist/rules/md047.js +35 -0
- package/dist/rules/md047.js.map +1 -0
- package/dist/rules/md048.d.ts +22 -0
- package/dist/rules/md048.d.ts.map +1 -0
- package/dist/rules/md048.js +80 -0
- package/dist/rules/md048.js.map +1 -0
- package/dist/rules/md049.d.ts +33 -0
- package/dist/rules/md049.d.ts.map +1 -0
- package/dist/rules/md049.js +189 -0
- package/dist/rules/md049.js.map +1 -0
- package/dist/rules/md050.d.ts +22 -0
- package/dist/rules/md050.d.ts.map +1 -0
- package/dist/rules/md050.js +32 -0
- package/dist/rules/md050.js.map +1 -0
- package/dist/rules/md051.d.ts +23 -0
- package/dist/rules/md051.d.ts.map +1 -0
- package/dist/rules/md051.js +63 -0
- package/dist/rules/md051.js.map +1 -0
- package/dist/rules/md052.d.ts +21 -0
- package/dist/rules/md052.d.ts.map +1 -0
- package/dist/rules/md052.js +71 -0
- package/dist/rules/md052.js.map +1 -0
- package/dist/rules/md053.d.ts +21 -0
- package/dist/rules/md053.d.ts.map +1 -0
- package/dist/rules/md053.js +95 -0
- package/dist/rules/md053.js.map +1 -0
- package/dist/rules/md054.d.ts +21 -0
- package/dist/rules/md054.d.ts.map +1 -0
- package/dist/rules/md054.js +87 -0
- package/dist/rules/md054.js.map +1 -0
- package/dist/rules/md055.d.ts +22 -0
- package/dist/rules/md055.d.ts.map +1 -0
- package/dist/rules/md055.js +157 -0
- package/dist/rules/md055.js.map +1 -0
- package/dist/rules/md056.d.ts +21 -0
- package/dist/rules/md056.d.ts.map +1 -0
- package/dist/rules/md056.js +154 -0
- package/dist/rules/md056.js.map +1 -0
- package/dist/rules/md058.d.ts +27 -0
- package/dist/rules/md058.d.ts.map +1 -0
- package/dist/rules/md058.js +71 -0
- package/dist/rules/md058.js.map +1 -0
- package/dist/rules/md059.d.ts +22 -0
- package/dist/rules/md059.d.ts.map +1 -0
- package/dist/rules/md059.js +161 -0
- package/dist/rules/md059.js.map +1 -0
- package/dist/rules/rule-interface.d.ts +51 -0
- package/dist/rules/rule-interface.d.ts.map +1 -0
- package/dist/rules/rule-interface.js +2 -0
- package/dist/rules/rule-interface.js.map +1 -0
- package/dist/server.d.ts +59 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +419 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +74 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file.d.ts +39 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +124 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/logger.d.ts +61 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +85 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/safe-match.d.ts +4 -0
- package/dist/utils/safe-match.d.ts.map +1 -0
- package/dist/utils/safe-match.js +51 -0
- package/dist/utils/safe-match.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MD003: Heading style
|
|
3
|
+
*
|
|
4
|
+
* This rule enforces a consistent heading style, which could be:
|
|
5
|
+
* - atx: # Heading
|
|
6
|
+
* - atx_closed: # Heading #
|
|
7
|
+
* - setext: Heading
|
|
8
|
+
* =======
|
|
9
|
+
*
|
|
10
|
+
* The default is atx, but this can be configured in .markdownlint.json.
|
|
11
|
+
*/
|
|
12
|
+
export const name = 'MD003';
|
|
13
|
+
export const description = 'Heading style';
|
|
14
|
+
/**
|
|
15
|
+
* Enum for heading styles
|
|
16
|
+
*/
|
|
17
|
+
var HeadingStyle;
|
|
18
|
+
(function (HeadingStyle) {
|
|
19
|
+
HeadingStyle["ATX"] = "atx";
|
|
20
|
+
HeadingStyle["ATX_CLOSED"] = "atx_closed";
|
|
21
|
+
HeadingStyle["SETEXT"] = "setext";
|
|
22
|
+
})(HeadingStyle || (HeadingStyle = {}));
|
|
23
|
+
/**
|
|
24
|
+
* Detect if a line is a heading and what style it uses
|
|
25
|
+
* @param line The line to check
|
|
26
|
+
* @returns An object with the heading level and style, or null if not a heading
|
|
27
|
+
*/
|
|
28
|
+
function detectHeadingStyle(line, nextLine) {
|
|
29
|
+
// ATX style: # Heading
|
|
30
|
+
const atxMatch = line.match(/^(#{1,6})\s+(.+?)(?:\s+#*)?$/);
|
|
31
|
+
if (atxMatch) {
|
|
32
|
+
// Check if it's closed style: # Heading #
|
|
33
|
+
const isClosed = line.trim().endsWith('#');
|
|
34
|
+
return {
|
|
35
|
+
level: atxMatch[1].length,
|
|
36
|
+
style: isClosed ? HeadingStyle.ATX_CLOSED : HeadingStyle.ATX,
|
|
37
|
+
content: atxMatch[2].trim(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Setext style: Heading
|
|
41
|
+
// =======
|
|
42
|
+
if (nextLine && /^[=-]+$/.test(nextLine.trim())) {
|
|
43
|
+
return {
|
|
44
|
+
level: nextLine.trim()[0] === '=' ? 1 : 2,
|
|
45
|
+
style: HeadingStyle.SETEXT,
|
|
46
|
+
content: line.trim(),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convert a heading to the specified style
|
|
53
|
+
* @param headingInfo The heading information (level, style, content)
|
|
54
|
+
* @param targetStyle The style to convert to
|
|
55
|
+
* @returns An array of lines for the new heading (could be 1 or 2 lines)
|
|
56
|
+
*/
|
|
57
|
+
function convertHeadingStyle(headingInfo, targetStyle) {
|
|
58
|
+
const { level, content } = headingInfo;
|
|
59
|
+
// Cannot convert to setext if level > 2
|
|
60
|
+
if (targetStyle === HeadingStyle.SETEXT && level > 2) {
|
|
61
|
+
targetStyle = HeadingStyle.ATX;
|
|
62
|
+
}
|
|
63
|
+
switch (targetStyle) {
|
|
64
|
+
case HeadingStyle.ATX:
|
|
65
|
+
return [`${'#'.repeat(level)} ${content}`];
|
|
66
|
+
case HeadingStyle.ATX_CLOSED:
|
|
67
|
+
return [`${'#'.repeat(level)} ${content} ${'#'.repeat(level)}`];
|
|
68
|
+
case HeadingStyle.SETEXT:
|
|
69
|
+
const underline = level === 1 ? '='.repeat(content.length) : '-'.repeat(content.length);
|
|
70
|
+
return [content, underline];
|
|
71
|
+
default:
|
|
72
|
+
return [`${'#'.repeat(level)} ${content}`]; // Default to ATX
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Fix headings to use a consistent style
|
|
77
|
+
* @param lines Array of string lines to fix
|
|
78
|
+
* @param config Optional configuration object
|
|
79
|
+
* @returns Fixed lines array with consistent heading styles
|
|
80
|
+
*/
|
|
81
|
+
export function fix(lines, config) {
|
|
82
|
+
if (lines.length === 0)
|
|
83
|
+
return lines;
|
|
84
|
+
// Default to ATX style if not configured
|
|
85
|
+
const targetStyle = config?.style || HeadingStyle.ATX;
|
|
86
|
+
const result = [];
|
|
87
|
+
for (let i = 0; i < lines.length; i++) {
|
|
88
|
+
const line = lines[i];
|
|
89
|
+
const nextLine = i < lines.length - 1 ? lines[i + 1] : undefined;
|
|
90
|
+
// Check if this line is a heading
|
|
91
|
+
const headingInfo = detectHeadingStyle(line, nextLine);
|
|
92
|
+
if (headingInfo) {
|
|
93
|
+
// We found a heading, let's check if it needs to be converted
|
|
94
|
+
if (headingInfo.style !== targetStyle) {
|
|
95
|
+
// Convert to the target style
|
|
96
|
+
const newHeadingLines = convertHeadingStyle(headingInfo, targetStyle);
|
|
97
|
+
// Add the new heading lines
|
|
98
|
+
result.push(...newHeadingLines);
|
|
99
|
+
// If we processed a setext heading, skip the next line (the underline)
|
|
100
|
+
if (headingInfo.style === HeadingStyle.SETEXT) {
|
|
101
|
+
i++;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Heading is already in the correct style
|
|
106
|
+
result.push(line);
|
|
107
|
+
// If it's a setext heading, also add the underline
|
|
108
|
+
if (headingInfo.style === HeadingStyle.SETEXT) {
|
|
109
|
+
result.push(nextLine);
|
|
110
|
+
i++;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Not a heading, just add the line
|
|
116
|
+
result.push(line);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Rule implementation for MD003
|
|
123
|
+
*/
|
|
124
|
+
export const rule = {
|
|
125
|
+
name,
|
|
126
|
+
description,
|
|
127
|
+
fix,
|
|
128
|
+
};
|
|
129
|
+
export default rule;
|
|
130
|
+
//# sourceMappingURL=md003.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md003.js","sourceRoot":"","sources":["../../src/rules/md003.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Rule, RuleViolation } from './rule-interface';
|
|
2
|
+
/**
|
|
3
|
+
* MD004: Unordered list style
|
|
4
|
+
*
|
|
5
|
+
* This rule is triggered when the list style of unordered lists is inconsistent.
|
|
6
|
+
* The rule ensures consistent use of bullet markers (*, +, -) in unordered lists.
|
|
7
|
+
* By default, this rule enforces a consistent style, using the first style detected.
|
|
8
|
+
*/
|
|
9
|
+
export declare const name = "MD004";
|
|
10
|
+
export declare const description = "Unordered list style";
|
|
11
|
+
/**
|
|
12
|
+
* Fix unordered lists by ensuring consistent bullet marker style
|
|
13
|
+
* @param lines Array of string lines to fix
|
|
14
|
+
* @returns Fixed lines array with consistent bullet markers
|
|
15
|
+
*/
|
|
16
|
+
export declare function fix(lines: string[]): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Validate lines for inconsistent unordered list styles
|
|
19
|
+
* @param lines Array of string lines to validate
|
|
20
|
+
* @returns Array of rule violations
|
|
21
|
+
*/
|
|
22
|
+
export declare function validate(lines: string[]): RuleViolation[];
|
|
23
|
+
/**
|
|
24
|
+
* Rule implementation for MD004
|
|
25
|
+
*/
|
|
26
|
+
export declare const rule: Rule;
|
|
27
|
+
export default rule;
|
|
28
|
+
//# sourceMappingURL=md004.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md004.d.ts","sourceRoot":"","sources":["../../src/rules/md004.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,UAAU,CAAC;AAC5B,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA4B7C;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAwBzD;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,IAKlB,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MD004: Unordered list style
|
|
3
|
+
*
|
|
4
|
+
* This rule is triggered when the list style of unordered lists is inconsistent.
|
|
5
|
+
* The rule ensures consistent use of bullet markers (*, +, -) in unordered lists.
|
|
6
|
+
* By default, this rule enforces a consistent style, using the first style detected.
|
|
7
|
+
*/
|
|
8
|
+
export const name = 'MD004';
|
|
9
|
+
export const description = 'Unordered list style';
|
|
10
|
+
/**
|
|
11
|
+
* Fix unordered lists by ensuring consistent bullet marker style
|
|
12
|
+
* @param lines Array of string lines to fix
|
|
13
|
+
* @returns Fixed lines array with consistent bullet markers
|
|
14
|
+
*/
|
|
15
|
+
export function fix(lines) {
|
|
16
|
+
// First, detect what style is used in the first list
|
|
17
|
+
let firstBulletStyle = null;
|
|
18
|
+
// Detect the first bullet style used
|
|
19
|
+
for (const line of lines) {
|
|
20
|
+
const match = line.match(/^\s*([-+*])\s+/);
|
|
21
|
+
if (match) {
|
|
22
|
+
firstBulletStyle = match[1];
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// If no bullet style was found, return the lines unchanged
|
|
27
|
+
if (!firstBulletStyle) {
|
|
28
|
+
return lines;
|
|
29
|
+
}
|
|
30
|
+
// Now apply the consistent style to all list items
|
|
31
|
+
return lines.map(line => {
|
|
32
|
+
// Check if this line is a list item with a different bullet style
|
|
33
|
+
const match = line.match(/^(\s*)([-+*])(\s+.*)/);
|
|
34
|
+
if (match && match[2] !== firstBulletStyle) {
|
|
35
|
+
// Replace the bullet style while keeping indentation and content
|
|
36
|
+
return `${match[1]}${firstBulletStyle}${match[3]}`;
|
|
37
|
+
}
|
|
38
|
+
return line;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Validate lines for inconsistent unordered list styles
|
|
43
|
+
* @param lines Array of string lines to validate
|
|
44
|
+
* @returns Array of rule violations
|
|
45
|
+
*/
|
|
46
|
+
export function validate(lines) {
|
|
47
|
+
const violations = [];
|
|
48
|
+
let firstBulletStyle = null;
|
|
49
|
+
lines.forEach((line, index) => {
|
|
50
|
+
const match = line.match(/^\s*([-+*])\s+/);
|
|
51
|
+
if (match) {
|
|
52
|
+
const bulletStyle = match[1];
|
|
53
|
+
if (firstBulletStyle === null) {
|
|
54
|
+
// Set the first bullet style as the expected style
|
|
55
|
+
firstBulletStyle = bulletStyle;
|
|
56
|
+
}
|
|
57
|
+
else if (bulletStyle !== firstBulletStyle) {
|
|
58
|
+
// Found inconsistent bullet style
|
|
59
|
+
violations.push({
|
|
60
|
+
lineNumber: index + 1,
|
|
61
|
+
details: `Expected '${firstBulletStyle}' for unordered list item, found '${bulletStyle}'`,
|
|
62
|
+
range: [match.index || 0, match[0].length],
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return violations;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Rule implementation for MD004
|
|
71
|
+
*/
|
|
72
|
+
export const rule = {
|
|
73
|
+
name,
|
|
74
|
+
description,
|
|
75
|
+
validate,
|
|
76
|
+
fix,
|
|
77
|
+
};
|
|
78
|
+
export default rule;
|
|
79
|
+
//# sourceMappingURL=md004.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md004.js","sourceRoot":"","sources":["../../src/rules/md004.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC;AAC5B,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,qDAAqD;IACrD,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAE3C,qCAAqC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM;QACR,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mDAAmD;IACnD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACtB,kEAAkE;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjD,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,EAAE,CAAC;YAC3C,iEAAiE;YACjE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAe;IACtC,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAE3C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE7B,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC9B,mDAAmD;gBACnD,gBAAgB,GAAG,WAAW,CAAC;YACjC,CAAC;iBAAM,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;gBAC5C,kCAAkC;gBAClC,UAAU,CAAC,IAAI,CAAC;oBACd,UAAU,EAAE,KAAK,GAAG,CAAC;oBACrB,OAAO,EAAE,aAAa,gBAAgB,qCAAqC,WAAW,GAAG;oBACzF,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;iBAC3C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAS;IACxB,IAAI;IACJ,WAAW;IACX,QAAQ;IACR,GAAG;CACJ,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Rule } from './rule-interface';
|
|
2
|
+
/**
|
|
3
|
+
* MD005: Inconsistent indentation for list items at the same level
|
|
4
|
+
*
|
|
5
|
+
* This rule is triggered when list items at the same level have different indentation.
|
|
6
|
+
* List items should be consistently indented for readability.
|
|
7
|
+
*/
|
|
8
|
+
export declare const name = "MD005";
|
|
9
|
+
export declare const description = "Inconsistent indentation for list items at the same level";
|
|
10
|
+
/**
|
|
11
|
+
* Fix inconsistently indented list items by standardizing indentation
|
|
12
|
+
* @param lines Array of string lines to fix
|
|
13
|
+
* @returns Fixed lines array with consistent list indentation
|
|
14
|
+
*/
|
|
15
|
+
export declare function fix(lines: string[]): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Rule implementation for MD005
|
|
18
|
+
*/
|
|
19
|
+
export declare const rule: Rule;
|
|
20
|
+
export default rule;
|
|
21
|
+
//# sourceMappingURL=md005.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md005.d.ts","sourceRoot":"","sources":["../../src/rules/md005.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC;;;;;GAKG;AACH,eAAO,MAAM,IAAI,UAAU,CAAC;AAC5B,eAAO,MAAM,WAAW,8DAA8D,CAAC;AAEvF;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAuE7C;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,IAIlB,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MD005: Inconsistent indentation for list items at the same level
|
|
3
|
+
*
|
|
4
|
+
* This rule is triggered when list items at the same level have different indentation.
|
|
5
|
+
* List items should be consistently indented for readability.
|
|
6
|
+
*/
|
|
7
|
+
export const name = 'MD005';
|
|
8
|
+
export const description = 'Inconsistent indentation for list items at the same level';
|
|
9
|
+
/**
|
|
10
|
+
* Fix inconsistently indented list items by standardizing indentation
|
|
11
|
+
* @param lines Array of string lines to fix
|
|
12
|
+
* @returns Fixed lines array with consistent list indentation
|
|
13
|
+
*/
|
|
14
|
+
export function fix(lines) {
|
|
15
|
+
const listItemRegex = /^(\s*)([*+-]|\d+[.)])\s+(.*)$/;
|
|
16
|
+
// Maps indentation level (number of parent lists) to space count
|
|
17
|
+
const levelToSpaces = {};
|
|
18
|
+
// Track current list level - increments on nested lists, decrements when nesting ends
|
|
19
|
+
let currentLevel = 0;
|
|
20
|
+
// First pass: detect the correct indentation for each level
|
|
21
|
+
lines.forEach(line => {
|
|
22
|
+
const match = line.match(listItemRegex);
|
|
23
|
+
if (!match)
|
|
24
|
+
return;
|
|
25
|
+
const indentation = match[1].length;
|
|
26
|
+
// If this is the first item at this level or has less indentation than what we've seen
|
|
27
|
+
if (!(currentLevel in levelToSpaces) || indentation < levelToSpaces[currentLevel]) {
|
|
28
|
+
levelToSpaces[currentLevel] = indentation;
|
|
29
|
+
}
|
|
30
|
+
// Check for new list level by looking at indentation
|
|
31
|
+
if (currentLevel === 0 || indentation > levelToSpaces[currentLevel - 1]) {
|
|
32
|
+
currentLevel++;
|
|
33
|
+
}
|
|
34
|
+
else if (currentLevel > 0 && indentation <= levelToSpaces[currentLevel - 1]) {
|
|
35
|
+
// Find the right level based on indentation
|
|
36
|
+
while (currentLevel > 0 && indentation <= levelToSpaces[currentLevel - 1]) {
|
|
37
|
+
currentLevel--;
|
|
38
|
+
}
|
|
39
|
+
// If still a list item, we're at the correct level
|
|
40
|
+
if (indentation > 0) {
|
|
41
|
+
currentLevel++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
// Reset for second pass
|
|
46
|
+
currentLevel = 0;
|
|
47
|
+
// Second pass: fix inconsistent indentation
|
|
48
|
+
return lines.map(line => {
|
|
49
|
+
const match = line.match(listItemRegex);
|
|
50
|
+
if (!match) {
|
|
51
|
+
// Not a list item, but if blank line or non-list content, may affect list nesting
|
|
52
|
+
if (line.trim() === '' || !line.trim().startsWith(' ')) {
|
|
53
|
+
// Reset level when we encounter non-list content
|
|
54
|
+
currentLevel = 0;
|
|
55
|
+
}
|
|
56
|
+
return line;
|
|
57
|
+
}
|
|
58
|
+
const indentation = match[1].length;
|
|
59
|
+
const marker = match[2];
|
|
60
|
+
const content = match[3];
|
|
61
|
+
// Update current level based on indentation
|
|
62
|
+
if (currentLevel === 0 || indentation > levelToSpaces[currentLevel - 1]) {
|
|
63
|
+
currentLevel++;
|
|
64
|
+
}
|
|
65
|
+
else if (currentLevel > 0 && indentation <= levelToSpaces[currentLevel - 1]) {
|
|
66
|
+
while (currentLevel > 0 && indentation <= levelToSpaces[currentLevel - 1]) {
|
|
67
|
+
currentLevel--;
|
|
68
|
+
}
|
|
69
|
+
if (indentation > 0) {
|
|
70
|
+
currentLevel++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Calculate correct indentation for this level
|
|
74
|
+
const correctIndentation = ' '.repeat(levelToSpaces[currentLevel - 1] || 0);
|
|
75
|
+
// Return fixed line with correct indentation
|
|
76
|
+
return `${correctIndentation}${marker} ${content}`;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Rule implementation for MD005
|
|
81
|
+
*/
|
|
82
|
+
export const rule = {
|
|
83
|
+
name,
|
|
84
|
+
description,
|
|
85
|
+
fix,
|
|
86
|
+
};
|
|
87
|
+
export default rule;
|
|
88
|
+
//# sourceMappingURL=md005.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md005.js","sourceRoot":"","sources":["../../src/rules/md005.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Rule } from './rule-interface';
|
|
2
|
+
/**
|
|
3
|
+
* MD007: Unordered list indentation
|
|
4
|
+
*
|
|
5
|
+
* This rule is triggered when unordered list items are not properly indented.
|
|
6
|
+
* By default, this rule enforces a 2-space indentation for nested lists.
|
|
7
|
+
*/
|
|
8
|
+
export declare const name = "MD007";
|
|
9
|
+
export declare const description = "Unordered list indentation";
|
|
10
|
+
/**
|
|
11
|
+
* Fix unordered list indentation by standardizing to 2 spaces per level
|
|
12
|
+
* @param lines Array of string lines to fix
|
|
13
|
+
* @returns Fixed lines array with proper list indentation
|
|
14
|
+
*/
|
|
15
|
+
export declare function fix(lines: string[]): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Rule implementation for MD007
|
|
18
|
+
*/
|
|
19
|
+
export declare const rule: Rule;
|
|
20
|
+
export default rule;
|
|
21
|
+
//# sourceMappingURL=md007.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md007.d.ts","sourceRoot":"","sources":["../../src/rules/md007.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC;;;;;GAKG;AACH,eAAO,MAAM,IAAI,UAAU,CAAC;AAC5B,eAAO,MAAM,WAAW,+BAA+B,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA8C7C;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,IAIlB,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MD007: Unordered list indentation
|
|
3
|
+
*
|
|
4
|
+
* This rule is triggered when unordered list items are not properly indented.
|
|
5
|
+
* By default, this rule enforces a 2-space indentation for nested lists.
|
|
6
|
+
*/
|
|
7
|
+
export const name = 'MD007';
|
|
8
|
+
export const description = 'Unordered list indentation';
|
|
9
|
+
/**
|
|
10
|
+
* Fix unordered list indentation by standardizing to 2 spaces per level
|
|
11
|
+
* @param lines Array of string lines to fix
|
|
12
|
+
* @returns Fixed lines array with proper list indentation
|
|
13
|
+
*/
|
|
14
|
+
export function fix(lines) {
|
|
15
|
+
const indentationAmount = 2; // Standard indentation (2 spaces)
|
|
16
|
+
const unorderedListItemRegex = /^(\s*)([*+-])\s+(.*)$/;
|
|
17
|
+
// Track list nesting levels
|
|
18
|
+
let nestingStack = [];
|
|
19
|
+
let currentLevel = 0;
|
|
20
|
+
return lines.map(line => {
|
|
21
|
+
const match = line.match(unorderedListItemRegex);
|
|
22
|
+
if (!match) {
|
|
23
|
+
// If we hit a non-list line, reset tracking
|
|
24
|
+
if (line.trim() === '' || !line.trim().startsWith(' ')) {
|
|
25
|
+
nestingStack.length = 0;
|
|
26
|
+
currentLevel = 0;
|
|
27
|
+
}
|
|
28
|
+
return line;
|
|
29
|
+
}
|
|
30
|
+
const indentation = match[1].length;
|
|
31
|
+
const marker = match[2];
|
|
32
|
+
const content = match[3];
|
|
33
|
+
// Determine nesting level based on indentation
|
|
34
|
+
if (indentation === 0) {
|
|
35
|
+
// Top-level list item
|
|
36
|
+
nestingStack = [];
|
|
37
|
+
currentLevel = 0;
|
|
38
|
+
}
|
|
39
|
+
else if (nestingStack.length === 0 || indentation > nestingStack[nestingStack.length - 1]) {
|
|
40
|
+
// New nested level
|
|
41
|
+
nestingStack.push(indentation);
|
|
42
|
+
currentLevel++;
|
|
43
|
+
}
|
|
44
|
+
else if (indentation < nestingStack[nestingStack.length - 1]) {
|
|
45
|
+
// Moving back up in nesting levels
|
|
46
|
+
while (nestingStack.length > 0 && indentation < nestingStack[nestingStack.length - 1]) {
|
|
47
|
+
nestingStack.pop();
|
|
48
|
+
currentLevel--;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Calculate correct indentation for this level
|
|
52
|
+
const correctIndentation = ' '.repeat(currentLevel * indentationAmount);
|
|
53
|
+
// Return fixed line with correct indentation
|
|
54
|
+
return `${correctIndentation}${marker} ${content}`;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Rule implementation for MD007
|
|
59
|
+
*/
|
|
60
|
+
export const rule = {
|
|
61
|
+
name,
|
|
62
|
+
description,
|
|
63
|
+
fix,
|
|
64
|
+
};
|
|
65
|
+
export default rule;
|
|
66
|
+
//# sourceMappingURL=md007.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md007.js","sourceRoot":"","sources":["../../src/rules/md007.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC;AAC5B,MAAM,CAAC,MAAM,WAAW,GAAG,4BAA4B,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC,kCAAkC;IAC/D,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;IAEvD,4BAA4B;IAC5B,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,4CAA4C;YAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;gBACxB,YAAY,GAAG,CAAC,CAAC;YACnB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzB,+CAA+C;QAC/C,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,sBAAsB;YACtB,YAAY,GAAG,EAAE,CAAC;YAClB,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5F,mBAAmB;YACnB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/B,YAAY,EAAE,CAAC;QACjB,CAAC;aAAM,IAAI,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YAC/D,mCAAmC;YACnC,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBACtF,YAAY,CAAC,GAAG,EAAE,CAAC;gBACnB,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,MAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,iBAAiB,CAAC,CAAC;QAExE,6CAA6C;QAC7C,OAAO,GAAG,kBAAkB,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAS;IACxB,IAAI;IACJ,WAAW;IACX,GAAG;CACJ,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Rule, RuleViolation } from './rule-interface';
|
|
2
|
+
/**
|
|
3
|
+
* MD009: Trailing spaces
|
|
4
|
+
*
|
|
5
|
+
* This rule is triggered when trailing spaces are found at the end of a line.
|
|
6
|
+
* Trailing spaces can cause unnecessary diffs in version control systems and
|
|
7
|
+
* can be confusing in a text editor.
|
|
8
|
+
*/
|
|
9
|
+
export declare const name = "MD009";
|
|
10
|
+
export declare const description = "Trailing spaces";
|
|
11
|
+
interface MD009Config {
|
|
12
|
+
br_spaces?: number;
|
|
13
|
+
list_item_empty_lines?: boolean;
|
|
14
|
+
strict?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Validate lines for trailing spaces
|
|
18
|
+
* @param lines Array of string lines to validate
|
|
19
|
+
* @param config Rule configuration
|
|
20
|
+
* @returns Array of rule violations
|
|
21
|
+
*/
|
|
22
|
+
export declare function validate(lines: string[], config?: MD009Config): RuleViolation[];
|
|
23
|
+
/**
|
|
24
|
+
* Fix trailing spaces by removing them from the end of each line
|
|
25
|
+
* @param lines Array of string lines to fix
|
|
26
|
+
* @param config Rule configuration
|
|
27
|
+
* @returns Fixed lines array with trailing spaces removed
|
|
28
|
+
*/
|
|
29
|
+
export declare function fix(lines: string[], config?: MD009Config): string[];
|
|
30
|
+
/**
|
|
31
|
+
* Rule implementation for MD009
|
|
32
|
+
*/
|
|
33
|
+
export declare const rule: Rule;
|
|
34
|
+
export default rule;
|
|
35
|
+
//# sourceMappingURL=md009.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md009.d.ts","sourceRoot":"","sources":["../../src/rules/md009.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,UAAU,CAAC;AAC5B,eAAO,MAAM,WAAW,oBAAoB,CAAC;AAE7C,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,WAAgB,GAAG,aAAa,EAAE,CAgDnF;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,WAAgB,GAAG,MAAM,EAAE,CAuDvE;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,IAKlB,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MD009: Trailing spaces
|
|
3
|
+
*
|
|
4
|
+
* This rule is triggered when trailing spaces are found at the end of a line.
|
|
5
|
+
* Trailing spaces can cause unnecessary diffs in version control systems and
|
|
6
|
+
* can be confusing in a text editor.
|
|
7
|
+
*/
|
|
8
|
+
export const name = 'MD009';
|
|
9
|
+
export const description = 'Trailing spaces';
|
|
10
|
+
/**
|
|
11
|
+
* Validate lines for trailing spaces
|
|
12
|
+
* @param lines Array of string lines to validate
|
|
13
|
+
* @param config Rule configuration
|
|
14
|
+
* @returns Array of rule violations
|
|
15
|
+
*/
|
|
16
|
+
export function validate(lines, config = {}) {
|
|
17
|
+
const violations = [];
|
|
18
|
+
const brSpaces = config.br_spaces ?? 0;
|
|
19
|
+
const strictMode = config.strict === true;
|
|
20
|
+
for (let i = 0; i < lines.length; i++) {
|
|
21
|
+
const line = lines[i];
|
|
22
|
+
const trailingSpaceMatch = line.match(/[ \t]+$/);
|
|
23
|
+
if (trailingSpaceMatch) {
|
|
24
|
+
const trailingSpaces = trailingSpaceMatch[0];
|
|
25
|
+
// In strict mode, any trailing whitespace is a violation
|
|
26
|
+
if (strictMode) {
|
|
27
|
+
violations.push({
|
|
28
|
+
lineNumber: i + 1,
|
|
29
|
+
details: `Trailing spaces${trailingSpaces.length > 0 ? ` (${trailingSpaces.length})` : ''}`,
|
|
30
|
+
range: [line.length - trailingSpaces.length, trailingSpaces.length],
|
|
31
|
+
});
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
// Check if line is blank (only whitespace)
|
|
35
|
+
const isBlankLine = line.trim() === '';
|
|
36
|
+
// Check if this line has a valid line break (exactly br_spaces trailing spaces)
|
|
37
|
+
const hasContent = line.trim().length > 0;
|
|
38
|
+
const isLineBreak = brSpaces > 0 && hasContent && trailingSpaces.length === brSpaces;
|
|
39
|
+
// Report a violation if:
|
|
40
|
+
// 1. It's not a valid line break (and br_spaces is set)
|
|
41
|
+
// 2. It's a blank line with trailing spaces
|
|
42
|
+
// 3. Any trailing spaces when br_spaces is 0
|
|
43
|
+
if ((brSpaces > 0 && !isLineBreak && hasContent) ||
|
|
44
|
+
(isBlankLine && trailingSpaces.length > 0) ||
|
|
45
|
+
brSpaces === 0) {
|
|
46
|
+
violations.push({
|
|
47
|
+
lineNumber: i + 1,
|
|
48
|
+
details: `Trailing spaces${trailingSpaces.length > 0 ? ` (${trailingSpaces.length})` : ''}`,
|
|
49
|
+
range: [line.length - trailingSpaces.length, trailingSpaces.length],
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return violations;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Fix trailing spaces by removing them from the end of each line
|
|
58
|
+
* @param lines Array of string lines to fix
|
|
59
|
+
* @param config Rule configuration
|
|
60
|
+
* @returns Fixed lines array with trailing spaces removed
|
|
61
|
+
*/
|
|
62
|
+
export function fix(lines, config = {}) {
|
|
63
|
+
const brSpaces = config.br_spaces ?? 0;
|
|
64
|
+
const strictMode = config.strict === true;
|
|
65
|
+
return lines.map(line => {
|
|
66
|
+
// Check if line has trailing spaces
|
|
67
|
+
const trailingSpaceMatch = line.match(/[ \t]+$/);
|
|
68
|
+
if (!trailingSpaceMatch)
|
|
69
|
+
return line;
|
|
70
|
+
// Check if line is blank (only whitespace)
|
|
71
|
+
const isBlankLine = line.trim() === '';
|
|
72
|
+
// If it's a blank line, always remove all trailing whitespace
|
|
73
|
+
if (isBlankLine) {
|
|
74
|
+
return '';
|
|
75
|
+
}
|
|
76
|
+
// Handle strict mode differently
|
|
77
|
+
if (strictMode) {
|
|
78
|
+
// In strict mode, if br_spaces is set, normalize to exactly that many spaces
|
|
79
|
+
if (brSpaces > 0) {
|
|
80
|
+
const hasContent = line.trim().length > 0;
|
|
81
|
+
if (hasContent) {
|
|
82
|
+
// Example: Line with trailing spaces. -> Line with trailing spaces.
|
|
83
|
+
return line.replace(/[ \t]+$/, ' '.repeat(brSpaces));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Empty lines should have no trailing spaces
|
|
87
|
+
return '';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// If br_spaces is not set, remove all trailing spaces
|
|
92
|
+
return line.replace(/[ \t]+$/, '');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Non-strict mode handling
|
|
96
|
+
if (brSpaces > 0) {
|
|
97
|
+
// If trailing spaces are already exactly br_spaces, keep them
|
|
98
|
+
if (trailingSpaceMatch[0].length === brSpaces) {
|
|
99
|
+
return line;
|
|
100
|
+
}
|
|
101
|
+
// If trailing spaces are fewer than br_spaces, replace with br_spaces
|
|
102
|
+
if (trailingSpaceMatch[0].length < brSpaces) {
|
|
103
|
+
return line.replace(/[ \t]+$/, ' '.repeat(brSpaces));
|
|
104
|
+
}
|
|
105
|
+
// If trailing spaces are more than br_spaces, replace with br_spaces
|
|
106
|
+
return line.replace(/[ \t]+$/, ' '.repeat(brSpaces));
|
|
107
|
+
}
|
|
108
|
+
// If br_spaces is 0 or not specified, remove all trailing whitespace
|
|
109
|
+
return line.replace(/[ \t]+$/, '');
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Rule implementation for MD009
|
|
114
|
+
*/
|
|
115
|
+
export const rule = {
|
|
116
|
+
name,
|
|
117
|
+
description,
|
|
118
|
+
validate,
|
|
119
|
+
fix,
|
|
120
|
+
};
|
|
121
|
+
export default rule;
|
|
122
|
+
//# sourceMappingURL=md009.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md009.js","sourceRoot":"","sources":["../../src/rules/md009.ts"],"names":[],"mappings":"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"}
|