commonmarker 0.17.13 → 0.23.4
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of commonmarker might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/README.md +94 -18
- data/Rakefile +24 -5
- data/bin/commonmarker +107 -47
- data/commonmarker.gemspec +18 -15
- data/ext/commonmarker/autolink.c +10 -6
- data/ext/commonmarker/blocks.c +102 -31
- data/ext/commonmarker/buffer.c +0 -1
- data/ext/commonmarker/chunk.h +0 -1
- data/ext/commonmarker/cmark-gfm-core-extensions.h +29 -0
- data/ext/commonmarker/cmark-gfm-extension_api.h +19 -2
- data/ext/commonmarker/cmark-gfm.h +19 -5
- data/ext/commonmarker/cmark-gfm_version.h +2 -2
- data/ext/commonmarker/commonmark.c +33 -12
- data/ext/commonmarker/commonmarker.c +209 -100
- data/ext/commonmarker/core-extensions.c +2 -0
- data/ext/commonmarker/ext_scanners.c +622 -684
- data/ext/commonmarker/ext_scanners.h +2 -0
- data/ext/commonmarker/extconf.rb +3 -1
- data/ext/commonmarker/footnotes.c +23 -0
- data/ext/commonmarker/footnotes.h +2 -0
- data/ext/commonmarker/houdini_href_e.c +1 -1
- data/ext/commonmarker/html.c +46 -25
- data/ext/commonmarker/inlines.c +127 -30
- data/ext/commonmarker/iterator.h +0 -1
- data/ext/commonmarker/map.h +0 -1
- data/ext/commonmarker/node.c +17 -3
- data/ext/commonmarker/node.h +9 -0
- data/ext/commonmarker/parser.h +2 -1
- data/ext/commonmarker/plaintext.c +22 -0
- data/ext/commonmarker/render.c +18 -15
- data/ext/commonmarker/render.h +0 -1
- data/ext/commonmarker/scanners.c +779 -953
- data/ext/commonmarker/scanners.h +0 -2
- data/ext/commonmarker/strikethrough.c +4 -1
- data/ext/commonmarker/syntax_extension.c +10 -0
- data/ext/commonmarker/syntax_extension.h +2 -0
- data/ext/commonmarker/table.c +178 -31
- data/ext/commonmarker/tasklist.c +156 -0
- data/ext/commonmarker/tasklist.h +8 -0
- data/ext/commonmarker/xml.c +9 -2
- data/lib/commonmarker/config.rb +41 -38
- data/lib/commonmarker/errors.rb +12 -0
- data/lib/commonmarker/node/inspect.rb +15 -17
- data/lib/commonmarker/node.rb +14 -2
- data/lib/commonmarker/renderer/html_renderer.rb +45 -36
- data/lib/commonmarker/renderer.rb +16 -10
- data/lib/commonmarker/version.rb +3 -1
- data/lib/commonmarker.rb +8 -7
- data/test/benchmark.rb +26 -21
- data/test/fixtures/strong.md +1 -0
- data/test/fixtures/table.md +10 -0
- data/test/test_attributes.rb +5 -3
- data/test/test_basics.rb +19 -0
- data/test/test_commands.rb +72 -0
- data/test/test_commonmark.rb +15 -13
- data/test/test_doc.rb +31 -29
- data/test/test_encoding.rb +9 -5
- data/test/test_extensions.rb +66 -73
- data/test/test_footnotes.rb +47 -12
- data/test/test_gc.rb +6 -2
- data/test/test_helper.rb +25 -15
- data/test/test_linebreaks.rb +2 -0
- data/test/test_maliciousness.rb +189 -190
- data/test/test_node.rb +12 -12
- data/test/test_options.rb +17 -15
- data/test/test_pathological_inputs.rb +14 -12
- data/test/test_plaintext.rb +23 -21
- data/test/test_renderer.rb +29 -10
- data/test/test_smartpunct.rb +7 -2
- data/test/test_spec.rb +7 -4
- data/test/test_tasklists.rb +43 -0
- data/test/test_xml.rb +107 -0
- metadata +74 -30
data/test/test_linebreaks.rb
CHANGED
data/test/test_maliciousness.rb
CHANGED
@@ -1,263 +1,262 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
def setup
|
5
|
-
@doc = CommonMarker.render_doc('Hi *there*')
|
6
|
-
end
|
3
|
+
require 'test_helper'
|
7
4
|
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
module CommonMarker
|
6
|
+
class TestMaliciousness < Minitest::Test
|
7
|
+
def setup
|
8
|
+
@doc = CommonMarker.render_doc('Hi *there*')
|
11
9
|
end
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
def test_init_with_bad_type
|
12
|
+
assert_raises TypeError do
|
13
|
+
Node.new(123)
|
14
|
+
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
assert_raises NodeError do
|
17
|
+
Node.new(:totes_fake)
|
18
|
+
end
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
assert_raises TypeError do
|
21
|
+
Node.new([])
|
22
|
+
end
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
24
|
+
assert_raises TypeError do
|
25
|
+
Node.new([23])
|
26
|
+
end
|
29
27
|
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
assert_raises TypeError do
|
29
|
+
Node.new(nil)
|
30
|
+
end
|
33
31
|
end
|
34
32
|
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
def test_rendering_with_bad_type
|
34
|
+
assert_raises TypeError do
|
35
|
+
CommonMarker.render_html("foo \n baz", 123)
|
36
|
+
end
|
38
37
|
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
assert_raises TypeError do
|
39
|
+
CommonMarker.render_html("foo \n baz", :totes_fake)
|
40
|
+
end
|
42
41
|
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
assert_raises TypeError do
|
43
|
+
CommonMarker.render_html("foo \n baz", [])
|
44
|
+
end
|
46
45
|
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
assert_raises TypeError do
|
47
|
+
CommonMarker.render_html("foo \n baz", [23])
|
48
|
+
end
|
50
49
|
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
assert_raises TypeError do
|
51
|
+
CommonMarker.render_html("foo \n baz", nil)
|
52
|
+
end
|
54
53
|
|
55
|
-
|
56
|
-
|
57
|
-
|
54
|
+
assert_raises TypeError do
|
55
|
+
CommonMarker.render_html("foo \n baz", [:SMART, 'totes_fake'])
|
56
|
+
end
|
58
57
|
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
assert_raises TypeError do
|
59
|
+
CommonMarker.render_html(123)
|
60
|
+
end
|
62
61
|
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
assert_raises TypeError do
|
63
|
+
CommonMarker.render_html([123])
|
64
|
+
end
|
66
65
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
assert_equal err.message, 'option \':SMART\' does not exist for CommonMarker::Config::Render'
|
66
|
+
assert_raises TypeError do
|
67
|
+
CommonMarker.render_html(nil)
|
68
|
+
end
|
71
69
|
|
72
|
-
|
73
|
-
|
74
|
-
|
70
|
+
assert_raises TypeError do
|
71
|
+
CommonMarker.render_doc("foo \n baz", 123)
|
72
|
+
end
|
75
73
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
74
|
+
err = assert_raises TypeError do
|
75
|
+
CommonMarker.render_doc("foo \n baz", :safe)
|
76
|
+
end
|
77
|
+
assert_equal('option \':safe\' does not exist for CommonMarker::Config::OPTS[:parse]', err.message)
|
80
78
|
|
81
|
-
|
82
|
-
|
83
|
-
|
79
|
+
assert_raises TypeError do
|
80
|
+
CommonMarker.render_doc("foo \n baz", :totes_fake)
|
81
|
+
end
|
84
82
|
|
85
|
-
|
86
|
-
|
87
|
-
|
83
|
+
assert_raises TypeError do
|
84
|
+
CommonMarker.render_doc("foo \n baz", [])
|
85
|
+
end
|
88
86
|
|
89
|
-
|
90
|
-
|
91
|
-
|
87
|
+
assert_raises TypeError do
|
88
|
+
CommonMarker.render_doc("foo \n baz", [23])
|
89
|
+
end
|
92
90
|
|
93
|
-
|
94
|
-
|
95
|
-
|
91
|
+
assert_raises TypeError do
|
92
|
+
CommonMarker.render_doc("foo \n baz", nil)
|
93
|
+
end
|
96
94
|
|
97
|
-
|
98
|
-
|
99
|
-
|
95
|
+
assert_raises TypeError do
|
96
|
+
CommonMarker.render_doc("foo \n baz", [:SMART, 'totes_fake'])
|
97
|
+
end
|
100
98
|
|
101
|
-
|
102
|
-
|
103
|
-
|
99
|
+
assert_raises TypeError do
|
100
|
+
CommonMarker.render_doc(123)
|
101
|
+
end
|
104
102
|
|
105
|
-
|
106
|
-
|
107
|
-
|
103
|
+
assert_raises TypeError do
|
104
|
+
CommonMarker.render_doc([123])
|
105
|
+
end
|
108
106
|
|
109
|
-
|
110
|
-
|
107
|
+
assert_raises TypeError do
|
108
|
+
CommonMarker.render_doc(nil)
|
109
|
+
end
|
111
110
|
end
|
112
|
-
end
|
113
111
|
|
114
|
-
|
115
|
-
|
116
|
-
|
112
|
+
def test_bad_set_string_content
|
113
|
+
assert_raises TypeError do
|
114
|
+
@doc.string_content = 123
|
115
|
+
end
|
117
116
|
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def test_bad_walking
|
121
|
-
assert_nil @doc.parent
|
122
|
-
assert_nil @doc.previous
|
123
|
-
end
|
124
117
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
@doc.insert_before(code)
|
118
|
+
def test_bad_walking
|
119
|
+
assert_nil @doc.parent
|
120
|
+
assert_nil @doc.previous
|
129
121
|
end
|
130
122
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
123
|
+
def test_bad_insertion
|
124
|
+
code = Node.new(:code)
|
125
|
+
assert_raises NodeError do
|
126
|
+
@doc.insert_before(code)
|
127
|
+
end
|
135
128
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
129
|
+
paragraph = Node.new(:paragraph)
|
130
|
+
assert_raises NodeError do
|
131
|
+
@doc.insert_after(paragraph)
|
132
|
+
end
|
140
133
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
134
|
+
document = Node.new(:document)
|
135
|
+
assert_raises NodeError do
|
136
|
+
@doc.prepend_child(document)
|
137
|
+
end
|
145
138
|
|
146
|
-
|
147
|
-
|
148
|
-
|
139
|
+
assert_raises NodeError do
|
140
|
+
@doc.append_child(document)
|
141
|
+
end
|
149
142
|
end
|
150
|
-
end
|
151
143
|
|
152
|
-
|
153
|
-
|
154
|
-
|
144
|
+
def test_bad_url_get
|
145
|
+
assert_raises NodeError do
|
146
|
+
@doc.url
|
147
|
+
end
|
155
148
|
end
|
156
149
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
end
|
150
|
+
def test_bad_url_set
|
151
|
+
assert_raises NodeError do
|
152
|
+
@doc.url = '123'
|
153
|
+
end
|
162
154
|
|
163
|
-
|
164
|
-
|
165
|
-
|
155
|
+
link = CommonMarker.render_doc('[GitHub](https://www.github.com)').first_child.first_child
|
156
|
+
assert_raises TypeError do
|
157
|
+
link.url = 123
|
158
|
+
end
|
166
159
|
end
|
167
|
-
end
|
168
160
|
|
169
|
-
|
170
|
-
|
171
|
-
|
161
|
+
def test_bad_title_get
|
162
|
+
assert_raises NodeError do
|
163
|
+
@doc.title
|
164
|
+
end
|
172
165
|
end
|
173
166
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
end
|
179
|
-
end
|
167
|
+
def test_bad_title_set
|
168
|
+
assert_raises NodeError do
|
169
|
+
@doc.title = '123'
|
170
|
+
end
|
180
171
|
|
181
|
-
|
182
|
-
|
183
|
-
|
172
|
+
image = CommonMarker.render_doc('![alt text](https://github.com/favicon.ico "Favicon")')
|
173
|
+
image = image.first_child.first_child
|
174
|
+
assert_raises TypeError do
|
175
|
+
image.title = 123
|
176
|
+
end
|
184
177
|
end
|
185
|
-
end
|
186
178
|
|
187
|
-
|
188
|
-
|
189
|
-
|
179
|
+
def test_bad_header_level_get
|
180
|
+
assert_raises NodeError do
|
181
|
+
@doc.header_level
|
182
|
+
end
|
190
183
|
end
|
191
184
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
end
|
185
|
+
def test_bad_header_level_set
|
186
|
+
assert_raises NodeError do
|
187
|
+
@doc.header_level = 1
|
188
|
+
end
|
197
189
|
|
198
|
-
|
199
|
-
|
200
|
-
|
190
|
+
header = CommonMarker.render_doc('### Header Three').first_child
|
191
|
+
assert_raises TypeError do
|
192
|
+
header.header_level = '123'
|
193
|
+
end
|
201
194
|
end
|
202
|
-
end
|
203
195
|
|
204
|
-
|
205
|
-
|
206
|
-
|
196
|
+
def test_bad_list_type_get
|
197
|
+
assert_raises NodeError do
|
198
|
+
@doc.list_type
|
199
|
+
end
|
207
200
|
end
|
208
201
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
assert_raises TypeError do
|
214
|
-
ul_list.list_type = 1234
|
215
|
-
end
|
216
|
-
end
|
202
|
+
def test_bad_list_type_set
|
203
|
+
assert_raises NodeError do
|
204
|
+
@doc.list_type = :bullet_list
|
205
|
+
end
|
217
206
|
|
218
|
-
|
219
|
-
|
220
|
-
|
207
|
+
ul_list = CommonMarker.render_doc("* Bullet\n*Bullet").first_child
|
208
|
+
assert_raises NodeError do
|
209
|
+
ul_list.list_type = :fake
|
210
|
+
end
|
211
|
+
assert_raises TypeError do
|
212
|
+
ul_list.list_type = 1234
|
213
|
+
end
|
221
214
|
end
|
222
|
-
end
|
223
215
|
|
224
|
-
|
225
|
-
|
226
|
-
|
216
|
+
def test_bad_list_start_get
|
217
|
+
assert_raises NodeError do
|
218
|
+
@doc.list_start
|
219
|
+
end
|
227
220
|
end
|
228
221
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
end
|
222
|
+
def test_bad_list_start_set
|
223
|
+
assert_raises NodeError do
|
224
|
+
@doc.list_start = 12
|
225
|
+
end
|
234
226
|
|
235
|
-
|
236
|
-
|
237
|
-
|
227
|
+
ol_list = CommonMarker.render_doc("1. One\n2. Two").first_child
|
228
|
+
assert_raises TypeError do
|
229
|
+
ol_list.list_start = :fake
|
230
|
+
end
|
238
231
|
end
|
239
|
-
end
|
240
232
|
|
241
|
-
|
242
|
-
|
243
|
-
|
233
|
+
def test_bad_list_tight_get
|
234
|
+
assert_raises NodeError do
|
235
|
+
@doc.list_tight
|
236
|
+
end
|
244
237
|
end
|
245
|
-
end
|
246
238
|
|
247
|
-
|
248
|
-
|
249
|
-
|
239
|
+
def test_bad_list_tight_set
|
240
|
+
assert_raises NodeError do
|
241
|
+
@doc.list_tight = false
|
242
|
+
end
|
250
243
|
end
|
251
|
-
end
|
252
244
|
|
253
|
-
|
254
|
-
|
255
|
-
|
245
|
+
def test_bad_fence_info_get
|
246
|
+
assert_raises NodeError do
|
247
|
+
@doc.fence_info
|
248
|
+
end
|
256
249
|
end
|
257
250
|
|
258
|
-
|
259
|
-
|
260
|
-
|
251
|
+
def test_bad_fence_info_set
|
252
|
+
assert_raises NodeError do
|
253
|
+
@doc.fence_info = 'ruby'
|
254
|
+
end
|
255
|
+
|
256
|
+
fence = CommonMarker.render_doc("``` ruby\nputs 'wow'\n```").first_child
|
257
|
+
assert_raises TypeError do
|
258
|
+
fence.fence_info = 123
|
259
|
+
end
|
261
260
|
end
|
262
261
|
end
|
263
262
|
end
|
data/test/test_node.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class TestNode < Minitest::Test
|
@@ -10,7 +12,7 @@ class TestNode < Minitest::Test
|
|
10
12
|
@doc.walk do |node|
|
11
13
|
nodes << node.type
|
12
14
|
end
|
13
|
-
assert_equal [
|
15
|
+
assert_equal %i[document paragraph text emph text text], nodes
|
14
16
|
end
|
15
17
|
|
16
18
|
def test_each
|
@@ -18,29 +20,29 @@ class TestNode < Minitest::Test
|
|
18
20
|
@doc.first_child.each do |node|
|
19
21
|
nodes << node.type
|
20
22
|
end
|
21
|
-
assert_equal [
|
23
|
+
assert_equal %i[text emph text], nodes
|
22
24
|
end
|
23
25
|
|
24
26
|
def test_deprecated_each_child
|
25
27
|
nodes = []
|
26
|
-
|
28
|
+
_, err = capture_io do
|
27
29
|
@doc.first_child.each_child do |node|
|
28
30
|
nodes << node.type
|
29
31
|
end
|
30
32
|
end
|
31
|
-
assert_equal [
|
32
|
-
assert_match
|
33
|
+
assert_equal %i[text emph text], nodes
|
34
|
+
assert_match(/`each_child` is deprecated/, err)
|
33
35
|
end
|
34
36
|
|
35
37
|
def test_select
|
36
38
|
nodes = @doc.first_child.select { |node| node.type == :text }
|
37
39
|
assert_equal CommonMarker::Node, nodes.first.class
|
38
|
-
assert_equal [
|
40
|
+
assert_equal %i[text text], nodes.map(&:type)
|
39
41
|
end
|
40
42
|
|
41
43
|
def test_map
|
42
44
|
nodes = @doc.first_child.map(&:type)
|
43
|
-
assert_equal [
|
45
|
+
assert_equal %i[text emph text], nodes
|
44
46
|
end
|
45
47
|
|
46
48
|
def test_insert_illegal
|
@@ -61,9 +63,7 @@ class TestNode < Minitest::Test
|
|
61
63
|
|
62
64
|
def test_walk_and_set_string_content
|
63
65
|
@doc.walk do |node|
|
64
|
-
if node.type == :text && node.string_content == 'there'
|
65
|
-
node.string_content = 'world'
|
66
|
-
end
|
66
|
+
node.string_content = 'world' if node.type == :text && node.string_content == 'there'
|
67
67
|
end
|
68
68
|
result = HtmlRenderer.new.render(@doc)
|
69
69
|
assert_equal "<p>Hi <em>world</em>, I am mostly text!</p>\n", result
|
@@ -80,10 +80,10 @@ class TestNode < Minitest::Test
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def test_inspect
|
83
|
-
assert_match
|
83
|
+
assert_match(/#<CommonMarker::Node\(document\):/, @doc.inspect)
|
84
84
|
end
|
85
85
|
|
86
86
|
def test_pretty_print
|
87
|
-
assert_match
|
87
|
+
assert_match(/#<CommonMarker::Node\(document\):/, PP.pp(@doc, +''))
|
88
88
|
end
|
89
89
|
end
|
data/test/test_options.rb
CHANGED
@@ -1,35 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class TestExtensions < Minitest::Test
|
4
6
|
def test_full_info_string
|
5
|
-
md =
|
6
|
-
```ruby
|
7
|
-
module Foo
|
8
|
-
```
|
7
|
+
md = <<~MD
|
8
|
+
```ruby
|
9
|
+
module Foo
|
10
|
+
```
|
9
11
|
MD
|
10
12
|
|
11
13
|
CommonMarker.render_html(md, :FULL_INFO_STRING).tap do |out|
|
12
|
-
assert_includes out,
|
14
|
+
assert_includes out, '<pre><code class="language-ruby">'
|
13
15
|
end
|
14
16
|
|
15
|
-
md =
|
16
|
-
```ruby my info string
|
17
|
-
module Foo
|
18
|
-
```
|
17
|
+
md = <<~MD
|
18
|
+
```ruby my info string
|
19
|
+
module Foo
|
20
|
+
```
|
19
21
|
MD
|
20
22
|
|
21
23
|
CommonMarker.render_html(md, :FULL_INFO_STRING).tap do |out|
|
22
|
-
assert_includes out,
|
24
|
+
assert_includes out, '<pre><code class="language-ruby" data-meta="my info string">'
|
23
25
|
end
|
24
26
|
|
25
|
-
md =
|
26
|
-
```ruby my \x00 string
|
27
|
-
module Foo
|
28
|
-
```
|
27
|
+
md = <<~MD
|
28
|
+
```ruby my \x00 string
|
29
|
+
module Foo
|
30
|
+
```
|
29
31
|
MD
|
30
32
|
|
31
33
|
CommonMarker.render_html(md, :FULL_INFO_STRING).tap do |out|
|
32
|
-
assert_includes out, %
|
34
|
+
assert_includes out, %(<pre><code class="language-ruby" data-meta="my � string">)
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
@@ -1,14 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
require 'minitest/benchmark' if ENV['BENCH']
|
3
5
|
|
4
|
-
def markdown(
|
5
|
-
CommonMarker.render_doc(
|
6
|
+
def markdown(str)
|
7
|
+
CommonMarker.render_doc(str).to_html
|
6
8
|
end
|
7
9
|
|
8
10
|
# list of pairs consisting of input and a regex that must match the output.
|
9
11
|
pathological = {
|
10
12
|
'nested strong emph' =>
|
11
|
-
[
|
13
|
+
["#{'*a **a ' * 65_000}b#{' a** a*' * 65_000}",
|
12
14
|
Regexp.compile('(<em>a <strong>a ){65_000}b( a</strong> a</em>){65_000}')],
|
13
15
|
'many emph closers with no openers' =>
|
14
16
|
[('a_ ' * 65_000),
|
@@ -32,10 +34,10 @@ pathological = {
|
|
32
34
|
['**x [a*b**c*](d)',
|
33
35
|
Regexp.compile('\\*\\*x <a href=\'d\'>a<em>b</em><em>c</em></a>')],
|
34
36
|
'nested brackets' =>
|
35
|
-
[
|
37
|
+
["#{'[' * 50_000}a#{']' * 50_000}",
|
36
38
|
Regexp.compile('\[{50000}a\]{50000}')],
|
37
39
|
'nested block quotes' =>
|
38
|
-
[
|
40
|
+
["#{'> ' * 50_000}a",
|
39
41
|
Regexp.compile('(<blockquote>\n){50000}')],
|
40
42
|
'U+0000 in input' =>
|
41
43
|
['abc\u0000de\u0000',
|
@@ -51,41 +53,41 @@ end
|
|
51
53
|
|
52
54
|
if ENV['BENCH']
|
53
55
|
class PathologicalInputsPerformanceTest < Minitest::Benchmark
|
54
|
-
def
|
56
|
+
def test_bench_pathological_one
|
55
57
|
assert_performance_linear 0.99 do |n|
|
56
58
|
star = '*' * (n * 10)
|
57
59
|
markdown("#{star}#{star}hi#{star}#{star}")
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
61
|
-
def
|
63
|
+
def test_bench_pathological_two
|
62
64
|
assert_performance_linear 0.99 do |n|
|
63
65
|
c = '`t`t`t`t`t`t' * (n * 10)
|
64
66
|
markdown(c)
|
65
67
|
end
|
66
68
|
end
|
67
69
|
|
68
|
-
def
|
70
|
+
def test_bench_pathological_three
|
69
71
|
assert_performance_linear 0.99 do |n|
|
70
72
|
markdown(" [a]: #{'A' * n}\n\n#{'[a][]' * n}\n")
|
71
73
|
end
|
72
74
|
end
|
73
75
|
|
74
|
-
def
|
76
|
+
def test_bench_pathological_four
|
75
77
|
assert_performance_linear 0.5 do |n|
|
76
78
|
markdown("#{'[' * n}a#{']' * n}")
|
77
79
|
end
|
78
80
|
end
|
79
81
|
|
80
|
-
def
|
82
|
+
def test_bench_pathological_five
|
81
83
|
assert_performance_linear 0.99 do |n|
|
82
84
|
markdown("#{'**a *a ' * n}#{'a* a**' * n}")
|
83
85
|
end
|
84
86
|
end
|
85
87
|
|
86
|
-
def
|
88
|
+
def test_bench_unbound_recursion
|
87
89
|
assert_performance_linear 0.99 do |n|
|
88
|
-
markdown(
|
90
|
+
markdown("#{'[' * n}foo#{'](bar)' * n}")
|
89
91
|
end
|
90
92
|
end
|
91
93
|
end
|