rich_text_renderer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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