greenmat 3.2.2.1 → 3.5.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +17 -4
  3. data/CHANGELOG.md +21 -0
  4. data/COPYING +17 -11
  5. data/Gemfile +2 -2
  6. data/README.md +19 -13
  7. data/bin/greenmat +4 -40
  8. data/ext/greenmat/autolink.c +29 -16
  9. data/ext/greenmat/buffer.c +24 -17
  10. data/ext/greenmat/buffer.h +18 -13
  11. data/ext/greenmat/gm_markdown.c +38 -14
  12. data/ext/greenmat/gm_render.c +60 -21
  13. data/ext/greenmat/greenmat.h +22 -0
  14. data/ext/greenmat/houdini.h +25 -0
  15. data/ext/greenmat/houdini_href_e.c +27 -11
  16. data/ext/greenmat/houdini_html_e.c +22 -1
  17. data/ext/greenmat/html.c +130 -48
  18. data/ext/greenmat/html.h +19 -14
  19. data/ext/greenmat/html_smartypants.c +47 -20
  20. data/ext/greenmat/markdown.c +42 -30
  21. data/ext/greenmat/markdown.h +17 -15
  22. data/ext/greenmat/stack.c +22 -0
  23. data/ext/greenmat/stack.h +22 -0
  24. data/greenmat.gemspec +4 -3
  25. data/lib/greenmat.rb +1 -1
  26. data/lib/greenmat/cli.rb +86 -0
  27. data/lib/greenmat/compat.rb +0 -5
  28. data/lib/greenmat/render_strip.rb +13 -1
  29. data/lib/greenmat/version.rb +1 -1
  30. data/spec/greenmat/markdown_spec.rb +123 -0
  31. data/test/custom_render_test.rb +41 -2
  32. data/test/greenmat_bin_test.rb +80 -0
  33. data/test/greenmat_compat_test.rb +6 -6
  34. data/test/html5_test.rb +60 -38
  35. data/test/html_render_test.rb +162 -128
  36. data/test/html_toc_render_test.rb +74 -11
  37. data/test/markdown_test.rb +261 -161
  38. data/test/safe_render_test.rb +5 -6
  39. data/test/smarty_html_test.rb +19 -13
  40. data/test/smarty_pants_test.rb +10 -0
  41. data/test/stripdown_render_test.rb +38 -9
  42. data/test/test_helper.rb +30 -9
  43. metadata +34 -19
  44. data/tasks/generate_xcode_project.rake +0 -5
@@ -3,24 +3,28 @@ require 'test_helper'
3
3
 
4
4
  class HTMLTOCRenderTest < Greenmat::TestCase
5
5
  def setup
6
- @render = Greenmat::Render::HTML_TOC
7
- @markdown = "# A title \n## A __nice__ subtitle\n## Another one \n### A sub-sub-title"
6
+ @renderer = Greenmat::Render::HTML_TOC
7
+ @markdown = <<-Markdown.strip_heredoc
8
+ # A title
9
+ ## A __nice__ subtitle
10
+ ## Another one
11
+ ### A sub-sub-title
12
+ ### 見出し
13
+ Markdown
8
14
  end
9
15
 
10
16
  def test_simple_toc_render
11
- renderer = Greenmat::Markdown.new(@render)
12
- output = renderer.render(@markdown).strip
17
+ output = render(@markdown)
13
18
 
14
19
  assert output.start_with?("<ul>")
15
20
  assert output.end_with?("</ul>")
16
21
 
17
22
  assert_equal 3, output.scan("<ul>").length
18
- assert_equal 4, output.scan("<li>").length
23
+ assert_equal 5, output.scan("<li>").length
19
24
  end
20
25
 
21
26
  def test_granular_toc_render
22
- renderer = Greenmat::Markdown.new(@render.new(nesting_level: 2))
23
- output = renderer.render(@markdown).strip
27
+ output = render(@markdown, with: { nesting_level: 2 })
24
28
 
25
29
  assert output.start_with?("<ul>")
26
30
  assert output.end_with?("</ul>")
@@ -29,21 +33,80 @@ class HTMLTOCRenderTest < Greenmat::TestCase
29
33
  assert !output.include?("A sub-sub title")
30
34
  end
31
35
 
36
+ def test_granular_toc_render_with_range
37
+ output = render(@markdown, with: { nesting_level: 2..5 }).strip
38
+
39
+ assert output.start_with?("<ul>")
40
+ assert output.end_with?("</ul>")
41
+
42
+ assert output.match("Another one")
43
+ assert output.match("A sub-sub-title")
44
+ assert output.match("見出し")
45
+
46
+ refute output.match("A title")
47
+ refute output.match("A really tiny title")
48
+ end
49
+
32
50
  def test_toc_heading_id
33
- renderer = Greenmat::Markdown.new(@render)
34
- output = renderer.render(@markdown)
51
+ output = render(@markdown)
35
52
 
36
53
  assert_match /a-title/, output
37
54
  assert_match /a-nice-subtitle/, output
38
55
  assert_match /another-one/, output
39
56
  assert_match /a-sub-sub-title/, output
57
+ # the part number length varies depending on architecture (32b or 64b)
58
+ assert_match /part-(37870bf)?a194139f/, output
40
59
  end
41
60
 
42
61
  def test_toc_heading_with_hyphen_and_equal
43
- renderer = Greenmat::Markdown.new(@render)
44
- output = renderer.render("# Hello World\n\n-\n\n=")
62
+ output = render("# Hello World\n\n-\n\n=")
45
63
 
46
64
  assert_equal 1, output.scan("<li>").length
47
65
  assert !output.include?('<a href=\"#\"></a>')
48
66
  end
67
+
68
+ def test_anchor_generation_with_edge_cases
69
+ # Imported from ActiveSupport::Inflector#parameterize's tests
70
+ titles = {
71
+ "Donald E. Knuth" => "donald-e-knuth",
72
+ "Random text with *(bad)* characters" => "random-text-with-bad-characters",
73
+ "!@#Surrounding bad characters!@#" => "surrounding-bad-characters",
74
+ "Squeeze separators" => "squeeze-separators",
75
+ "Test with + sign" => "test-with-sign",
76
+ "Test with a Namespaced::Class" => "test-with-a-namespaced-class"
77
+ }
78
+
79
+ titles.each do |title, anchor|
80
+ assert_match %("##{anchor}"), render("# #{title}")
81
+ end
82
+ end
83
+
84
+ def test_inline_markup_is_not_escaped
85
+ output = render(@markdown)
86
+
87
+ assert_match "A <strong>nice</strong> subtitle", output
88
+ assert_no_match %r{&lt;}, output
89
+ end
90
+
91
+ def test_inline_markup_escaping
92
+ output = render(@markdown, with: [:escape_html])
93
+
94
+ assert_match "&lt;strong&gt;", output
95
+ assert_no_match %r{<strong>}, output
96
+ end
97
+
98
+ def test_ignoring_fenced_code_blocks_comments
99
+ markdown = <<-Markdown.strip_heredoc
100
+ # Hello world !
101
+
102
+ ~~~ruby
103
+ # This is a comment
104
+ ~~~
105
+ Markdown
106
+
107
+ output = render(markdown)
108
+
109
+ assert output.match("Hello world")
110
+ refute output.match("This is a comment")
111
+ end
49
112
  end
@@ -2,315 +2,415 @@
2
2
  require 'test_helper'
3
3
 
4
4
  class MarkdownTest < Greenmat::TestCase
5
-
6
5
  def setup
7
- @markdown = Greenmat::Markdown.new(Greenmat::Render::HTML, greenmat_options)
8
- end
9
-
10
- def render_with(flags, text)
11
- flags = greenmat_options.merge(flags)
12
- Greenmat::Markdown.new(Greenmat::Render::HTML, flags).render(text)
13
- end
14
-
15
- def greenmat_options
16
- { no_mention_emphasis: true }
6
+ @renderer = Greenmat::Render::HTML
17
7
  end
18
8
 
19
9
  def test_that_simple_one_liner_goes_to_html
20
- assert_respond_to @markdown, :render
21
- html_equal "<p>Hello World.</p>\n", @markdown.render("Hello World.")
10
+ assert_equal "<p>Hello World.</p>", render("Hello World.")
22
11
  end
23
12
 
24
13
  def test_that_inline_markdown_goes_to_html
25
- markdown = @markdown.render('_Hello World_!')
26
- html_equal "<p><em>Hello World</em>!</p>\n", markdown
14
+ assert_equal "<p><em>Hello World</em>!</p>", render('_Hello World_!')
27
15
  end
28
16
 
29
17
  def test_that_inline_markdown_starts_and_ends_correctly
30
- markdown = render_with({:no_intra_emphasis => true}, '_start _ foo_bar bar_baz _ end_ *italic* **bold** <a>_blah_</a>')
18
+ output = render('_start _ foo_bar bar_baz _ end_ *italic* **bold** <a>_blah_</a>', with: [:no_intra_emphasis])
19
+ expected = "<p><em>start _ foo_bar bar_baz _ end</em> <em>italic</em> <strong>bold</strong> <a><em>blah</em></a></p>"
31
20
 
32
- html_equal "<p><em>start _ foo_bar bar_baz _ end</em> <em>italic</em> <strong>bold</strong> <a><em>blah</em></a></p>\n", markdown
21
+ assert_equal expected, output
33
22
 
34
- markdown = @markdown.render("Run 'rake radiant:extensions:rbac_base:migrate'")
35
- html_equal "<p>Run 'rake radiant:extensions:rbac_base:migrate'</p>\n", markdown
23
+ output = render("Run 'rake radiant:extensions:rbac_base:migrate'")
24
+ expected = "<p>Run &#39;rake radiant:extensions:rbac_base:migrate&#39;</p>"
25
+
26
+ assert_equal expected, output
36
27
  end
37
28
 
38
29
  def test_that_urls_are_not_doubly_escaped
39
- markdown = @markdown.render('[Page 2](/search?query=Markdown+Test&page=2)')
40
- html_equal "<p><a href=\"/search?query=Markdown+Test&amp;page=2\">Page 2</a></p>\n", markdown
30
+ output = render('[Page 2](/search?query=Markdown+Test&page=2)')
31
+ assert_equal "<p><a href=\"/search?query=Markdown+Test&page=2\">Page 2</a></p>", output
41
32
  end
42
33
 
43
34
  def test_simple_inline_html
44
- #markdown = Markdown.new("before\n\n<div>\n foo\n</div>\nafter")
45
- markdown = @markdown.render("before\n\n<div>\n foo\n</div>\n\nafter")
46
- html_equal "<p>before</p>\n\n<div>\n foo\n</div>\n\n<p>after</p>\n", markdown
35
+ output = render("before\n\n<div>\n foo\n</div>\n\nafter")
36
+ expected = "<p>before</p>\n\n<div>\n foo\n</div>\n\n<p>after</p>"
37
+
38
+ assert_equal expected, output
47
39
  end
48
40
 
49
41
  def test_that_html_blocks_do_not_require_their_own_end_tag_line
50
- markdown = @markdown.render("Para 1\n\n<div><pre>HTML block\n</pre></div>\n\nPara 2 [Link](#anchor)")
51
- html_equal "<p>Para 1</p>\n\n<div><pre>HTML block\n</pre></div>\n\n<p>Para 2 <a href=\"#anchor\">Link</a></p>\n",
52
- markdown
42
+ output = render("Para 1\n\n<div><pre>HTML block\n</pre></div>\n\nPara 2 [Link](#anchor)")
43
+ expected = "<p>Para 1</p>\n\n<div><pre>HTML block\n</pre></div>\n\n<p>Para 2 <a href=\"#anchor\">Link</a></p>"
44
+
45
+ assert_equal expected, output
53
46
  end
54
47
 
55
48
  # This isn't in the spec but is Markdown.pl behavior.
56
49
  def test_block_quotes_preceded_by_spaces
57
- markdown = @markdown.render(
58
- "A wise man once said:\n\n" +
59
- " > Isn't it wonderful just to be alive.\n"
60
- )
61
- html_equal "<p>A wise man once said:</p>\n\n" +
62
- "<blockquote><p>Isn't it wonderful just to be alive.</p>\n</blockquote>\n",
63
- markdown
50
+ output = render <<-Markdown.strip_heredoc
51
+ A wise man once said:
52
+
53
+
54
+ > Isn't it wonderful just to be alive.
55
+ Markdown
56
+ expected = <<-HTML.chomp.strip_heredoc
57
+ <p>A wise man once said:</p>
58
+
59
+ <blockquote>
60
+ <p>Isn&#39;t it wonderful just to be alive.</p>
61
+ </blockquote>
62
+ HTML
63
+
64
+ assert_equal expected, output
64
65
  end
65
66
 
66
67
  def test_para_before_block_html_should_not_wrap_in_p_tag
67
- markdown = render_with({:lax_spacing => true},
68
- "Things to watch out for\n" +
69
- "<ul>\n<li>Blah</li>\n</ul>\n")
68
+ output = render("Things to watch out for\n<ul>\n<li>Blah</li>\n</ul>", with: [:lax_spacing])
69
+ expected = "<p>Things to watch out for</p>\n\n<ul>\n<li>Blah</li>\n</ul>"
70
70
 
71
- html_equal "<p>Things to watch out for</p>\n\n" +
72
- "<ul>\n<li>Blah</li>\n</ul>\n", markdown
71
+ assert_equal expected, output
73
72
  end
74
73
 
75
74
  # https://github.com/vmg/greenmat/issues/111
76
75
  def test_p_with_less_than_4space_indent_should_not_be_part_of_last_list_item
77
- text = <<MARKDOWN
76
+ text = <<-Markdown
78
77
  * a
79
78
  * b
80
79
  * c
81
80
 
82
81
  This paragraph is not part of the list.
83
- MARKDOWN
84
- expected = <<HTML
85
- <ul>
86
- <li>a</li>
87
- <li>b</li>
88
- <li>c</li>
89
- </ul>
82
+ Markdown
83
+ expected = <<-HTML.chomp.strip_heredoc
84
+ <ul>
85
+ <li>a</li>
86
+ <li>b</li>
87
+ <li>c</li>
88
+ </ul>
89
+
90
+ <p>This paragraph is not part of the list.</p>
91
+ HTML
90
92
 
91
- <p>This paragraph is not part of the list.</p>
92
- HTML
93
- html_equal expected, @markdown.render(text)
93
+ assert_equal expected, render(text)
94
94
  end
95
95
 
96
96
  # http://github.com/rtomayko/rdiscount/issues/#issue/13
97
97
  def test_headings_with_trailing_space
98
- text = "The Ant-Sugar Tales \n" +
99
- "=================== \n\n" +
98
+ text = "The Ant-Sugar Tales \n" +
99
+ "=================== \n\n" +
100
100
  "By Candice Yellowflower \n"
101
- html_equal "<h1>The Ant-Sugar Tales </h1>\n\n<p>By Candice Yellowflower </p>\n", @markdown.render(text)
101
+
102
+ assert_equal "<h1>The Ant-Sugar Tales </h1>\n\n<p>By Candice Yellowflower </p>", render(text)
102
103
  end
103
104
 
104
105
  def test_that_intra_emphasis_works
105
- rd = render_with({}, "foo_bar_baz")
106
- html_equal "<p>foo<em>bar</em>baz</p>\n", rd
107
-
108
- rd = render_with({:no_intra_emphasis => true},"foo_bar_baz")
109
- html_equal "<p>foo_bar_baz</p>\n", rd
106
+ assert_equal "<p>foo<em>bar</em>baz</p>", render("foo_bar_baz")
107
+ assert_equal "<p>foo_bar_baz</p>", render("foo_bar_baz", with: [:no_intra_emphasis])
110
108
  end
111
109
 
112
110
  def test_that_autolink_flag_works
113
- rd = render_with({:autolink => true}, "http://github.com/rtomayko/rdiscount")
114
- html_equal "<p><a href=\"http://github.com/rtomayko/rdiscount\">http://github.com/rtomayko/rdiscount</a></p>\n", rd
111
+ output = render("http://github.com/rtomayko/rdiscount", with: [:autolink])
112
+ expected = "<p><a href=\"http://github.com/rtomayko/rdiscount\">http://github.com/rtomayko/rdiscount</a></p>"
113
+
114
+ assert_equal expected, output
115
115
  end
116
116
 
117
117
  def test_that_tags_can_have_dashes_and_underscores
118
- rd = @markdown.render("foo <asdf-qwerty>bar</asdf-qwerty> and <a_b>baz</a_b>")
119
- html_equal "<p>foo <asdf-qwerty>bar</asdf-qwerty> and <a_b>baz</a_b></p>\n", rd
118
+ output = render("foo <asdf-qwerty>bar</asdf-qwerty> and <a_b>baz</a_b>")
119
+ expected = "<p>foo <asdf-qwerty>bar</asdf-qwerty> and <a_b>baz</a_b></p>"
120
+
121
+ assert_equal expected, output
120
122
  end
121
123
 
122
124
  def test_link_syntax_is_not_processed_within_code_blocks
123
- markdown = @markdown.render(" This is a code block\n This is a link [[1]] inside\n")
124
- html_equal "<pre><code>This is a code block\nThis is a link [[1]] inside\n</code></pre>\n",
125
- markdown
125
+ output = render(" This is a code block\n This is a link [[1]] inside\n")
126
+ expected = "<pre><code>This is a code block\nThis is a link [[1]] inside\n</code></pre>"
127
+
128
+ assert_equal expected, output
126
129
  end
127
130
 
128
131
  def test_whitespace_after_urls
129
- rd = render_with({:autolink => true}, "Japan: http://www.abc.net.au/news/events/japan-quake-2011/beforeafter.htm (yes, japan)")
130
- exp = %{<p>Japan: <a href="http://www.abc.net.au/news/events/japan-quake-2011/beforeafter.htm">http://www.abc.net.au/news/events/japan-quake-2011/beforeafter.htm</a> (yes, japan)</p>\n}
131
- html_equal exp, rd
132
+ output = render("Japan: http://www.abc.net.au/news/events/japan-quake-2011/beforeafter.htm (yes, japan)", with: [:autolink])
133
+ expected = %(<p>Japan: <a href="http://www.abc.net.au/news/events/japan-quake-2011/beforeafter.htm">http://www.abc.net.au/news/events/japan-quake-2011/beforeafter.htm</a> (yes, japan)</p>)
134
+
135
+ assert_equal expected, output
132
136
  end
133
137
 
134
138
  def test_memory_leak_when_parsing_char_links
135
- @markdown.render(<<-leaks)
136
- 2. Identify the wild-type cluster and determine all clusters
137
- containing or contained by it:
139
+ render(<<-leaks.strip_heredoc)
140
+ 2. Identify the wild-type cluster and determine all clusters
141
+ containing or contained by it:
138
142
 
139
- wildtype <- wildtype.cluster(h)
140
- wildtype.mask <- logical(nclust)
141
- wildtype.mask[c(contains(h, wildtype),
142
- wildtype,
143
- contained.by(h, wildtype))] <- TRUE
143
+ wildtype <- wildtype.cluster(h)
144
+ wildtype.mask <- logical(nclust)
145
+ wildtype.mask[c(contains(h, wildtype),
146
+ wildtype,
147
+ contained.by(h, wildtype))] <- TRUE
144
148
 
145
- This could be more elegant.
149
+ This could be more elegant.
146
150
  leaks
147
151
  end
148
152
 
149
153
  def test_infinite_loop_in_header
150
- html_equal "<h1>Body</h1>\n", @markdown.render(<<-header)
151
- ######
152
- #Body#
153
- ######
154
+ assert_equal "<h1>Body</h1>", render(<<-header.strip_heredoc)
155
+ ######
156
+ #Body#
157
+ ######
154
158
  header
155
159
  end
156
160
 
157
161
  def test_a_hyphen_and_a_equal_should_not_be_converted_to_heading
158
- html_equal "<p>-</p>\n", @markdown.render("-")
159
- html_equal "<p>=</p>\n", @markdown.render("=")
162
+ assert_equal "<p>-</p>", render("-")
163
+ assert_equal "<p>=</p>", render("=")
160
164
  end
161
165
 
162
166
  def test_that_tables_flag_works
163
- text = <<EOS
164
- aaa | bbbb
165
- -----|------
166
- hello|sailor
167
- EOS
168
-
169
- assert render_with({}, text) !~ /<table/
167
+ text = <<-Markdown.strip_heredoc
168
+ aaa | bbbb
169
+ -----|------
170
+ hello|sailor
171
+ Markdown
170
172
 
171
- assert render_with({:tables => true}, text) =~ /<table/
173
+ assert render(text) !~ /<table/
174
+ assert render(text, with: [:tables]) =~ /<table/
172
175
  end
173
176
 
174
177
  def test_that_tables_work_with_org_table_syntax
175
- text = <<EOS
176
- | aaa | bbbb |
177
- |-----+------|
178
- |hello|sailor|
179
- EOS
178
+ text = <<-Markdown.strip_heredoc
179
+ | aaa | bbbb |
180
+ |-----+------|
181
+ |hello|sailor|
182
+ Markdown
180
183
 
181
- assert render_with({}, text) !~ /<table/
182
-
183
- assert render_with({:tables => true}, text) =~ /<table/
184
+ assert render(text) !~ /<table/
185
+ assert render(text, with: [:tables]) =~ /<table/
184
186
  end
185
187
 
186
188
  def test_strikethrough_flag_works
187
189
  text = "this is ~some~ striked ~~text~~"
188
190
 
189
- assert render_with({}, text) !~ /<del/
190
-
191
- assert render_with({:strikethrough => true}, text) =~ /<del/
191
+ assert render(text) !~ /<del/
192
+ assert render(text, with: [:strikethrough]) =~ /<del/
192
193
  end
193
194
 
194
195
  def test_underline_flag_works
195
- text = "this is *some* text that is _underlined_. ___boom___"
196
+ text = "this is *some* text that is _underlined_. ___boom___"
197
+ output = render(text, with: [:underline])
196
198
 
197
- refute render_with({}, text).include? '<u>underlined</u>'
199
+ refute render(text).include? '<u>underlined</u>'
198
200
 
199
- output = render_with({:underline => true}, text)
200
201
  assert output.include? '<u>underlined</u>'
201
202
  assert output.include? '<em>some</em>'
202
203
  end
203
204
 
204
205
  def test_highlight_flag_works
205
- text = "this is ==highlighted=="
206
+ text = "this is ==highlighted=="
207
+ output = render(text, with: [:highlight])
206
208
 
207
- refute render_with({}, text).include? '<mark>highlighted</mark>'
209
+ refute render(text).include? '<mark>highlighted</mark>'
208
210
 
209
- output = render_with({:highlight => true}, text)
210
211
  assert output.include? '<mark>highlighted</mark>'
211
212
  end
212
213
 
213
214
  def test_quote_flag_works
214
- text = 'this is "quote"'
215
+ text = 'this is a "quote"'
216
+ output = render(text, with: [:quote])
215
217
 
216
- refute render_with({}, text).include? '<q>quote</q>'
218
+ refute render(text).include? '<q>quote</q>'
217
219
 
218
- output = render_with({:quote => true}, text)
219
- assert output.include? '<q>quote</q>'
220
+ assert_equal '<p>this is a <q>quote</q></p>', output
220
221
  end
221
222
 
222
- def test_that_fenced_flag_works
223
- text = <<fenced
224
- This is a simple test
223
+ def test_quote_flag_honors_escape_html
224
+ text = 'We are not "<svg/onload=pwned>"'
225
+
226
+ output_enabled = render(text, with: [:quote, :escape_html])
227
+ output_disabled = render(text, with: [:quote])
225
228
 
226
- ~~~~~
227
- This is some awesome code
228
- with tabs and shit
229
- ~~~
230
- fenced
229
+ assert_equal "<p>We are not <q>&lt;svg/onload=pwned&gt;</q></p>", output_enabled
230
+ assert_equal "<p>We are not <q><svg/onload=pwned></q></p>", output_disabled
231
+ end
231
232
 
232
- assert render_with({}, text) !~ /<code/
233
+ def test_that_fenced_flag_works
234
+ text = <<-fenced.strip_heredoc
235
+ This is a simple test
233
236
 
234
- assert render_with({:fenced_code_blocks => true}, text) =~ /<code/
237
+ ~~~~~
238
+ This is some awesome code
239
+ with tabs and shit
240
+ ~~~
241
+ fenced
242
+
243
+ assert render(text) !~ /<code/
244
+ assert render(text, with: [:fenced_code_blocks]) =~ /<code/
235
245
  end
236
246
 
237
247
  def test_that_fenced_flag_works_without_space
238
- text = "foo\nbar\n```\nsome\ncode\n```\nbaz"
239
- out = Greenmat::Markdown.new(Greenmat::Render::HTML, :fenced_code_blocks => true, :lax_spacing => true).render(text)
240
- assert out.include?("<pre><code>")
248
+ text = "foo\nbar\n```\nsome\ncode\n```\nbaz"
249
+ output = render(text, with: [:fenced_code_blocks, :lax_spacing])
250
+
251
+ assert output.include?("<pre><code>")
252
+
253
+ output = render(text, with: [:fenced_code_blocks])
254
+ assert !output.include?("<pre><code>")
255
+ end
241
256
 
242
- out = Greenmat::Markdown.new(Greenmat::Render::HTML, :fenced_code_blocks => true).render(text)
243
- assert !out.include?("<pre><code>")
257
+ def test_that_indented_code_preserves_references
258
+ text = <<-indented.strip_heredoc
259
+ This is normal text
260
+
261
+ Link to [Google][1]
262
+
263
+ [1]: http://google.com
264
+ indented
265
+
266
+ output = render(text, with: [:fenced_code_blocks])
267
+ assert output.include?("[1]: http://google.com")
268
+ end
269
+
270
+ def test_that_fenced_flag_preserves_references
271
+ text = <<-fenced.strip_heredoc
272
+ This is normal text
273
+
274
+ ```
275
+ Link to [Google][1]
276
+
277
+ [1]: http://google.com
278
+ ```
279
+ fenced
280
+
281
+ out = render(text, with: [:fenced_code_blocks])
282
+ assert out.include?("[1]: http://google.com")
283
+ end
284
+
285
+ def test_that_fenced_code_copies_language_verbatim_with_braces
286
+ text = "```{rust,no_run}\nx = 'foo'\n```"
287
+ html = render(text, with: [:fenced_code_blocks])
288
+
289
+ assert_equal "<pre><code data-metadata=\"rust,no_run\">x = &#39;foo&#39;\n</code></pre>", html
290
+ end
291
+
292
+ def test_that_fenced_code_copies_language_verbatim
293
+ text = "```rust,no_run\nx = 'foo'\n```"
294
+ html = render(text, with: [:fenced_code_blocks])
295
+
296
+ assert_equal "<pre><code data-metadata=\"rust,no_run\">x = &#39;foo&#39;\n</code></pre>", html
244
297
  end
245
298
 
246
299
  def test_that_indented_flag_works
247
- text = <<indented
248
- This is a simple text
300
+ text = <<-indented.strip_heredoc
301
+ This is a simple text
249
302
 
250
- This is some awesome code
251
- with shit
303
+ This is some awesome code
304
+ with shit
252
305
 
253
- And this is again a simple text
254
- indented
306
+ And this is again a simple text
307
+ indented
255
308
 
256
- assert render_with({}, text) =~ /<code/
257
- assert render_with({:disable_indented_code_blocks => true}, text) !~ /<code/
309
+ assert render(text) =~ /<code/
310
+ assert render(text, with: [:disable_indented_code_blocks]) !~ /<code/
258
311
  end
259
312
 
260
313
  def test_that_headers_are_linkable
261
- markdown = @markdown.render('### Hello [GitHub](http://github.com)')
262
- html_equal "<h3>Hello <a href=\"http://github.com\">GitHub</a></h3>\n", markdown
314
+ output = render('### Hello [GitHub](http://github.com)')
315
+ expected = "<h3>Hello <a href=\"http://github.com\">GitHub</a></h3>"
316
+
317
+ assert_equal expected, output
263
318
  end
264
319
 
265
320
  def test_autolinking_with_ent_chars
266
- markdown = render_with({:autolink => true}, <<text)
267
- This a stupid link: https://github.com/rtomayko/tilt/issues?milestone=1&state=open
268
- text
269
- html_equal "<p>This a stupid link: <a href=\"https://github.com/rtomayko/tilt/issues?milestone=1&state=open\">https://github.com/rtomayko/tilt/issues?milestone=1&amp;state=open</a></p>\n", markdown
321
+ markdown = <<-Markdown.strip_heredoc
322
+ This a stupid link: https://github.com/rtomayko/tilt/issues?milestone=1&state=open
323
+ Markdown
324
+ output = render(markdown, with: [:autolink])
325
+
326
+ assert_equal "<p>This a stupid link: <a href=\"https://github.com/rtomayko/tilt/issues?milestone=1&state=open\">https://github.com/rtomayko/tilt/issues?milestone=1&amp;state=open</a></p>", output
270
327
  end
271
328
 
272
329
  def test_spaced_headers
273
- rd = render_with({:space_after_headers => true}, "#123 a header yes\n")
274
- assert rd !~ /<h1>/
330
+ output = render("#123 a header yes\n", with: [:space_after_headers])
331
+
332
+ assert output !~ /<h1>/
275
333
  end
276
334
 
277
335
  def test_proper_intra_emphasis
278
- assert render_with({:no_intra_emphasis => true}, "http://en.wikipedia.org/wiki/Dave_Allen_(comedian)") !~ /<em>/
279
- assert render_with({:no_intra_emphasis => true}, "this fails: hello_world_") !~ /<em>/
280
- assert render_with({:no_intra_emphasis => true}, "this also fails: hello_world_#bye") !~ /<em>/
281
- assert render_with({:no_intra_emphasis => true}, "this works: hello_my_world") !~ /<em>/
282
- assert render_with({:no_intra_emphasis => true}, "句中**粗體**測試") =~ /<strong>/
336
+ assert render("http://en.wikipedia.org/wiki/Dave_Allen_(comedian)", with: [:no_intra_emphasis]) !~ /<em>/
337
+ assert render("this fails: hello_world_", with: [:no_intra_emphasis]) !~ /<em>/
338
+ assert render("this also fails: hello_world_#bye", with: [:no_intra_emphasis]) !~ /<em>/
339
+ assert render("this works: hello_my_world", with: [:no_intra_emphasis]) !~ /<em>/
340
+ assert render("句中**粗體**測試", with: [:no_intra_emphasis]) =~ /<strong>/
283
341
 
284
342
  markdown = "This is (**bold**) and this_is_not_italic!"
285
- html = "<p>This is (<strong>bold</strong>) and this_is_not_italic!</p>\n"
286
- assert_equal html, render_with({:no_intra_emphasis => true}, markdown)
343
+ output = "<p>This is (<strong>bold</strong>) and this_is_not_italic!</p>"
344
+
345
+ assert_equal output, render(markdown, with: [:no_intra_emphasis])
287
346
 
288
347
  markdown = "This is \"**bold**\""
289
- html = "<p>This is &quot;<strong>bold</strong>&quot;</p>\n"
290
- assert_equal html, render_with({:no_intra_emphasis => true}, markdown)
348
+ output = "<p>This is &quot;<strong>bold</strong>&quot;</p>"
349
+ assert_equal output, render(markdown, with: [:no_intra_emphasis])
291
350
  end
292
351
 
293
352
  def test_emphasis_escaping
294
- markdown = @markdown.render("**foo\\*** _dd\\_dd_")
295
- html_equal "<p><strong>foo*</strong> <em>dd_dd</em></p>\n", markdown
353
+ assert_equal "<p><strong>foo*</strong> <em>dd_dd</em></p>", render("**foo\\*** _dd\\_dd_")
296
354
  end
297
355
 
298
356
  def test_char_escaping_when_highlighting
299
- markdown = "==attribute\\==="
300
- output = render_with({highlight: true}, markdown)
301
- html_equal "<p><mark>attribute=</mark></p>\n", output
357
+ output = render("==attribute\\===", with: [:highlight])
358
+
359
+ assert_equal "<p><mark>attribute=</mark></p>", output
302
360
  end
303
361
 
304
362
  def test_ordered_lists_with_lax_spacing
305
- markdown = "Foo:\n1. Foo\n2. Bar"
306
- output = render_with({lax_spacing: true}, markdown)
363
+ output = render("Foo:\n1. Foo\n2. Bar", with: [:lax_spacing])
307
364
 
308
365
  assert_match /<ol>/, output
309
366
  assert_match /<li>Foo<\/li>/, output
310
367
  end
311
368
 
312
369
  def test_references_with_tabs_after_colon
313
- markdown = @markdown.render("[Link][id]\n[id]:\t\t\thttp://google.es")
314
- html_equal "<p><a href=\"http://google.es\">Link</a></p>\n", markdown
370
+ output = render("[Link][id]\n[id]:\t\t\thttp://google.es")
371
+
372
+ assert_equal "<p><a href=\"http://google.es\">Link</a></p>", output
373
+ end
374
+
375
+ def test_superscript
376
+ output = render("this is the 2^nd time", with: [:superscript])
377
+
378
+ assert_equal "<p>this is the 2<sup>nd</sup> time</p>", output
379
+ end
380
+
381
+ def test_superscript_enclosed_in_parenthesis
382
+ output = render("this is the 2^(nd) time", with: [:superscript])
383
+
384
+ assert_equal "<p>this is the 2<sup>nd</sup> time</p>", output
385
+ end
386
+
387
+ def test_no_rewind_into_previous_inline
388
+ result = "<p><em>!dl</em><a href=\"mailto:1@danlec.com\">1@danlec.com</a></p>"
389
+ output = render("_!dl_1@danlec.com", with: [:autolink])
390
+
391
+ assert_equal result, output
392
+
393
+ result = "<p>abc123<em><a href=\"http://www.foo.com\">www.foo.com</a></em>@foo.com</p>"
394
+ output = render("abc123_www.foo.com_@foo.com", with: [:autolink])
395
+
396
+ assert_equal result, output
397
+ end
398
+
399
+ def test_autolink_with_period_next_to_url
400
+ result = %(<p>Checkout a cool site like <a href="https://github.com">https://github.com</a>.</p>)
401
+ output = render("Checkout a cool site like https://github.com.", with: [:autolink])
402
+
403
+ assert_equal result, output
404
+ end
405
+
406
+ def test_single_dashes_on_table_headers
407
+ markdown = <<-Markdown.strip_heredoc
408
+ | a | b |
409
+ | - | - |
410
+ | c | d |
411
+ Markdown
412
+ output = render(markdown, with: [:tables])
413
+
414
+ assert_match /<table>/, output
315
415
  end
316
416
  end