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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +487 -0
- data/CONTRIBUTING.md +33 -0
- data/README.markdown +5 -5
- data/ext/redcarpet/html.c +18 -1
- data/ext/redcarpet/html_block_names.txt +44 -0
- data/ext/redcarpet/html_blocks.h +30 -35
- data/ext/redcarpet/markdown.c +51 -20
- data/ext/redcarpet/rc_markdown.c +16 -5
- data/ext/redcarpet/rc_render.c +55 -22
- data/ext/redcarpet/redcarpet.h +2 -0
- data/lib/redcarpet.rb +1 -1
- data/redcarpet.gemspec +9 -21
- metadata +14 -41
- data/test/benchmark.rb +0 -24
- data/test/custom_render_test.rb +0 -67
- data/test/fixtures/benchmark.md +0 -232
- data/test/html5_test.rb +0 -82
- data/test/html_render_test.rb +0 -274
- data/test/html_toc_render_test.rb +0 -112
- data/test/markdown_test.rb +0 -416
- data/test/pathological_inputs_test.rb +0 -34
- data/test/redcarpet_bin_test.rb +0 -80
- data/test/redcarpet_compat_test.rb +0 -38
- data/test/safe_render_test.rb +0 -35
- data/test/smarty_html_test.rb +0 -51
- data/test/smarty_pants_test.rb +0 -58
- data/test/stripdown_render_test.rb +0 -69
- data/test/test_helper.rb +0 -47
data/test/html_render_test.rb
DELETED
@@ -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 <em>NO</em> <script>DOUBLE NO</script></p>
|
20
|
-
|
21
|
-
<p><script>BAD</script></p>
|
22
|
-
|
23
|
-
<p><img src="/favicon.ico" /></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 = %( <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&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'link"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. <a href="#fnref1">↩</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 = ";)"
|
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's & Bar'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{<}, output
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_inline_markup_escaping
|
92
|
-
output = render(@markdown, with: [:escape_html])
|
93
|
-
|
94
|
-
assert_match "<strong>", 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
|