rich_text_renderer 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +5 -0
- data/lib/rich_text_renderer/block_renderers.rb +2 -0
- data/lib/rich_text_renderer/block_renderers/asset_block_renderer.rb +27 -0
- data/lib/rich_text_renderer/block_renderers/asset_hyperlink_renderer.rb +64 -0
- data/lib/rich_text_renderer/renderer.rb +2 -0
- data/lib/rich_text_renderer/version.rb +1 -1
- data/spec/lib/rich_text_renderer/block_renderers/asset_block_renderer_spec.rb +101 -0
- data/spec/lib/rich_text_renderer/block_renderers/asset_hyperlink_renderer_spec.rb +32 -0
- data/spec/spec_helper.rb +23 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1af73f4a930b3c68dcf396b334a9318b1fb83ca3ba817582534f4c72b112e210
|
4
|
+
data.tar.gz: 8c92ee30ffe286b8c89532828eff36f4b7b2b123165691c95af3a49f92b8335f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c425f17916e5485f1074c75e5f55e9459e92dbd51d7608a42fe2253795baa2df5be419f59dba5684fa7ca501ff990621cddedb1c32361468e39783963298a08
|
7
|
+
data.tar.gz: c84e55adf160d7370ddf868fe31ae708b7634241e3002814cf565d3fa99b0d0c365658941f2ff377b01342a2d9c2f032228ec83ff65849b35fcfbd6b86c78b3e
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,8 @@ require_relative './block_renderers/hyperlink_renderer'
|
|
5
5
|
require_relative './block_renderers/blockquote_renderer'
|
6
6
|
|
7
7
|
require_relative './block_renderers/entry_block_renderer'
|
8
|
+
require_relative './block_renderers/asset_block_renderer'
|
9
|
+
require_relative './block_renderers/asset_hyperlink_renderer'
|
8
10
|
|
9
11
|
require_relative './block_renderers/heading_one_renderer'
|
10
12
|
require_relative './block_renderers/heading_two_renderer'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative './asset_hyperlink_renderer'
|
2
|
+
|
3
|
+
module RichTextRenderer
|
4
|
+
# Asset block renderer
|
5
|
+
class AssetBlockRenderer < AssetHyperlinkRenderer
|
6
|
+
# IMG HTML Tag
|
7
|
+
IMAGE_HTML = ->(url, text) { "<img src=\"#{url}\" alt=\"#{text}\" />" }
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def render_asset(asset, node = nil)
|
12
|
+
if asset.file.respond_to?(:content_type) && asset.file.content_type.include?('image')
|
13
|
+
return render!(IMAGE_HTML, asset.url, asset.title)
|
14
|
+
end
|
15
|
+
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
def render_hash(asset, node = nil)
|
20
|
+
if asset.fetch('fields', {}).fetch('file', {}).fetch('contentType', '').include?('image')
|
21
|
+
return render!(IMAGE_HTML, asset['fields']['file']['url'], asset['fields']['title'])
|
22
|
+
end
|
23
|
+
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require_relative './base_block_renderer'
|
2
|
+
|
3
|
+
module RichTextRenderer
|
4
|
+
# Asset hyperlink renderer
|
5
|
+
class AssetHyperlinkRenderer < BaseBlockRenderer
|
6
|
+
# Anchor HTML Tag
|
7
|
+
ANCHOR_HTML = ->(url, text) { "<a href=\"#{url}\">#{text}</a>" }
|
8
|
+
|
9
|
+
# Renders asset nodes
|
10
|
+
def render(node)
|
11
|
+
asset = nil
|
12
|
+
begin
|
13
|
+
asset = node['data']['target']
|
14
|
+
rescue
|
15
|
+
fail "Node target is not an asset - Node: #{node}"
|
16
|
+
end
|
17
|
+
|
18
|
+
# Check by class name instead of instance type to
|
19
|
+
# avoid dependending on the Contentful SDK.
|
20
|
+
return render_asset(asset, node) if asset.class.ancestors.map(&:to_s).any? { |name| name.include?('Asset') }
|
21
|
+
|
22
|
+
if asset.is_a?(::Hash)
|
23
|
+
unless asset.key?('fields') && asset['fields'].key?('file')
|
24
|
+
fail "Node target is not an asset - Node: #{node}"
|
25
|
+
end
|
26
|
+
|
27
|
+
return render_hash(asset, node)
|
28
|
+
end
|
29
|
+
|
30
|
+
fail "Node target is not an asset - Node: #{node}"
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
def render_asset(asset, node = nil)
|
36
|
+
render!(
|
37
|
+
ANCHOR_HTML,
|
38
|
+
asset.url,
|
39
|
+
renders_node?(node) ? node : asset.title,
|
40
|
+
renders_node?(node)
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
def render_hash(asset, node = nil)
|
45
|
+
render!(
|
46
|
+
ANCHOR_HTML,
|
47
|
+
asset['fields']['file']['url'],
|
48
|
+
renders_node?(node) ? node : asset['fields']['title'],
|
49
|
+
renders_node?(node)
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
def renders_node?(node)
|
54
|
+
!(node.nil? || node.empty?) && (
|
55
|
+
node.is_a?(::Hash) ? renders_node?(node['content']) : true
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
def render!(markup, url, text, formatted = false)
|
60
|
+
text = render_content(text) if formatted
|
61
|
+
markup[url, text]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -25,6 +25,8 @@ module RichTextRenderer
|
|
25
25
|
'ordered-list' => OrderedListRenderer,
|
26
26
|
'unordered-list' => UnorderedListRenderer,
|
27
27
|
'embedded-entry-block' => EntryBlockRenderer,
|
28
|
+
'embedded-asset-block' => AssetBlockRenderer,
|
29
|
+
'asset-hyperlink' => AssetHyperlinkRenderer,
|
28
30
|
'hr' => HrRenderer,
|
29
31
|
'text' => TextRenderer,
|
30
32
|
'bold' => BoldRenderer,
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
mock_image_asset_node = {
|
4
|
+
'data' => {
|
5
|
+
'target' => {
|
6
|
+
'fields' => {
|
7
|
+
'title' => 'Foo',
|
8
|
+
'file' => {
|
9
|
+
'contentType' => 'image/jpeg',
|
10
|
+
'url' => 'https://example.com/cat.jpg',
|
11
|
+
},
|
12
|
+
}
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
mock_image_asset_resolved_node = {
|
18
|
+
'data' => {
|
19
|
+
'target' => MockAsset.new(
|
20
|
+
{
|
21
|
+
'fields' => {
|
22
|
+
'title' => 'Foo',
|
23
|
+
'file' => {
|
24
|
+
'contentType' => 'image/jpeg',
|
25
|
+
'url' => 'https://example.com/cat.jpg',
|
26
|
+
},
|
27
|
+
}
|
28
|
+
}
|
29
|
+
)
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
mock_non_image_asset_node = {
|
34
|
+
'data' => {
|
35
|
+
'target' => {
|
36
|
+
'fields' => {
|
37
|
+
'title' => 'Foo',
|
38
|
+
'file' => {
|
39
|
+
'contentType' => 'text/csv',
|
40
|
+
'url' => 'https://example.com/cat.csv',
|
41
|
+
},
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
mock_non_image_asset_resolved_node = {
|
48
|
+
'data' => {
|
49
|
+
'target' => MockAsset.new(
|
50
|
+
{
|
51
|
+
'fields' => {
|
52
|
+
'title' => 'Foo',
|
53
|
+
'file' => {
|
54
|
+
'contentType' => 'text/csv',
|
55
|
+
'url' => 'https://example.com/cat.csv',
|
56
|
+
},
|
57
|
+
}
|
58
|
+
}
|
59
|
+
)
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
describe RichTextRenderer::AssetBlockRenderer do
|
64
|
+
subject do
|
65
|
+
described_class.new(
|
66
|
+
'text' => RichTextRenderer::TextRenderer
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#render' do
|
71
|
+
it 'renders an image asset hash as img' do
|
72
|
+
expect(subject.render(mock_image_asset_node)).to eq '<img src="https://example.com/cat.jpg" alt="Foo" />'
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'renders an image asset object as img' do
|
76
|
+
expect(subject.render(mock_image_asset_resolved_node)).to eq '<img src="https://example.com/cat.jpg" alt="Foo" />'
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'renders a non image hash as an a' do
|
80
|
+
expect(subject.render(mock_non_image_asset_node)).to eq '<a href="https://example.com/cat.csv">Foo</a>'
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'renders a non image object as an a' do
|
84
|
+
expect(subject.render(mock_non_image_asset_resolved_node)).to eq '<a href="https://example.com/cat.csv">Foo</a>'
|
85
|
+
end
|
86
|
+
|
87
|
+
describe 'errors' do
|
88
|
+
it 'raises exception when node is not a data node' do
|
89
|
+
expect { subject.render({}) }.to raise_exception 'Node target is not an asset - Node: {}'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'raises exception when target is nil' do
|
93
|
+
expect { subject.render({ 'data' => { 'target' => nil }}) }.to raise_exception 'Node target is not an asset - Node: {"data"=>{"target"=>nil}}'
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'raises exception when target does not contain asset fields' do
|
97
|
+
expect { subject.render({ 'data' => { 'target' => {} }}) }.to raise_exception 'Node target is not an asset - Node: {"data"=>{"target"=>{}}}'
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
mock_asset_hyperlink_node = {
|
4
|
+
'data' => {
|
5
|
+
'target' => MockAsset.new(
|
6
|
+
{
|
7
|
+
'fields' => {
|
8
|
+
'title' => 'Foo',
|
9
|
+
'file' => {
|
10
|
+
'contentType' => 'image/jpeg',
|
11
|
+
'url' => 'https://example.com/cat.jpg',
|
12
|
+
},
|
13
|
+
}
|
14
|
+
}
|
15
|
+
)
|
16
|
+
},
|
17
|
+
'content' => [{'value' => 'Example', 'nodeType' => 'text', 'marks' => []}],
|
18
|
+
}
|
19
|
+
|
20
|
+
describe RichTextRenderer::AssetHyperlinkRenderer do
|
21
|
+
subject do
|
22
|
+
described_class.new(
|
23
|
+
'text' => RichTextRenderer::TextRenderer
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#render' do
|
28
|
+
it 'renders an a' do
|
29
|
+
expect(subject.render(mock_asset_hyperlink_node)).to eq '<a href="https://example.com/cat.jpg">Example</a>'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,6 +9,29 @@ RSpec.configure do |config|
|
|
9
9
|
config.run_all_when_everything_filtered = true
|
10
10
|
end
|
11
11
|
|
12
|
+
class MockFile
|
13
|
+
attr_reader :content_type, :url
|
14
|
+
|
15
|
+
def initialize(json)
|
16
|
+
@url = json['url']
|
17
|
+
@content_type = json['contentType']
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class MockAsset
|
22
|
+
attr_reader :fields, :file, :title
|
23
|
+
|
24
|
+
def initialize(json)
|
25
|
+
@fields = json['fields']
|
26
|
+
@file = MockFile.new(@fields['file'])
|
27
|
+
@title = @fields['title']
|
28
|
+
end
|
29
|
+
|
30
|
+
def url
|
31
|
+
file.url
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
12
35
|
class NodeRenderer
|
13
36
|
attr_reader :mappings
|
14
37
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rich_text_renderer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Contentful GmbH (David Litvak Bruno)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -282,6 +282,8 @@ files:
|
|
282
282
|
- lib/rich_text_renderer.rb
|
283
283
|
- lib/rich_text_renderer/base_node_renderer.rb
|
284
284
|
- lib/rich_text_renderer/block_renderers.rb
|
285
|
+
- lib/rich_text_renderer/block_renderers/asset_block_renderer.rb
|
286
|
+
- lib/rich_text_renderer/block_renderers/asset_hyperlink_renderer.rb
|
285
287
|
- lib/rich_text_renderer/block_renderers/base_block_renderer.rb
|
286
288
|
- lib/rich_text_renderer/block_renderers/blockquote_renderer.rb
|
287
289
|
- lib/rich_text_renderer/block_renderers/entry_block_renderer.rb
|
@@ -310,6 +312,8 @@ files:
|
|
310
312
|
- lib/rich_text_renderer/text_renderers/underline_renderer.rb
|
311
313
|
- lib/rich_text_renderer/version.rb
|
312
314
|
- rich_text_renderer.gemspec
|
315
|
+
- spec/lib/rich_text_renderer/block_renderers/asset_block_renderer_spec.rb
|
316
|
+
- spec/lib/rich_text_renderer/block_renderers/asset_hyperlink_renderer_spec.rb
|
313
317
|
- spec/lib/rich_text_renderer/block_renderers/base_block_renderer_spec.rb
|
314
318
|
- spec/lib/rich_text_renderer/block_renderers/blockquote_renderer_spec.rb
|
315
319
|
- spec/lib/rich_text_renderer/block_renderers/entry_block_renderer_spec.rb
|
@@ -360,6 +364,8 @@ signing_key:
|
|
360
364
|
specification_version: 4
|
361
365
|
summary: Rich Text Renderer for the Contentful RichText field type
|
362
366
|
test_files:
|
367
|
+
- spec/lib/rich_text_renderer/block_renderers/asset_block_renderer_spec.rb
|
368
|
+
- spec/lib/rich_text_renderer/block_renderers/asset_hyperlink_renderer_spec.rb
|
363
369
|
- spec/lib/rich_text_renderer/block_renderers/base_block_renderer_spec.rb
|
364
370
|
- spec/lib/rich_text_renderer/block_renderers/blockquote_renderer_spec.rb
|
365
371
|
- spec/lib/rich_text_renderer/block_renderers/entry_block_renderer_spec.rb
|