greenmat 3.2.2.1 → 3.5.1.1

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 +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