Skip to content

Commit 14f3ea1

Browse files
committed
Update MD051/link-fragments to allow multiple consecutive dash and underline characters for named anchor syntax (fixes #2282).
1 parent a905b19 commit 14f3ea1

3 files changed

Lines changed: 44 additions & 49 deletions

File tree

‎lib/md051.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { filterByTypesCached } from "./cache.mjs";
77
// Regular expression for identifying HTML anchor names
88
const idRe = getHtmlAttributeRe("id");
99
const nameRe = getHtmlAttributeRe("name");
10-
const anchorRe = /\{(#[a-z\d]+(?:[-_][a-z\d]+)*)\}/gu;
10+
const anchorRe = /\{(#[a-z\d]+(?:[-_]+[a-z\d]+)*)\}/gu;
1111
const lineFragmentRe = /^#(?:L\d+(?:C\d+)?-L\d+(?:C\d+)?|L\d+)$/;
1212

1313
// Sets for filtering heading tokens during conversion

‎test/link-fragments.md‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,25 +263,33 @@ Text
263263

264264
[Valid](#valid-heading-with-another-named-fragment-another_fragment_123)
265265

266+
[Valid](#multiple--dashes---fragment__name)
267+
268+
[Valid](#valid-heading-with-named-fragment-and-multiple-dashes-multiple--dashes---fragment__name)
269+
266270
[Valid](#closed-atx)
267271

268272
[Valid](#setext)
269273

274+
[Valid](#hyphen--run)
275+
270276
### Valid Heading with Named Fragment {#named-fragment}
271277

272278
### Valid Heading with Another Named Fragment {#another_fragment_123}
273279

280+
### Valid Heading with Named Fragment and Multiple Dashes {#multiple--dashes---fragment__name}
281+
274282
### Valid Closed ATX Heading with Named Fragment {#closed-atx} ###
275283

276284
Valid Setext Heading with Named Fragment {#setext}
277285
--------------------------------------------------
278286

287+
### Valid Heading with Named Fragment {#hyphen--run}
288+
279289
## Invalid Named Fragments
280290

281291
### Invalid Heading with Named Fragment {#embedded space}
282292

283-
### Invalid Heading with Named Fragment {#hyphen--run}
284-
285293
### Invalid Heading with Named Fragment {#UpperCase}
286294

287295
{#named-fragment-outside-heading}
@@ -292,8 +300,6 @@ Valid Setext Heading with Named Fragment {#setext}
292300

293301
[Invalid](#embedded) {MD051}
294302

295-
[Invalid](#hyphen--run) {MD051}
296-
297303
[Invalid](#hyphen-run) {MD051}
298304

299305
[Invalid](#named-fragment-outside-heading) {MD051}

‎test/markdownlint-test-scenarios.mjs.snapshot‎

Lines changed: 33 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -28594,7 +28594,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2859428594
"severity": "error"
2859528595
},
2859628596
{
28597-
"lineNumber": 289,
28597+
"lineNumber": 297,
2859828598
"ruleNames": [
2859928599
"MD051",
2860028600
"link-fragments"
@@ -28611,7 +28611,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2861128611
"severity": "error"
2861228612
},
2861328613
{
28614-
"lineNumber": 291,
28614+
"lineNumber": 299,
2861528615
"ruleNames": [
2861628616
"MD051",
2861728617
"link-fragments"
@@ -28628,7 +28628,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2862828628
"severity": "error"
2862928629
},
2863028630
{
28631-
"lineNumber": 293,
28631+
"lineNumber": 301,
2863228632
"ruleNames": [
2863328633
"MD051",
2863428634
"link-fragments"
@@ -28645,24 +28645,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2864528645
"severity": "error"
2864628646
},
2864728647
{
28648-
"lineNumber": 295,
28649-
"ruleNames": [
28650-
"MD051",
28651-
"link-fragments"
28652-
],
28653-
"ruleDescription": "Link fragments should be valid",
28654-
"ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md051.md",
28655-
"errorDetail": null,
28656-
"errorContext": "[Invalid](#hyphen--run)",
28657-
"errorRange": [
28658-
1,
28659-
23
28660-
],
28661-
"fixInfo": null,
28662-
"severity": "error"
28663-
},
28664-
{
28665-
"lineNumber": 297,
28648+
"lineNumber": 303,
2866628649
"ruleNames": [
2866728650
"MD051",
2866828651
"link-fragments"
@@ -28679,7 +28662,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2867928662
"severity": "error"
2868028663
},
2868128664
{
28682-
"lineNumber": 299,
28665+
"lineNumber": 305,
2868328666
"ruleNames": [
2868428667
"MD051",
2868528668
"link-fragments"
@@ -28696,7 +28679,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2869628679
"severity": "error"
2869728680
},
2869828681
{
28699-
"lineNumber": 301,
28682+
"lineNumber": 307,
2870028683
"ruleNames": [
2870128684
"MD051",
2870228685
"link-fragments"
@@ -28713,7 +28696,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2871328696
"severity": "error"
2871428697
},
2871528698
{
28716-
"lineNumber": 303,
28699+
"lineNumber": 309,
2871728700
"ruleNames": [
2871828701
"MD051",
2871928702
"link-fragments"
@@ -28730,7 +28713,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2873028713
"severity": "error"
2873128714
},
2873228715
{
28733-
"lineNumber": 305,
28716+
"lineNumber": 311,
2873428717
"ruleNames": [
2873528718
"MD051",
2873628719
"link-fragments"
@@ -28751,7 +28734,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2875128734
"severity": "error"
2875228735
},
2875328736
{
28754-
"lineNumber": 307,
28737+
"lineNumber": 313,
2875528738
"ruleNames": [
2875628739
"MD051",
2875728740
"link-fragments"
@@ -28768,7 +28751,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2876828751
"severity": "error"
2876928752
},
2877028753
{
28771-
"lineNumber": 309,
28754+
"lineNumber": 315,
2877228755
"ruleNames": [
2877328756
"MD051",
2877428757
"link-fragments"
@@ -28785,7 +28768,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2878528768
"severity": "error"
2878628769
},
2878728770
{
28788-
"lineNumber": 311,
28771+
"lineNumber": 317,
2878928772
"ruleNames": [
2879028773
"MD051",
2879128774
"link-fragments"
@@ -28802,7 +28785,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2880228785
"severity": "error"
2880328786
},
2880428787
{
28805-
"lineNumber": 313,
28788+
"lineNumber": 319,
2880628789
"ruleNames": [
2880728790
"MD051",
2880828791
"link-fragments"
@@ -28819,7 +28802,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2881928802
"severity": "error"
2882028803
},
2882128804
{
28822-
"lineNumber": 315,
28805+
"lineNumber": 321,
2882328806
"ruleNames": [
2882428807
"MD051",
2882528808
"link-fragments"
@@ -28836,7 +28819,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2883628819
"severity": "error"
2883728820
},
2883828821
{
28839-
"lineNumber": 317,
28822+
"lineNumber": 323,
2884028823
"ruleNames": [
2884128824
"MD051",
2884228825
"link-fragments"
@@ -28853,7 +28836,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2885328836
"severity": "error"
2885428837
},
2885528838
{
28856-
"lineNumber": 319,
28839+
"lineNumber": 325,
2885728840
"ruleNames": [
2885828841
"MD051",
2885928842
"link-fragments"
@@ -28870,7 +28853,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2887028853
"severity": "error"
2887128854
},
2887228855
{
28873-
"lineNumber": 321,
28856+
"lineNumber": 327,
2887428857
"ruleNames": [
2887528858
"MD051",
2887628859
"link-fragments"
@@ -28887,7 +28870,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2888728870
"severity": "error"
2888828871
},
2888928872
{
28890-
"lineNumber": 323,
28873+
"lineNumber": 329,
2889128874
"ruleNames": [
2889228875
"MD051",
2889328876
"link-fragments"
@@ -28904,7 +28887,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2890428887
"severity": "error"
2890528888
},
2890628889
{
28907-
"lineNumber": 325,
28890+
"lineNumber": 331,
2890828891
"ruleNames": [
2890928892
"MD051",
2891028893
"link-fragments"
@@ -28921,7 +28904,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2892128904
"severity": "error"
2892228905
},
2892328906
{
28924-
"lineNumber": 327,
28907+
"lineNumber": 333,
2892528908
"ruleNames": [
2892628909
"MD051",
2892728910
"link-fragments"
@@ -28938,7 +28921,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2893828921
"severity": "error"
2893928922
},
2894028923
{
28941-
"lineNumber": 329,
28924+
"lineNumber": 335,
2894228925
"ruleNames": [
2894328926
"MD051",
2894428927
"link-fragments"
@@ -28955,7 +28938,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2895528938
"severity": "error"
2895628939
},
2895728940
{
28958-
"lineNumber": 331,
28941+
"lineNumber": 337,
2895928942
"ruleNames": [
2896028943
"MD051",
2896128944
"link-fragments"
@@ -28972,7 +28955,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2897228955
"severity": "error"
2897328956
},
2897428957
{
28975-
"lineNumber": 333,
28958+
"lineNumber": 339,
2897628959
"ruleNames": [
2897728960
"MD051",
2897828961
"link-fragments"
@@ -28989,7 +28972,7 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2898928972
"severity": "error"
2899028973
},
2899128974
{
28992-
"lineNumber": 339,
28975+
"lineNumber": 345,
2899328976
"ruleNames": [
2899428977
"MD051",
2899528978
"link-fragments"
@@ -29276,25 +29259,33 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2927629259
"",
2927729260
"[Valid](#valid-heading-with-another-named-fragment-another_fragment_123)",
2927829261
"",
29262+
"[Valid](#multiple--dashes---fragment__name)",
29263+
"",
29264+
"[Valid](#valid-heading-with-named-fragment-and-multiple-dashes-multiple--dashes---fragment__name)",
29265+
"",
2927929266
"[Valid](#closed-atx)",
2928029267
"",
2928129268
"[Valid](#setext)",
2928229269
"",
29270+
"[Valid](#hyphen--run)",
29271+
"",
2928329272
"### Valid Heading with Named Fragment {#named-fragment}",
2928429273
"",
2928529274
"### Valid Heading with Another Named Fragment {#another_fragment_123}",
2928629275
"",
29276+
"### Valid Heading with Named Fragment and Multiple Dashes {#multiple--dashes---fragment__name}",
29277+
"",
2928729278
"### Valid Closed ATX Heading with Named Fragment {#closed-atx} ###",
2928829279
"",
2928929280
"Valid Setext Heading with Named Fragment {#setext}",
2929029281
"--------------------------------------------------",
2929129282
"",
29283+
"### Valid Heading with Named Fragment {#hyphen--run}",
29284+
"",
2929229285
"## Invalid Named Fragments",
2929329286
"",
2929429287
"### Invalid Heading with Named Fragment {#embedded space}",
2929529288
"",
29296-
"### Invalid Heading with Named Fragment {#hyphen--run}",
29297-
"",
2929829289
"### Invalid Heading with Named Fragment {#UpperCase}",
2929929290
"",
2930029291
"{#named-fragment-outside-heading}",
@@ -29305,8 +29296,6 @@ exports[`markdownlint-test-scenarios.mjs > link-fragments.md 1`] = `
2930529296
"",
2930629297
"[Invalid](#embedded) {MD051}",
2930729298
"",
29308-
"[Invalid](#hyphen--run) {MD051}",
29309-
"",
2931029299
"[Invalid](#hyphen-run) {MD051}",
2931129300
"",
2931229301
"[Invalid](#named-fragment-outside-heading) {MD051}",

0 commit comments

Comments
 (0)