rich_text_renderer 0.1.0 → 0.2.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.
- 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
|