rich_text_renderer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +27 -0
  5. data/.rubocop_todo.yml +35 -0
  6. data/.travis.yml +13 -0
  7. data/.yardopts +4 -0
  8. data/CHANGELOG.md +19 -0
  9. data/Gemfile +3 -0
  10. data/Guardfile +24 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +87 -0
  13. data/Rakefile +33 -0
  14. data/lib/rich_text_renderer.rb +2 -0
  15. data/lib/rich_text_renderer/base_node_renderer.rb +18 -0
  16. data/lib/rich_text_renderer/block_renderers.rb +18 -0
  17. data/lib/rich_text_renderer/block_renderers/base_block_renderer.rb +24 -0
  18. data/lib/rich_text_renderer/block_renderers/blockquote_renderer.rb +12 -0
  19. data/lib/rich_text_renderer/block_renderers/entry_block_renderer.rb +13 -0
  20. data/lib/rich_text_renderer/block_renderers/heading_five_renderer.rb +12 -0
  21. data/lib/rich_text_renderer/block_renderers/heading_four_renderer.rb +12 -0
  22. data/lib/rich_text_renderer/block_renderers/heading_one_renderer.rb +12 -0
  23. data/lib/rich_text_renderer/block_renderers/heading_six_renderer.rb +12 -0
  24. data/lib/rich_text_renderer/block_renderers/heading_three_renderer.rb +12 -0
  25. data/lib/rich_text_renderer/block_renderers/heading_two_renderer.rb +12 -0
  26. data/lib/rich_text_renderer/block_renderers/hr_renderer.rb +11 -0
  27. data/lib/rich_text_renderer/block_renderers/hyperlink_renderer.rb +11 -0
  28. data/lib/rich_text_renderer/block_renderers/list_item_renderer.rb +12 -0
  29. data/lib/rich_text_renderer/block_renderers/ordered_list_renderer.rb +12 -0
  30. data/lib/rich_text_renderer/block_renderers/paragraph_renderer.rb +12 -0
  31. data/lib/rich_text_renderer/block_renderers/unordered_list_renderer.rb +12 -0
  32. data/lib/rich_text_renderer/document_renderers.rb +1 -0
  33. data/lib/rich_text_renderer/document_renderers/document_renderer.rb +13 -0
  34. data/lib/rich_text_renderer/null_renderer.rb +19 -0
  35. data/lib/rich_text_renderer/renderer.rb +46 -0
  36. data/lib/rich_text_renderer/text_renderers.rb +5 -0
  37. data/lib/rich_text_renderer/text_renderers/base_inline_renderer.rb +17 -0
  38. data/lib/rich_text_renderer/text_renderers/bold_renderer.rb +12 -0
  39. data/lib/rich_text_renderer/text_renderers/code_renderer.rb +12 -0
  40. data/lib/rich_text_renderer/text_renderers/italic_renderer.rb +12 -0
  41. data/lib/rich_text_renderer/text_renderers/text_renderer.rb +19 -0
  42. data/lib/rich_text_renderer/text_renderers/underline_renderer.rb +12 -0
  43. data/lib/rich_text_renderer/version.rb +4 -0
  44. data/rich_text_renderer.gemspec +30 -0
  45. data/spec/lib/rich_text_renderer/block_renderers/base_block_renderer_spec.rb +26 -0
  46. data/spec/lib/rich_text_renderer/block_renderers/blockquote_renderer_spec.rb +25 -0
  47. data/spec/lib/rich_text_renderer/block_renderers/entry_block_renderer_spec.rb +15 -0
  48. data/spec/lib/rich_text_renderer/block_renderers/heading_five_renderer_spec.rb +24 -0
  49. data/spec/lib/rich_text_renderer/block_renderers/heading_four_renderer_spec.rb +24 -0
  50. data/spec/lib/rich_text_renderer/block_renderers/heading_one_renderer_spec.rb +24 -0
  51. data/spec/lib/rich_text_renderer/block_renderers/heading_six_renderer_spec.rb +24 -0
  52. data/spec/lib/rich_text_renderer/block_renderers/heading_three_renderer_spec.rb +24 -0
  53. data/spec/lib/rich_text_renderer/block_renderers/heading_two_renderer_spec.rb +24 -0
  54. data/spec/lib/rich_text_renderer/block_renderers/hr_renderer_spec.rb +13 -0
  55. data/spec/lib/rich_text_renderer/block_renderers/hyperlink_renderer_spec.rb +24 -0
  56. data/spec/lib/rich_text_renderer/block_renderers/list_item_renderer_spec.rb +24 -0
  57. data/spec/lib/rich_text_renderer/block_renderers/ordered_list_renderer_spec.rb +56 -0
  58. data/spec/lib/rich_text_renderer/block_renderers/paragraph_renderer_spec.rb +30 -0
  59. data/spec/lib/rich_text_renderer/block_renderers/unordered_list_renderer_spec.rb +56 -0
  60. data/spec/lib/rich_text_renderer/document_renderers/document_renderer_spec.rb +42 -0
  61. data/spec/lib/rich_text_renderer/null_renderer_spec.rb +19 -0
  62. data/spec/lib/rich_text_renderer/renderer_spec.rb +308 -0
  63. data/spec/lib/rich_text_renderer/text_renderers/base_inline_renderer_spec.rb +11 -0
  64. data/spec/lib/rich_text_renderer/text_renderers/bold_renderer_spec.rb +11 -0
  65. data/spec/lib/rich_text_renderer/text_renderers/code_renderer_spec.rb +11 -0
  66. data/spec/lib/rich_text_renderer/text_renderers/italic_renderer_spec.rb +11 -0
  67. data/spec/lib/rich_text_renderer/text_renderers/text_renderer_spec.rb +53 -0
  68. data/spec/lib/rich_text_renderer/text_renderers/underline_renderer_spec.rb +11 -0
  69. data/spec/spec_helper.rb +82 -0
  70. metadata +387 -0
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
4
+
5
+ mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
6
+
7
+ describe RichTextRenderer::HeadingOneRenderer do
8
+ subject do
9
+ described_class.new(
10
+ 'text' => RichTextRenderer::TextRenderer,
11
+ 'bold' => RichTextRenderer::BoldRenderer
12
+ )
13
+ end
14
+
15
+ describe '#render' do
16
+ it 'renders a h1' do
17
+ expect(subject.render(mock_node)).to eq "<h1>foo</h1>"
18
+ end
19
+
20
+ it 'will propagate marks to text renderers' do
21
+ expect(subject.render(mock_node_with_marks)).to eq "<h1><b>foo</b></h1>"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
4
+
5
+ mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
6
+
7
+ describe RichTextRenderer::HeadingSixRenderer do
8
+ subject do
9
+ described_class.new(
10
+ 'text' => RichTextRenderer::TextRenderer,
11
+ 'bold' => RichTextRenderer::BoldRenderer
12
+ )
13
+ end
14
+
15
+ describe '#render' do
16
+ it 'renders a h6' do
17
+ expect(subject.render(mock_node)).to eq "<h6>foo</h6>"
18
+ end
19
+
20
+ it 'will propagate marks to text renderers' do
21
+ expect(subject.render(mock_node_with_marks)).to eq "<h6><b>foo</b></h6>"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
4
+
5
+ mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
6
+
7
+ describe RichTextRenderer::HeadingThreeRenderer do
8
+ subject do
9
+ described_class.new(
10
+ 'text' => RichTextRenderer::TextRenderer,
11
+ 'bold' => RichTextRenderer::BoldRenderer
12
+ )
13
+ end
14
+
15
+ describe '#render' do
16
+ it 'renders a h3' do
17
+ expect(subject.render(mock_node)).to eq "<h3>foo</h3>"
18
+ end
19
+
20
+ it 'will propagate marks to text renderers' do
21
+ expect(subject.render(mock_node_with_marks)).to eq "<h3><b>foo</b></h3>"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
4
+
5
+ mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
6
+
7
+ describe RichTextRenderer::HeadingTwoRenderer do
8
+ subject do
9
+ described_class.new(
10
+ 'text' => RichTextRenderer::TextRenderer,
11
+ 'bold' => RichTextRenderer::BoldRenderer
12
+ )
13
+ end
14
+
15
+ describe '#render' do
16
+ it 'renders a h2' do
17
+ expect(subject.render(mock_node)).to eq "<h2>foo</h2>"
18
+ end
19
+
20
+ it 'will propagate marks to text renderers' do
21
+ expect(subject.render(mock_node_with_marks)).to eq "<h2><b>foo</b></h2>"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ mock_node = {"nodeType" => "hr"}
4
+
5
+ describe RichTextRenderer::HrRenderer do
6
+ subject { described_class.new }
7
+
8
+ describe '#render' do
9
+ it 'will render an hr' do
10
+ expect(subject.render(mock_node)).to eq '<hr />'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ mock_node = {"data" => {"uri" => "https://foobar.com"}, "content" => [{"value" => "foo", "nodeType" => "text"}]}
4
+
5
+ mock_node_with_marks = {"data" => {"uri" => "https://foobar.com"}, "content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
6
+
7
+ describe RichTextRenderer::HyperlinkRenderer do
8
+ subject do
9
+ described_class.new(
10
+ 'text' => RichTextRenderer::TextRenderer,
11
+ 'bold' => RichTextRenderer::BoldRenderer
12
+ )
13
+ end
14
+
15
+ describe '#render' do
16
+ it 'renders an a' do
17
+ expect(subject.render(mock_node)).to eq '<a href="https://foobar.com">foo</a>'
18
+ end
19
+
20
+ it 'will propagate marks to text renderers' do
21
+ expect(subject.render(mock_node_with_marks)).to eq '<a href="https://foobar.com"><b>foo</b></a>'
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
4
+
5
+ mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
6
+
7
+ describe RichTextRenderer::ListItemRenderer do
8
+ subject do
9
+ described_class.new(
10
+ 'text' => RichTextRenderer::TextRenderer,
11
+ 'bold' => RichTextRenderer::BoldRenderer
12
+ )
13
+ end
14
+
15
+ describe '#render' do
16
+ it 'renders a li' do
17
+ expect(subject.render(mock_node)).to eq "<li>foo</li>"
18
+ end
19
+
20
+ it 'will propagate marks to text renderers' do
21
+ expect(subject.render(mock_node_with_marks)).to eq "<li><b>foo</b></li>"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ mock_node = {"content" => [
4
+ {
5
+ "content" => [{
6
+ "content" => [{
7
+ "value" => "foo",
8
+ "nodeType" => "text",
9
+ "nodeClass" => "text"
10
+ }],
11
+ "nodeType" => "paragraph",
12
+ "nodeClass" => "block"
13
+ }],
14
+ "nodeType" => "list-item",
15
+ "nodeClass" => "block"
16
+ }]
17
+ }
18
+
19
+ mock_node_with_marks = {"content" => [
20
+ {
21
+ "content" => [{
22
+ "content" => [{
23
+ "marks" => [{"type" => "bold"}],
24
+ "value" => "foo",
25
+ "nodeType" => "text",
26
+ "nodeClass" => "text"
27
+ }],
28
+ "nodeType" => "paragraph",
29
+ "nodeClass" => "block"
30
+ }],
31
+ "nodeType" => "list-item",
32
+ "nodeClass" => "block"
33
+ }]
34
+ }
35
+
36
+
37
+ describe RichTextRenderer::OrderedListRenderer do
38
+ subject do
39
+ described_class.new(
40
+ 'paragraph' => RichTextRenderer::ParagraphRenderer,
41
+ 'text' => RichTextRenderer::TextRenderer,
42
+ 'bold' => RichTextRenderer::BoldRenderer,
43
+ 'list-item' => RichTextRenderer::ListItemRenderer
44
+ )
45
+ end
46
+
47
+ describe '#render' do
48
+ it 'renders a ol' do
49
+ expect(subject.render(mock_node)).to eq "<ol><li><p>foo</p></li></ol>"
50
+ end
51
+
52
+ it 'will propagate marks to text renderers' do
53
+ expect(subject.render(mock_node_with_marks)).to eq "<ol><li><p><b>foo</b></p></li></ol>"
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
4
+
5
+ mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
6
+
7
+ mock_node_with_multiple_content_nodes = {"content" => [{"value" => "foo", "nodeType" => "text"}, {"value" => " bar", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
8
+
9
+ describe RichTextRenderer::ParagraphRenderer do
10
+ subject do
11
+ described_class.new(
12
+ 'text' => RichTextRenderer::TextRenderer,
13
+ 'bold' => RichTextRenderer::BoldRenderer
14
+ )
15
+ end
16
+
17
+ describe '#render' do
18
+ it 'renders a p' do
19
+ expect(subject.render(mock_node)).to eq "<p>foo</p>"
20
+ end
21
+
22
+ it 'will propagate marks to text renderers' do
23
+ expect(subject.render(mock_node_with_marks)).to eq "<p><b>foo</b></p>"
24
+ end
25
+
26
+ it 'will properly render multiple content nodes' do
27
+ expect(subject.render(mock_node_with_multiple_content_nodes)).to eq "<p>foo<b> bar</b></p>"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ mock_node = {"content" => [
4
+ {
5
+ "content" => [{
6
+ "content" => [{
7
+ "value" => "foo",
8
+ "nodeType" => "text",
9
+ "nodeClass" => "text"
10
+ }],
11
+ "nodeType" => "paragraph",
12
+ "nodeClass" => "block"
13
+ }],
14
+ "nodeType" => "list-item",
15
+ "nodeClass" => "block"
16
+ }]
17
+ }
18
+
19
+ mock_node_with_marks = {"content" => [
20
+ {
21
+ "content" => [{
22
+ "content" => [{
23
+ "marks" => [{"type" => "bold"}],
24
+ "value" => "foo",
25
+ "nodeType" => "text",
26
+ "nodeClass" => "text"
27
+ }],
28
+ "nodeType" => "paragraph",
29
+ "nodeClass" => "block"
30
+ }],
31
+ "nodeType" => "list-item",
32
+ "nodeClass" => "block"
33
+ }]
34
+ }
35
+
36
+
37
+ describe RichTextRenderer::UnorderedListRenderer do
38
+ subject do
39
+ described_class.new(
40
+ 'paragraph' => RichTextRenderer::ParagraphRenderer,
41
+ 'text' => RichTextRenderer::TextRenderer,
42
+ 'bold' => RichTextRenderer::BoldRenderer,
43
+ 'list-item' => RichTextRenderer::ListItemRenderer
44
+ )
45
+ end
46
+
47
+ describe '#render' do
48
+ it 'renders a ul' do
49
+ expect(subject.render(mock_node)).to eq "<ul><li><p>foo</p></li></ul>"
50
+ end
51
+
52
+ it 'will propagate marks to text renderers' do
53
+ expect(subject.render(mock_node_with_marks)).to eq "<ul><li><p><b>foo</b></p></li></ul>"
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ mock_document = {
4
+ "nodeType" => "document",
5
+ "content" => [
6
+ {
7
+ "content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}],
8
+ "nodeType" => "heading-1",
9
+ }
10
+ ],
11
+ }
12
+
13
+ mock_document_with_unknown_nodetype = {
14
+ "nodeType" => "document",
15
+ "content" => [
16
+ {
17
+ "content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}],
18
+ "nodeType" => "unknown",
19
+ }
20
+ ],
21
+ }
22
+
23
+ describe RichTextRenderer::DocumentRenderer do
24
+ subject do
25
+ described_class.new(
26
+ 'heading-1' => RichTextRenderer::HeadingOneRenderer,
27
+ 'text' => RichTextRenderer::TextRenderer,
28
+ 'bold' => RichTextRenderer::BoldRenderer,
29
+ nil => RichTextRenderer::NullRenderer
30
+ )
31
+ end
32
+
33
+ describe '#render' do
34
+ it 'propagates rendering to renderers' do
35
+ expect(subject.render(mock_document)).to eq "<h1><b>foo</b></h1>"
36
+ end
37
+
38
+ it 'will raise an error unknown node types' do
39
+ expect { subject.render(mock_document_with_unknown_nodetype) }.to raise_error "No renderer defined for 'unknown' nodes"
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe RichTextRenderer::NullRenderer do
4
+ subject { described_class.new }
5
+
6
+ describe 'null renderer will raise errors for unknown nodes' do
7
+ it 'will look for nodeType' do
8
+ expect { subject.render({'nodeType' => 'foo'}) }.to raise_error "No renderer defined for 'foo' nodes"
9
+ end
10
+
11
+ it 'will look for type' do
12
+ expect { subject.render({'type' => 'foo'}) }.to raise_error "No renderer defined for 'foo' nodes"
13
+ end
14
+
15
+ it 'if none of the above found, will dump the node' do
16
+ expect { subject.render({'foo' => 'bar'}) }.to raise_error "No renderer defined for '{\"foo\"=>\"bar\"}' nodes"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,308 @@
1
+ require 'spec_helper'
2
+
3
+ full_document = {
4
+ "content" => [
5
+ {
6
+ "data" => {},
7
+ "content" => [
8
+ {
9
+ "marks" => [],
10
+ "value" => "Some heading",
11
+ "nodeType" => "text",
12
+ "nodeClass" => "text",
13
+ }
14
+ ],
15
+ "nodeType" => "heading-1",
16
+ "nodeClass" => "block",
17
+ },
18
+ {
19
+ "data" => {},
20
+ "content" => [
21
+ {"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
22
+ ],
23
+ "nodeType" => "paragraph",
24
+ "nodeClass" => "block",
25
+ },
26
+ {
27
+ "data" => {
28
+ "target" => {
29
+ "sys" => {
30
+ "id" => "49rofLvvxCOiIMIi6mk8ai",
31
+ "type" => "Link",
32
+ "linkType" => "Entry",
33
+ }
34
+ }
35
+ },
36
+ "content" => [
37
+ {"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
38
+ ],
39
+ "nodeType" => "embedded-entry-block",
40
+ "nodeClass" => "block",
41
+ },
42
+ {
43
+ "data" => {},
44
+ "content" => [
45
+ {
46
+ "marks" => [],
47
+ "value" => "Some subheading",
48
+ "nodeType" => "text",
49
+ "nodeClass" => "text",
50
+ }
51
+ ],
52
+ "nodeType" => "heading-2",
53
+ "nodeClass" => "block",
54
+ },
55
+ {
56
+ "data" => {},
57
+ "content" => [
58
+ {
59
+ "marks" => [{"data" => {}, "type" => "bold", "object" => "mark"}],
60
+ "value" => "Some bold",
61
+ "nodeType" => "text",
62
+ "nodeClass" => "text",
63
+ }
64
+ ],
65
+ "nodeType" => "paragraph",
66
+ "nodeClass" => "block",
67
+ },
68
+ {
69
+ "data" => {},
70
+ "content" => [
71
+ {
72
+ "marks" => [{"data" => {}, "type" => "italic", "object" => "mark"}],
73
+ "value" => "Some italics",
74
+ "nodeType" => "text",
75
+ "nodeClass" => "text",
76
+ }
77
+ ],
78
+ "nodeType" => "paragraph",
79
+ "nodeClass" => "block",
80
+ },
81
+ {
82
+ "data" => {},
83
+ "content" => [
84
+ {
85
+ "marks" => [{"data" => {}, "type" => "underline", "object" => "mark"}],
86
+ "value" => "Some underline",
87
+ "nodeType" => "text",
88
+ "nodeClass" => "text",
89
+ }
90
+ ],
91
+ "nodeType" => "paragraph",
92
+ "nodeClass" => "block",
93
+ },
94
+ {
95
+ "data" => {},
96
+ "content" => [
97
+ {"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
98
+ ],
99
+ "nodeType" => "paragraph",
100
+ "nodeClass" => "block",
101
+ },
102
+ {
103
+ "data" => {},
104
+ "content" => [
105
+ {"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
106
+ ],
107
+ "nodeType" => "paragraph",
108
+ "nodeClass" => "block",
109
+ },
110
+ {
111
+ "data" => {
112
+ "target" => {
113
+ "sys" => {
114
+ "id" => "5ZF9Q4K6iWSYIU2OUs0UaQ",
115
+ "type" => "Link",
116
+ "linkType" => "Entry",
117
+ }
118
+ }
119
+ },
120
+ "content" => [
121
+ {"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
122
+ ],
123
+ "nodeType" => "embedded-entry-block",
124
+ "nodeClass" => "block",
125
+ },
126
+ {
127
+ "data" => {},
128
+ "content" => [
129
+ {"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
130
+ ],
131
+ "nodeType" => "paragraph",
132
+ "nodeClass" => "block",
133
+ },
134
+ {
135
+ "data" => {},
136
+ "content" => [
137
+ {
138
+ "marks" => [],
139
+ "value" => "Some raw content",
140
+ "nodeType" => "text",
141
+ "nodeClass" => "text",
142
+ }
143
+ ],
144
+ "nodeType" => "paragraph",
145
+ "nodeClass" => "block",
146
+ },
147
+ {
148
+ "data" => {},
149
+ "content" => [
150
+ {"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
151
+ ],
152
+ "nodeType" => "paragraph",
153
+ "nodeClass" => "block",
154
+ },
155
+ {
156
+ "data" => {},
157
+ "content" => [
158
+ {
159
+ "marks" => [],
160
+ "value" => "An unpublished embed:",
161
+ "nodeType" => "text",
162
+ "nodeClass" => "text",
163
+ }
164
+ ],
165
+ "nodeType" => "paragraph",
166
+ "nodeClass" => "block",
167
+ },
168
+ {
169
+ "data" => {},
170
+ "content" => [
171
+ {"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
172
+ ],
173
+ "nodeType" => "paragraph",
174
+ "nodeClass" => "block",
175
+ },
176
+ {
177
+ "data" => {
178
+ "target" => {
179
+ "sys" => {
180
+ "id" => "q2hGXkd5tICym64AcgeKK",
181
+ "type" => "Link",
182
+ "linkType" => "Entry",
183
+ }
184
+ }
185
+ },
186
+ "content" => [
187
+ {"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
188
+ ],
189
+ "nodeType" => "embedded-entry-block",
190
+ "nodeClass" => "block",
191
+ },
192
+ {
193
+ "data" => {},
194
+ "content" => [
195
+ {
196
+ "marks" => [],
197
+ "value" => "Some more content",
198
+ "nodeType" => "text",
199
+ "nodeClass" => "text",
200
+ }
201
+ ],
202
+ "nodeType" => "paragraph",
203
+ "nodeClass" => "block",
204
+ },
205
+ ],
206
+ "nodeType" => "document",
207
+ "nodeClass" => "document",
208
+ }
209
+
210
+ describe RichTextRenderer::Renderer do
211
+ subject { described_class.new }
212
+
213
+ describe '#render' do
214
+ it 'by default renders html' do
215
+ expect(subject.render(full_document)).to eq [
216
+ "<h1>Some heading</h1>",
217
+ "<p></p>",
218
+ '<div>{"target"=>{"sys"=>{"id"=>"49rofLvvxCOiIMIi6mk8ai", "type"=>"Link", "linkType"=>"Entry"}}}</div>',
219
+ "<h2>Some subheading</h2>",
220
+ "<p><b>Some bold</b></p>",
221
+ "<p><i>Some italics</i></p>",
222
+ "<p><u>Some underline</u></p>",
223
+ "<p></p>",
224
+ "<p></p>",
225
+ '<div>{"target"=>{"sys"=>{"id"=>"5ZF9Q4K6iWSYIU2OUs0UaQ", "type"=>"Link", "linkType"=>"Entry"}}}</div>',
226
+ "<p></p>",
227
+ "<p>Some raw content</p>",
228
+ "<p></p>",
229
+ "<p>An unpublished embed:</p>",
230
+ "<p></p>",
231
+ '<div>{"target"=>{"sys"=>{"id"=>"q2hGXkd5tICym64AcgeKK", "type"=>"Link", "linkType"=>"Entry"}}}</div>',
232
+ "<p>Some more content</p>",
233
+ ].join("\n")
234
+ end
235
+ end
236
+
237
+ describe 'with all renderers overridden' do
238
+ subject do
239
+ described_class.new(
240
+ 'heading-1' => HeadingOneMarkdownRenderer,
241
+ 'heading-2' => HeadingTwoMarkdownRenderer,
242
+ 'paragraph' => ParagraphMarkdownRenderer,
243
+ 'embedded-entry-block' => EntryBlockMarkdownRenderer,
244
+ 'bold' => BoldMarkdownRenderer,
245
+ 'italic' => ItalicMarkdownRenderer,
246
+ 'underline' => UnderlineMarkdownRenderer
247
+ )
248
+ end
249
+
250
+ it 'renders with the overridden renderers' do
251
+ expect(subject.render(full_document)).to eq [
252
+ "# Some heading",
253
+ "",
254
+ "",
255
+ "",
256
+ "",
257
+ "```",
258
+ '{"target"=>{"sys"=>{"id"=>"49rofLvvxCOiIMIi6mk8ai", "type"=>"Link", "linkType"=>"Entry"}}}',
259
+ "```",
260
+ "",
261
+ "## Some subheading",
262
+ "",
263
+ "**Some bold**",
264
+ "",
265
+ "",
266
+ "*Some italics*",
267
+ "",
268
+ "",
269
+ "__Some underline__",
270
+ "",
271
+ "",
272
+ "",
273
+ "",
274
+ "",
275
+ "",
276
+ "",
277
+ "",
278
+ "```",
279
+ '{"target"=>{"sys"=>{"id"=>"5ZF9Q4K6iWSYIU2OUs0UaQ", "type"=>"Link", "linkType"=>"Entry"}}}',
280
+ "```",
281
+ "",
282
+ "",
283
+ "",
284
+ "",
285
+ "",
286
+ "Some raw content",
287
+ "",
288
+ "",
289
+ "",
290
+ "",
291
+ "",
292
+ "An unpublished embed:",
293
+ "",
294
+ "",
295
+ "",
296
+ "",
297
+ "",
298
+ "```",
299
+ '{"target"=>{"sys"=>{"id"=>"q2hGXkd5tICym64AcgeKK", "type"=>"Link", "linkType"=>"Entry"}}}',
300
+ "```",
301
+ "",
302
+ "",
303
+ "Some more content",
304
+ ""
305
+ ].join("\n")
306
+ end
307
+ end
308
+ end