redcarpet 3.5.1 → 3.6.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.
@@ -1,274 +0,0 @@
1
- # coding: UTF-8
2
- require 'test_helper'
3
-
4
- class HTMLRenderTest < Redcarpet::TestCase
5
- def setup
6
- @renderer = Redcarpet::Render::HTML
7
- end
8
-
9
- # Hint: overrides filter_html, no_images and no_links
10
- def test_that_escape_html_works
11
- source = <<-HTML.strip_heredoc
12
- Through <em>NO</em> <script>DOUBLE NO</script>
13
-
14
- <script>BAD</script>
15
-
16
- <img src="/favicon.ico" />
17
- HTML
18
- expected = <<-HTML.chomp.strip_heredoc
19
- <p>Through &lt;em&gt;NO&lt;/em&gt; &lt;script&gt;DOUBLE NO&lt;/script&gt;</p>
20
-
21
- <p>&lt;script&gt;BAD&lt;/script&gt;</p>
22
-
23
- <p>&lt;img src=&quot;/favicon.ico&quot; /&gt;</p>
24
- HTML
25
-
26
- assert_equal expected, render(source, with: [:escape_html])
27
- end
28
-
29
- def test_that_filter_html_works
30
- markdown = 'Through <em>NO</em> <script>DOUBLE NO</script>'
31
- output = render(markdown, with: [:filter_html])
32
-
33
- assert_equal "<p>Through NO DOUBLE NO</p>", output
34
- end
35
-
36
- def test_filter_html_doesnt_break_two_space_hard_break
37
- markdown = "Lorem, \nipsum\n"
38
- output = render(markdown, with: [:filter_html])
39
-
40
- assert_equal "<p>Lorem,<br>\nipsum</p>", output
41
- end
42
-
43
- def test_that_no_image_flag_works
44
- markdown = %(![dust mite](http://dust.mite/image.png) <img src="image.png" />)
45
- output = render(markdown, with: [:no_images])
46
-
47
- assert_no_match %r{<img}, output
48
- end
49
-
50
- def test_that_links_with_ampersands_work
51
- markdown = %([/?a=b&c=d](/?a=b&c=d))
52
- output = render(markdown)
53
- assert_equal "<p><a href=\"/?a=b&c=d\">/?a=b&amp;c=d</a></p>", output
54
- end
55
-
56
- def test_that_no_links_flag_works
57
- markdown = %([This link](http://example.net/) <a href="links.html">links</a>)
58
- output = render(markdown, with: [:no_links])
59
-
60
- assert_no_match %r{<a }, output
61
- end
62
-
63
- def test_that_safelink_flag_works
64
- markdown = "[IRC](irc://chat.freenode.org/#freenode)"
65
- output = render(markdown, with: [:safe_links_only])
66
-
67
- assert_equal "<p>[IRC](irc://chat.freenode.org/#freenode)</p>", output
68
- end
69
-
70
- def test_that_hard_wrap_works
71
- markdown = <<-Markdown.strip_heredoc
72
- Hello world,
73
- this is just a simple test
74
-
75
- With hard wraps
76
- and other *things*.
77
- Markdown
78
- output = render(markdown, with: [:hard_wrap])
79
-
80
- assert_match %r{<br>}, output
81
- end
82
-
83
- def test_that_link_attributes_work
84
- rndr = Redcarpet::Render::HTML.new(:link_attributes => {:rel => 'blank'})
85
- md = Redcarpet::Markdown.new(rndr)
86
- assert md.render('This is a [simple](http://test.com) test.').include?('rel="blank"')
87
- end
88
-
89
- def test_that_link_works_with_quotes
90
- markdown = %([This'link"is](http://example.net/))
91
- expected = %(<p><a href="http://example.net/">This&#39;link&quot;is</a></p>)
92
-
93
- assert_equal expected, render(markdown)
94
- assert_equal expected, render(markdown, with: [:escape_html])
95
- end
96
-
97
- def test_that_code_emphasis_work
98
- markdown = <<-Markdown.strip_heredoc
99
- This should be **`a bold codespan`**
100
- However, this should be *`an emphasised codespan`*
101
-
102
- * **`ABC`** or **`DEF`**
103
- * Foo bar
104
- Markdown
105
-
106
- html = <<-HTML.chomp.strip_heredoc
107
- <p>This should be <strong><code>a bold codespan</code></strong>
108
- However, this should be <em><code>an emphasised codespan</code></em></p>
109
-
110
- <ul>
111
- <li><strong><code>ABC</code></strong> or <strong><code>DEF</code></strong></li>
112
- <li>Foo bar</li>
113
- </ul>
114
- HTML
115
-
116
- assert_equal html, render(markdown)
117
- end
118
-
119
- def test_that_parenthesis_are_handled_into_links
120
- markdown = %(The [bash man page](man:bash(1))!)
121
- expected = %(<p>The <a href="man:bash(1)">bash man page</a>!</p>)
122
-
123
- assert_equal expected, render(markdown)
124
- end
125
-
126
- def test_autolinking_works_as_expected
127
- markdown = "Uri ftp://user:pass@example.com/. Email foo@bar.com and link http://bar.com"
128
- output = render(markdown, with: [:autolink])
129
-
130
- assert output.include? '<a href="ftp://user:pass@example.com/">ftp://user:pass@example.com/</a>'
131
- assert output.include? 'mailto:foo@bar.com'
132
- assert output.include? '<a href="http://bar.com">'
133
- end
134
-
135
- def test_that_footnotes_work
136
- markdown = <<-Markdown.strip_heredoc
137
- This is a footnote.[^1]
138
-
139
- [^1]: It provides additional information.
140
- Markdown
141
-
142
- html = <<-HTML.chomp.strip_heredoc
143
- <p>This is a footnote.<sup id="fnref1"><a href="#fn1">1</a></sup></p>
144
-
145
- <div class="footnotes">
146
- <hr>
147
- <ol>
148
-
149
- <li id="fn1">
150
- <p>It provides additional information.&nbsp;<a href="#fnref1">&#8617;</a></p>
151
- </li>
152
-
153
- </ol>
154
- </div>
155
- HTML
156
-
157
- output = render(markdown, with: [:footnotes])
158
- assert_equal html, output
159
- end
160
-
161
- def test_footnotes_enabled_but_missing_marker
162
- markdown = <<-Markdown.strip_heredoc
163
- Some text without a marker
164
-
165
- [^1] And a trailing definition
166
- Markdown
167
- html = <<-HTML.chomp.strip_heredoc
168
- <p>Some text without a marker</p>
169
-
170
- <p>[^1] And a trailing definition</p>
171
- HTML
172
-
173
- output = render(markdown, with: [:footnotes])
174
- assert_equal html, output
175
- end
176
-
177
- def test_footnotes_enabled_but_missing_definition
178
- markdown = "Some text with a marker[^1] but no definition."
179
- expected = "<p>Some text with a marker[^1] but no definition.</p>"
180
-
181
- output = render(markdown, with: [:footnotes])
182
- assert_equal expected, output
183
- end
184
-
185
- def test_autolink_short_domains
186
- markdown = "Example of uri ftp://auto/short/domains. Email auto@l.n and link http://a/u/t/o/s/h/o/r/t"
187
- output = render(markdown, with: [:autolink])
188
-
189
- assert output.include? '<a href="ftp://auto/short/domains">ftp://auto/short/domains</a>'
190
- assert output.include? 'mailto:auto@l.n'
191
- assert output.include? '<a href="http://a/u/t/o/s/h/o/r/t">http://a/u/t/o/s/h/o/r/t</a>'
192
- end
193
-
194
- def test_that_prettify_works
195
- markdown = "\tclass Foo\nend"
196
- output = render(markdown, with: [:prettify])
197
-
198
- assert output.include?("<pre><code class=\"prettyprint\">")
199
-
200
- markdown = "`class`"
201
- output = render(markdown, with: [:prettify])
202
-
203
- assert output.include?("<code class=\"prettyprint\">")
204
- end
205
-
206
- def test_prettify_with_fenced_code_blocks
207
- markdown = "~~~ruby\ncode\n~~~"
208
- output = render(markdown, with: [:fenced_code_blocks, :prettify])
209
-
210
- assert output.include?("<code class=\"prettyprint lang-ruby\">")
211
- end
212
-
213
- def test_safe_links_only_with_anchors
214
- markdown = "An [anchor link](#anchor) on a page."
215
- output = render(markdown, with: [:safe_links_only])
216
-
217
- assert_match %r{<a href="#anchor">anchor link</a>}, output
218
- end
219
-
220
- def test_autolink_with_link_attributes
221
- options = { autolink: true, link_attributes: {rel: "nofollow"} }
222
- output = render("https://github.com/", with: options)
223
-
224
- assert_match %r{rel="nofollow"}, output
225
- end
226
-
227
- def test_image_unsafe_src_with_safe_links_only
228
- markdown = "![foo](javascript:while(1);)"
229
- output = render(markdown, with: [:safe_links_only])
230
-
231
- assert_not_match %r{img src}, output
232
- end
233
-
234
- def test_no_styles_option_inside_a_paragraph
235
- markdown = "Hello <style> foo { bar: baz; } </style> !"
236
- output = render(markdown, with: [:no_styles])
237
-
238
- assert_no_match %r{<style>}, output
239
- end
240
-
241
- def test_no_styles_inside_html_block_rendering
242
- markdown = "<style> foo { bar: baz; } </style>"
243
- output = render(markdown, with: [:no_styles])
244
-
245
- assert_no_match %r{<style>}, output
246
- end
247
-
248
- def test_non_ascii_removal_in_header_anchors
249
- markdown = "# Glühlampe"
250
- html = "<h1 id=\"gl-hlampe\">Glühlampe</h1>"
251
-
252
- assert_equal html, render(markdown, with: [:with_toc_data])
253
- end
254
-
255
- def test_utf8_only_header_anchors
256
- markdown = "# 見出し"
257
- if 1.size == 4 # 32-bit architecture
258
- html = "<h1 id=\"part-a194139f\">見出し</h1>"
259
- elsif 1.size == 8 # 64-bit architecture
260
- html = "<h1 id=\"part-37870bfa194139f\">見出し</h1>"
261
- else
262
- raise "unknown integer size"
263
- end
264
-
265
- assert_equal html, render(markdown, with: [:with_toc_data])
266
- end
267
-
268
- def test_escape_entities_removal_from_anchor
269
- output = render("# Foo's & Bar's", with: [:with_toc_data])
270
- result = %(<h1 id="foos-bars">Foo&#39;s &amp; Bar&#39;s</h1>)
271
-
272
- assert_equal result, output
273
- end
274
- end
@@ -1,112 +0,0 @@
1
- # coding: UTF-8
2
- require 'test_helper'
3
-
4
- class HTMLTOCRenderTest < Redcarpet::TestCase
5
- def setup
6
- @renderer = Redcarpet::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
14
- end
15
-
16
- def test_simple_toc_render
17
- output = render(@markdown)
18
-
19
- assert output.start_with?("<ul>")
20
- assert output.end_with?("</ul>")
21
-
22
- assert_equal 3, output.scan("<ul>").length
23
- assert_equal 5, output.scan("<li>").length
24
- end
25
-
26
- def test_granular_toc_render
27
- output = render(@markdown, with: { nesting_level: 2 })
28
-
29
- assert output.start_with?("<ul>")
30
- assert output.end_with?("</ul>")
31
-
32
- assert_equal 3, output.scan("<li>").length
33
- assert !output.include?("A sub-sub title")
34
- end
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
-
50
- def test_toc_heading_id
51
- output = render(@markdown)
52
-
53
- assert_match /a-title/, output
54
- assert_match /a-nice-subtitle/, output
55
- assert_match /another-one/, output
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
59
- end
60
-
61
- def test_toc_heading_with_hyphen_and_equal
62
- output = render("# Hello World\n\n-\n\n=")
63
-
64
- assert_equal 1, output.scan("<li>").length
65
- assert !output.include?('<a href=\"#\"></a>')
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
112
- end