mdl 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +78 -0
- data/docs/RULES.md +197 -7
- data/docs/configuration.md +7 -3
- data/docs/rolling_a_release.md +23 -0
- data/lib/mdl.rb +13 -4
- data/lib/mdl/cli.rb +13 -2
- data/lib/mdl/doc.rb +29 -2
- data/lib/mdl/rules.rb +89 -1
- data/lib/mdl/styles/cirosantilli.rb +5 -0
- data/lib/mdl/styles/default.rb +2 -0
- data/lib/mdl/styles/relaxed.rb +3 -0
- data/lib/mdl/version.rb +1 -1
- data/mdl.gemspec +1 -1
- data/test/rule_tests/code_block_dollar.md +1 -1
- data/test/rule_tests/emphasis_instead_of_headers.md +35 -0
- data/test/rule_tests/fenced_code_blocks.md +6 -0
- data/test/rule_tests/fenced_code_without_blank_lines_style.rb +2 -0
- data/test/rule_tests/hr_style_dashes.md +22 -0
- data/test/rule_tests/hr_style_dashes_style.rb +2 -0
- data/test/rule_tests/hr_style_inconsistent.md +22 -0
- data/test/rule_tests/hr_style_long.md +22 -0
- data/test/rule_tests/hr_style_long_style.rb +2 -0
- data/test/rule_tests/hr_style_stars.md +22 -0
- data/test/rule_tests/hr_style_stars_style.rb +2 -0
- data/test/rule_tests/inline_html.md +13 -0
- data/test/rule_tests/links.md +9 -0
- data/test/rule_tests/reversed_link.md +1 -1
- data/test/rule_tests/spaces_inside_codespan_elements.md +7 -0
- data/test/rule_tests/spaces_inside_emphasis_markers.md +31 -0
- data/test/rule_tests/spaces_inside_link_text.md +7 -0
- data/test/rule_tests/trailing_spaces_br.md +4 -0
- data/test/rule_tests/trailing_spaces_br_style.rb +2 -0
- data/test/rule_tests/{whitespace issues.md → whitespace_issues.md} +0 -0
- data/test/test_ruledocs.rb +1 -1
- metadata +39 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 754ba4fcea65ab367c6851469bb744fbf4339800
|
4
|
+
data.tar.gz: 22488dfa5f78f22cbf15ea204eadd437854515da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9129f6ab9f1dc20326f2171eb70fd0d620becbc825f7b2d913a679b26a1f536643550f6db309590349ad1a7fcda3ae5cebed97e73bce5e1840ffb973348b2ec0
|
7
|
+
data.tar.gz: 554f83c5d7f92e0ae15442acab0d9d18a7b2052fafc3c61037e15140354c2db6c6fca38f4d9a8bfbce95a817d6975d911016735b040414ad825186e85b276d72
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
## [v0.2.0](https://github.com/mivok/markdownlint/tree/v0.2.0) (2015-04-13)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/mivok/markdownlint/compare/v0.1.0...v0.2.0)
|
6
|
+
|
7
|
+
### Rules added
|
8
|
+
|
9
|
+
* MD033 - Inline HTML
|
10
|
+
* MD034 - Bare URL used
|
11
|
+
* MD035 - Horizontal rule style
|
12
|
+
* MD036 - Emphasis used instead of a header
|
13
|
+
* MD037 - Spaces inside emphasis markers
|
14
|
+
* MD038 - Spaces inside code span elements
|
15
|
+
* MD039 - Spaces inside link text
|
16
|
+
* MD040 - Fenced code blocks should have a language specified
|
17
|
+
|
18
|
+
## Enhancements implemented
|
19
|
+
|
20
|
+
* Trailing spaces rule should allow an excemption for deliberate <br/\>
|
21
|
+
insertion.
|
22
|
+
* Rules can be excluded in .mdlrc and on the command line by specifying a rule
|
23
|
+
as ~MD000.
|
24
|
+
|
25
|
+
### Merged pull requests
|
26
|
+
|
27
|
+
* [Add parameter (value and default) information to rule documentation. - David Anson](https://github.com/mivok/markdownlint/pull/76)
|
28
|
+
|
29
|
+
## [v0.1.0](https://github.com/mivok/markdownlint/tree/v0.1.0) (2015-02-22)
|
30
|
+
|
31
|
+
[Full Changelog](https://github.com/mivok/markdownlint/compare/v0.0.1...v0.1.0)
|
32
|
+
|
33
|
+
### Rules added
|
34
|
+
|
35
|
+
* MD031 - Fenced code blocks should be surrounded by blank lines
|
36
|
+
* MD032 - Lists should be surrounded by blank lines
|
37
|
+
|
38
|
+
### Bugs fixed
|
39
|
+
|
40
|
+
* MD014 triggers when it shouldn't
|
41
|
+
|
42
|
+
### Merged pull requests
|
43
|
+
|
44
|
+
* [MD032 - Lists should be surrounded by blank lines - David Anson](https://github.com/mivok/markdownlint/pull/70)
|
45
|
+
* [MD031 - Fenced code blocks should be surrounded by blank lines - David Anson](https://github.com/mivok/markdownlint/pull/68)
|
46
|
+
* [Clarify how to specify your own style - mjankowski](https://github.com/mivok/markdownlint/pull/65)
|
47
|
+
* [Use single quotes to prevent early escaping - highb](https://github.com/mivok/markdownlint/pull/64)
|
48
|
+
|
49
|
+
## [v0.0.1](https://github.com/mivok/markdownlint/tree/v0.0.1) (2014-09-07)
|
50
|
+
|
51
|
+
### Rules added
|
52
|
+
|
53
|
+
* MD001 - Header levels should only increment by one level at a time
|
54
|
+
* MD002 - First header should be a h1 header
|
55
|
+
* MD003 - Header style
|
56
|
+
* MD004 - Unordered list style
|
57
|
+
* MD005 - Inconsistent indentation for list items at the same level
|
58
|
+
* MD006 - Consider starting bulleted lists at the beginning of the line
|
59
|
+
* MD007 - Unordered list indentation
|
60
|
+
* MD009 - Trailing spaces
|
61
|
+
* MD010 - Hard tabs
|
62
|
+
* MD011 - Reversed link syntax
|
63
|
+
* MD012 - Multiple consecutive blank lines
|
64
|
+
* MD013 - Line length
|
65
|
+
* MD014 - Dollar signs used before commands without showing output
|
66
|
+
* MD018 - No space after hash on atx style header
|
67
|
+
* MD019 - Multiple spaces after hash on atx style header
|
68
|
+
* MD020 - No space inside hashes on closed atx style header
|
69
|
+
* MD021 - Multiple spaces inside hashes on closed atx style header
|
70
|
+
* MD022 - Headers should be surrounded by blank lines
|
71
|
+
* MD023 - Headers must start at the beginning of the line
|
72
|
+
* MD024 - Multiple headers with the same content
|
73
|
+
* MD025 - Multiple top level headers in the same document
|
74
|
+
* MD026 - Trailing punctuation in header
|
75
|
+
* MD027 - Multiple spaces after blockquote symbol
|
76
|
+
* MD028 - Blank line inside blockquote
|
77
|
+
* MD029 - Ordered list item prefix
|
78
|
+
* MD030 - Spaces after list markers
|
data/docs/RULES.md
CHANGED
@@ -53,7 +53,7 @@ The first header in the document should be a h1 header:
|
|
53
53
|
|
54
54
|
Tags: headers
|
55
55
|
|
56
|
-
Parameters: style
|
56
|
+
Parameters: style ("consistent", "atx", "atx_closed", "setext"; default "consistent")
|
57
57
|
|
58
58
|
This rule is triggered when different header styles (atx, setext, and 'closed'
|
59
59
|
atx) are used in the same document:
|
@@ -79,7 +79,7 @@ document.
|
|
79
79
|
|
80
80
|
Tags: bullet, ul
|
81
81
|
|
82
|
-
Parameters: style
|
82
|
+
Parameters: style ("consistent", "asterisk", "plus", "dash"; default "consistent")
|
83
83
|
|
84
84
|
This rule is triggered when the symbols used in the document for unordered
|
85
85
|
list items do not match the configured unordered list style:
|
@@ -149,7 +149,7 @@ characters if you use 4 space tabs, or 1 character if you use 2 space tabs).
|
|
149
149
|
|
150
150
|
Tags: bullet, ul, indentation
|
151
151
|
|
152
|
-
Parameters: indent
|
152
|
+
Parameters: indent (number; default 2)
|
153
153
|
|
154
154
|
This rule is triggered when list items are not indented by the configured
|
155
155
|
number of spaces (default: 2).
|
@@ -182,9 +182,20 @@ for a description of the problem.
|
|
182
182
|
|
183
183
|
Tags: whitespace
|
184
184
|
|
185
|
+
Parameters: br_spaces (number; default: 0)
|
186
|
+
|
185
187
|
This rule is triggered on any lines that end with whitespace. To fix this,
|
186
188
|
find the line that is triggered and remove any trailing spaces from the end.
|
187
189
|
|
190
|
+
The br_spaces parameter allows an exception to this rule for a specific amount
|
191
|
+
of trailing spaces used to insert an explicit line break/br element. For
|
192
|
+
example, set br_spaces to 2 to allow exactly 2 spaces at the end of a line.
|
193
|
+
|
194
|
+
Note: you have to set br_spaces to 2 or higher for this exception to take
|
195
|
+
effect - you can't insert a br element with just a single trailing space, so
|
196
|
+
if you set br_spaces to 1, the exception will be disabled, just as if it was
|
197
|
+
set to the default of 0.
|
198
|
+
|
188
199
|
## MD010 - Hard tabs
|
189
200
|
|
190
201
|
Tags: whitespace, hard_tab
|
@@ -244,7 +255,7 @@ lines inside code blocks.
|
|
244
255
|
|
245
256
|
Tags: line_length
|
246
257
|
|
247
|
-
Parameters: line_length
|
258
|
+
Parameters: line_length (number; default 80)
|
248
259
|
|
249
260
|
This rule is triggered when there are lines that are longer than the
|
250
261
|
configured line length (default: 80 characters). To fix this, split the line
|
@@ -463,7 +474,7 @@ should be contained within this header.
|
|
463
474
|
|
464
475
|
Tags: headers
|
465
476
|
|
466
|
-
Parameters: punctuation
|
477
|
+
Parameters: punctuation (string; default ".,;:!?")
|
467
478
|
|
468
479
|
This rule is triggered on any header that has a punctuation character as the
|
469
480
|
last character in the line:
|
@@ -531,7 +542,7 @@ separate blockquotes.
|
|
531
542
|
|
532
543
|
Tags: ol
|
533
544
|
|
534
|
-
Parameters: style
|
545
|
+
Parameters: style ("one", "ordered"; default "one")
|
535
546
|
|
536
547
|
This rule is triggered on ordered lists that do not either start with '1.' or
|
537
548
|
do not have a prefix that increases in numerical order (depending on the
|
@@ -553,7 +564,7 @@ Example valid list if the style is configured as 'ordered':
|
|
553
564
|
|
554
565
|
Tags: ol, ul, whitespace
|
555
566
|
|
556
|
-
Parameters: ul_single, ol_single, ul_multi, ol_multi
|
567
|
+
Parameters: ul_single, ol_single, ul_multi, ol_multi (number, default 1)
|
557
568
|
|
558
569
|
This rule checks for the number of spaces between a list marker (e.g. '`-`',
|
559
570
|
'`*`', '`+`' or '`1.`') and the text of the list item.
|
@@ -682,3 +693,182 @@ items with hanging indents are okay:
|
|
682
693
|
|
683
694
|
* This is
|
684
695
|
okay
|
696
|
+
|
697
|
+
## MD033 - Inline HTML
|
698
|
+
|
699
|
+
Tags: html
|
700
|
+
|
701
|
+
This rule is triggered whenever raw HTML is used in a markdown document:
|
702
|
+
|
703
|
+
<h1>Inline HTML header</h1>
|
704
|
+
|
705
|
+
To fix this, use 'pure' markdown instead of including raw HTML:
|
706
|
+
|
707
|
+
# Markdown header
|
708
|
+
|
709
|
+
Rationale: Raw HTML is allowed in markdown, but this rule is included for
|
710
|
+
those who want their documents to only include "pure" markdown, or for those
|
711
|
+
who are rendering markdown documents in something other than HTML.
|
712
|
+
|
713
|
+
## MD034 - Bare URL used
|
714
|
+
|
715
|
+
Tags: links, url
|
716
|
+
|
717
|
+
This rule is triggered whenever a URL is given that isn't surrounded by angle
|
718
|
+
brackets:
|
719
|
+
|
720
|
+
For more information, see http://www.example.com/.
|
721
|
+
|
722
|
+
To fix this, add angle brackets around the URL:
|
723
|
+
|
724
|
+
For more information, see <http://www.example.com/>.
|
725
|
+
|
726
|
+
Rationale: Without angle brackets, the URL isn't converted into a link in many
|
727
|
+
markdown parsers.
|
728
|
+
|
729
|
+
Note: if you do want a bare URL without it being converted into a link,
|
730
|
+
enclose it in a code block, otherwise in some markdown parsers it _will_ be
|
731
|
+
converted:
|
732
|
+
|
733
|
+
`http://www.example.com`
|
734
|
+
|
735
|
+
## MD035 - Horizontal rule style
|
736
|
+
|
737
|
+
Tags: hr
|
738
|
+
|
739
|
+
Parameters: style ("consistent", "---", "***", or other string specifying the
|
740
|
+
horizontal rule; default "consistent")
|
741
|
+
|
742
|
+
This rule is triggered when inconsistent styles of horizontal rules used in
|
743
|
+
the document:
|
744
|
+
|
745
|
+
---
|
746
|
+
|
747
|
+
- - -
|
748
|
+
|
749
|
+
***
|
750
|
+
|
751
|
+
* * *
|
752
|
+
|
753
|
+
****
|
754
|
+
|
755
|
+
To fix this, ensure any horizontal rules used in the document are consistent,
|
756
|
+
or match the given style if the rule is so configured:
|
757
|
+
|
758
|
+
---
|
759
|
+
|
760
|
+
---
|
761
|
+
|
762
|
+
Note: by default, this rule is configured to just require that all horizontal
|
763
|
+
rules in the document are the same, and will trigger if any of the horizontal
|
764
|
+
rules are different than the first one encountered in the document. If you
|
765
|
+
want to configure the rule to match a specific style, the parameter given to
|
766
|
+
the 'style' option is a string containing the exact horizontal rule text that
|
767
|
+
is allowed.
|
768
|
+
|
769
|
+
## MD036 - Emphasis used instead of a header
|
770
|
+
|
771
|
+
Tags: headers, emphasis
|
772
|
+
|
773
|
+
This check looks for instances where emphasized (i.e. bold or italic) text is
|
774
|
+
used to separate sections, where a header should be used instead:
|
775
|
+
|
776
|
+
**My document**
|
777
|
+
|
778
|
+
Lorem ipsum dolor sit amet...
|
779
|
+
|
780
|
+
_Another section_
|
781
|
+
|
782
|
+
Consectetur adipiscing elit, sed do eiusmod.
|
783
|
+
|
784
|
+
To fix this, use markdown headers instead of emphasized text to denote
|
785
|
+
sections:
|
786
|
+
|
787
|
+
# My document
|
788
|
+
|
789
|
+
Lorem ipsum dolor sit amet...
|
790
|
+
|
791
|
+
## Another section
|
792
|
+
|
793
|
+
Consectetur adipiscing elit, sed do eiusmod.
|
794
|
+
|
795
|
+
Note: this rule looks for paragraphs that consist entirely of emphasized text.
|
796
|
+
It won't fire on emphasis used within regular text.
|
797
|
+
|
798
|
+
## MD037 - Spaces inside emphasis markers
|
799
|
+
|
800
|
+
Tags: whitespace, emphasis
|
801
|
+
|
802
|
+
This rule is triggered when emphasis markers (bold, italic) are used, but they
|
803
|
+
have spaces between the markers and the text:
|
804
|
+
|
805
|
+
Here is some ** bold ** text.
|
806
|
+
|
807
|
+
Here is some * italic * text.
|
808
|
+
|
809
|
+
Here is some more __ bold __ text.
|
810
|
+
|
811
|
+
Here is some more _ italic _ text.
|
812
|
+
|
813
|
+
To fix this, remove the spaces around the emphasis markers:
|
814
|
+
|
815
|
+
Here is some **bold** text.
|
816
|
+
|
817
|
+
Here is some *italic* text.
|
818
|
+
|
819
|
+
Here is some more __bold__ text.
|
820
|
+
|
821
|
+
Here is some more _italic_ text.
|
822
|
+
|
823
|
+
Rationale: Emphasis is only parsed as such when the asterisks/underscores
|
824
|
+
aren't completely surrounded by spaces. This rule attempts to detect where
|
825
|
+
they were surrounded by spaces, but it appears that emphasized text was
|
826
|
+
intended by the author.
|
827
|
+
|
828
|
+
## MD038 - Spaces inside code span elements
|
829
|
+
|
830
|
+
Tags: whitespace, code
|
831
|
+
|
832
|
+
This rule is triggered on code span elements that have spaces right inside the
|
833
|
+
backticks:
|
834
|
+
|
835
|
+
` some text `
|
836
|
+
|
837
|
+
`some text `
|
838
|
+
|
839
|
+
` some text`
|
840
|
+
|
841
|
+
To fix this, remove the spaces inside the codespan markers:
|
842
|
+
|
843
|
+
`some text`
|
844
|
+
|
845
|
+
## MD039 - Spaces inside link text
|
846
|
+
|
847
|
+
Tags: whitespace, links
|
848
|
+
|
849
|
+
This rule is triggered on links that have spaces surrounding the link text:
|
850
|
+
|
851
|
+
[ a link ](http://www.example.com/)
|
852
|
+
|
853
|
+
To fix this, remove the spaces surrounding the link text:
|
854
|
+
|
855
|
+
[a link](http://www.example.com/)
|
856
|
+
|
857
|
+
## MD040 - Fenced code blocks should have a language specified
|
858
|
+
|
859
|
+
Tags: code, language
|
860
|
+
|
861
|
+
This rule is triggered when fenced code blocks are used, but a language isn't
|
862
|
+
specified:
|
863
|
+
|
864
|
+
```
|
865
|
+
#!/bin/bash
|
866
|
+
echo Hello world
|
867
|
+
```
|
868
|
+
|
869
|
+
To fix this, add a language specifier to the code block:
|
870
|
+
|
871
|
+
```bash
|
872
|
+
#!/bin/bash
|
873
|
+
echo Hello world
|
874
|
+
```
|
data/docs/configuration.md
CHANGED
@@ -42,19 +42,23 @@ instead, and ignore any files git doesn't know about.
|
|
42
42
|
|
43
43
|
Tags - Limit the rules mdl enables to those containing the provided tags.
|
44
44
|
|
45
|
-
* Command line: `-t tag1,tag2`, `--tags tag1,tag2`
|
45
|
+
* Command line: `-t tag1,tag2`, `--tags tag1,tag2`, `-t ~tag1,~tag2`
|
46
46
|
* Config file: `tags "tag1", "tag2"`
|
47
47
|
* Default: process all rules (no tag limit)
|
48
48
|
|
49
49
|
Rules - Limit the rules mdl enables to those provided in this option.
|
50
50
|
|
51
|
-
* Command line: `-r MD001,MD002`, `--rules MD001,MD002`
|
51
|
+
* Command line: `-r MD001,MD002`, `--rules MD001,MD002`, `-r ~MD001,~MD002`
|
52
52
|
* Config file: `rules "MD001", "MD002"`
|
53
53
|
* Default: process all rules (no rule limit)
|
54
54
|
|
55
|
+
If a rule or tag ID is preceded by a tilde (`~`), then it _disables_ the
|
56
|
+
matching rules instead of enabling them, starting with all rules being enabled.
|
57
|
+
|
55
58
|
Note: if both `--rules` and `--tags` are provided, then a given rule has to
|
56
59
|
both be in the list of enabled rules, as well as be tagged with one of the
|
57
|
-
tags provided with the `--tags` option.
|
60
|
+
tags provided with the `--tags` option. Use the `-l/--list-rules` option to
|
61
|
+
test this behavior.
|
58
62
|
|
59
63
|
Style - Select which style mdl uses. A 'style' is a file containing a list of
|
60
64
|
enabled/disable rules, as well as options for some rules that take them. For
|
data/docs/rolling_a_release.md
CHANGED
@@ -12,6 +12,29 @@ Bump the version. Markdownlint uses semantic versioning. From
|
|
12
12
|
To bump the version, edit `lib/mdl/version.rb` and commit to the master
|
13
13
|
branch.
|
14
14
|
|
15
|
+
Update the changelog:
|
16
|
+
|
17
|
+
* Add a new header and 'full changelog' link for the new release:
|
18
|
+
|
19
|
+
## [v0.2.0](https://github.com/mivok/markdownlint/tree/v0.2.0) (2015-04-13)
|
20
|
+
|
21
|
+
[Full Changelog](https://github.com/mivok/markdownlint/compare/v0.1.0...v0.2.0)
|
22
|
+
|
23
|
+
* Add an 'Rules added' section, listing every new rule added for this version.
|
24
|
+
* Use `git diff v0.1.0..v0.2.0 docs/RULES.md | grep '## MD'` to discover
|
25
|
+
what these are.
|
26
|
+
* Search for closed issues:
|
27
|
+
* Go to <https://github.com/mivok/markdownlint/issues>
|
28
|
+
* Search for `is:closed closed:>1900-01-01`, changing the date to the date
|
29
|
+
of the last release.
|
30
|
+
* From this list of issues, make sections for:
|
31
|
+
* Enhancements implemented
|
32
|
+
* Bugs fixed
|
33
|
+
* Search for merged pull requests:
|
34
|
+
* Search for `is:pull-request merged:>1900-01-01`
|
35
|
+
* Add an entry for each merged pull request:
|
36
|
+
* `[Title - author](https://github.com/mivok/markdownlint/pull/NN)`
|
37
|
+
|
15
38
|
Next, run `rake release`. This will:
|
16
39
|
|
17
40
|
* Tag vX.Y.Z in git and push it.
|
data/lib/mdl.rb
CHANGED
@@ -13,11 +13,21 @@ module MarkdownLint
|
|
13
13
|
cli = MarkdownLint::CLI.new
|
14
14
|
cli.run
|
15
15
|
rules = RuleSet.load_default
|
16
|
-
|
16
|
+
Style.load(Config[:style], rules)
|
17
17
|
# Rule option filter
|
18
|
-
|
18
|
+
if Config[:rules]
|
19
|
+
rules.select! {|r| Config[:rules][:include].include?(r) } \
|
20
|
+
unless Config[:rules][:include].empty?
|
21
|
+
rules.select! {|r| not Config[:rules][:exclude].include?(r) } \
|
22
|
+
unless Config[:rules][:exclude].empty?
|
23
|
+
end
|
19
24
|
# Tag option filter
|
20
|
-
|
25
|
+
if Config[:tags]
|
26
|
+
rules.select! {|r, v| not (v.tags & Config[:tags][:include]).empty? } \
|
27
|
+
unless Config[:tags][:include].empty?
|
28
|
+
rules.select! {|r, v| (v.tags & Config[:tags][:exclude]).empty? } \
|
29
|
+
unless Config[:tags][:exclude].empty?
|
30
|
+
end
|
21
31
|
|
22
32
|
if Config[:list_rules]
|
23
33
|
puts "Enabled rules:"
|
@@ -34,7 +44,6 @@ module MarkdownLint
|
|
34
44
|
# Recurse into directories
|
35
45
|
cli.cli_arguments.each_with_index do |filename, i|
|
36
46
|
if Dir.exist?(filename)
|
37
|
-
pattern = "#{filename}/**/*.md" # This works for both Dir and ls-files
|
38
47
|
if Config[:git_recurse]
|
39
48
|
Dir.chdir(filename) do
|
40
49
|
cli.cli_arguments[i] = %x(git ls-files '*.md').split("\n")
|
data/lib/mdl/cli.rb
CHANGED
@@ -28,13 +28,13 @@ module MarkdownLint
|
|
28
28
|
:short => '-t',
|
29
29
|
:long => '--tags TAG1,TAG2',
|
30
30
|
:description => 'Only process rules with these tags',
|
31
|
-
:proc => Proc.new { |v| v
|
31
|
+
:proc => Proc.new { |v| toggle_list(v, true) }
|
32
32
|
|
33
33
|
option :rules,
|
34
34
|
:short => '-r',
|
35
35
|
:long => '--rules RULE1,RULE2',
|
36
36
|
:description => 'Only process these rules',
|
37
|
-
:proc => Proc.new { |v| v
|
37
|
+
:proc => Proc.new { |v| toggle_list(v) }
|
38
38
|
|
39
39
|
option :style,
|
40
40
|
:short => '-s',
|
@@ -85,5 +85,16 @@ module MarkdownLint
|
|
85
85
|
cli_arguments << "-"
|
86
86
|
end
|
87
87
|
end
|
88
|
+
|
89
|
+
def self.toggle_list(s, to_sym=false)
|
90
|
+
parts = s.split(',')
|
91
|
+
inc = parts.select{|p| not p.start_with?('~')}
|
92
|
+
exc = parts.select{|p| p.start_with?('~')}.map{|p| p[1..-1]}
|
93
|
+
if to_sym
|
94
|
+
inc.map!{|p| p.to_sym}
|
95
|
+
exc.map!{|p| p.to_sym}
|
96
|
+
end
|
97
|
+
{:include => inc, :exclude => exc}
|
98
|
+
end
|
88
99
|
end
|
89
100
|
end
|
data/lib/mdl/doc.rb
CHANGED
@@ -84,6 +84,33 @@ module MarkdownLint
|
|
84
84
|
results
|
85
85
|
end
|
86
86
|
|
87
|
+
##
|
88
|
+
# A variation on find_type_elements that allows you to skip drilling down
|
89
|
+
# into children of specific element types.
|
90
|
+
#
|
91
|
+
# Instead of a single type, a list of types can be provided instead to
|
92
|
+
# find all types.
|
93
|
+
#
|
94
|
+
# Unlike find_type_elements, this method will always search for nested
|
95
|
+
# elements, and skip the element types given to nested_except.
|
96
|
+
|
97
|
+
def find_type_elements_except(type, nested_except=[], elements=@elements)
|
98
|
+
results = []
|
99
|
+
if type.class == Symbol
|
100
|
+
type = [type]
|
101
|
+
end
|
102
|
+
if nested_except.class == Symbol
|
103
|
+
nested_except = [nested_except]
|
104
|
+
end
|
105
|
+
elements.each do |e|
|
106
|
+
results.push(e) if type.include?(e.type)
|
107
|
+
unless nested_except.include?(e.type) or e.children.empty?
|
108
|
+
results.concat(find_type_elements_except(type, nested_except, e.children))
|
109
|
+
end
|
110
|
+
end
|
111
|
+
results
|
112
|
+
end
|
113
|
+
|
87
114
|
##
|
88
115
|
# Returns the line number a given element is located on in the source
|
89
116
|
# file. You can pass in either an element object or an options hash here.
|
@@ -186,9 +213,9 @@ module MarkdownLint
|
|
186
213
|
# Returns line numbers for lines that match the given regular expression.
|
187
214
|
# Only considers text inside of 'text' elements (i.e. regular markdown
|
188
215
|
# text and not code/links or other elements).
|
189
|
-
def matching_text_element_lines(re)
|
216
|
+
def matching_text_element_lines(re, exclude_nested=[:a])
|
190
217
|
matches = []
|
191
|
-
|
218
|
+
find_type_elements_except(:text, exclude_nested).each do |e|
|
192
219
|
first_line = e.options[:location]
|
193
220
|
lines = e.value.split("\n")
|
194
221
|
lines.each_with_index do |l, i|
|
data/lib/mdl/rules.rb
CHANGED
@@ -115,8 +115,13 @@ end
|
|
115
115
|
|
116
116
|
rule "MD009", "Trailing spaces" do
|
117
117
|
tags :whitespace
|
118
|
+
params :br_spaces => 0
|
118
119
|
check do |doc|
|
119
|
-
doc.matching_lines(/\s$/)
|
120
|
+
errors = doc.matching_lines(/\s$/)
|
121
|
+
if params[:br_spaces] > 1
|
122
|
+
errors -= doc.matching_lines(/\S\s{#{params[:br_spaces]}}$/)
|
123
|
+
end
|
124
|
+
errors
|
120
125
|
end
|
121
126
|
end
|
122
127
|
|
@@ -442,3 +447,86 @@ rule "MD032", "Lists should be surrounded by blank lines" do
|
|
442
447
|
errors.uniq
|
443
448
|
end
|
444
449
|
end
|
450
|
+
|
451
|
+
rule "MD033", "Inline HTML" do
|
452
|
+
tags :html
|
453
|
+
check do |doc|
|
454
|
+
doc.element_linenumbers(doc.find_type(:html_element))
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
rule "MD034", "Bare URL used" do
|
459
|
+
tags :links, :url
|
460
|
+
check do |doc|
|
461
|
+
doc.matching_text_element_lines(/https?:\/\//)
|
462
|
+
end
|
463
|
+
end
|
464
|
+
|
465
|
+
rule "MD035", "Horizontal rule style" do
|
466
|
+
tags :hr
|
467
|
+
params :style => :consistent
|
468
|
+
check do |doc|
|
469
|
+
hrs = doc.find_type(:hr)
|
470
|
+
if hrs.empty?
|
471
|
+
[]
|
472
|
+
else
|
473
|
+
if params[:style] == :consistent
|
474
|
+
doc_style = doc.element_line(hrs[0])
|
475
|
+
else
|
476
|
+
doc_style = params[:style]
|
477
|
+
end
|
478
|
+
doc.element_linenumbers(hrs.select{|e| doc.element_line(e) != doc_style})
|
479
|
+
end
|
480
|
+
end
|
481
|
+
end
|
482
|
+
|
483
|
+
rule "MD036", "Emphasis used instead of a header" do
|
484
|
+
tags :headers, :emphasis
|
485
|
+
check do |doc|
|
486
|
+
# We are looking for a paragraph consisting entirely of emphasized
|
487
|
+
# (italic/bold) text.
|
488
|
+
doc.element_linenumbers(doc.find_type_elements(:p, false).select{|p|
|
489
|
+
p.children.length == 1 && [:em, :strong].include?(p.children[0].type)})
|
490
|
+
end
|
491
|
+
end
|
492
|
+
|
493
|
+
rule "MD037", "Spaces inside emphasis markers" do
|
494
|
+
tags :whitespace, :emphasis
|
495
|
+
check do |doc|
|
496
|
+
# Kramdown doesn't parse emphasis with spaces, which means we can just
|
497
|
+
# look for emphasis patterns inside regular text with spaces just inside
|
498
|
+
# them.
|
499
|
+
(doc.matching_text_element_lines(/(\*\*?|__?)\s.+\1/) | \
|
500
|
+
doc.matching_text_element_lines(/(\*\*?|__?).+\s\1/)).sort
|
501
|
+
end
|
502
|
+
end
|
503
|
+
|
504
|
+
rule "MD038", "Spaces inside code span elements" do
|
505
|
+
tags :whitespace, :code
|
506
|
+
check do |doc|
|
507
|
+
# We only want to check single line codespan elements and not fenced code
|
508
|
+
# block that happen to be parsed as code spans.
|
509
|
+
doc.element_linenumbers(doc.find_type_elements(:codespan).select{
|
510
|
+
|i| i.value.match(/(^\s|\s$)/) and not i.value.include?("\n")})
|
511
|
+
end
|
512
|
+
end
|
513
|
+
|
514
|
+
rule "MD039", "Spaces inside link text" do
|
515
|
+
tags :whitespace, :links
|
516
|
+
check do |doc|
|
517
|
+
doc.element_linenumbers(doc.find_type_elements(:a).select{|e|
|
518
|
+
e.children[0].value.start_with?(" ") or
|
519
|
+
e.children[0].value.end_with?(" ")})
|
520
|
+
end
|
521
|
+
end
|
522
|
+
|
523
|
+
rule "MD040", "Fenced code blocks should have a language specified" do
|
524
|
+
tags :code, :language
|
525
|
+
check do |doc|
|
526
|
+
# Kramdown parses code blocks with language settings as code blocks with
|
527
|
+
# the class attribute set to language-languagename.
|
528
|
+
doc.element_linenumbers(doc.find_type_elements(:codeblock).select{|i|
|
529
|
+
not i.attr['class'].to_s.start_with?("language-") and
|
530
|
+
not doc.element_line(i).start_with?(" ")})
|
531
|
+
end
|
532
|
+
end
|
@@ -4,3 +4,8 @@ rule 'MD003', :style => :atx
|
|
4
4
|
rule 'MD004', :style => :dash
|
5
5
|
rule 'MD007', :indent => 4
|
6
6
|
rule 'MD030', :ul_multi => 3, :ol_multi => 2
|
7
|
+
rule 'MD035', :style => "---"
|
8
|
+
|
9
|
+
# Inline HTML - this isn't forbidden by the style guide, and raw HTML use is
|
10
|
+
# explicitly mentioned in the 'email automatic links' section.
|
11
|
+
exclude_rule 'MD033'
|
data/lib/mdl/styles/default.rb
CHANGED
data/lib/mdl/styles/relaxed.rb
CHANGED
@@ -4,3 +4,6 @@ exclude_tag :line_length
|
|
4
4
|
|
5
5
|
exclude_rule 'MD006' # Lists at beginning of line
|
6
6
|
exclude_rule 'MD007' # List indentation
|
7
|
+
exclude_rule 'MD033' # Inline HTML
|
8
|
+
exclude_rule 'MD034' # Bare URL used
|
9
|
+
exclude_rule 'MD040' # Fenced code blocks should have a language specified
|
data/lib/mdl/version.rb
CHANGED
data/mdl.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["mark@mivok.net"]
|
11
11
|
spec.summary = %q{Markdown lint tool}
|
12
12
|
spec.description = %q{Style checker/lint tool for markdown files}
|
13
|
-
spec.homepage = "http://github.com/mivok/
|
13
|
+
spec.homepage = "http://github.com/mivok/markdownlint"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -0,0 +1,35 @@
|
|
1
|
+
**Section 1: the first section {MD036}**
|
2
|
+
|
3
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
|
4
|
+
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
5
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
6
|
+
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
|
7
|
+
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
|
8
|
+
in culpa qui officia deserunt mollit anim id est laborum.
|
9
|
+
|
10
|
+
__Section 1.1: another section {MD036}__
|
11
|
+
|
12
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
|
13
|
+
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
14
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
15
|
+
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
|
16
|
+
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
|
17
|
+
in culpa qui officia deserunt mollit anim id est laborum.
|
18
|
+
|
19
|
+
*Section 2: yet more sections {MD036}*
|
20
|
+
|
21
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
|
22
|
+
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
|
23
|
+
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
24
|
+
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
|
25
|
+
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
|
26
|
+
in culpa qui officia deserunt mollit anim id est laborum.
|
27
|
+
|
28
|
+
_Section 3: oh no more sections {MD036}_
|
29
|
+
|
30
|
+
This is a normal paragraph
|
31
|
+
**that just happens to have emphasized text in**
|
32
|
+
even though the emphasized text is on its own line.
|
33
|
+
|
34
|
+
This is another **normal** paragraph with some text in it. This also should
|
35
|
+
not trigger the rule.
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Regular header
|
2
|
+
|
3
|
+
<h1>Inline HTML Header {MD033}</h1>
|
4
|
+
|
5
|
+
<p>More inline HTML {MD033}
|
6
|
+
but this time on multiple lines
|
7
|
+
</p>
|
8
|
+
|
9
|
+
<h1>This shouldn't trigger as it's inside a code block</h1>
|
10
|
+
|
11
|
+
```text
|
12
|
+
<p>Neither should this as it's also in a code block</p>
|
13
|
+
```
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Line with *Normal emphasis*
|
2
|
+
|
3
|
+
Line with **Normal strong**
|
4
|
+
|
5
|
+
Line with _Normal emphasis_
|
6
|
+
|
7
|
+
Line with __Normal strong__
|
8
|
+
|
9
|
+
Broken * emphasis * with spaces in {MD037}
|
10
|
+
|
11
|
+
Broken ** strong ** with spaces in {MD037}
|
12
|
+
|
13
|
+
Broken _ emphasis _ with spaces in {MD037}
|
14
|
+
|
15
|
+
Broken __ strong __ with spaces in {MD037}
|
16
|
+
|
17
|
+
Mixed *ok emphasis* and * broken emphasis * {MD037}
|
18
|
+
|
19
|
+
Mixed **ok strong** and ** broken strong ** {MD037}
|
20
|
+
|
21
|
+
Mixed _ok emphasis_ and _ broken emphasis _ {MD037}
|
22
|
+
|
23
|
+
Mixed __ok strong__ and __ broken strong __ {MD037}
|
24
|
+
|
25
|
+
Mixed *ok emphasis* **ok strong** * broken emphasis * {MD037}
|
26
|
+
|
27
|
+
Multiple * broken emphasis * _ broken emphasis _ {MD037}
|
28
|
+
|
29
|
+
One-sided *broken emphasis * {MD037}
|
30
|
+
|
31
|
+
One-sided * broken emphasis* {MD037}
|
File without changes
|
data/test/test_ruledocs.rb
CHANGED
@@ -19,7 +19,7 @@ class TestRuledocs < Minitest::Test
|
|
19
19
|
curr_rule = $1
|
20
20
|
elsif l.match(/^Tags: (.*)$/)
|
21
21
|
rules[curr_rule][:tags] = $1.split(',').map{|i| i.strip.to_sym}
|
22
|
-
elsif l.match(/^Parameters: (.*)$/)
|
22
|
+
elsif l.match(/^Parameters: (.*)(\(.*\)?)$/)
|
23
23
|
rules[curr_rule][:params] = $1.split(',').map{|i| i.strip.to_sym}
|
24
24
|
end
|
25
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mdl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Harrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kramdown
|
@@ -136,6 +136,7 @@ extra_rdoc_files: []
|
|
136
136
|
files:
|
137
137
|
- ".gitignore"
|
138
138
|
- ".travis.yml"
|
139
|
+
- CHANGELOG.md
|
139
140
|
- Gemfile
|
140
141
|
- LICENSE.txt
|
141
142
|
- README.md
|
@@ -174,9 +175,11 @@ files:
|
|
174
175
|
- test/rule_tests/consistent_bullet_styles_asterisk.md
|
175
176
|
- test/rule_tests/consistent_bullet_styles_dash.md
|
176
177
|
- test/rule_tests/consistent_bullet_styles_plus.md
|
178
|
+
- test/rule_tests/emphasis_instead_of_headers.md
|
177
179
|
- test/rule_tests/empty_doc.md
|
178
180
|
- test/rule_tests/fenced_code_blocks.md
|
179
181
|
- test/rule_tests/fenced_code_without_blank_lines.md
|
182
|
+
- test/rule_tests/fenced_code_without_blank_lines_style.rb
|
180
183
|
- test/rule_tests/first_header_bad_atx.md
|
181
184
|
- test/rule_tests/first_header_bad_setext.md
|
182
185
|
- test/rule_tests/first_header_good_atx.md
|
@@ -192,6 +195,13 @@ files:
|
|
192
195
|
- test/rule_tests/headers_surrounding_space_atx.md
|
193
196
|
- test/rule_tests/headers_surrounding_space_setext.md
|
194
197
|
- test/rule_tests/headers_with_spaces_at_the_beginning.md
|
198
|
+
- test/rule_tests/hr_style_dashes.md
|
199
|
+
- test/rule_tests/hr_style_dashes_style.rb
|
200
|
+
- test/rule_tests/hr_style_inconsistent.md
|
201
|
+
- test/rule_tests/hr_style_long.md
|
202
|
+
- test/rule_tests/hr_style_long_style.rb
|
203
|
+
- test/rule_tests/hr_style_stars.md
|
204
|
+
- test/rule_tests/hr_style_stars_style.rb
|
195
205
|
- test/rule_tests/inconsistent_bullet_indent_same_level.md
|
196
206
|
- test/rule_tests/inconsistent_bullet_styles_asterisk.md
|
197
207
|
- test/rule_tests/inconsistent_bullet_styles_dash.md
|
@@ -208,6 +218,8 @@ files:
|
|
208
218
|
- test/rule_tests/incorrect_header_atx_style.rb
|
209
219
|
- test/rule_tests/incorrect_header_setext.md
|
210
220
|
- test/rule_tests/incorrect_header_setext_style.rb
|
221
|
+
- test/rule_tests/inline_html.md
|
222
|
+
- test/rule_tests/links.md
|
211
223
|
- test/rule_tests/lists_without_blank_lines.md
|
212
224
|
- test/rule_tests/long_lines.md
|
213
225
|
- test/rule_tests/long_lines_100.md
|
@@ -221,14 +233,19 @@ files:
|
|
221
233
|
- test/rule_tests/reversed_link.md
|
222
234
|
- test/rule_tests/spaces_after_list_marker.md
|
223
235
|
- test/rule_tests/spaces_after_list_marker_style.rb
|
224
|
-
- test/rule_tests/
|
236
|
+
- test/rule_tests/spaces_inside_codespan_elements.md
|
237
|
+
- test/rule_tests/spaces_inside_emphasis_markers.md
|
238
|
+
- test/rule_tests/spaces_inside_link_text.md
|
239
|
+
- test/rule_tests/trailing_spaces_br.md
|
240
|
+
- test/rule_tests/trailing_spaces_br_style.rb
|
241
|
+
- test/rule_tests/whitespace_issues.md
|
225
242
|
- test/setup_tests.rb
|
226
243
|
- test/test_ruledocs.rb
|
227
244
|
- test/test_rules.rb
|
228
245
|
- tools/README.md
|
229
246
|
- tools/test_location.rb
|
230
247
|
- tools/view_markdown.rb
|
231
|
-
homepage: http://github.com/mivok/
|
248
|
+
homepage: http://github.com/mivok/markdownlint
|
232
249
|
licenses:
|
233
250
|
- MIT
|
234
251
|
metadata: {}
|
@@ -266,9 +283,11 @@ test_files:
|
|
266
283
|
- test/rule_tests/consistent_bullet_styles_asterisk.md
|
267
284
|
- test/rule_tests/consistent_bullet_styles_dash.md
|
268
285
|
- test/rule_tests/consistent_bullet_styles_plus.md
|
286
|
+
- test/rule_tests/emphasis_instead_of_headers.md
|
269
287
|
- test/rule_tests/empty_doc.md
|
270
288
|
- test/rule_tests/fenced_code_blocks.md
|
271
289
|
- test/rule_tests/fenced_code_without_blank_lines.md
|
290
|
+
- test/rule_tests/fenced_code_without_blank_lines_style.rb
|
272
291
|
- test/rule_tests/first_header_bad_atx.md
|
273
292
|
- test/rule_tests/first_header_bad_setext.md
|
274
293
|
- test/rule_tests/first_header_good_atx.md
|
@@ -284,6 +303,13 @@ test_files:
|
|
284
303
|
- test/rule_tests/headers_surrounding_space_atx.md
|
285
304
|
- test/rule_tests/headers_surrounding_space_setext.md
|
286
305
|
- test/rule_tests/headers_with_spaces_at_the_beginning.md
|
306
|
+
- test/rule_tests/hr_style_dashes.md
|
307
|
+
- test/rule_tests/hr_style_dashes_style.rb
|
308
|
+
- test/rule_tests/hr_style_inconsistent.md
|
309
|
+
- test/rule_tests/hr_style_long.md
|
310
|
+
- test/rule_tests/hr_style_long_style.rb
|
311
|
+
- test/rule_tests/hr_style_stars.md
|
312
|
+
- test/rule_tests/hr_style_stars_style.rb
|
287
313
|
- test/rule_tests/inconsistent_bullet_indent_same_level.md
|
288
314
|
- test/rule_tests/inconsistent_bullet_styles_asterisk.md
|
289
315
|
- test/rule_tests/inconsistent_bullet_styles_dash.md
|
@@ -300,6 +326,8 @@ test_files:
|
|
300
326
|
- test/rule_tests/incorrect_header_atx_style.rb
|
301
327
|
- test/rule_tests/incorrect_header_setext.md
|
302
328
|
- test/rule_tests/incorrect_header_setext_style.rb
|
329
|
+
- test/rule_tests/inline_html.md
|
330
|
+
- test/rule_tests/links.md
|
303
331
|
- test/rule_tests/lists_without_blank_lines.md
|
304
332
|
- test/rule_tests/long_lines.md
|
305
333
|
- test/rule_tests/long_lines_100.md
|
@@ -313,7 +341,13 @@ test_files:
|
|
313
341
|
- test/rule_tests/reversed_link.md
|
314
342
|
- test/rule_tests/spaces_after_list_marker.md
|
315
343
|
- test/rule_tests/spaces_after_list_marker_style.rb
|
316
|
-
- test/rule_tests/
|
344
|
+
- test/rule_tests/spaces_inside_codespan_elements.md
|
345
|
+
- test/rule_tests/spaces_inside_emphasis_markers.md
|
346
|
+
- test/rule_tests/spaces_inside_link_text.md
|
347
|
+
- test/rule_tests/trailing_spaces_br.md
|
348
|
+
- test/rule_tests/trailing_spaces_br_style.rb
|
349
|
+
- test/rule_tests/whitespace_issues.md
|
317
350
|
- test/setup_tests.rb
|
318
351
|
- test/test_ruledocs.rb
|
319
352
|
- test/test_rules.rb
|
353
|
+
has_rdoc:
|