Skip to content

Commit 1ddee6b

Browse files
committed
Update MD051/link-fragments to also look for a fragment matching the URI-encoded link definition (implicit behavior in previous version via markdown-it) (fixes #954, fixes #955).
1 parent b7ef571 commit 1ddee6b

5 files changed

+62
-37
lines changed

demo/markdownlint-browser.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6328,7 +6328,10 @@ module.exports = {
63286328
try {
63296329
var _loop = function _loop() {
63306330
var definition = _step4.value;
6331-
if (definition.text.length > 1 && definition.text.startsWith("#") && !fragments.has(definition.text)) {
6331+
var endColumn = definition.endColumn,
6332+
startColumn = definition.startColumn,
6333+
text = definition.text;
6334+
if (text.length > 1 && text.startsWith("#") && !fragments.has(text) && !fragments.has("#".concat(encodeURIComponent(text.slice(1))))) {
63326335
// eslint-disable-next-line no-undef-init
63336336
var context = undefined;
63346337
// eslint-disable-next-line no-undef-init
@@ -6339,18 +6342,18 @@ module.exports = {
63396342
context = link.text;
63406343
range = [link.startColumn, link.endColumn - link.startColumn];
63416344
fixInfo = {
6342-
"editColumn": definition.startColumn,
6343-
"deleteCount": definition.endColumn - definition.startColumn
6345+
"editColumn": startColumn,
6346+
"deleteCount": endColumn - startColumn
63446347
};
63456348
}
6346-
var definitionTextLower = definition.text.toLowerCase();
6349+
var textLower = text.toLowerCase();
63476350
var mixedCaseKey = _toConsumableArray(fragments.keys()).find(function (key) {
6348-
return definitionTextLower === key.toLowerCase();
6351+
return textLower === key.toLowerCase();
63496352
});
63506353
if (mixedCaseKey) {
63516354
// @ts-ignore
63526355
(fixInfo || {}).insertText = mixedCaseKey;
6353-
addErrorDetailIf(onError, link.startLine, mixedCaseKey, definition.text, undefined, context, range, fixInfo);
6356+
addErrorDetailIf(onError, link.startLine, mixedCaseKey, text, undefined, context, range, fixInfo);
63546357
} else {
63556358
addError(onError, link.startLine, undefined, context, range);
63566359
}

lib/md051.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,12 @@ module.exports = {
9999
for (const link of links) {
100100
const definitions = filterByTypes(link.children, [ definitionType ]);
101101
for (const definition of definitions) {
102+
const { endColumn, startColumn, text } = definition;
102103
if (
103-
(definition.text.length > 1) &&
104-
definition.text.startsWith("#") &&
105-
!fragments.has(definition.text)
104+
(text.length > 1) &&
105+
text.startsWith("#") &&
106+
!fragments.has(text) &&
107+
!fragments.has(`#${encodeURIComponent(text.slice(1))}`)
106108
) {
107109
// eslint-disable-next-line no-undef-init
108110
let context = undefined;
@@ -114,21 +116,21 @@ module.exports = {
114116
context = link.text;
115117
range = [ link.startColumn, link.endColumn - link.startColumn ];
116118
fixInfo = {
117-
"editColumn": definition.startColumn,
118-
"deleteCount": definition.endColumn - definition.startColumn
119+
"editColumn": startColumn,
120+
"deleteCount": endColumn - startColumn
119121
};
120122
}
121-
const definitionTextLower = definition.text.toLowerCase();
123+
const textLower = text.toLowerCase();
122124
const mixedCaseKey = [ ...fragments.keys() ]
123-
.find((key) => definitionTextLower === key.toLowerCase());
125+
.find((key) => textLower === key.toLowerCase());
124126
if (mixedCaseKey) {
125127
// @ts-ignore
126128
(fixInfo || {}).insertText = mixedCaseKey;
127129
addErrorDetailIf(
128130
onError,
129131
link.startLine,
130132
mixedCaseKey,
131-
definition.text,
133+
text,
132134
undefined,
133135
context,
134136
range,

test/link-fragments.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,16 @@
4444

4545
[Valid](#valid-heading-about-lh%C3%B4pitals-rule)
4646

47+
[Valid](#valid-heading-about-lhôpitals-rule)
48+
4749
[Valid](#en-t%C3%AAte-valide-dans-fran%C3%A7ais-pour-v%C3%A9rification)
4850

51+
[Valid](#en-tête-valide-dans-français-pour-vérification)
52+
53+
[Valid](#%E6%A0%87%E9%A2%98)
54+
55+
[Valid](#标题)
56+
4957
[Valid](#valid-heading-is-a-link)
5058

5159
[Valid](#valid-heading-has-a-link)
@@ -137,6 +145,8 @@ Text
137145

138146
### En-tête Valide Dans Français Pour Vérification
139147

148+
### 标题
149+
140150
### [Valid Heading Is a Link](https://example.com)
141151

142152
### Valid Heading [Has a Link](https://example.com)

test/snapshots/markdownlint-test-scenarios.js.md

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23969,7 +23969,7 @@ Generated by [AVA](https://avajs.dev).
2396923969
37,
2397023970
],
2397123971
fixInfo: null,
23972-
lineNumber: 172,
23972+
lineNumber: 182,
2397323973
ruleDescription: 'Link fragments should be valid',
2397423974
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2397523975
ruleNames: [
@@ -23985,7 +23985,7 @@ Generated by [AVA](https://avajs.dev).
2398523985
31,
2398623986
],
2398723987
fixInfo: null,
23988-
lineNumber: 174,
23988+
lineNumber: 184,
2398923989
ruleDescription: 'Link fragments should be valid',
2399023990
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2399123991
ruleNames: [
@@ -24001,7 +24001,7 @@ Generated by [AVA](https://avajs.dev).
2400124001
36,
2400224002
],
2400324003
fixInfo: null,
24004-
lineNumber: 176,
24004+
lineNumber: 186,
2400524005
ruleDescription: 'Link fragments should be valid',
2400624006
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2400724007
ruleNames: [
@@ -24017,7 +24017,7 @@ Generated by [AVA](https://avajs.dev).
2401724017
28,
2401824018
],
2401924019
fixInfo: null,
24020-
lineNumber: 178,
24020+
lineNumber: 188,
2402124021
ruleDescription: 'Link fragments should be valid',
2402224022
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2402324023
ruleNames: [
@@ -24033,7 +24033,7 @@ Generated by [AVA](https://avajs.dev).
2403324033
18,
2403424034
],
2403524035
fixInfo: null,
24036-
lineNumber: 180,
24036+
lineNumber: 190,
2403724037
ruleDescription: 'Link fragments should be valid',
2403824038
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2403924039
ruleNames: [
@@ -24053,7 +24053,7 @@ Generated by [AVA](https://avajs.dev).
2405324053
editColumn: 11,
2405424054
insertText: '#HREFandID',
2405524055
},
24056-
lineNumber: 182,
24056+
lineNumber: 192,
2405724057
ruleDescription: 'Link fragments should be valid',
2405824058
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2405924059
ruleNames: [
@@ -24069,7 +24069,7 @@ Generated by [AVA](https://avajs.dev).
2406924069
34,
2407024070
],
2407124071
fixInfo: null,
24072-
lineNumber: 184,
24072+
lineNumber: 194,
2407324073
ruleDescription: 'Link fragments should be valid',
2407424074
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2407524075
ruleNames: [
@@ -24085,7 +24085,7 @@ Generated by [AVA](https://avajs.dev).
2408524085
34,
2408624086
],
2408724087
fixInfo: null,
24088-
lineNumber: 186,
24088+
lineNumber: 196,
2408924089
ruleDescription: 'Link fragments should be valid',
2409024090
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2409124091
ruleNames: [
@@ -24101,7 +24101,7 @@ Generated by [AVA](https://avajs.dev).
2410124101
39,
2410224102
],
2410324103
fixInfo: null,
24104-
lineNumber: 188,
24104+
lineNumber: 198,
2410524105
ruleDescription: 'Link fragments should be valid',
2410624106
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2410724107
ruleNames: [
@@ -24114,7 +24114,7 @@ Generated by [AVA](https://avajs.dev).
2411424114
errorDetail: null,
2411524115
errorRange: null,
2411624116
fixInfo: null,
24117-
lineNumber: 190,
24117+
lineNumber: 200,
2411824118
ruleDescription: 'Link fragments should be valid',
2411924119
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2412024120
ruleNames: [
@@ -24130,7 +24130,7 @@ Generated by [AVA](https://avajs.dev).
2413024130
28,
2413124131
],
2413224132
fixInfo: null,
24133-
lineNumber: 195,
24133+
lineNumber: 205,
2413424134
ruleDescription: 'Link fragments should be valid',
2413524135
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2413624136
ruleNames: [
@@ -24150,7 +24150,7 @@ Generated by [AVA](https://avajs.dev).
2415024150
editColumn: 9,
2415124151
insertText: '#valid-fragments',
2415224152
},
24153-
lineNumber: 199,
24153+
lineNumber: 209,
2415424154
ruleDescription: 'Link fragments should be valid',
2415524155
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2415624156
ruleNames: [
@@ -24170,7 +24170,7 @@ Generated by [AVA](https://avajs.dev).
2417024170
editColumn: 12,
2417124171
insertText: '#namedlink',
2417224172
},
24173-
lineNumber: 201,
24173+
lineNumber: 211,
2417424174
ruleDescription: 'Link fragments should be valid',
2417524175
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2417624176
ruleNames: [
@@ -24183,7 +24183,7 @@ Generated by [AVA](https://avajs.dev).
2418324183
errorDetail: 'Expected: #namedlink; Actual: #NAMEDLINK',
2418424184
errorRange: null,
2418524185
fixInfo: null,
24186-
lineNumber: 203,
24186+
lineNumber: 213,
2418724187
ruleDescription: 'Link fragments should be valid',
2418824188
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2418924189
ruleNames: [
@@ -24203,7 +24203,7 @@ Generated by [AVA](https://avajs.dev).
2420324203
editColumn: 13,
2420424204
insertText: '#idlink',
2420524205
},
24206-
lineNumber: 208,
24206+
lineNumber: 218,
2420724207
ruleDescription: 'Link fragments should be valid',
2420824208
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2420924209
ruleNames: [
@@ -24219,7 +24219,7 @@ Generated by [AVA](https://avajs.dev).
2421924219
26,
2422024220
],
2422124221
fixInfo: null,
24222-
lineNumber: 243,
24222+
lineNumber: 253,
2422324223
ruleDescription: 'Link fragments should be valid',
2422424224
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2422524225
ruleNames: [
@@ -24235,7 +24235,7 @@ Generated by [AVA](https://avajs.dev).
2423524235
26,
2423624236
],
2423724237
fixInfo: null,
24238-
lineNumber: 245,
24238+
lineNumber: 255,
2423924239
ruleDescription: 'Link fragments should be valid',
2424024240
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2424124241
ruleNames: [
@@ -24251,7 +24251,7 @@ Generated by [AVA](https://avajs.dev).
2425124251
20,
2425224252
],
2425324253
fixInfo: null,
24254-
lineNumber: 247,
24254+
lineNumber: 257,
2425524255
ruleDescription: 'Link fragments should be valid',
2425624256
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2425724257
ruleNames: [
@@ -24267,7 +24267,7 @@ Generated by [AVA](https://avajs.dev).
2426724267
23,
2426824268
],
2426924269
fixInfo: null,
24270-
lineNumber: 249,
24270+
lineNumber: 259,
2427124271
ruleDescription: 'Link fragments should be valid',
2427224272
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2427324273
ruleNames: [
@@ -24283,7 +24283,7 @@ Generated by [AVA](https://avajs.dev).
2428324283
22,
2428424284
],
2428524285
fixInfo: null,
24286-
lineNumber: 251,
24286+
lineNumber: 261,
2428724287
ruleDescription: 'Link fragments should be valid',
2428824288
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2428924289
ruleNames: [
@@ -24299,7 +24299,7 @@ Generated by [AVA](https://avajs.dev).
2429924299
42,
2430024300
],
2430124301
fixInfo: null,
24302-
lineNumber: 253,
24302+
lineNumber: 263,
2430324303
ruleDescription: 'Link fragments should be valid',
2430424304
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2430524305
ruleNames: [
@@ -24315,7 +24315,7 @@ Generated by [AVA](https://avajs.dev).
2431524315
21,
2431624316
],
2431724317
fixInfo: null,
24318-
lineNumber: 255,
24318+
lineNumber: 265,
2431924319
ruleDescription: 'Link fragments should be valid',
2432024320
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2432124321
ruleNames: [
@@ -24331,7 +24331,7 @@ Generated by [AVA](https://avajs.dev).
2433124331
21,
2433224332
],
2433324333
fixInfo: null,
24334-
lineNumber: 257,
24334+
lineNumber: 267,
2433524335
ruleDescription: 'Link fragments should be valid',
2433624336
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md',
2433724337
ruleNames: [
@@ -24386,8 +24386,16 @@ Generated by [AVA](https://avajs.dev).
2438624386
2438724387
[Valid](#valid-heading-about-lh%C3%B4pitals-rule)␊
2438824388
24389+
[Valid](#valid-heading-about-lhôpitals-rule)␊
24390+
2438924391
[Valid](#en-t%C3%AAte-valide-dans-fran%C3%A7ais-pour-v%C3%A9rification)␊
2439024392
24393+
[Valid](#en-tête-valide-dans-français-pour-vérification)␊
24394+
24395+
[Valid](#%E6%A0%87%E9%A2%98)␊
24396+
24397+
[Valid](#标题)␊
24398+
2439124399
[Valid](#valid-heading-is-a-link)␊
2439224400
2439324401
[Valid](#valid-heading-has-a-link)␊
@@ -24479,6 +24487,8 @@ Generated by [AVA](https://avajs.dev).
2447924487
2448024488
### En-tête Valide Dans Français Pour Vérification␊
2448124489
24490+
### 标题␊
24491+
2448224492
### [Valid Heading Is a Link](https://example.com)␊
2448324493
2448424494
### Valid Heading [Has a Link](https://example.com)␊
Binary file not shown.

0 commit comments

Comments
 (0)