Skip to content

Commit 7f4a51e

Browse files
michaelmiorwooorm
authored andcommitted
Update main heading rules to accept preferred depth
Update `first-heading-level` and `no-multiple-toplevel-headings` to accept a preferred main heading level. The previous, and default, state is defined as level 1 headings, but it’s now possible to specify other levels as well. Closes GH-51.
1 parent 3fbddf8 commit 7f4a51e

8 files changed

+53
-16
lines changed

doc/rules.md

+9-5
Original file line numberDiff line numberDiff line change
@@ -403,18 +403,20 @@ Options: `boolean`, default: `false`.
403403
### first-heading-level
404404

405405
```md
406-
<!-- Valid: -->
406+
<!-- Valid, when set to `1` -->
407407
# Foo
408408

409409
## Bar
410410

411-
<!-- Invalid: -->
411+
<!-- Invalid, when set to `1` -->
412412
## Foo
413413

414414
# Bar
415415
```
416416

417-
Warn when the first heading has a level other than `1`.
417+
Warn when the first heading has a level other than a specified value.
418+
419+
Options: `number`, default: `1`.
418420

419421
### hard-break-spaces
420422

@@ -950,19 +952,21 @@ Options: `boolean`, default: `false`.
950952
### no-multiple-toplevel-headings
951953

952954
```md
953-
<!-- Invalid: -->
955+
<!-- Invalid, when set to `1` -->
954956
# Foo
955957

956958
# Bar
957959

958-
<!-- Valid: -->
960+
<!-- Valid, when set to `1` -->
959961
# Foo
960962

961963
## Bar
962964
```
963965

964966
Warn when multiple top-level headings are used.
965967

968+
Options: `number`, default: `1`.
969+
966970
### no-shell-dollars
967971

968972
````md

lib/rules/first-heading-level.js

+11-7
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44
* @license MIT
55
* @module first-heading-level
66
* @fileoverview
7-
* Warn when the first heading has a level other than `1`.
7+
* Warn when the first heading has a level other than a specified value.
8+
*
9+
* Options: `number`, default: `1`.
810
* @example
9-
* <!-- Valid: -->
11+
* <!-- Valid, when set to `1` -->
1012
* # Foo
1113
*
1214
* ## Bar
1315
*
14-
* <!-- Invalid: -->
16+
* <!-- Invalid, when set to `1` -->
1517
* ## Foo
1618
*
1719
* # Bar
@@ -29,21 +31,23 @@ var visit = require('unist-util-visit');
2931
var position = require('mdast-util-position');
3032

3133
/**
32-
* Warn when the first heading has a level other than `1`.
34+
* Warn when the first heading has a level other than a specified value.
3335
*
3436
* @param {Node} ast - Root node.
3537
* @param {File} file - Virtual file.
36-
* @param {*} preferred - Ignored.
38+
* @param {number?} [preferred=1] - First heading level.
3739
* @param {Function} done - Callback.
3840
*/
3941
function firstHeadingLevel(ast, file, preferred, done) {
42+
var style = preferred && preferred !== true ? preferred : 1;
43+
4044
visit(ast, 'heading', function (node) {
4145
if (position.generated(node)) {
4246
return null;
4347
}
4448

45-
if (node.depth !== 1) {
46-
file.warn('First heading level should be `1`', node);
49+
if (node.depth !== style) {
50+
file.warn('First heading level should be `' + style + '`', node);
4751
}
4852

4953
return false;

lib/rules/no-multiple-toplevel-headings.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
* @module no-multiple-toplevel-headings
66
* @fileoverview
77
* Warn when multiple top-level headings are used.
8+
*
9+
* Options: `number`, default: `1`.
810
* @example
9-
* <!-- Invalid: -->
11+
* <!-- Invalid, when set to `1` -->
1012
* # Foo
1113
*
1214
* # Bar
1315
*
14-
* <!-- Valid: -->
16+
* <!-- Valid, when set to `1` -->
1517
* # Foo
1618
*
1719
* ## Bar
@@ -33,10 +35,11 @@ var position = require('mdast-util-position');
3335
*
3436
* @param {Node} ast - Root node.
3537
* @param {File} file - Virtual file.
36-
* @param {*} preferred - Ignored.
38+
* @param {number?} [preferred=1] - Top heading level.
3739
* @param {Function} done - Callback.
3840
*/
3941
function noMultipleToplevelHeadings(ast, file, preferred, done) {
42+
var style = preferred && preferred !== true ? preferred : 1;
4043
var topLevelheading = false;
4144

4245
visit(ast, 'heading', function (node) {
@@ -46,7 +49,7 @@ function noMultipleToplevelHeadings(ast, file, preferred, done) {
4649
return;
4750
}
4851

49-
if (node.depth === 1) {
52+
if (node.depth === style) {
5053
if (topLevelheading) {
5154
pos = position.start(node);
5255

Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Valid
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
## Valid
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Another heading
2+
---------------
3+
4+
## Another
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Valid
2+
---------------
3+
4+
### Another heading

test/index.js

+16
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,14 @@ describe('Rules', function () {
493493

494494
assertFile('first-heading-level-valid.md', []);
495495
});
496+
497+
describeSetting(2, function () {
498+
assertFile('first-heading-level-invalid-second.md', [
499+
'first-heading-level-invalid-second.md:1:1-1:8: First heading level should be `2`'
500+
]);
501+
502+
assertFile('first-heading-level-valid-second.md', []);
503+
});
496504
});
497505

498506
describeRule('heading-increment', function () {
@@ -719,6 +727,14 @@ describe('Rules', function () {
719727

720728
assertFile('no-multiple-toplevel-headings-valid.md', []);
721729
});
730+
731+
describeSetting(2, function () {
732+
assertFile('no-multiple-toplevel-headings-invalid-second.md', [
733+
'no-multiple-toplevel-headings-invalid-second.md:4:1-4:11: Don’t use multiple top level headings (4:1)'
734+
]);
735+
736+
assertFile('no-multiple-toplevel-headings-valid-second.md', []);
737+
});
722738
});
723739

724740
describeRule('no-literal-urls', function () {

0 commit comments

Comments
 (0)