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.
- checksums.yaml +5 -5
- data/.travis.yml +17 -4
- data/CHANGELOG.md +21 -0
- data/COPYING +17 -11
- data/Gemfile +2 -2
- data/README.md +19 -13
- data/bin/greenmat +4 -40
- data/ext/greenmat/autolink.c +29 -16
- data/ext/greenmat/buffer.c +24 -17
- data/ext/greenmat/buffer.h +18 -13
- data/ext/greenmat/gm_markdown.c +38 -14
- data/ext/greenmat/gm_render.c +60 -21
- data/ext/greenmat/greenmat.h +22 -0
- data/ext/greenmat/houdini.h +25 -0
- data/ext/greenmat/houdini_href_e.c +27 -11
- data/ext/greenmat/houdini_html_e.c +22 -1
- data/ext/greenmat/html.c +130 -48
- data/ext/greenmat/html.h +19 -14
- data/ext/greenmat/html_smartypants.c +47 -20
- data/ext/greenmat/markdown.c +42 -30
- data/ext/greenmat/markdown.h +17 -15
- data/ext/greenmat/stack.c +22 -0
- data/ext/greenmat/stack.h +22 -0
- data/greenmat.gemspec +4 -3
- data/lib/greenmat.rb +1 -1
- data/lib/greenmat/cli.rb +86 -0
- data/lib/greenmat/compat.rb +0 -5
- data/lib/greenmat/render_strip.rb +13 -1
- data/lib/greenmat/version.rb +1 -1
- data/spec/greenmat/markdown_spec.rb +123 -0
- data/test/custom_render_test.rb +41 -2
- data/test/greenmat_bin_test.rb +80 -0
- data/test/greenmat_compat_test.rb +6 -6
- data/test/html5_test.rb +60 -38
- data/test/html_render_test.rb +162 -128
- data/test/html_toc_render_test.rb +74 -11
- data/test/markdown_test.rb +261 -161
- data/test/safe_render_test.rb +5 -6
- data/test/smarty_html_test.rb +19 -13
- data/test/smarty_pants_test.rb +10 -0
- data/test/stripdown_render_test.rb +38 -9
- data/test/test_helper.rb +30 -9
- metadata +34 -19
- data/tasks/generate_xcode_project.rake +0 -5
@@ -4,35 +4,35 @@ require 'test_helper'
|
|
4
4
|
class GreenmatCompatTest < Greenmat::TestCase
|
5
5
|
def test_simple_compat_api
|
6
6
|
html = GreenmatCompat.new("This is_just_a test").to_html
|
7
|
-
|
7
|
+
assert_equal "<p>This is<em>just</em>a test</p>\n", html
|
8
8
|
end
|
9
9
|
|
10
10
|
def test_compat_api_enables_extensions
|
11
11
|
html = GreenmatCompat.new("This is_just_a test", :no_intra_emphasis).to_html
|
12
|
-
|
12
|
+
assert_equal "<p>This is_just_a test</p>\n", html
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_compat_api_knows_fenced_code_extension
|
16
16
|
text = "```ruby\nx = 'foo'\n```"
|
17
17
|
html = GreenmatCompat.new(text, :fenced_code).to_html
|
18
|
-
|
18
|
+
assert_equal "<pre><code data-metadata=\"ruby\">x = 'foo'\n</code></pre>\n", html
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_compat_api_ignores_gh_blockcode_extension
|
22
22
|
text = "```ruby\nx = 'foo'\n```"
|
23
23
|
html = GreenmatCompat.new(text, :fenced_code, :gh_blockcode).to_html
|
24
|
-
|
24
|
+
assert_equal "<pre><code data-metadata=\"ruby\">x = 'foo'\n</code></pre>\n", html
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_compat_api_knows_no_intraemphasis_extension
|
28
28
|
html = GreenmatCompat.new("This is_just_a test", :no_intraemphasis).to_html
|
29
|
-
|
29
|
+
assert_equal "<p>This is_just_a test</p>\n", html
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_translate_outdated_extensions
|
33
33
|
# these extensions are no longer used
|
34
34
|
exts = [:gh_blockcode, :no_tables, :smart, :strict]
|
35
35
|
html = GreenmatCompat.new('"TEST"', *exts).to_html
|
36
|
-
|
36
|
+
assert_equal "<p>"TEST"</p>\n", html
|
37
37
|
end
|
38
38
|
end
|
data/test/html5_test.rb
CHANGED
@@ -2,68 +2,90 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class HTML5Test < Greenmat::TestCase
|
4
4
|
def test_that_html5_works
|
5
|
-
section =
|
6
|
-
<section>
|
7
|
-
|
8
|
-
</section>
|
9
|
-
|
5
|
+
section = <<-HTML.chomp.strip_heredoc
|
6
|
+
<section>
|
7
|
+
<p>The quick brown fox jumps over the lazy dog.</p>
|
8
|
+
</section>
|
9
|
+
HTML
|
10
10
|
|
11
|
-
figure =
|
12
|
-
<figure>
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
</figure>
|
18
|
-
|
11
|
+
figure = <<-HTML.chomp.strip_heredoc
|
12
|
+
<figure>
|
13
|
+
<img src="http://example.org/image.jpg" alt="">
|
14
|
+
<figcaption>
|
15
|
+
<p>Hello world!</p>
|
16
|
+
</figcaption>
|
17
|
+
</figure>
|
18
|
+
HTML
|
19
19
|
|
20
20
|
assert_renders section, section
|
21
21
|
assert_renders figure, figure
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_that_html5_works_with_code_blocks
|
25
|
-
section =
|
25
|
+
section = <<-HTML
|
26
26
|
\t<section>
|
27
27
|
\t\t<p>The quick brown fox jumps over the lazy dog.</p>
|
28
28
|
\t</section>
|
29
|
-
|
29
|
+
HTML
|
30
30
|
|
31
|
-
section_expected =
|
32
|
-
<pre><code><section>
|
33
|
-
|
34
|
-
</section>
|
35
|
-
</code></pre>
|
36
|
-
|
31
|
+
section_expected = <<-HTML.chomp.strip_heredoc
|
32
|
+
<pre><code><section>
|
33
|
+
<p>The quick brown fox jumps over the lazy dog.</p>
|
34
|
+
</section>
|
35
|
+
</code></pre>
|
36
|
+
HTML
|
37
37
|
|
38
|
-
header =
|
38
|
+
header = <<-HTML
|
39
39
|
<header>
|
40
40
|
<hgroup>
|
41
41
|
<h1>Section heading</h1>
|
42
42
|
<h2>Subhead</h2>
|
43
43
|
</hgroup>
|
44
44
|
</header>
|
45
|
-
|
45
|
+
HTML
|
46
46
|
|
47
|
-
header_expected =
|
48
|
-
<pre><code><header>
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
</header>
|
54
|
-
</code></pre>
|
55
|
-
|
47
|
+
header_expected = <<-HTML.chomp.strip_heredoc
|
48
|
+
<pre><code><header>
|
49
|
+
<hgroup>
|
50
|
+
<h1>Section heading</h1>
|
51
|
+
<h2>Subhead</h2>
|
52
|
+
</hgroup>
|
53
|
+
</header>
|
54
|
+
</code></pre>
|
55
|
+
HTML
|
56
56
|
|
57
57
|
assert_renders section_expected, section
|
58
58
|
assert_renders header_expected, header
|
59
59
|
end
|
60
60
|
|
61
61
|
def test_script_tag_recognition
|
62
|
-
|
63
|
-
<script type="text/javascript">
|
64
|
-
|
65
|
-
</script>
|
66
|
-
|
67
|
-
|
62
|
+
html = <<-HTML.chomp.strip_heredoc
|
63
|
+
<script type="text/javascript">
|
64
|
+
alert('Foo!');
|
65
|
+
</script>
|
66
|
+
HTML
|
67
|
+
|
68
|
+
assert_renders html, html
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_details_tags_ignoring
|
72
|
+
details = <<-HTML.chomp.strip_heredoc
|
73
|
+
<details><summary>Folding sample</summary><div>
|
74
|
+
|
75
|
+
```rb
|
76
|
+
puts 'Hello, World'
|
77
|
+
```
|
78
|
+
</div></details>
|
79
|
+
HTML
|
80
|
+
html = <<-HTML.chomp.strip_heredoc
|
81
|
+
<p><details><summary>Folding sample</summary><div></p>
|
82
|
+
|
83
|
+
<p><code>rb
|
84
|
+
puts 'Hello, World'
|
85
|
+
</code>
|
86
|
+
</div></details></p>
|
87
|
+
HTML
|
88
|
+
|
89
|
+
assert_renders html, details
|
68
90
|
end
|
69
91
|
end
|
data/test/html_render_test.rb
CHANGED
@@ -3,79 +3,81 @@ require 'test_helper'
|
|
3
3
|
|
4
4
|
class HTMLRenderTest < Greenmat::TestCase
|
5
5
|
def setup
|
6
|
-
@
|
7
|
-
@rndr = {
|
8
|
-
:no_html => Greenmat::Render::HTML.new(:filter_html => true),
|
9
|
-
:no_images => Greenmat::Render::HTML.new(:no_images => true),
|
10
|
-
:no_links => Greenmat::Render::HTML.new(:no_links => true),
|
11
|
-
:safe_links => Greenmat::Render::HTML.new(:safe_links_only => true),
|
12
|
-
:escape_html => Greenmat::Render::HTML.new(:escape_html => true),
|
13
|
-
:hard_wrap => Greenmat::Render::HTML.new(:hard_wrap => true),
|
14
|
-
:toc_data => Greenmat::Render::HTML.new(:with_toc_data => true),
|
15
|
-
:prettify => Greenmat::Render::HTML.new(:prettify => true)
|
16
|
-
}
|
17
|
-
end
|
18
|
-
|
19
|
-
def render_with(rndr, text)
|
20
|
-
Greenmat::Markdown.new(rndr).render(text)
|
6
|
+
@renderer = Greenmat::Render::HTML
|
21
7
|
end
|
22
8
|
|
23
9
|
# Hint: overrides filter_html, no_images and no_links
|
24
10
|
def test_that_escape_html_works
|
25
|
-
source =
|
26
|
-
Through <em>NO</em> <script>DOUBLE NO</script>
|
11
|
+
source = <<-HTML.strip_heredoc
|
12
|
+
Through <em>NO</em> <script>DOUBLE NO</script>
|
27
13
|
|
28
|
-
<script>BAD</script>
|
14
|
+
<script>BAD</script>
|
29
15
|
|
30
|
-
<img src="/favicon.ico" />
|
31
|
-
|
32
|
-
expected =
|
33
|
-
<p>Through <em>NO</em> <script>DOUBLE NO</script></p>
|
16
|
+
<img src="/favicon.ico" />
|
17
|
+
HTML
|
18
|
+
expected = <<-HTML.chomp.strip_heredoc
|
19
|
+
<p>Through <em>NO</em> <script>DOUBLE NO</script></p>
|
34
20
|
|
35
|
-
<p><script>BAD</script></p>
|
21
|
+
<p><script>BAD</script></p>
|
36
22
|
|
37
|
-
<p><img src="/favicon.ico" /></p>
|
38
|
-
|
23
|
+
<p><img src="/favicon.ico" /></p>
|
24
|
+
HTML
|
39
25
|
|
40
|
-
|
41
|
-
html_equal expected, markdown
|
26
|
+
assert_equal expected, render(source, with: [:escape_html])
|
42
27
|
end
|
43
28
|
|
44
29
|
def test_that_filter_html_works
|
45
|
-
markdown =
|
46
|
-
|
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
|
47
34
|
end
|
48
35
|
|
49
36
|
def test_filter_html_doesnt_break_two_space_hard_break
|
50
|
-
markdown =
|
51
|
-
|
37
|
+
markdown = "Lorem, \nipsum\n"
|
38
|
+
output = render(markdown, with: [:filter_html])
|
39
|
+
|
40
|
+
assert_equal "<p>Lorem,<br>\nipsum</p>", output
|
52
41
|
end
|
53
42
|
|
54
43
|
def test_that_no_image_flag_works
|
55
|
-
|
56
|
-
|
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
|
57
54
|
end
|
58
55
|
|
59
56
|
def test_that_no_links_flag_works
|
60
|
-
|
61
|
-
|
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
|
62
61
|
end
|
63
62
|
|
64
63
|
def test_that_safelink_flag_works
|
65
|
-
|
66
|
-
|
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
|
67
68
|
end
|
68
69
|
|
69
70
|
def test_that_hard_wrap_works
|
70
|
-
|
71
|
-
Hello world,
|
72
|
-
this is just a simple test
|
71
|
+
markdown = <<-Markdown.strip_heredoc
|
72
|
+
Hello world,
|
73
|
+
this is just a simple test
|
73
74
|
|
74
|
-
With hard wraps
|
75
|
-
and other *things*.
|
76
|
-
|
75
|
+
With hard wraps
|
76
|
+
and other *things*.
|
77
|
+
Markdown
|
78
|
+
output = render(markdown, with: [:hard_wrap])
|
77
79
|
|
78
|
-
|
80
|
+
assert_match %r{<br>}, output
|
79
81
|
end
|
80
82
|
|
81
83
|
def test_that_link_attributes_work
|
@@ -85,48 +87,45 @@ EOE
|
|
85
87
|
end
|
86
88
|
|
87
89
|
def test_that_link_works_with_quotes
|
88
|
-
|
89
|
-
|
90
|
+
markdown = %([This'link"is](http://example.net/))
|
91
|
+
expected = %(<p><a href="http://example.net/">This'link"is</a></p>)
|
90
92
|
|
91
|
-
|
92
|
-
assert_equal
|
93
|
+
assert_equal expected, render(markdown)
|
94
|
+
assert_equal expected, render(markdown, with: [:escape_html])
|
93
95
|
end
|
94
96
|
|
95
97
|
def test_that_code_emphasis_work
|
96
|
-
markdown = <<-
|
97
|
-
This should be **`a bold codespan`**
|
98
|
-
However, this should be *`an emphasised codespan`*
|
98
|
+
markdown = <<-Markdown.strip_heredoc
|
99
|
+
This should be **`a bold codespan`**
|
100
|
+
However, this should be *`an emphasised codespan`*
|
99
101
|
|
100
|
-
* **`ABC`** or **`DEF`**
|
101
|
-
* Foo bar
|
102
|
-
|
102
|
+
* **`ABC`** or **`DEF`**
|
103
|
+
* Foo bar
|
104
|
+
Markdown
|
103
105
|
|
104
|
-
html =
|
105
|
-
<p>This should be <strong><code>a bold codespan</code></strong>
|
106
|
-
However, this should be <em><code>an emphasised codespan</code></em></p>
|
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>
|
107
109
|
|
108
|
-
<ul>
|
109
|
-
<li><strong><code>ABC</code></strong> or <strong><code>DEF</code></strong></li>
|
110
|
-
<li>Foo bar</li>
|
111
|
-
</ul>
|
112
|
-
HTML
|
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
|
113
115
|
|
114
|
-
|
115
|
-
assert_equal html, output
|
116
|
+
assert_equal html, render(markdown)
|
116
117
|
end
|
117
118
|
|
118
119
|
def test_that_parenthesis_are_handled_into_links
|
119
|
-
markdown =
|
120
|
-
|
121
|
-
output = render_with(Greenmat::Render::HTML.new, markdown)
|
120
|
+
markdown = %(The [bash man page](man:bash(1))!)
|
121
|
+
expected = %(<p>The <a href="man:bash(1)">bash man page</a>!</p>)
|
122
122
|
|
123
|
-
assert_equal
|
123
|
+
assert_equal expected, render(markdown)
|
124
124
|
end
|
125
125
|
|
126
126
|
def test_autolinking_works_as_expected
|
127
|
-
markdown = "
|
128
|
-
|
129
|
-
output = renderer.render(markdown)
|
127
|
+
markdown = "Uri ftp://user:pass@example.com/. Email foo@bar.com and link http://bar.com"
|
128
|
+
output = render(markdown, with: [:autolink])
|
130
129
|
|
131
130
|
assert output.include? '<a href="ftp://user:pass@example.com/">ftp://user:pass@example.com/</a>'
|
132
131
|
assert output.include? 'mailto:foo@bar.com'
|
@@ -134,107 +133,142 @@ HTML
|
|
134
133
|
end
|
135
134
|
|
136
135
|
def test_that_footnotes_work
|
137
|
-
markdown = <<-
|
138
|
-
This is a footnote.[^1]
|
136
|
+
markdown = <<-Markdown.strip_heredoc
|
137
|
+
This is a footnote.[^1]
|
139
138
|
|
140
|
-
[^1]: It provides additional information.
|
141
|
-
|
139
|
+
[^1]: It provides additional information.
|
140
|
+
Markdown
|
142
141
|
|
143
|
-
html =
|
144
|
-
<p>This is a footnote.<sup id="fnref1"><a href="#fn1"
|
142
|
+
html = <<-HTML.chomp.strip_heredoc
|
143
|
+
<p>This is a footnote.<sup id="fnref1"><a href="#fn1">1</a></sup></p>
|
145
144
|
|
146
|
-
<div class="footnotes">
|
147
|
-
<hr>
|
148
|
-
<ol>
|
145
|
+
<div class="footnotes">
|
146
|
+
<hr>
|
147
|
+
<ol>
|
149
148
|
|
150
|
-
<li id="fn1">
|
151
|
-
<p>It provides additional information. <a href="#fnref1"
|
152
|
-
</li>
|
149
|
+
<li id="fn1">
|
150
|
+
<p>It provides additional information. <a href="#fnref1">↩</a></p>
|
151
|
+
</li>
|
153
152
|
|
154
|
-
</ol>
|
155
|
-
</div>
|
156
|
-
HTML
|
153
|
+
</ol>
|
154
|
+
</div>
|
155
|
+
HTML
|
157
156
|
|
158
|
-
|
159
|
-
output = renderer.render(markdown)
|
157
|
+
output = render(markdown, with: [:footnotes])
|
160
158
|
assert_equal html, output
|
161
159
|
end
|
162
160
|
|
163
161
|
def test_footnotes_enabled_but_missing_marker
|
164
|
-
markdown =
|
165
|
-
Some text without a marker
|
162
|
+
markdown = <<-Markdown.strip_heredoc
|
163
|
+
Some text without a marker
|
166
164
|
|
167
|
-
[^1] And a trailing definition
|
168
|
-
|
169
|
-
html =
|
170
|
-
<p>Some text without a marker</p>
|
165
|
+
[^1] And a trailing definition
|
166
|
+
Markdown
|
167
|
+
html = <<-HTML.chomp.strip_heredoc
|
168
|
+
<p>Some text without a marker</p>
|
171
169
|
|
172
|
-
<p>[^1] And a trailing definition</p>
|
173
|
-
HTML
|
170
|
+
<p>[^1] And a trailing definition</p>
|
171
|
+
HTML
|
174
172
|
|
175
|
-
|
176
|
-
output = renderer.render(markdown)
|
173
|
+
output = render(markdown, with: [:footnotes])
|
177
174
|
assert_equal html, output
|
178
175
|
end
|
179
176
|
|
180
177
|
def test_footnotes_enabled_but_missing_definition
|
181
178
|
markdown = "Some text with a marker[^1] but no definition."
|
182
|
-
|
179
|
+
expected = "<p>Some text with a marker[^1] but no definition.</p>"
|
183
180
|
|
184
|
-
|
185
|
-
|
186
|
-
assert_equal html, output
|
181
|
+
output = render(markdown, with: [:footnotes])
|
182
|
+
assert_equal expected, output
|
187
183
|
end
|
188
184
|
|
189
185
|
def test_autolink_short_domains
|
190
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"
|
191
|
-
|
192
|
-
output = renderer.render(markdown)
|
187
|
+
output = render(markdown, with: [:autolink])
|
193
188
|
|
194
189
|
assert output.include? '<a href="ftp://auto/short/domains">ftp://auto/short/domains</a>'
|
195
190
|
assert output.include? 'mailto:auto@l.n'
|
196
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>'
|
197
192
|
end
|
198
193
|
|
199
|
-
def test_toc_heading_id
|
200
|
-
markdown = "# First level heading\n## Second level heading"
|
201
|
-
output = render_with(@rndr[:toc_data], markdown)
|
202
|
-
assert_match /<h1 id="first-level-heading">/, output
|
203
|
-
assert_match /<h2 id="second-level-heading">/, output
|
204
|
-
end
|
205
|
-
|
206
194
|
def test_that_prettify_works
|
207
|
-
|
208
|
-
|
195
|
+
markdown = "\tclass Foo\nend"
|
196
|
+
output = render(markdown, with: [:prettify])
|
197
|
+
|
198
|
+
assert output.include?("<pre><code class=\"prettyprint\">")
|
209
199
|
|
210
|
-
|
211
|
-
|
212
|
-
code
|
213
|
-
~~~
|
200
|
+
markdown = "`class`"
|
201
|
+
output = render(markdown, with: [:prettify])
|
214
202
|
|
215
|
-
|
216
|
-
|
203
|
+
assert output.include?("<code class=\"prettyprint\">")
|
204
|
+
end
|
217
205
|
|
218
|
-
|
219
|
-
|
206
|
+
def test_prettify_with_fenced_code_blocks
|
207
|
+
markdown = "~~~ruby\ncode\n~~~"
|
208
|
+
output = render(markdown, with: [:fenced_code_blocks, :prettify])
|
220
209
|
|
221
|
-
assert output.include?("<code class=\"prettyprint ruby\">")
|
210
|
+
assert output.include?("<code class=\"prettyprint\" data-metadata=\"ruby\">")
|
222
211
|
end
|
223
212
|
|
224
213
|
def test_safe_links_only_with_anchors
|
225
214
|
markdown = "An [anchor link](#anchor) on a page."
|
226
|
-
|
227
|
-
renderer = Greenmat::Markdown.new(@rndr[:safe_links])
|
228
|
-
output = renderer.render(markdown)
|
215
|
+
output = render(markdown, with: [:safe_links_only])
|
229
216
|
|
230
217
|
assert_match %r{<a href="#anchor">anchor link</a>}, output
|
231
218
|
end
|
232
219
|
|
233
220
|
def test_autolink_with_link_attributes
|
234
|
-
|
235
|
-
|
221
|
+
options = { autolink: true, link_attributes: {rel: "nofollow"} }
|
222
|
+
output = render("https://github.com/", with: options)
|
236
223
|
|
237
|
-
output = parser.render("https://github.com/")
|
238
224
|
assert_match %r{rel="nofollow"}, output
|
239
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
|
240
274
|
end
|