qiita-markdown 0.24.0 → 0.25.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of qiita-markdown might be problematic. Click here for more details.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89534a166cf79eb437e025498219b56ad7f62ec2
|
4
|
+
data.tar.gz: 8e4d0c3fe57c5876dbc3467a1a523fb2b96f7174
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7b791b1d6ee445d539b1f6576d17f00e70370f3a723efcf614c85ea1277a49d43848570202955fdf016ff11965657a3feb8395887ea11de8c37510da60949c3
|
7
|
+
data.tar.gz: a31faf66fcd5e3d5509adeb1b4726e6b76f9184efdf6831f451048e5fbb9d187b7b62846f888ff5691a9b8f338ec1c7664579aad58e40e26008cddc90588fab4
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,10 @@ module Qiita
|
|
2
2
|
module Markdown
|
3
3
|
module Embed
|
4
4
|
module CodePen
|
5
|
-
|
5
|
+
SCRIPT_URLS = [
|
6
|
+
"https://production-assets.codepen.io/assets/embed/ei.js",
|
7
|
+
"https://static.codepen.io/assets/embed/ei.js",
|
8
|
+
]
|
6
9
|
CLASS_NAME = %w[codepen]
|
7
10
|
DATA_ATTRIBUTES = %w[
|
8
11
|
data-active-link-color data-active-tab-color data-animations data-border
|
@@ -21,9 +21,9 @@ describe Qiita::Markdown::Processor do
|
|
21
21
|
shared_examples_for "basic markdown syntax" do
|
22
22
|
context "with valid condition" do
|
23
23
|
let(:markdown) do
|
24
|
-
<<-
|
24
|
+
<<-MARKDOWN.strip_heredoc
|
25
25
|
example
|
26
|
-
|
26
|
+
MARKDOWN
|
27
27
|
end
|
28
28
|
|
29
29
|
it "returns a Hash with HTML output and other metadata" do
|
@@ -39,9 +39,9 @@ describe Qiita::Markdown::Processor do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it "sanitizes them" do
|
42
|
-
should eq <<-
|
42
|
+
should eq <<-HTML.strip_heredoc
|
43
43
|
<p><>&</p>
|
44
|
-
|
44
|
+
HTML
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -51,24 +51,24 @@ describe Qiita::Markdown::Processor do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
it "replaces with mailto link" do
|
54
|
-
should eq <<-
|
54
|
+
should eq <<-HTML.strip_heredoc
|
55
55
|
<p><a href="mailto:test@example.com" class="autolink">test@example.com</a></p>
|
56
|
-
|
56
|
+
HTML
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
60
|
context "with headings" do
|
61
61
|
let(:markdown) do
|
62
|
-
<<-
|
62
|
+
<<-MARKDOWN.strip_heredoc
|
63
63
|
# a
|
64
64
|
## a
|
65
65
|
### a
|
66
66
|
### a
|
67
|
-
|
67
|
+
MARKDOWN
|
68
68
|
end
|
69
69
|
|
70
70
|
it "adds ID for ToC" do
|
71
|
-
should eq <<-
|
71
|
+
should eq <<-HTML.strip_heredoc
|
72
72
|
|
73
73
|
<h1>
|
74
74
|
<span id="a" class="fragment"></span><a href="#a"><i class="fa fa-link"></i></a>a</h1>
|
@@ -81,48 +81,48 @@ describe Qiita::Markdown::Processor do
|
|
81
81
|
|
82
82
|
<h3>
|
83
83
|
<span id="a-3" class="fragment"></span><a href="#a-3"><i class="fa fa-link"></i></a>a</h3>
|
84
|
-
|
84
|
+
HTML
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
88
|
context "with heading whose title includes special HTML characters" do
|
89
89
|
let(:markdown) do
|
90
|
-
<<-
|
90
|
+
<<-MARKDOWN.strip_heredoc
|
91
91
|
# <b>R&B</b>
|
92
|
-
|
92
|
+
MARKDOWN
|
93
93
|
end
|
94
94
|
|
95
95
|
it "generates fragment identifier by sanitizing the special characters in the title" do
|
96
|
-
should eq <<-
|
96
|
+
should eq <<-HTML.strip_heredoc
|
97
97
|
|
98
98
|
<h1>
|
99
99
|
<span id="rb" class="fragment"></span><a href="#rb"><i class="fa fa-link"></i></a><b>R&B</b>
|
100
100
|
</h1>
|
101
|
-
|
101
|
+
HTML
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
105
|
context "with manually inputted heading HTML tags without id attribute" do
|
106
106
|
let(:markdown) do
|
107
|
-
<<-
|
107
|
+
<<-MARKDOWN.strip_heredoc
|
108
108
|
<h1>foo</h1>
|
109
|
-
|
109
|
+
MARKDOWN
|
110
110
|
end
|
111
111
|
|
112
112
|
it "does nothing" do
|
113
|
-
should eq <<-
|
113
|
+
should eq <<-HTML.strip_heredoc
|
114
114
|
<h1>foo</h1>
|
115
|
-
|
115
|
+
HTML
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
119
|
context "with code" do
|
120
120
|
let(:markdown) do
|
121
|
-
<<-
|
121
|
+
<<-MARKDOWN.strip_heredoc
|
122
122
|
```foo.rb
|
123
123
|
puts 'hello world'
|
124
124
|
```
|
125
|
-
|
125
|
+
MARKDOWN
|
126
126
|
end
|
127
127
|
|
128
128
|
it "returns detected codes" do
|
@@ -138,68 +138,68 @@ describe Qiita::Markdown::Processor do
|
|
138
138
|
|
139
139
|
context "with code & filename" do
|
140
140
|
let(:markdown) do
|
141
|
-
<<-
|
141
|
+
<<-MARKDOWN.strip_heredoc
|
142
142
|
```example.rb
|
143
143
|
1
|
144
144
|
```
|
145
|
-
|
145
|
+
MARKDOWN
|
146
146
|
end
|
147
147
|
|
148
148
|
it "returns code-frame, code-lang, and highlighted pre element" do
|
149
|
-
should eq <<-
|
149
|
+
should eq <<-HTML.strip_heredoc
|
150
150
|
<div class="code-frame" data-lang="ruby">
|
151
151
|
<div class="code-lang"><span class="bold">example.rb</span></div>
|
152
152
|
<div class="highlight"><pre><span></span><span class="mi">1</span>
|
153
153
|
</pre></div>
|
154
154
|
</div>
|
155
|
-
|
155
|
+
HTML
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
159
159
|
context "with code & filename with .php" do
|
160
160
|
let(:markdown) do
|
161
|
-
<<-
|
161
|
+
<<-MARKDOWN.strip_heredoc
|
162
162
|
```example.php
|
163
163
|
1
|
164
164
|
```
|
165
|
-
|
165
|
+
MARKDOWN
|
166
166
|
end
|
167
167
|
|
168
168
|
it "returns PHP code-frame" do
|
169
|
-
should eq <<-
|
169
|
+
should eq <<-HTML.strip_heredoc
|
170
170
|
<div class="code-frame" data-lang="php">
|
171
171
|
<div class="code-lang"><span class="bold">example.php</span></div>
|
172
172
|
<div class="highlight"><pre><span></span><span class="mi">1</span>
|
173
173
|
</pre></div>
|
174
174
|
</div>
|
175
|
-
|
175
|
+
HTML
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
179
|
context "with code & no filename" do
|
180
180
|
let(:markdown) do
|
181
|
-
<<-
|
181
|
+
<<-MARKDOWN.strip_heredoc
|
182
182
|
```ruby
|
183
183
|
1
|
184
184
|
```
|
185
|
-
|
185
|
+
MARKDOWN
|
186
186
|
end
|
187
187
|
|
188
188
|
it "returns code-frame and highlighted pre element" do
|
189
|
-
should eq <<-
|
189
|
+
should eq <<-HTML.strip_heredoc
|
190
190
|
<div class="code-frame" data-lang="ruby"><div class="highlight"><pre><span></span><span class="mi">1</span>
|
191
191
|
</pre></div></div>
|
192
|
-
|
192
|
+
HTML
|
193
193
|
end
|
194
194
|
end
|
195
195
|
|
196
196
|
context "with undefined but aliased language" do
|
197
197
|
let(:markdown) do
|
198
|
-
<<-
|
198
|
+
<<-MARKDOWN.strip_heredoc
|
199
199
|
```zsh
|
200
200
|
true
|
201
201
|
```
|
202
|
-
|
202
|
+
MARKDOWN
|
203
203
|
end
|
204
204
|
|
205
205
|
it "returns aliased language name" do
|
@@ -215,22 +215,22 @@ describe Qiita::Markdown::Processor do
|
|
215
215
|
|
216
216
|
context "with code with leading and trailing newlines" do
|
217
217
|
let(:markdown) do
|
218
|
-
<<-
|
218
|
+
<<-MARKDOWN.strip_heredoc
|
219
219
|
```
|
220
220
|
|
221
221
|
foo
|
222
222
|
|
223
223
|
```
|
224
|
-
|
224
|
+
MARKDOWN
|
225
225
|
end
|
226
226
|
|
227
227
|
it "does not strip the newlines" do
|
228
|
-
should eq <<-
|
228
|
+
should eq <<-HTML.strip_heredoc
|
229
229
|
<div class="code-frame" data-lang="text"><div class="highlight"><pre><span></span>
|
230
230
|
foo
|
231
231
|
|
232
232
|
</pre></div></div>
|
233
|
-
|
233
|
+
HTML
|
234
234
|
end
|
235
235
|
end
|
236
236
|
|
@@ -240,9 +240,9 @@ describe Qiita::Markdown::Processor do
|
|
240
240
|
end
|
241
241
|
|
242
242
|
it "replaces mention with link" do
|
243
|
-
should include(<<-
|
243
|
+
should include(<<-HTML.strip_heredoc.rstrip)
|
244
244
|
<a href="/alice" class="user-mention js-hovercard" title="alice" data-hovercard-target-type="user" data-hovercard-target-name="alice">@alice</a>
|
245
|
-
|
245
|
+
HTML
|
246
246
|
end
|
247
247
|
end
|
248
248
|
|
@@ -252,15 +252,15 @@ describe Qiita::Markdown::Processor do
|
|
252
252
|
end
|
253
253
|
|
254
254
|
it "replaces mention with link" do
|
255
|
-
should include(<<-
|
255
|
+
should include(<<-HTML.strip_heredoc.rstrip)
|
256
256
|
<a href="/al" class="user-mention js-hovercard" title="al" data-hovercard-target-type="user" data-hovercard-target-name="al">@al</a>
|
257
|
-
|
257
|
+
HTML
|
258
258
|
end
|
259
259
|
end
|
260
260
|
|
261
261
|
context "with mentions in complex patterns" do
|
262
262
|
let(:markdown) do
|
263
|
-
<<-
|
263
|
+
<<-MARKDOWN.strip_heredoc
|
264
264
|
@alice
|
265
265
|
|
266
266
|
```
|
@@ -280,7 +280,7 @@ describe Qiita::Markdown::Processor do
|
|
280
280
|
@-o
|
281
281
|
@o_
|
282
282
|
@_o
|
283
|
-
|
283
|
+
MARKDOWN
|
284
284
|
end
|
285
285
|
|
286
286
|
it "extracts mentions correctly" do
|
@@ -300,21 +300,21 @@ describe Qiita::Markdown::Processor do
|
|
300
300
|
|
301
301
|
context "with mention-like filename on code block" do
|
302
302
|
let(:markdown) do
|
303
|
-
<<-
|
303
|
+
<<-MARKDOWN.strip_heredoc
|
304
304
|
```ruby:@alice
|
305
305
|
1
|
306
306
|
```
|
307
|
-
|
307
|
+
MARKDOWN
|
308
308
|
end
|
309
309
|
|
310
310
|
it "does not treat it as mention" do
|
311
|
-
should include(<<-
|
311
|
+
should include(<<-HTML.strip_heredoc.rstrip)
|
312
312
|
<div class="code-frame" data-lang="ruby">
|
313
313
|
<div class="code-lang"><span class="bold">@alice</span></div>
|
314
314
|
<div class="highlight"><pre><span></span><span class="mi">1</span>
|
315
315
|
</pre></div>
|
316
316
|
</div>
|
317
|
-
|
317
|
+
HTML
|
318
318
|
end
|
319
319
|
end
|
320
320
|
|
@@ -324,11 +324,11 @@ describe Qiita::Markdown::Processor do
|
|
324
324
|
end
|
325
325
|
|
326
326
|
it "does not replace mention with link" do
|
327
|
-
should include(<<-
|
327
|
+
should include(<<-HTML.strip_heredoc.rstrip)
|
328
328
|
<blockquote>
|
329
329
|
<p>@alice</p>
|
330
330
|
</blockquote>
|
331
|
-
|
331
|
+
HTML
|
332
332
|
end
|
333
333
|
end
|
334
334
|
|
@@ -338,9 +338,9 @@ describe Qiita::Markdown::Processor do
|
|
338
338
|
end
|
339
339
|
|
340
340
|
it "does not emphasize the name" do
|
341
|
-
should include(<<-
|
341
|
+
should include(<<-HTML.strip_heredoc.rstrip)
|
342
342
|
<a href="/_alice_" class="user-mention js-hovercard" title="_alice_" data-hovercard-target-type="user" data-hovercard-target-name="_alice_">@_alice_</a>
|
343
|
-
|
343
|
+
HTML
|
344
344
|
end
|
345
345
|
end
|
346
346
|
|
@@ -350,10 +350,10 @@ describe Qiita::Markdown::Processor do
|
|
350
350
|
end
|
351
351
|
|
352
352
|
let(:markdown) do
|
353
|
-
<<-
|
353
|
+
<<-MARKDOWN.strip_heredoc
|
354
354
|
@alice
|
355
355
|
@bob
|
356
|
-
|
356
|
+
MARKDOWN
|
357
357
|
end
|
358
358
|
|
359
359
|
it "limits mentions to allowed usernames" do
|
@@ -371,9 +371,9 @@ describe Qiita::Markdown::Processor do
|
|
371
371
|
end
|
372
372
|
|
373
373
|
it "links it and reports all allowed users as mentioned user names" do
|
374
|
-
should include(<<-
|
374
|
+
should include(<<-HTML.strip_heredoc.rstrip)
|
375
375
|
<a href="/" class="user-mention" title="all">@all</a>
|
376
|
-
|
376
|
+
HTML
|
377
377
|
expect(result[:mentioned_usernames]).to eq context[:allowed_usernames]
|
378
378
|
end
|
379
379
|
end
|
@@ -409,9 +409,9 @@ describe Qiita::Markdown::Processor do
|
|
409
409
|
end
|
410
410
|
|
411
411
|
it "does not replace it" do
|
412
|
-
is_expected.to eq <<-
|
412
|
+
is_expected.to eq <<-HTML.strip_heredoc
|
413
413
|
<p>@alice/bob</p>
|
414
|
-
|
414
|
+
HTML
|
415
415
|
end
|
416
416
|
end
|
417
417
|
|
@@ -427,9 +427,9 @@ describe Qiita::Markdown::Processor do
|
|
427
427
|
end
|
428
428
|
|
429
429
|
it "replaces it with preferred link and updates :mentioned_groups" do
|
430
|
-
is_expected.to eq <<-
|
430
|
+
is_expected.to eq <<-HTML.strip_heredoc
|
431
431
|
<p><a href="https://alice.example.com/groups/bob" rel="nofollow noopener" target="_blank">@alice/bob</a></p>
|
432
|
-
|
432
|
+
HTML
|
433
433
|
expect(result[:mentioned_groups]).to eq [{
|
434
434
|
group_url_name: "bob",
|
435
435
|
team_url_name: "alice",
|
@@ -459,9 +459,9 @@ describe Qiita::Markdown::Processor do
|
|
459
459
|
end
|
460
460
|
|
461
461
|
it "creates link for that" do
|
462
|
-
should eq <<-
|
462
|
+
should eq <<-HTML.strip_heredoc
|
463
463
|
<p><a href="/example"></a></p>
|
464
|
-
|
464
|
+
HTML
|
465
465
|
end
|
466
466
|
end
|
467
467
|
|
@@ -471,9 +471,9 @@ describe Qiita::Markdown::Processor do
|
|
471
471
|
end
|
472
472
|
|
473
473
|
it "creates link for that" do
|
474
|
-
should eq <<-
|
474
|
+
should eq <<-HTML.strip_heredoc
|
475
475
|
<p><a href="#example"></a></p>
|
476
|
-
|
476
|
+
HTML
|
477
477
|
end
|
478
478
|
end
|
479
479
|
|
@@ -483,9 +483,9 @@ describe Qiita::Markdown::Processor do
|
|
483
483
|
end
|
484
484
|
|
485
485
|
it "creates link for that with the title" do
|
486
|
-
should eq <<-
|
486
|
+
should eq <<-HTML.strip_heredoc
|
487
487
|
<p><a href="/example" title="Title"></a></p>
|
488
|
-
|
488
|
+
HTML
|
489
489
|
end
|
490
490
|
end
|
491
491
|
|
@@ -508,9 +508,9 @@ describe Qiita::Markdown::Processor do
|
|
508
508
|
end
|
509
509
|
|
510
510
|
it "removes that link by creating empty a element" do
|
511
|
-
should eq <<-
|
511
|
+
should eq <<-HTML.strip_heredoc
|
512
512
|
<p><a></a></p>
|
513
|
-
|
513
|
+
HTML
|
514
514
|
end
|
515
515
|
end
|
516
516
|
|
@@ -526,11 +526,11 @@ describe Qiita::Markdown::Processor do
|
|
526
526
|
|
527
527
|
context "with emoji in pre or code element" do
|
528
528
|
let(:markdown) do
|
529
|
-
<<-
|
529
|
+
<<-MARKDOWN.strip_heredoc
|
530
530
|
```
|
531
531
|
:+1:
|
532
532
|
```
|
533
|
-
|
533
|
+
MARKDOWN
|
534
534
|
end
|
535
535
|
|
536
536
|
it "does not replace it" do
|
@@ -573,11 +573,11 @@ describe Qiita::Markdown::Processor do
|
|
573
573
|
|
574
574
|
context "with colon-only label" do
|
575
575
|
let(:markdown) do
|
576
|
-
<<-
|
576
|
+
<<-MARKDOWN.strip_heredoc
|
577
577
|
```:
|
578
578
|
1
|
579
579
|
```
|
580
|
-
|
580
|
+
MARKDOWN
|
581
581
|
end
|
582
582
|
|
583
583
|
it "does not replace it" do
|
@@ -597,42 +597,42 @@ describe Qiita::Markdown::Processor do
|
|
597
597
|
end
|
598
598
|
|
599
599
|
it "allows font element with color attribute" do
|
600
|
-
should eq <<-
|
600
|
+
should eq <<-HTML.strip_heredoc
|
601
601
|
<p>#{markdown}</p>
|
602
|
-
|
602
|
+
HTML
|
603
603
|
end
|
604
604
|
end
|
605
605
|
|
606
606
|
context "with task list" do
|
607
607
|
let(:markdown) do
|
608
|
-
<<-
|
608
|
+
<<-MARKDOWN.strip_heredoc
|
609
609
|
- [ ] a
|
610
610
|
- [x] b
|
611
|
-
|
611
|
+
MARKDOWN
|
612
612
|
end
|
613
613
|
|
614
614
|
it "inserts checkbox" do
|
615
|
-
should eq <<-
|
615
|
+
should eq <<-HTML.strip_heredoc
|
616
616
|
<ul>
|
617
617
|
<li class="task-list-item">
|
618
618
|
<input type="checkbox" class="task-list-item-checkbox" disabled>a</li>
|
619
619
|
<li class="task-list-item">
|
620
620
|
<input type="checkbox" class="task-list-item-checkbox" checked disabled>b</li>
|
621
621
|
</ul>
|
622
|
-
|
622
|
+
HTML
|
623
623
|
end
|
624
624
|
end
|
625
625
|
|
626
626
|
context "with nested task list" do
|
627
627
|
let(:markdown) do
|
628
|
-
<<-
|
628
|
+
<<-MARKDOWN.strip_heredoc
|
629
629
|
- [ ] a
|
630
630
|
- [ ] b
|
631
|
-
|
631
|
+
MARKDOWN
|
632
632
|
end
|
633
633
|
|
634
634
|
it "inserts checkbox" do
|
635
|
-
should eq <<-
|
635
|
+
should eq <<-HTML.strip_heredoc
|
636
636
|
<ul>
|
637
637
|
<li class="task-list-item">
|
638
638
|
<input type="checkbox" class="task-list-item-checkbox" disabled>a
|
@@ -643,45 +643,45 @@ describe Qiita::Markdown::Processor do
|
|
643
643
|
</ul>
|
644
644
|
</li>
|
645
645
|
</ul>
|
646
|
-
|
646
|
+
HTML
|
647
647
|
end
|
648
648
|
end
|
649
649
|
|
650
650
|
context "with task list in code block" do
|
651
651
|
let(:markdown) do
|
652
|
-
<<-
|
652
|
+
<<-MARKDOWN.strip_heredoc
|
653
653
|
```
|
654
654
|
- [ ] a
|
655
655
|
- [x] b
|
656
656
|
```
|
657
|
-
|
657
|
+
MARKDOWN
|
658
658
|
end
|
659
659
|
|
660
660
|
it "does not replace checkbox" do
|
661
|
-
should eq <<-
|
661
|
+
should eq <<-HTML.strip_heredoc
|
662
662
|
<div class="code-frame" data-lang="text"><div class="highlight"><pre><span></span>- [ ] a
|
663
663
|
- [x] b
|
664
664
|
</pre></div></div>
|
665
|
-
|
665
|
+
HTML
|
666
666
|
end
|
667
667
|
end
|
668
668
|
|
669
669
|
context "with empty line between task list" do
|
670
670
|
let(:markdown) do
|
671
|
-
<<-
|
671
|
+
<<-MARKDOWN.strip_heredoc
|
672
672
|
- [ ] a
|
673
673
|
|
674
674
|
- [x] b
|
675
|
-
|
675
|
+
MARKDOWN
|
676
676
|
end
|
677
677
|
|
678
678
|
it "inserts checkbox" do
|
679
|
-
should eq <<-
|
679
|
+
should eq <<-HTML.strip_heredoc
|
680
680
|
<ul>
|
681
681
|
<li class="task-list-item"><p><input type="checkbox" class="task-list-item-checkbox" disabled>a</p></li>
|
682
682
|
<li class="task-list-item"><p><input type="checkbox" class="task-list-item-checkbox" checked disabled>b</p></li>
|
683
683
|
</ul>
|
684
|
-
|
684
|
+
HTML
|
685
685
|
end
|
686
686
|
end
|
687
687
|
|
@@ -691,25 +691,25 @@ describe Qiita::Markdown::Processor do
|
|
691
691
|
end
|
692
692
|
|
693
693
|
it "inserts checkbox" do
|
694
|
-
should eq <<-
|
694
|
+
should eq <<-HTML.strip_heredoc
|
695
695
|
<ul>
|
696
696
|
<li>
|
697
697
|
</ul>
|
698
|
-
|
698
|
+
HTML
|
699
699
|
end
|
700
700
|
end
|
701
701
|
|
702
702
|
context "with text-aligned table" do
|
703
703
|
let(:markdown) do
|
704
|
-
<<-
|
704
|
+
<<-MARKDOWN.strip_heredoc
|
705
705
|
| a | b | c |
|
706
706
|
|:---|---:|:---:|
|
707
707
|
| a | b | c |
|
708
|
-
|
708
|
+
MARKDOWN
|
709
709
|
end
|
710
710
|
|
711
711
|
it "creates table element with text-align style" do
|
712
|
-
should eq <<-
|
712
|
+
should eq <<-HTML.strip_heredoc
|
713
713
|
<table>
|
714
714
|
<thead>
|
715
715
|
<tr>
|
@@ -726,20 +726,20 @@ describe Qiita::Markdown::Processor do
|
|
726
726
|
</tr>
|
727
727
|
</tbody>
|
728
728
|
</table>
|
729
|
-
|
729
|
+
HTML
|
730
730
|
end
|
731
731
|
end
|
732
732
|
|
733
733
|
context "with footenotes syntax" do
|
734
734
|
let(:markdown) do
|
735
|
-
<<-
|
735
|
+
<<-MARKDOWN.strip_heredoc
|
736
736
|
[^1]
|
737
737
|
[^1]: test
|
738
|
-
|
738
|
+
MARKDOWN
|
739
739
|
end
|
740
740
|
|
741
741
|
it "generates footnotes elements" do
|
742
|
-
should eq <<-
|
742
|
+
should eq <<-HTML.strip_heredoc
|
743
743
|
<p><sup id="fnref1"><a href="#fn1" rel="footnote" title="test">1</a></sup></p>
|
744
744
|
|
745
745
|
<div class="footnotes">
|
@@ -752,35 +752,35 @@ describe Qiita::Markdown::Processor do
|
|
752
752
|
|
753
753
|
</ol>
|
754
754
|
</div>
|
755
|
-
|
755
|
+
HTML
|
756
756
|
end
|
757
757
|
end
|
758
758
|
|
759
759
|
context "with manually written link inside of <sup> tag" do
|
760
760
|
let(:markdown) do
|
761
|
-
<<-
|
761
|
+
<<-MARKDOWN.strip_heredoc
|
762
762
|
<sup>[Example](http://example.com/)</sup>
|
763
|
-
|
763
|
+
MARKDOWN
|
764
764
|
end
|
765
765
|
|
766
766
|
it "does not confuse the structure with automatically generated footnote reference" do
|
767
|
-
should eq <<-
|
767
|
+
should eq <<-HTML.strip_heredoc
|
768
768
|
<p><sup><a href="http://example.com/">Example</a></sup></p>
|
769
|
-
|
769
|
+
HTML
|
770
770
|
end
|
771
771
|
end
|
772
772
|
|
773
773
|
context "with manually written <a> tag with strange href inside of <sup> tag" do
|
774
774
|
let(:markdown) do
|
775
|
-
<<-
|
775
|
+
<<-MARKDOWN.strip_heredoc
|
776
776
|
<sup><a href="#foo.1">Link</a></sup>
|
777
|
-
|
777
|
+
MARKDOWN
|
778
778
|
end
|
779
779
|
|
780
780
|
it "does not confuse the structure with automatically generated footnote reference" do
|
781
|
-
should eq <<-
|
781
|
+
should eq <<-HTML.strip_heredoc
|
782
782
|
<p><sup><a href="#foo.1">Link</a></sup></p>
|
783
|
-
|
783
|
+
HTML
|
784
784
|
end
|
785
785
|
end
|
786
786
|
|
@@ -790,16 +790,16 @@ describe Qiita::Markdown::Processor do
|
|
790
790
|
end
|
791
791
|
|
792
792
|
let(:markdown) do
|
793
|
-
<<-
|
793
|
+
<<-MARKDOWN.strip_heredoc
|
794
794
|
[^1]
|
795
795
|
[^1]: test
|
796
|
-
|
796
|
+
MARKDOWN
|
797
797
|
end
|
798
798
|
|
799
799
|
it "does not generate footnote elements" do
|
800
|
-
should eq <<-
|
800
|
+
should eq <<-HTML.strip_heredoc
|
801
801
|
<p><a href="test">^1</a></p>
|
802
|
-
|
802
|
+
HTML
|
803
803
|
end
|
804
804
|
end
|
805
805
|
|
@@ -813,9 +813,9 @@ describe Qiita::Markdown::Processor do
|
|
813
813
|
end
|
814
814
|
|
815
815
|
let(:markdown) do
|
816
|
-
<<-
|
816
|
+
<<-MARKDOWN.strip_heredoc
|
817
817
|
:foo: :o: :x:
|
818
|
-
|
818
|
+
MARKDOWN
|
819
819
|
end
|
820
820
|
|
821
821
|
it "replaces only the specified emoji names with img elements with custom URL" do
|
@@ -1036,9 +1036,9 @@ describe Qiita::Markdown::Processor do
|
|
1036
1036
|
shared_examples_for "script element" do |allowed:|
|
1037
1037
|
context "with script element" do
|
1038
1038
|
let(:markdown) do
|
1039
|
-
<<-
|
1039
|
+
<<-MARKDOWN.strip_heredoc
|
1040
1040
|
<script>alert(1)</script>
|
1041
|
-
|
1041
|
+
MARKDOWN
|
1042
1042
|
end
|
1043
1043
|
|
1044
1044
|
if allowed
|
@@ -1048,9 +1048,9 @@ describe Qiita::Markdown::Processor do
|
|
1048
1048
|
|
1049
1049
|
context "and allowed attributes" do
|
1050
1050
|
let(:markdown) do
|
1051
|
-
<<-
|
1051
|
+
<<-MARKDOWN.strip_heredoc
|
1052
1052
|
<p><script async data-a="b" type="text/javascript">alert(1)</script></p>
|
1053
|
-
|
1053
|
+
MARKDOWN
|
1054
1054
|
end
|
1055
1055
|
|
1056
1056
|
it "allows data-attributes" do
|
@@ -1068,32 +1068,32 @@ describe Qiita::Markdown::Processor do
|
|
1068
1068
|
shared_examples_for "malicious script in filename" do |allowed:|
|
1069
1069
|
context "with malicious script in filename" do
|
1070
1070
|
let(:markdown) do
|
1071
|
-
<<-
|
1071
|
+
<<-MARKDOWN.strip_heredoc
|
1072
1072
|
```js:test<script>alert(1)</script>
|
1073
1073
|
1
|
1074
1074
|
```
|
1075
|
-
|
1075
|
+
MARKDOWN
|
1076
1076
|
end
|
1077
1077
|
|
1078
1078
|
if allowed
|
1079
1079
|
it "does not sanitize script element" do
|
1080
|
-
should eq <<-
|
1080
|
+
should eq <<-HTML.strip_heredoc
|
1081
1081
|
<div class="code-frame" data-lang="js">
|
1082
1082
|
<div class="code-lang"><span class="bold">test<script>alert(1)</script></span></div>
|
1083
1083
|
<div class="highlight"><pre><span></span><span class="mi">1</span>
|
1084
1084
|
</pre></div>
|
1085
1085
|
</div>
|
1086
|
-
|
1086
|
+
HTML
|
1087
1087
|
end
|
1088
1088
|
else
|
1089
1089
|
it "sanitizes script element" do
|
1090
|
-
should eq <<-
|
1090
|
+
should eq <<-HTML.strip_heredoc
|
1091
1091
|
<div class="code-frame" data-lang="js">
|
1092
1092
|
<div class="code-lang"><span class="bold">test</span></div>
|
1093
1093
|
<div class="highlight"><pre><span></span><span class="mi">1</span>
|
1094
1094
|
</pre></div>
|
1095
1095
|
</div>
|
1096
|
-
|
1096
|
+
HTML
|
1097
1097
|
end
|
1098
1098
|
end
|
1099
1099
|
end
|
@@ -1102,9 +1102,9 @@ describe Qiita::Markdown::Processor do
|
|
1102
1102
|
shared_examples_for "iframe element" do |allowed:|
|
1103
1103
|
context "with iframe" do
|
1104
1104
|
let(:markdown) do
|
1105
|
-
<<-
|
1105
|
+
<<-MARKDOWN.strip_heredoc
|
1106
1106
|
<iframe width="1" height="2" src="//example.com" frameborder="0" allowfullscreen></iframe>
|
1107
|
-
|
1107
|
+
MARKDOWN
|
1108
1108
|
end
|
1109
1109
|
|
1110
1110
|
if allowed
|
@@ -1122,9 +1122,9 @@ describe Qiita::Markdown::Processor do
|
|
1122
1122
|
shared_examples_for "input element" do |allowed:|
|
1123
1123
|
context "with input" do
|
1124
1124
|
let(:markdown) do
|
1125
|
-
<<-
|
1125
|
+
<<-MARKDOWN.strip_heredoc
|
1126
1126
|
<input type="checkbox"> foo
|
1127
|
-
|
1127
|
+
MARKDOWN
|
1128
1128
|
end
|
1129
1129
|
|
1130
1130
|
if allowed
|
@@ -1142,66 +1142,66 @@ describe Qiita::Markdown::Processor do
|
|
1142
1142
|
shared_examples_for "data-attributes" do |allowed:|
|
1143
1143
|
context "with data-attributes for general tags" do
|
1144
1144
|
let(:markdown) do
|
1145
|
-
<<-
|
1145
|
+
<<-MARKDOWN.strip_heredoc
|
1146
1146
|
<div data-a="b"></div>
|
1147
|
-
|
1147
|
+
MARKDOWN
|
1148
1148
|
end
|
1149
1149
|
|
1150
1150
|
if allowed
|
1151
1151
|
it "does not sanitize data-attributes" do
|
1152
|
-
should eq <<-
|
1152
|
+
should eq <<-HTML.strip_heredoc
|
1153
1153
|
<div data-a="b"></div>
|
1154
|
-
|
1154
|
+
HTML
|
1155
1155
|
end
|
1156
1156
|
else
|
1157
1157
|
it "sanitizes data-attributes" do
|
1158
|
-
should eq <<-
|
1158
|
+
should eq <<-HTML.strip_heredoc
|
1159
1159
|
<div></div>
|
1160
|
-
|
1160
|
+
HTML
|
1161
1161
|
end
|
1162
1162
|
end
|
1163
1163
|
end
|
1164
1164
|
|
1165
1165
|
context "with data-attributes for <blockquote> tag" do
|
1166
1166
|
let(:markdown) do
|
1167
|
-
<<-
|
1167
|
+
<<-MARKDOWN.strip_heredoc
|
1168
1168
|
<blockquote data-theme="a" data-malicious="b"></blockquote>
|
1169
|
-
|
1169
|
+
MARKDOWN
|
1170
1170
|
end
|
1171
1171
|
|
1172
1172
|
if allowed
|
1173
1173
|
it "does not sanitize data-attributes" do
|
1174
|
-
should eq <<-
|
1174
|
+
should eq <<-HTML.strip_heredoc
|
1175
1175
|
<blockquote data-theme="a" data-malicious="b"></blockquote>
|
1176
|
-
|
1176
|
+
HTML
|
1177
1177
|
end
|
1178
1178
|
else
|
1179
1179
|
it "sanitizes data-attributes except the attributes used by tweet" do
|
1180
|
-
should eq <<-
|
1180
|
+
should eq <<-HTML.strip_heredoc
|
1181
1181
|
<blockquote data-theme="a"></blockquote>
|
1182
|
-
|
1182
|
+
HTML
|
1183
1183
|
end
|
1184
1184
|
end
|
1185
1185
|
end
|
1186
1186
|
|
1187
1187
|
context "with data-attributes for <p> tag" do
|
1188
1188
|
let(:markdown) do
|
1189
|
-
<<-
|
1189
|
+
<<-MARKDOWN.strip_heredoc
|
1190
1190
|
<p data-slug-hash="a" data-malicious="b"></p>
|
1191
|
-
|
1191
|
+
MARKDOWN
|
1192
1192
|
end
|
1193
1193
|
|
1194
1194
|
if allowed
|
1195
1195
|
it "does not sanitize data-attributes" do
|
1196
|
-
should eq <<-
|
1196
|
+
should eq <<-HTML.strip_heredoc
|
1197
1197
|
<p data-slug-hash="a" data-malicious="b"></p>
|
1198
|
-
|
1198
|
+
HTML
|
1199
1199
|
end
|
1200
1200
|
else
|
1201
1201
|
it "sanitizes data-attributes except the attributes used by codepen" do
|
1202
|
-
should eq <<-
|
1202
|
+
should eq <<-HTML.strip_heredoc
|
1203
1203
|
<p data-slug-hash="a"></p>
|
1204
|
-
|
1204
|
+
HTML
|
1205
1205
|
end
|
1206
1206
|
end
|
1207
1207
|
end
|
@@ -1226,91 +1226,91 @@ describe Qiita::Markdown::Processor do
|
|
1226
1226
|
|
1227
1227
|
context "with class attribute for <a> tag" do
|
1228
1228
|
let(:markdown) do
|
1229
|
-
<<-
|
1229
|
+
<<-MARKDOWN.strip_heredoc
|
1230
1230
|
<a href="foo" class="malicious-class">foo</a>
|
1231
1231
|
http://qiita.com/
|
1232
|
-
|
1232
|
+
MARKDOWN
|
1233
1233
|
end
|
1234
1234
|
|
1235
1235
|
if allowed
|
1236
1236
|
it "does not sanitize the classes" do
|
1237
|
-
should eq <<-
|
1237
|
+
should eq <<-HTML.strip_heredoc
|
1238
1238
|
<p><a href="foo" class="malicious-class">foo</a><br>
|
1239
1239
|
<a href="http://qiita.com/" class="autolink" rel="nofollow noopener" target="_blank">http://qiita.com/</a></p>
|
1240
|
-
|
1240
|
+
HTML
|
1241
1241
|
end
|
1242
1242
|
else
|
1243
1243
|
it "sanitizes classes except `autolink`" do
|
1244
|
-
should eq <<-
|
1244
|
+
should eq <<-HTML.strip_heredoc
|
1245
1245
|
<p><a href="foo" class="">foo</a><br>
|
1246
1246
|
<a href="http://qiita.com/" class="autolink" rel="nofollow noopener" target="_blank">http://qiita.com/</a></p>
|
1247
|
-
|
1247
|
+
HTML
|
1248
1248
|
end
|
1249
1249
|
end
|
1250
1250
|
end
|
1251
1251
|
|
1252
1252
|
context "with class attribute for <blockquote> tag" do
|
1253
1253
|
let(:markdown) do
|
1254
|
-
<<-
|
1254
|
+
<<-MARKDOWN.strip_heredoc
|
1255
1255
|
<blockquote class="twitter-tweet malicious-class">foo</blockquote>
|
1256
|
-
|
1256
|
+
MARKDOWN
|
1257
1257
|
end
|
1258
1258
|
|
1259
1259
|
if allowed
|
1260
1260
|
it "does not sanitize the classes" do
|
1261
|
-
should eq <<-
|
1261
|
+
should eq <<-HTML.strip_heredoc
|
1262
1262
|
<blockquote class="twitter-tweet malicious-class">foo</blockquote>
|
1263
|
-
|
1263
|
+
HTML
|
1264
1264
|
end
|
1265
1265
|
else
|
1266
1266
|
it "sanitizes classes except `twitter-tweet`" do
|
1267
|
-
should eq <<-
|
1267
|
+
should eq <<-HTML.strip_heredoc
|
1268
1268
|
<blockquote class="twitter-tweet">foo</blockquote>
|
1269
|
-
|
1269
|
+
HTML
|
1270
1270
|
end
|
1271
1271
|
end
|
1272
1272
|
end
|
1273
1273
|
|
1274
1274
|
context "with class attribute for <div> tag" do
|
1275
1275
|
let(:markdown) do
|
1276
|
-
<<-
|
1276
|
+
<<-MARKDOWN.strip_heredoc
|
1277
1277
|
<div class="footnotes malicious-class">foo</div>
|
1278
|
-
|
1278
|
+
MARKDOWN
|
1279
1279
|
end
|
1280
1280
|
|
1281
1281
|
if allowed
|
1282
1282
|
it "does not sanitize the classes" do
|
1283
|
-
should eq <<-
|
1283
|
+
should eq <<-HTML.strip_heredoc
|
1284
1284
|
<div class="footnotes malicious-class">foo</div>
|
1285
|
-
|
1285
|
+
HTML
|
1286
1286
|
end
|
1287
1287
|
else
|
1288
1288
|
it "sanitizes classes except `footnotes`" do
|
1289
|
-
should eq <<-
|
1289
|
+
should eq <<-HTML.strip_heredoc
|
1290
1290
|
<div class="footnotes">foo</div>
|
1291
|
-
|
1291
|
+
HTML
|
1292
1292
|
end
|
1293
1293
|
end
|
1294
1294
|
end
|
1295
1295
|
|
1296
1296
|
context "with class attribute for <p> tag" do
|
1297
1297
|
let(:markdown) do
|
1298
|
-
<<-
|
1298
|
+
<<-MARKDOWN.strip_heredoc
|
1299
1299
|
<p class="codepen malicious-class">foo</p>
|
1300
|
-
|
1300
|
+
MARKDOWN
|
1301
1301
|
end
|
1302
1302
|
|
1303
1303
|
if allowed
|
1304
1304
|
it "does not sanitize the classes" do
|
1305
|
-
should eq <<-
|
1305
|
+
should eq <<-HTML.strip_heredoc
|
1306
1306
|
<p class="codepen malicious-class">foo</p>
|
1307
|
-
|
1307
|
+
HTML
|
1308
1308
|
end
|
1309
1309
|
else
|
1310
1310
|
it "sanitizes classes except `codepen`" do
|
1311
|
-
should eq <<-
|
1311
|
+
should eq <<-HTML.strip_heredoc
|
1312
1312
|
<p class="codepen">foo</p>
|
1313
|
-
|
1313
|
+
HTML
|
1314
1314
|
end
|
1315
1315
|
end
|
1316
1316
|
end
|
@@ -1335,44 +1335,69 @@ describe Qiita::Markdown::Processor do
|
|
1335
1335
|
end
|
1336
1336
|
|
1337
1337
|
shared_examples_for "override embed code attributes" do |allowed:|
|
1338
|
-
context "with HTML embed code for CodePen" do
|
1338
|
+
context "with HTML embed code for CodePen using old script url" do
|
1339
1339
|
let(:markdown) do
|
1340
|
-
<<-
|
1340
|
+
<<-MARKDOWN.strip_heredoc
|
1341
1341
|
<p data-height="1" data-theme-id="0" data-slug-hash="foo" data-default-tab="bar" data-user="baz" data-embed-version="2" data-pen-title="qux" class="codepen"></p>
|
1342
1342
|
<script src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
|
1343
|
-
|
1343
|
+
MARKDOWN
|
1344
1344
|
end
|
1345
1345
|
|
1346
1346
|
if allowed
|
1347
1347
|
it "does not sanitize embed code" do
|
1348
|
-
should eq <<-
|
1348
|
+
should eq <<-HTML.strip_heredoc
|
1349
1349
|
<p data-height="1" data-theme-id="0" data-slug-hash="foo" data-default-tab="bar" data-user="baz" data-embed-version="2" data-pen-title="qux" class="codepen"></p>\n
|
1350
1350
|
<script src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
|
1351
|
-
|
1351
|
+
HTML
|
1352
1352
|
end
|
1353
1353
|
else
|
1354
1354
|
it "forces async attribute on script" do
|
1355
|
-
should eq <<-
|
1355
|
+
should eq <<-HTML.strip_heredoc
|
1356
1356
|
<p data-height="1" data-theme-id="0" data-slug-hash="foo" data-default-tab="bar" data-user="baz" data-embed-version="2" data-pen-title="qux" class="codepen"></p>\n
|
1357
1357
|
<script src="https://production-assets.codepen.io/assets/embed/ei.js" async="async"></script>
|
1358
|
-
|
1358
|
+
HTML
|
1359
|
+
end
|
1360
|
+
end
|
1361
|
+
end
|
1362
|
+
|
1363
|
+
context "with HTML embed code for CodePen" do
|
1364
|
+
let(:markdown) do
|
1365
|
+
<<-MARKDOWN.strip_heredoc
|
1366
|
+
<p data-height="1" data-theme-id="0" data-slug-hash="foo" data-default-tab="bar" data-user="baz" data-embed-version="2" data-pen-title="qux" class="codepen"></p>
|
1367
|
+
<script src="https://static.codepen.io/assets/embed/ei.js"></script>
|
1368
|
+
MARKDOWN
|
1369
|
+
end
|
1370
|
+
|
1371
|
+
if allowed
|
1372
|
+
it "does not sanitize embed code" do
|
1373
|
+
should eq <<-HTML.strip_heredoc
|
1374
|
+
<p data-height="1" data-theme-id="0" data-slug-hash="foo" data-default-tab="bar" data-user="baz" data-embed-version="2" data-pen-title="qux" class="codepen"></p>\n
|
1375
|
+
<script src="https://static.codepen.io/assets/embed/ei.js"></script>
|
1376
|
+
HTML
|
1377
|
+
end
|
1378
|
+
else
|
1379
|
+
it "forces async attribute on script" do
|
1380
|
+
should eq <<-HTML.strip_heredoc
|
1381
|
+
<p data-height="1" data-theme-id="0" data-slug-hash="foo" data-default-tab="bar" data-user="baz" data-embed-version="2" data-pen-title="qux" class="codepen"></p>\n
|
1382
|
+
<script src="https://static.codepen.io/assets/embed/ei.js" async="async"></script>
|
1383
|
+
HTML
|
1359
1384
|
end
|
1360
1385
|
end
|
1361
1386
|
end
|
1362
1387
|
|
1363
1388
|
context "with embed code for Tweet" do
|
1364
1389
|
let(:markdown) do
|
1365
|
-
<<-
|
1390
|
+
<<-MARKDOWN.strip_heredoc
|
1366
1391
|
<blockquote class="twitter-tweet" data-lang="es" data-cards="hidden" data-conversation="none">foo</blockquote>
|
1367
1392
|
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
|
1368
|
-
|
1393
|
+
MARKDOWN
|
1369
1394
|
end
|
1370
1395
|
|
1371
1396
|
it "does not sanitize embed code" do
|
1372
|
-
should eq <<-
|
1397
|
+
should eq <<-HTML.strip_heredoc
|
1373
1398
|
<blockquote class="twitter-tweet" data-lang="es" data-cards="hidden" data-conversation="none">foo</blockquote>\n
|
1374
1399
|
<script async src="https://platform.twitter.com/widgets.js"></script>
|
1375
|
-
|
1400
|
+
HTML
|
1376
1401
|
end
|
1377
1402
|
end
|
1378
1403
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qiita-markdown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.25.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gemoji
|