slacken 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +20 -0
- data/README.md +60 -0
- data/Rakefile +36 -0
- data/lib/slacken.rb +21 -0
- data/lib/slacken/document_component.rb +73 -0
- data/lib/slacken/document_component/elim_blanks.rb +36 -0
- data/lib/slacken/document_component/elim_invalid_links.rb +26 -0
- data/lib/slacken/document_component/elim_line_breaks.rb +27 -0
- data/lib/slacken/document_component/extract_img_alt.rb +12 -0
- data/lib/slacken/document_component/group_indent.rb +27 -0
- data/lib/slacken/document_component/group_inlines.rb +26 -0
- data/lib/slacken/document_component/sanitize_link_containers.rb +40 -0
- data/lib/slacken/document_component/sanitize_special_tag_containers.rb +102 -0
- data/lib/slacken/document_component/stringfy_checkbox.rb +20 -0
- data/lib/slacken/document_component/stringfy_emoji.rb +20 -0
- data/lib/slacken/dom_container.rb +45 -0
- data/lib/slacken/node_type.rb +53 -0
- data/lib/slacken/render_element.rb +91 -0
- data/lib/slacken/rendering.rb +102 -0
- data/lib/slacken/slack_url.rb +7 -0
- data/lib/slacken/table_element.rb +23 -0
- data/lib/slacken/version.rb +3 -0
- data/sample/out.txt +38 -0
- data/sample/source.html +55 -0
- data/scripts/update_markup_fixture.rb +8 -0
- data/slacken.gemspec +28 -0
- data/spec/fixtures/example.html +114 -0
- data/spec/fixtures/markup_text.txt +73 -0
- data/spec/helpers/document_component_dsl.rb +11 -0
- data/spec/slacken/document_component/elim_blanks_spec.rb +34 -0
- data/spec/slacken/document_component/elim_invalid_links_spec.rb +49 -0
- data/spec/slacken/document_component/elim_line_breaks_spec.rb +41 -0
- data/spec/slacken/document_component/group_indent_spec.rb +37 -0
- data/spec/slacken/document_component/group_inlines_spec.rb +33 -0
- data/spec/slacken/document_component/sanitize_special_tag_containers_spec.rb +64 -0
- data/spec/slacken/document_component_spec.rb +19 -0
- data/spec/slacken_spec.rb +12 -0
- data/spec/spec_helper.rb +13 -0
- metadata +194 -0
data/slacken.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path('../lib/slacken/version', __FILE__)
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = "slacken"
|
7
|
+
gem.version = Slacken::VERSION
|
8
|
+
gem.summary = %q{Translate HTML sources to markup texts for slack}
|
9
|
+
gem.description = %q{Translate HTML sources to markup texts for slack}
|
10
|
+
gem.license = "MIT"
|
11
|
+
gem.authors = ["Tomoya Chiba"]
|
12
|
+
gem.email = "tomo.asleep@gmail.com"
|
13
|
+
gem.homepage = "https://rubygems.org/gems/slacken"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ['lib']
|
19
|
+
|
20
|
+
gem.add_development_dependency 'bundler', '~> 1.0'
|
21
|
+
gem.add_development_dependency 'rake', '~> 10.0'
|
22
|
+
gem.add_development_dependency 'rdoc', '~> 3.0'
|
23
|
+
gem.add_development_dependency 'rspec', '~> 3.0'
|
24
|
+
gem.add_development_dependency 'rubygems-tasks', '~> 0.2'
|
25
|
+
|
26
|
+
gem.add_runtime_dependency 'nokogiri', '~> 1.6'
|
27
|
+
gem.add_runtime_dependency 'kosi', '~> 1.0'
|
28
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
|
2
|
+
<h1>
|
3
|
+
<span id="見出し-bold" class="fragment"></span><a href="#%E8%A6%8B%E5%87%BA%E3%81%97-bold"><i class="fa fa-link"></i></a>見出し <strong>bold</strong>
|
4
|
+
</h1>
|
5
|
+
|
6
|
+
<p>テキスト<em>イタリック</em> <strong>太字</strong><br>
|
7
|
+
stringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstring</p>
|
8
|
+
|
9
|
+
<p>hogehogehogehogehogehogehoge <img class="emoji" title=":eyes:" alt=":eyes:" src="https://cdn.qiita.com/emoji/unicode/1f440.png" height="20" width="20" align="absmiddle"> hogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehoge <img class="emoji" title=":bowtie:" alt=":bowtie:" src="https://cdn.qiita.com/emoji/bowtie.png" height="20" width="20" align="absmiddle"> </p>
|
10
|
+
|
11
|
+
<h2>
|
12
|
+
<span id="中見出し-italic" class="fragment"></span><a href="#%E4%B8%AD%E8%A6%8B%E5%87%BA%E3%81%97-italic"><i class="fa fa-link"></i></a>中見出し <em>italic</em>
|
13
|
+
</h2>
|
14
|
+
|
15
|
+
<p>内容をここに書く</p>
|
16
|
+
|
17
|
+
<ul>
|
18
|
+
<li>リスト
|
19
|
+
|
20
|
+
<ul>
|
21
|
+
<li>リスト1</li>
|
22
|
+
<li>リスト2</li>
|
23
|
+
</ul>
|
24
|
+
</li>
|
25
|
+
</ul>
|
26
|
+
|
27
|
+
<ol>
|
28
|
+
<li>Item 1</li>
|
29
|
+
<li>Item 2</li>
|
30
|
+
<li>Item 3
|
31
|
+
|
32
|
+
<ul>
|
33
|
+
<li>Item 3a</li>
|
34
|
+
<li>Item 3b</li>
|
35
|
+
</ul>
|
36
|
+
</li>
|
37
|
+
</ol>
|
38
|
+
|
39
|
+
<ul>
|
40
|
+
<li class="task-list-item">
|
41
|
+
<input type="checkbox" class="task-list-item-checkbox" checked disabled><a href="/qiitan" class="user-mention" title="qiitan">@qiitan</a>, <a href="/tomoasleep_seed" class="user-mention" title="tomoasleep_seed">@tomoasleep_seed</a> </li>
|
42
|
+
<li class="task-list-item">
|
43
|
+
<input type="checkbox" class="task-list-item-checkbox" checked disabled>List items can have <strong>bold</strong> and <em>italic text</em>
|
44
|
+
</li>
|
45
|
+
<li class="task-list-item">
|
46
|
+
<input type="checkbox" class="task-list-item-checkbox" checked disabled>Checkbox</li>
|
47
|
+
<li class="task-list-item">
|
48
|
+
<input type="checkbox" class="task-list-item-checkbox" checked disabled>Checked item</li>
|
49
|
+
<li class="task-list-item">
|
50
|
+
<input type="checkbox" class="task-list-item-checkbox" disabled>Unchecked item</li>
|
51
|
+
</ul>
|
52
|
+
|
53
|
+
<dl>
|
54
|
+
<dt>定義語リストとは?</dt>
|
55
|
+
<dd>こんなかんじで単語の意味を説明していくリストです。</dd>
|
56
|
+
<dt>他の単語</dt>
|
57
|
+
<dd>ここに説明を書く</dd>
|
58
|
+
</dl>
|
59
|
+
|
60
|
+
<p>引用してみるよ</p>
|
61
|
+
|
62
|
+
<blockquote>
|
63
|
+
<p>この文字列は引用されたものです<br>
|
64
|
+
インデントされているはず<br>
|
65
|
+
これはもインデントされている</p>
|
66
|
+
</blockquote>
|
67
|
+
|
68
|
+
<p>これはインデントされない</p>
|
69
|
+
|
70
|
+
<p>まずは <strong>「自己紹介」</strong>してみましょう。<br>
|
71
|
+
こんにちは <code>Hello, world!</code> 你好。
|
72
|
+
</p>
|
73
|
+
|
74
|
+
<div class="code-frame" data-lang="rb"><div class="highlight"><pre><span class="k">class</span> <span class="nc">Klass</span>
|
75
|
+
<span class="k">def</span> <span class="nf">method</span>
|
76
|
+
<span class="nb">puts</span> <span class="s1">'method called!'</span>
|
77
|
+
<span class="k">end</span>
|
78
|
+
<span class="k">end</span>
|
79
|
+
</pre></div></div>
|
80
|
+
|
81
|
+
<table>
|
82
|
+
<thead>
|
83
|
+
<tr>
|
84
|
+
<th>ヘッダー</th>
|
85
|
+
<th>Header</th>
|
86
|
+
</tr>
|
87
|
+
</thead>
|
88
|
+
<tbody>
|
89
|
+
<tr>
|
90
|
+
<td>Cell1</td>
|
91
|
+
<td>セル1</td>
|
92
|
+
</tr>
|
93
|
+
<tr>
|
94
|
+
<td>試しに長い文字列を入力してみるYo</td>
|
95
|
+
<td>looooooooooooooooooong</td>
|
96
|
+
</tr>
|
97
|
+
</tbody>
|
98
|
+
</table>
|
99
|
+
|
100
|
+
<p><img src="http://cdn.qiita.com/assets/siteid-reverse-1949e989f9d8b2f6fad65a57292b2b01.png" alt="Qiita logo"></p>
|
101
|
+
<p><a href="http://qiita.com"><img src="http://cdn.qiita.com/assets/siteid-reverse-1949e989f9d8b2f6fad65a57292b2b01.png" alt="Qiita logo"></a></p>
|
102
|
+
|
103
|
+
<p><a href="http://qiita.com">http://qiita.com</a> - リンク<br>
|
104
|
+
<a href="http://qiita.com">Qiita</a></p>
|
105
|
+
|
106
|
+
<p>↓水平線</p>
|
107
|
+
|
108
|
+
<hr>
|
109
|
+
|
110
|
+
<p>↑水平線</p>
|
111
|
+
|
112
|
+
<p><del>ignore it</del></p>
|
113
|
+
|
114
|
+
<p><img class="emoji" title=":trollface:" alt=":trollface:" src="https://cdn.qiita.com/emoji/trollface.png" height="20" width="20" align="absmiddle"> <img class="emoji" title=":trollface:" alt=":trollface:" src="https://cdn.qiita.com/emoji/trollface.png" height="20" width="20" align="absmiddle"> <img class="emoji" title=":trollface:" alt=":trollface:" src="https://cdn.qiita.com/emoji/trollface.png" height="20" width="20" align="absmiddle"> <img class="emoji" title=":trollface:" alt=":trollface:" src="https://cdn.qiita.com/emoji/trollface.png" height="20" width="20" align="absmiddle"> <img class="emoji" title=":joy:" alt=":joy:" src="https://cdn.qiita.com/emoji/unicode/1f602.png" height="20" width="20" align="absmiddle"> <img class="emoji" title=":joy:" alt=":joy:" src="https://cdn.qiita.com/emoji/unicode/1f602.png" height="20" width="20" align="absmiddle"> <img class="emoji" title=":sob:" alt=":sob:" src="https://cdn.qiita.com/emoji/unicode/1f62d.png" height="20" width="20" align="absmiddle"> <img class="emoji" title=":sob:" alt=":sob:" src="https://cdn.qiita.com/emoji/unicode/1f62d.png" height="20" width="20" align="absmiddle"> </p>
|
@@ -0,0 +1,73 @@
|
|
1
|
+
*見出し bold*
|
2
|
+
|
3
|
+
テキスト _イタリック_ *太字*
|
4
|
+
stringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstring
|
5
|
+
|
6
|
+
hogehogehogehogehogehogehoge :eyes: hogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehoge :bowtie:
|
7
|
+
|
8
|
+
*中見出し _italic_*
|
9
|
+
|
10
|
+
内容をここに書く
|
11
|
+
|
12
|
+
• リスト
|
13
|
+
• リスト1
|
14
|
+
• リスト2
|
15
|
+
|
16
|
+
1. Item 1
|
17
|
+
2. Item 2
|
18
|
+
3. Item 3
|
19
|
+
• Item 3a
|
20
|
+
• Item 3b
|
21
|
+
|
22
|
+
• [x]@qiitan, @tomoasleep_seed
|
23
|
+
• [x] List items can have *bold* and _italic text_
|
24
|
+
• [x] Checkbox
|
25
|
+
• [x] Checked item
|
26
|
+
• [ ] Unchecked item
|
27
|
+
|
28
|
+
• 定義語リストとは?
|
29
|
+
• こんなかんじで単語の意味を説明していくリストです。
|
30
|
+
• 他の単語
|
31
|
+
• ここに説明を書く
|
32
|
+
|
33
|
+
引用してみるよ
|
34
|
+
|
35
|
+
> この文字列は引用されたものです
|
36
|
+
> インデントされているはず
|
37
|
+
> これはもインデントされている
|
38
|
+
|
39
|
+
これはインデントされない
|
40
|
+
|
41
|
+
まずは *「自己紹介」* してみましょう。
|
42
|
+
こんにちは `Hello, world!` 你好。
|
43
|
+
|
44
|
+
```class Klass
|
45
|
+
def method
|
46
|
+
puts 'method called!'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
+--------------------------------+----------------------+
|
52
|
+
|ヘッダー |Header |
|
53
|
+
+--------------------------------+----------------------+
|
54
|
+
|Cell1 |セル1 |
|
55
|
+
|試しに長い文字列を入力してみるYo|looooooooooooooooooong|
|
56
|
+
+--------------------------------+----------------------+
|
57
|
+
|
58
|
+
<http://cdn.qiita.com/assets/siteid-reverse-1949e989f9d8b2f6fad65a57292b2b01.png|Qiita logo>
|
59
|
+
|
60
|
+
<http://qiita.com|Qiita logo>
|
61
|
+
|
62
|
+
<http://qiita.com|http://qiita.com> - リンク
|
63
|
+
<http://qiita.com|Qiita>
|
64
|
+
|
65
|
+
↓水平線
|
66
|
+
|
67
|
+
-----------
|
68
|
+
|
69
|
+
↑水平線
|
70
|
+
|
71
|
+
ignore it
|
72
|
+
|
73
|
+
:trollface::trollface::trollface::trollface::joy::joy::sob::sob:
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Public: Provide DSL methods to build a DocumentComponent like S-exp.
|
2
|
+
module DocumentComponentDsl
|
3
|
+
def c(type_name, *children)
|
4
|
+
options = children.first.is_a?(Hash) ? children.shift : {}
|
5
|
+
Slacken::DocumentComponent.new(type_name, children, options)
|
6
|
+
end
|
7
|
+
|
8
|
+
def text(content)
|
9
|
+
Slacken::DocumentComponent.new(:text, [], content: content)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Slacken::DocumentComponent
|
4
|
+
describe ElimBlanks, dsl: true do
|
5
|
+
describe '#has_no_blanks?' do
|
6
|
+
subject { component.has_no_blanks? }
|
7
|
+
|
8
|
+
context 'when a component obviously having no blanks is given' do
|
9
|
+
let(:component) do
|
10
|
+
c(:div, text('hello world!'))
|
11
|
+
end
|
12
|
+
|
13
|
+
it { is_expected.to be_truthy }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when a component with blank children is given' do
|
17
|
+
let(:component) do
|
18
|
+
c(:div, text(''), c(:div), c(:span))
|
19
|
+
end
|
20
|
+
|
21
|
+
it { is_expected.to be_falsey }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when a component with a img is given' do
|
25
|
+
let(:component) do
|
26
|
+
c(:div, c(:img))
|
27
|
+
end
|
28
|
+
|
29
|
+
it { is_expected.to be_truthy }
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Slacken::DocumentComponent
|
4
|
+
describe ElimInvalidLinks, dsl: true do
|
5
|
+
describe '#has_no_invalid_links?' do
|
6
|
+
subject { component.has_no_invalid_links? }
|
7
|
+
|
8
|
+
context 'when a http link is given' do
|
9
|
+
let(:component) do
|
10
|
+
c(:a, { href: 'http://example.com' })
|
11
|
+
end
|
12
|
+
|
13
|
+
it { is_expected.to be_truthy }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when a https link is given' do
|
17
|
+
let(:component) do
|
18
|
+
c(:a, { href: 'https://example.com' })
|
19
|
+
end
|
20
|
+
|
21
|
+
it { is_expected.to be_truthy }
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when a disallowed link containing 'http://' is given" do
|
25
|
+
let(:component) do
|
26
|
+
c(:a, { href: '#hogefugahttp://' })
|
27
|
+
end
|
28
|
+
|
29
|
+
it { is_expected.to be_falsey }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when a disallowed link is given' do
|
33
|
+
let(:component) do
|
34
|
+
c(:a, { href: '#hogehoge' })
|
35
|
+
end
|
36
|
+
|
37
|
+
it { is_expected.to be_falsey }
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'when a disallowed link occurs as a component\'s children' do
|
41
|
+
let(:component) do
|
42
|
+
c(:div, c(:span, c(:a, { href: '#hogehoge' })))
|
43
|
+
end
|
44
|
+
|
45
|
+
it { is_expected.to be_falsey }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Slacken::DocumentComponent
|
4
|
+
describe ElimLineBreaks, dsl: true do
|
5
|
+
describe '#has_no_line_breaks?' do
|
6
|
+
subject { component.has_no_line_breaks? }
|
7
|
+
|
8
|
+
context 'when no linebreaks occur' do
|
9
|
+
let(:component) do
|
10
|
+
c(:div, c(:h1, text('yo!')), c(:wrapper, text('hello world!'), text('another')))
|
11
|
+
end
|
12
|
+
|
13
|
+
it { is_expected.to be_truthy }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when a linebreak occurs in a inline component' do
|
17
|
+
let(:component) do
|
18
|
+
c(:div, c(:h1, text('yo!')), c(:wrapper, text('hello world!'), text("another\n")))
|
19
|
+
end
|
20
|
+
|
21
|
+
it { is_expected.to be_falsey }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when a linebreak occurs in a block component' do
|
25
|
+
let(:component) do
|
26
|
+
c(:div, c(:h1, text("yo\n!")), c(:wrapper, text('hello world!'), text("another")))
|
27
|
+
end
|
28
|
+
|
29
|
+
it { is_expected.to be_falsey }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when a linebreak occurs in a pre tag' do
|
33
|
+
let(:component) do
|
34
|
+
c(:div, c(:pre, text("yo\n!")), c(:wrapper, text('hello world!'), text("another")))
|
35
|
+
end
|
36
|
+
|
37
|
+
it { is_expected.to be_truthy }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Slacken::DocumentComponent
|
4
|
+
describe GroupIndent, dsl: true do
|
5
|
+
describe '#indent_grouped?' do
|
6
|
+
subject { component.indent_grouped? }
|
7
|
+
|
8
|
+
context 'when a indented list component is given' do
|
9
|
+
let(:component) do
|
10
|
+
c(:ul,
|
11
|
+
c(:li,
|
12
|
+
text('List Heading'),
|
13
|
+
c(:indent,
|
14
|
+
text('List Content1'),
|
15
|
+
c(:span, text('List Content2'), text('List Content3'))
|
16
|
+
)))
|
17
|
+
end
|
18
|
+
|
19
|
+
it { is_expected.to be_truthy }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when a indented list where child component is not indented is given' do
|
23
|
+
let(:component) do
|
24
|
+
c(:ul,
|
25
|
+
c(:li,
|
26
|
+
text('List Heading'),
|
27
|
+
c(:span,
|
28
|
+
text('List Content1'),
|
29
|
+
c(:span, text('List Content2'), text('List Content3'))
|
30
|
+
)))
|
31
|
+
end
|
32
|
+
|
33
|
+
it { is_expected.to be_falsey }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Slacken::DocumentComponent
|
4
|
+
describe GroupInlines, dsl: true do
|
5
|
+
describe '#inlines_grouped?' do
|
6
|
+
subject { component.inlines_grouped? }
|
7
|
+
|
8
|
+
context 'when a grouped component is given' do
|
9
|
+
let(:component) do
|
10
|
+
c(:div, c(:wrapper, text('hello world!'), text('another')))
|
11
|
+
end
|
12
|
+
|
13
|
+
it { is_expected.to be_truthy }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when a component whose inline components are exposed is given' do
|
17
|
+
let(:component) do
|
18
|
+
c(:div, text(''), c(:div), c(:span))
|
19
|
+
end
|
20
|
+
|
21
|
+
it { is_expected.to be_falsey }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when a component with only block components is given' do
|
25
|
+
let(:component) do
|
26
|
+
c(:div, c(:div), c(:img), c(:p, c(:h1)))
|
27
|
+
end
|
28
|
+
|
29
|
+
it { is_expected.to be_truthy }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Slacken::DocumentComponent
|
4
|
+
describe SanitizeSpecialTagContainers, dsl: true do
|
5
|
+
describe '#sanitized?' do
|
6
|
+
subject { component.sanitized? }
|
7
|
+
|
8
|
+
context 'when a header occurs in a list' do
|
9
|
+
let(:component) do
|
10
|
+
c(:ul,
|
11
|
+
c(:li,
|
12
|
+
text('header'),
|
13
|
+
c(:indent,
|
14
|
+
c(:h1, text('hoge')))))
|
15
|
+
end
|
16
|
+
|
17
|
+
it { is_expected.to be_falsey }
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when a list occurs in another list' do
|
21
|
+
let(:component) do
|
22
|
+
c(:ul,
|
23
|
+
c(:li,
|
24
|
+
text('header'),
|
25
|
+
c(:indent,
|
26
|
+
c(:dl,
|
27
|
+
c(:li,
|
28
|
+
text('header2'),
|
29
|
+
c(:indent,
|
30
|
+
text('fuga')))))))
|
31
|
+
end
|
32
|
+
|
33
|
+
it { is_expected.to be_truthy }
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when a code occurs in a header' do
|
37
|
+
let(:component) do
|
38
|
+
c(:h3,
|
39
|
+
text('A Ruby Code is Given: '),
|
40
|
+
c(:span,
|
41
|
+
c(:code, text("puts('hello, world!')"))))
|
42
|
+
end
|
43
|
+
|
44
|
+
it { is_expected.to be_falsey }
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when a pre tag occurs in a table' do
|
48
|
+
let(:component) do
|
49
|
+
c(:table,
|
50
|
+
c(:thead,
|
51
|
+
c(:tr,
|
52
|
+
c(:th, text('Header1')),
|
53
|
+
c(:th, text('Header2')))),
|
54
|
+
c(:tbody,
|
55
|
+
c(:tr,
|
56
|
+
c(:td, text('Content1')),
|
57
|
+
c(:td, c(:pre, (text('Content2')))))))
|
58
|
+
end
|
59
|
+
|
60
|
+
it { is_expected.to be_falsey }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|