greenmat 3.2.2.2 → 3.5.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +21 -8
  3. data/CHANGELOG.md +24 -0
  4. data/COPYING +17 -11
  5. data/Gemfile +2 -2
  6. data/README.md +19 -13
  7. data/Rakefile +1 -0
  8. data/bin/greenmat +4 -40
  9. data/ext/greenmat/autolink.c +24 -12
  10. data/ext/greenmat/buffer.c +24 -17
  11. data/ext/greenmat/buffer.h +18 -13
  12. data/ext/greenmat/gm_markdown.c +41 -14
  13. data/ext/greenmat/gm_render.c +68 -21
  14. data/ext/greenmat/greenmat.h +22 -0
  15. data/ext/greenmat/houdini.h +22 -0
  16. data/ext/greenmat/houdini_href_e.c +27 -11
  17. data/ext/greenmat/houdini_html_e.c +22 -1
  18. data/ext/greenmat/html.c +177 -47
  19. data/ext/greenmat/html.h +19 -14
  20. data/ext/greenmat/html_smartypants.c +47 -20
  21. data/ext/greenmat/markdown.c +181 -30
  22. data/ext/greenmat/markdown.h +20 -16
  23. data/ext/greenmat/stack.c +22 -0
  24. data/ext/greenmat/stack.h +22 -0
  25. data/greenmat.gemspec +4 -3
  26. data/lib/greenmat.rb +1 -1
  27. data/lib/greenmat/cli.rb +86 -0
  28. data/lib/greenmat/compat.rb +0 -5
  29. data/lib/greenmat/render_strip.rb +13 -1
  30. data/lib/greenmat/version.rb +1 -1
  31. data/spec/greenmat/markdown_spec.rb +166 -0
  32. data/test/custom_render_test.rb +41 -2
  33. data/test/greenmat_bin_test.rb +80 -0
  34. data/test/greenmat_compat_test.rb +6 -6
  35. data/test/html5_test.rb +60 -38
  36. data/test/html_render_test.rb +162 -128
  37. data/test/html_toc_render_test.rb +74 -11
  38. data/test/markdown_test.rb +258 -182
  39. data/test/safe_render_test.rb +5 -6
  40. data/test/smarty_html_test.rb +19 -13
  41. data/test/smarty_pants_test.rb +10 -0
  42. data/test/stripdown_render_test.rb +38 -9
  43. data/test/test_helper.rb +30 -9
  44. metadata +29 -13
@@ -2,34 +2,33 @@ require 'test_helper'
2
2
 
3
3
  class SafeRenderTest < Greenmat::TestCase
4
4
  def setup
5
- @render = Greenmat::Render::Safe
6
- @parser = Greenmat::Markdown.new(@render, fenced_code_blocks: true)
5
+ @renderer = Greenmat::Render::Safe
7
6
  end
8
7
 
9
8
  def test_safe_links_only_is_enabled_by_default
10
9
  markdown = "[foo](javascript:alert('foo'))"
11
- output = @parser.render(markdown)
10
+ output = render(markdown)
12
11
 
13
12
  assert_not_match %r{a href}, output
14
13
  end
15
14
 
16
15
  def test_escape_html_is_enabled_by_default
17
16
  markdown = "<p>Hello world!</p>"
18
- output = @parser.render(markdown)
17
+ output = render(markdown)
19
18
 
20
19
  assert_match %r{&lt;}, output
21
20
  end
22
21
 
23
22
  def test_html_escaping_in_code_blocks
24
23
  markdown = "~~~\n<p>Hello!</p>\n~~~"
25
- output = @parser.render(markdown)
24
+ output = render(markdown)
26
25
 
27
26
  assert_match %r{&lt;p&gt;}, output
28
27
  end
29
28
 
30
29
  def test_lang_class_is_removed
31
30
  markdown = "~~~ruby\nclass Foo; end\n~~~"
32
- output = @parser.render(markdown)
31
+ output = render(markdown, with: [:fenced_code_blocks])
33
32
 
34
33
  assert_not_match %r{ruby}, output
35
34
  end
@@ -3,43 +3,49 @@ require 'test_helper'
3
3
 
4
4
  class SmartyHTMLTest < Greenmat::TestCase
5
5
  def setup
6
- @smarty_markdown = Greenmat::Markdown.new(Greenmat::Render::SmartyHTML)
6
+ @renderer = Greenmat::Render::SmartyHTML
7
7
  end
8
8
 
9
9
  def test_that_smartyhtml_converts_single_quotes
10
- markdown = @smarty_markdown.render("They're not for sale.")
11
- assert_equal "<p>They&rsquo;re not for sale.</p>\n", markdown
10
+ markdown = render("They're not for sale.")
11
+ assert_equal "<p>They&rsquo;re not for sale.</p>", markdown
12
12
  end
13
13
 
14
14
  def test_that_smartyhtml_converts_double_quotes
15
- rd = @smarty_markdown.render(%("Quoted text"))
16
- assert_equal %(<p>&ldquo;Quoted text&rdquo;</p>\n), rd
15
+ rd = render(%("Quoted text"))
16
+ assert_equal %(<p>&ldquo;Quoted text&rdquo;</p>), rd
17
17
  end
18
18
 
19
19
  def test_that_smartyhtml_converts_double_hyphen
20
- rd = @smarty_markdown.render("double hyphen -- ndash")
21
- assert_equal "<p>double hyphen &ndash; ndash</p>\n", rd
20
+ rd = render("double hyphen -- ndash")
21
+ assert_equal "<p>double hyphen &ndash; ndash</p>", rd
22
22
  end
23
23
 
24
24
  def test_that_smartyhtml_converts_triple_hyphen
25
- rd = @smarty_markdown.render("triple hyphen --- mdash")
26
- assert_equal "<p>triple hyphen &mdash; mdash</p>\n", rd
25
+ rd = render("triple hyphen --- mdash")
26
+ assert_equal "<p>triple hyphen &mdash; mdash</p>", rd
27
27
  end
28
28
 
29
29
  def test_that_smartyhtml_ignores_double_hyphen_in_code
30
- rd = @smarty_markdown.render("double hyphen in `--option`")
31
- assert_equal "<p>double hyphen in <code>--option</code></p>\n", rd
30
+ rd = render("double hyphen in `--option`")
31
+ assert_equal "<p>double hyphen in <code>--option</code></p>", rd
32
32
  end
33
33
 
34
34
  def test_that_smartyhtml_ignores_pre
35
- rd = @smarty_markdown.render(" It's a test of \"pre\"\n")
35
+ rd = render(" It's a test of \"pre\"\n")
36
36
  expected = "It&#39;s a test of &quot;pre&quot;"
37
37
  assert rd.include?(expected), "\"#{rd}\" should contain \"#{expected}\""
38
38
  end
39
39
 
40
40
  def test_that_smartyhtml_ignores_code
41
- rd = @smarty_markdown.render("`It's a test of \"code\"`\n")
41
+ rd = render("`It's a test of \"code\"`\n")
42
42
  expected = "It&#39;s a test of &quot;code&quot;"
43
43
  assert rd.include?(expected), "\"#{rd}\" should contain \"#{expected}\""
44
44
  end
45
+
46
+ def test_that_smartyhtml_ignores_links_for_single_quotes
47
+ output = render("[John](link)'s cat")
48
+ expected = %(<p><a href="link">John</a>&rsquo;s cat</p>)
49
+ assert_equal expected, output
50
+ end
45
51
  end
@@ -45,4 +45,14 @@ class SmartyPantsTest < Greenmat::TestCase
45
45
  rd = @pants.render("<p>Hopin' that this bug gets some fixin'.</p>")
46
46
  assert_equal "<p>Hopin&rsquo; that this bug gets some fixin&rsquo;.</p>", rd
47
47
  end
48
+
49
+ def test_that_is_not_confused_by_fractions
50
+ rd = @pants.render('I am 1/4... of the way to 1/4/2000')
51
+ assert_equal "I am &frac14;&hellip; of the way to 1/4/2000", rd
52
+ end
53
+
54
+ def test_that_smart_converts_multiple_single_quotes
55
+ rd = @pants.render(%(<p>'First' and 'second' and 'third'</p>))
56
+ assert_equal %(<p>&lsquo;First&rsquo; and &lsquo;second&rsquo; and &lsquo;third&rsquo;</p>), rd
57
+ end
48
58
  end
@@ -3,37 +3,66 @@ require 'test_helper'
3
3
 
4
4
  class StripDownRender < Greenmat::TestCase
5
5
  def setup
6
- @parser = Greenmat::Markdown.new(Greenmat::Render::StripDown)
6
+ @renderer = Greenmat::Render::StripDown
7
7
  end
8
8
 
9
9
  def test_titles
10
10
  markdown = "# Foo bar"
11
- output = @parser.render(markdown)
11
+ output = render(markdown)
12
12
 
13
- assert_equal "Foo bar\n", output
13
+ assert_equal "Foo bar", output
14
14
  end
15
15
 
16
16
  def test_code_blocks
17
17
  markdown = "\tclass Foo\n\tend"
18
- output = @parser.render(markdown)
18
+ output = render(markdown)
19
19
 
20
- assert_equal "class Foo\nend\n", output
20
+ assert_equal "class Foo\nend", output
21
21
  end
22
22
 
23
23
  def test_images
24
24
  markdown = "Look at this ![picture](http://example.org/picture.png)\n" \
25
25
  "And this: ![](http://example.org/image.jpg)"
26
26
  expected = "Look at this picture http://example.org/picture.png\n" \
27
- "And this: http://example.org/image.jpg\n"
28
- output = @parser.render(markdown)
27
+ "And this: http://example.org/image.jpg"
28
+ output = render(markdown)
29
29
 
30
30
  assert_equal expected, output
31
31
  end
32
32
 
33
33
  def test_links
34
34
  markdown = "Here's an [example](https://github.com)"
35
- expected = "Here's an example (https://github.com)\n"
36
- output = @parser.render(markdown)
35
+ expected = "Here's an example (https://github.com)"
36
+ output = render(markdown)
37
+
38
+ assert_equal expected, output
39
+ end
40
+
41
+ def test_tables
42
+ markdown = "| Left-Aligned | Centre Aligned | Right Aligned |\n" \
43
+ "| :------------ |:---------------:| -----:|\n" \
44
+ "| col 3 is | some wordy text | $1600 |\n" \
45
+ "| col 2 is | centered | $12 |"
46
+ expected = "Left-Aligned\tCentre Aligned\tRight Aligned\t\n" \
47
+ "col 3 is\tsome wordy text\t$1600\t\n" \
48
+ "col 2 is\tcentered\t$12\t"
49
+ output = render(markdown, with: [:tables])
50
+
51
+ assert_equal expected, output
52
+ end
53
+
54
+ def test_highlight
55
+ markdown = "==Hello world!=="
56
+ expected = "Hello world!"
57
+ output = render(markdown, with: [:highlight])
58
+
59
+ assert_equal expected, output
60
+ end
61
+
62
+ def test_with_quote_option_enabled
63
+ markdown = %(A common idiom is "Hello world")
64
+ expected = %(A common idiom is Hello world)
65
+ output = render(markdown, with: [:quote])
37
66
 
38
67
  assert_equal expected, output
39
68
  end
data/test/test_helper.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # coding: UTF-8
2
- Encoding.default_internal = 'UTF-8' if defined? Encoding
2
+ $:.unshift(File.expand_path('../../lib', __FILE__))
3
+ Encoding.default_internal = 'UTF-8'
3
4
 
4
5
  gem 'test-unit', '>= 2' # necessary when not using bundle exec
5
6
 
@@ -9,21 +10,41 @@ require 'nokogiri'
9
10
  require 'greenmat'
10
11
  require 'greenmat/render_strip'
11
12
  require 'greenmat/render_man'
12
- require 'greenmat/compat'
13
13
 
14
14
  class Greenmat::TestCase < Test::Unit::TestCase
15
- def html_equal(html_a, html_b)
16
- assert_equal Nokogiri::HTML::DocumentFragment.parse(html_a).to_html,
17
- Nokogiri::HTML::DocumentFragment.parse(html_b).to_html
15
+ def assert_renders(html, markdown)
16
+ assert_equal html, render(markdown)
18
17
  end
19
18
 
20
- def assert_renders(html, markdown)
21
- html_equal html, parser.render(markdown)
19
+ def render(markdown, options = {})
20
+ options = options.fetch(:with, {})
21
+
22
+ if options.kind_of?(Array)
23
+ options = Hash[options.map {|o| [o, true]}]
24
+ end
25
+
26
+ render = begin
27
+ renderer.new(options)
28
+ rescue ArgumentError
29
+ renderer.new
30
+ end
31
+
32
+ parser = Greenmat::Markdown.new(render, options)
33
+
34
+ parser.render(markdown).chomp
22
35
  end
23
36
 
24
37
  private
25
38
 
26
- def parser
27
- @parser ||= Greenmat::Markdown.new(Greenmat::Render::HTML)
39
+ def renderer
40
+ @renderer ||= Greenmat::Render::HTML
41
+ end
42
+
43
+ # Imported from Active Support
44
+ class ::String
45
+ def strip_heredoc
46
+ indent = scan(/^ *(?=\S)/).min.size || 0
47
+ gsub(/^[ \t]{#{indent}}/, '')
48
+ end
28
49
  end
29
50
  end
metadata CHANGED
@@ -1,16 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: greenmat
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.2.2
4
+ version: 3.5.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Natacha Porté
8
8
  - Vicent Martí
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-02-23 00:00:00.000000000 Z
12
+ date: 2021-07-01 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
14
28
  - !ruby/object:Gem::Dependency
15
29
  name: nokogiri
16
30
  requirement: !ruby/object:Gem::Requirement
@@ -31,28 +45,28 @@ dependencies:
31
45
  requirements:
32
46
  - - "~>"
33
47
  - !ruby/object:Gem::Version
34
- version: '10.0'
48
+ version: 12.2.1
35
49
  type: :development
36
50
  prerelease: false
37
51
  version_requirements: !ruby/object:Gem::Requirement
38
52
  requirements:
39
53
  - - "~>"
40
54
  - !ruby/object:Gem::Version
41
- version: '10.0'
55
+ version: 12.2.1
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: rake-compiler
44
58
  requirement: !ruby/object:Gem::Requirement
45
59
  requirements:
46
60
  - - "~>"
47
61
  - !ruby/object:Gem::Version
48
- version: 0.8.3
62
+ version: 1.0.3
49
63
  type: :development
50
64
  prerelease: false
51
65
  version_requirements: !ruby/object:Gem::Requirement
52
66
  requirements:
53
67
  - - "~>"
54
68
  - !ruby/object:Gem::Version
55
- version: 0.8.3
69
+ version: 1.0.3
56
70
  - !ruby/object:Gem::Dependency
57
71
  name: rspec
58
72
  requirement: !ruby/object:Gem::Requirement
@@ -73,14 +87,14 @@ dependencies:
73
87
  requirements:
74
88
  - - "~>"
75
89
  - !ruby/object:Gem::Version
76
- version: 2.5.4
90
+ version: 3.2.3
77
91
  type: :development
78
92
  prerelease: false
79
93
  version_requirements: !ruby/object:Gem::Requirement
80
94
  requirements:
81
95
  - - "~>"
82
96
  - !ruby/object:Gem::Version
83
- version: 2.5.4
97
+ version: 3.2.3
84
98
  description: A Markdown parser for Qiita, based on Redcarpet.
85
99
  email: nkymyj@gmail.com
86
100
  executables:
@@ -120,6 +134,7 @@ files:
120
134
  - ext/greenmat/stack.h
121
135
  - greenmat.gemspec
122
136
  - lib/greenmat.rb
137
+ - lib/greenmat/cli.rb
123
138
  - lib/greenmat/compat.rb
124
139
  - lib/greenmat/render_man.rb
125
140
  - lib/greenmat/render_strip.rb
@@ -215,6 +230,7 @@ files:
215
230
  - test/benchmark.rb
216
231
  - test/custom_render_test.rb
217
232
  - test/fixtures/benchmark.md
233
+ - test/greenmat_bin_test.rb
218
234
  - test/greenmat_compat_test.rb
219
235
  - test/html5_test.rb
220
236
  - test/html_render_test.rb
@@ -230,7 +246,7 @@ homepage: https://github.com/increments/greenmat
230
246
  licenses:
231
247
  - MIT
232
248
  metadata: {}
233
- post_install_message:
249
+ post_install_message:
234
250
  rdoc_options: []
235
251
  require_paths:
236
252
  - lib
@@ -245,9 +261,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
261
  - !ruby/object:Gem::Version
246
262
  version: '0'
247
263
  requirements: []
248
- rubyforge_project:
249
- rubygems_version: 2.6.8
250
- signing_key:
264
+ rubygems_version: 3.1.4
265
+ signing_key:
251
266
  specification_version: 4
252
267
  summary: A Markdown parser for Qiita, based on Redcarpet.
253
268
  test_files:
@@ -340,6 +355,7 @@ test_files:
340
355
  - test/benchmark.rb
341
356
  - test/custom_render_test.rb
342
357
  - test/fixtures/benchmark.md
358
+ - test/greenmat_bin_test.rb
343
359
  - test/greenmat_compat_test.rb
344
360
  - test/html5_test.rb
345
361
  - test/html_render_test.rb