mdl 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.travis.yml +7 -0
  4. data/Gemfile +2 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +79 -0
  7. data/Rakefile +8 -0
  8. data/bin/mdl +10 -0
  9. data/docs/RULES.md +609 -0
  10. data/docs/creating_rules.md +83 -0
  11. data/docs/creating_styles.md +47 -0
  12. data/example/markdown_spec.md +897 -0
  13. data/lib/mdl.rb +72 -0
  14. data/lib/mdl/cli.rb +89 -0
  15. data/lib/mdl/config.rb +9 -0
  16. data/lib/mdl/doc.rb +252 -0
  17. data/lib/mdl/kramdown_parser.rb +29 -0
  18. data/lib/mdl/rules.rb +393 -0
  19. data/lib/mdl/ruleset.rb +47 -0
  20. data/lib/mdl/style.rb +50 -0
  21. data/lib/mdl/styles/all.rb +1 -0
  22. data/lib/mdl/styles/cirosantilli.rb +6 -0
  23. data/lib/mdl/styles/default.rb +1 -0
  24. data/lib/mdl/styles/relaxed.rb +6 -0
  25. data/lib/mdl/version.rb +3 -0
  26. data/mdl.gemspec +31 -0
  27. data/test/rule_tests/atx_closed_header_spacing.md +17 -0
  28. data/test/rule_tests/atx_header_spacing.md +5 -0
  29. data/test/rule_tests/blockquote_blank_lines.md +31 -0
  30. data/test/rule_tests/blockquote_spaces.md +21 -0
  31. data/test/rule_tests/bulleted_list_2_space_indent.md +6 -0
  32. data/test/rule_tests/bulleted_list_2_space_indent_style.rb +2 -0
  33. data/test/rule_tests/bulleted_list_4_space_indent.md +3 -0
  34. data/test/rule_tests/bulleted_list_not_at_beginning_of_line.md +14 -0
  35. data/test/rule_tests/code_block_dollar.md +22 -0
  36. data/test/rule_tests/consecutive_blank_lines.md +11 -0
  37. data/test/rule_tests/consistent_bullet_styles_asterisk.md +3 -0
  38. data/test/rule_tests/consistent_bullet_styles_dash.md +3 -0
  39. data/test/rule_tests/consistent_bullet_styles_plus.md +3 -0
  40. data/test/rule_tests/empty_doc.md +0 -0
  41. data/test/rule_tests/fenced_code_blocks.md +21 -0
  42. data/test/rule_tests/first_header_bad_atx.md +1 -0
  43. data/test/rule_tests/first_header_bad_setext.md +2 -0
  44. data/test/rule_tests/first_header_good_atx.md +1 -0
  45. data/test/rule_tests/first_header_good_setext.md +2 -0
  46. data/test/rule_tests/header_duplicate_content.md +11 -0
  47. data/test/rule_tests/header_multiple_toplevel.md +3 -0
  48. data/test/rule_tests/header_mutliple_h1_no_toplevel.md +5 -0
  49. data/test/rule_tests/header_trailing_punctuation.md +11 -0
  50. data/test/rule_tests/header_trailing_punctuation_customized.md +14 -0
  51. data/test/rule_tests/header_trailing_punctuation_customized_style.rb +2 -0
  52. data/test/rule_tests/headers_bad.md +7 -0
  53. data/test/rule_tests/headers_good.md +5 -0
  54. data/test/rule_tests/headers_surrounding_space_atx.md +9 -0
  55. data/test/rule_tests/headers_surrounding_space_setext.md +15 -0
  56. data/test/rule_tests/headers_with_spaces_at_the_beginning.md +9 -0
  57. data/test/rule_tests/inconsistent_bullet_indent_same_level.md +4 -0
  58. data/test/rule_tests/inconsistent_bullet_styles_asterisk.md +3 -0
  59. data/test/rule_tests/inconsistent_bullet_styles_dash.md +3 -0
  60. data/test/rule_tests/inconsistent_bullet_styles_plus.md +3 -0
  61. data/test/rule_tests/incorrect_bullet_style_asterisk.md +3 -0
  62. data/test/rule_tests/incorrect_bullet_style_asterisk_style.rb +2 -0
  63. data/test/rule_tests/incorrect_bullet_style_dash.md +3 -0
  64. data/test/rule_tests/incorrect_bullet_style_dash_style.rb +2 -0
  65. data/test/rule_tests/incorrect_bullet_style_plus.md +3 -0
  66. data/test/rule_tests/incorrect_bullet_style_plus_style.rb +2 -0
  67. data/test/rule_tests/incorrect_header_atx.md +6 -0
  68. data/test/rule_tests/incorrect_header_atx_closed.md +6 -0
  69. data/test/rule_tests/incorrect_header_atx_closed_style.rb +2 -0
  70. data/test/rule_tests/incorrect_header_atx_style.rb +2 -0
  71. data/test/rule_tests/incorrect_header_setext.md +6 -0
  72. data/test/rule_tests/incorrect_header_setext_style.rb +2 -0
  73. data/test/rule_tests/long_lines.md +3 -0
  74. data/test/rule_tests/long_lines_100.md +7 -0
  75. data/test/rule_tests/long_lines_100_style.rb +2 -0
  76. data/test/rule_tests/mixed_header_types_atx.md +6 -0
  77. data/test/rule_tests/mixed_header_types_atx_closed.md +6 -0
  78. data/test/rule_tests/mixed_header_types_setext.md +6 -0
  79. data/test/rule_tests/ordered_list_item_prefix.md +13 -0
  80. data/test/rule_tests/ordered_list_item_prefix_ordered.md +13 -0
  81. data/test/rule_tests/ordered_list_item_prefix_ordered_style.rb +2 -0
  82. data/test/rule_tests/reversed_link.md +7 -0
  83. data/test/rule_tests/spaces_after_list_marker.md +74 -0
  84. data/test/rule_tests/spaces_after_list_marker_style.rb +3 -0
  85. data/test/rule_tests/whitespace issues.md +3 -0
  86. data/test/setup_tests.rb +5 -0
  87. data/test/test_ruledocs.rb +45 -0
  88. data/test/test_rules.rb +56 -0
  89. data/tools/README.md +3 -0
  90. data/tools/test_location.rb +20 -0
  91. data/tools/view_markdown.rb +11 -0
  92. metadata +314 -0
@@ -0,0 +1 @@
1
+ all
@@ -0,0 +1,6 @@
1
+ # Enforce the style guide at http://www.cirosantilli.com/markdown-styleguide
2
+ all
3
+ rule 'MD003', :style => :atx
4
+ rule 'MD004', :style => :dash
5
+ rule 'MD007', :indent => 4
6
+ rule 'MD030', :ul_multi => 3, :ol_multi => 2
@@ -0,0 +1 @@
1
+ all
@@ -0,0 +1,6 @@
1
+ all
2
+ exclude_tag :whitespace
3
+ exclude_tag :line_length
4
+
5
+ exclude_rule 'MD006' # Lists at beginning of line
6
+ exclude_rule 'MD007' # List indentation
@@ -0,0 +1,3 @@
1
+ module MarkdownLint
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mdl/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mdl"
8
+ spec.version = MarkdownLint::VERSION
9
+ spec.authors = ["Mark Harrison"]
10
+ spec.email = ["mark@mivok.net"]
11
+ spec.summary = %q{Markdown lint tool}
12
+ spec.description = %q{Style checker/lint tool for markdown files}
13
+ spec.homepage = "http://github.com/mivok/mdl"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.required_ruby_version = '>= 1.9.2'
22
+
23
+ spec.add_dependency 'kramdown', '~> 1.4', '>= 1.4.0'
24
+ spec.add_dependency 'mixlib-config', '~> 2.1', '>= 2.1.0'
25
+ spec.add_dependency 'mixlib-cli', '~> 1.5', '>= 1.5.0'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.5'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
29
+ spec.add_development_dependency 'minitest', '~> 5.0'
30
+ spec.add_development_dependency 'pry', '~> 0.10'
31
+ end
@@ -0,0 +1,17 @@
1
+ #Header 1 {MD020} #
2
+
3
+ ## Header 2 {MD020}##
4
+
5
+ ##Header 3 {MD020}##
6
+
7
+ ## Header 4 {MD021} ##
8
+
9
+ ## Header 5 {MD021} ##
10
+
11
+ ## Header 6 {MD021} ##
12
+
13
+ ## Header 7 {MD021} ##
14
+
15
+ ## Header 8 \#
16
+
17
+ ## Header 9 \#
@@ -0,0 +1,5 @@
1
+ #Header 1 {MD018}
2
+
3
+ ## Header 2 {MD019}
4
+
5
+ ## Header 3 {MD019}
@@ -0,0 +1,31 @@
1
+ Some text
2
+
3
+ > a quote
4
+ > same quote
5
+
6
+ > blank line above me
7
+
8
+
9
+ > two blank lines above me
10
+
11
+ > space above me
12
+
13
+ * List with embedded blockquote
14
+
15
+ > Test
16
+ > Test
17
+
18
+ > Test
19
+
20
+ * Item 2
21
+
22
+ > Test. The blank line below should _not_ trigger MD028 as one blockquote is
23
+ > inside the list, and the other is outside it.
24
+
25
+ > Test
26
+
27
+ Expected errors:
28
+
29
+ {MD028:5} {MD028:8} {MD028:10} {MD028:17}
30
+ {MD009:10} (trailing space is intentional)
31
+ {MD012:8} (multiple blank lines are intentional)
@@ -0,0 +1,21 @@
1
+ Some text
2
+
3
+ > Hello world
4
+ > Foo {MD027}
5
+ > Bar {MD027}
6
+
7
+ This tests other things embedded in the blockquote:
8
+
9
+ > *Hello world*
10
+ > *foo* {MD027}
11
+ > **bar** {MD027}
12
+ > "Baz" {MD027}
13
+ > *foo*
14
+ > **bar**
15
+ > 'baz'
16
+
17
+ Test the first line being indented too much:
18
+
19
+ > Foo {MD027}
20
+ > Bar {MD027}
21
+ > Baz
@@ -0,0 +1,6 @@
1
+ This is a document where the lists are indented by 2 spaces, but the style is
2
+ set to 4 space indents for lists:
3
+
4
+ * Test X
5
+ * Test Y {MD007}
6
+ * Test Z {MD007}
@@ -0,0 +1,2 @@
1
+ all
2
+ rule 'MD007', :indent => 4
@@ -0,0 +1,3 @@
1
+ * Test X
2
+ * Test Y {MD007}
3
+ * Test Z {MD007}
@@ -0,0 +1,14 @@
1
+ Some text
2
+
3
+ * Item {MD006}
4
+ * Item
5
+ * Item
6
+ * Item
7
+ * Item
8
+ * Item
9
+ * Item
10
+
11
+ Some more text
12
+
13
+ * Item {MD006}
14
+ * Item
@@ -0,0 +1,22 @@
1
+ The following code block shouldn't have $ before the commands:
2
+
3
+ $ ls {MD014}
4
+ $ less foo
5
+
6
+ $ cat bar
7
+
8
+ However the following code block shows output, and $ can be used to
9
+ distinguish between command and output:
10
+
11
+ $ ls
12
+ foo bar
13
+ $ less foo
14
+ Hello world
15
+
16
+ $ cat bar
17
+ baz
18
+
19
+ The following code block uses variable names, and likewise shouldn't fire:
20
+
21
+ $foo = 'bar';
22
+ $baz = 'qux';
@@ -0,0 +1,11 @@
1
+ Some text
2
+
3
+
4
+ Some text {MD012:3}
5
+
6
+ This is a code block
7
+
8
+
9
+ with two blank lines in it
10
+
11
+ Some more text
@@ -0,0 +1,3 @@
1
+ * Item
2
+ * Item
3
+ * Item
@@ -0,0 +1,3 @@
1
+ - Item
2
+ - Item
3
+ - Item
@@ -0,0 +1,3 @@
1
+ + Item
2
+ + Item
3
+ + Item
File without changes
@@ -0,0 +1,21 @@
1
+ This is a GFM-style fenced code block:
2
+
3
+ ``` bash
4
+ #!/bin/bash
5
+
6
+ # Print something to stdout:
7
+ echo "Hello"
8
+ echo "World"
9
+ ```
10
+
11
+ This is a kramdown-style fenced code block:
12
+
13
+ ~~~ bash
14
+ #!/bin/bash
15
+
16
+ # Print something to stdout:
17
+ echo "Hello"
18
+ echo "World"
19
+ ~~~
20
+
21
+ None of the above should trigger any heading related rules.
@@ -0,0 +1 @@
1
+ ## Header {MD002}
@@ -0,0 +1,2 @@
1
+ Header {MD002}
2
+ --------------
@@ -0,0 +1 @@
1
+ # Header
@@ -0,0 +1,2 @@
1
+ Header
2
+ ======
@@ -0,0 +1,11 @@
1
+ # Header 1
2
+
3
+ ## Header 2
4
+
5
+ ## Header 1
6
+
7
+ ### Header 2
8
+
9
+ ## Header 3
10
+
11
+ {MD024:5} {MD024:7}
@@ -0,0 +1,3 @@
1
+ # Heading 1
2
+
3
+ # Heading 2 {MD025}
@@ -0,0 +1,5 @@
1
+ Some introductory text
2
+
3
+ # Heading 1
4
+
5
+ # Heading 2
@@ -0,0 +1,11 @@
1
+ # Heading 1 {MD026}.
2
+
3
+ ## Heading 2 {MD026},
4
+
5
+ ## Heading 3 {MD026}!
6
+
7
+ ## Heading 4 {MD026}:
8
+
9
+ ## Heading 5 {MD026};
10
+
11
+ ## Heading 6 {MD026}?
@@ -0,0 +1,14 @@
1
+ # Heading 1 {MD026}.
2
+
3
+ ## Heading 2 {MD026},
4
+
5
+ ## Heading 3 {MD026}!
6
+
7
+ ## Heading 4 {MD026}:
8
+
9
+ ## Heading 5 {MD026};
10
+
11
+ ## Heading 6?
12
+
13
+ The rule has been customized to allow question marks while disallowing
14
+ everything else.
@@ -0,0 +1,2 @@
1
+ all
2
+ rule 'MD026', :punctuation => '.,;:!'
@@ -0,0 +1,7 @@
1
+ # Header
2
+
3
+ ### Header 3 {MD001}
4
+
5
+ ## Header 2
6
+
7
+ #### Header 4 {MD001}
@@ -0,0 +1,5 @@
1
+ # Heading 1
2
+
3
+ ## Heading 2
4
+
5
+ ## Heading 3
@@ -0,0 +1,9 @@
1
+ # Header 1
2
+
3
+ ## Header 2 {MD022}
4
+ Some text
5
+ ## Header 3 {MD022}
6
+ Some text
7
+ ## Header 4 {MD022}
8
+
9
+ ## Header 5
@@ -0,0 +1,15 @@
1
+ Header 1
2
+ ========
3
+
4
+ Header 2 {MD022}
5
+ ----------------
6
+ Some text
7
+ Header 3 {MD022}
8
+ ================
9
+ Some text
10
+ Header 4 {MD022}
11
+ ================
12
+ Some text
13
+
14
+ Header 5
15
+ --------
@@ -0,0 +1,9 @@
1
+ Some text
2
+
3
+ # Header 1 {MD023}
4
+
5
+ Setext style fully indented {MD023}
6
+ ===================================
7
+
8
+ Setext style title only indented {MD023}
9
+ =========================================
@@ -0,0 +1,4 @@
1
+ * Item
2
+ * Item {MD007}
3
+ * Item {MD005}
4
+ * Item
@@ -0,0 +1,3 @@
1
+ * Item
2
+ + Item {MD004}
3
+ - Item {MD004}
@@ -0,0 +1,3 @@
1
+ - Item
2
+ * Item {MD004}
3
+ + Item {MD004}
@@ -0,0 +1,3 @@
1
+ + Item
2
+ * Item {MD004}
3
+ - Item {MD004}
@@ -0,0 +1,3 @@
1
+ * Item
2
+ - Item {MD004}
3
+ + Item {MD004}
@@ -0,0 +1,2 @@
1
+ all
2
+ rule 'MD004', :style => :asterisk
@@ -0,0 +1,3 @@
1
+ * Item {MD004}
2
+ - Item
3
+ + Item {MD004}
@@ -0,0 +1,2 @@
1
+ all
2
+ rule 'MD004', :style => :dash
@@ -0,0 +1,3 @@
1
+ * Item {MD004}
2
+ - Item {MD004}
3
+ + Item
@@ -0,0 +1,2 @@
1
+ all
2
+ rule 'MD004', :style => :plus
@@ -0,0 +1,6 @@
1
+ # Header 1 {MD003} #
2
+
3
+ ## Header 2
4
+
5
+ Header 3 {MD003}
6
+ ----------------
@@ -0,0 +1,6 @@
1
+ # Header 1 #
2
+
3
+ ## Header 2 {MD003}
4
+
5
+ Header 3 {MD003}
6
+ ----------------
@@ -0,0 +1,2 @@
1
+ all
2
+ rule 'MD003', :style => :atx_closed
@@ -0,0 +1,2 @@
1
+ all
2
+ rule 'MD003', :style => :atx