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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a005b745298c66461e9f96c7066f47b0ae964e2102932242a09f0dfc3387e500
4
- data.tar.gz: e1533944ead3ffa58ed274598721d99922dee574e3ddaaa54b4103cfd2f60901
3
+ metadata.gz: 1af73f4a930b3c68dcf396b334a9318b1fb83ca3ba817582534f4c72b112e210
4
+ data.tar.gz: 8c92ee30ffe286b8c89532828eff36f4b7b2b123165691c95af3a49f92b8335f
5
5
  SHA512:
6
- metadata.gz: cc2063f0e0aadfab6aca31401f4c5912273c75aeb06d2a421f3e4b33ed143a49b7451af9ba3f515f683e507e93d6c50ba577590285252aa2551d8fb15b11618f
7
- data.tar.gz: 8d3380163cb785d1ac0ac6141f599edebd629c32c5cfb274536b50cbbda988cfc2146f7dfd96bc6da3a8a6dc5861e1817b8057e5ac8d4042ba671ee78851a575
6
+ metadata.gz: 5c425f17916e5485f1074c75e5f55e9459e92dbd51d7608a42fe2253795baa2df5be419f59dba5684fa7ca501ff990621cddedb1c32361468e39783963298a08
7
+ data.tar.gz: c84e55adf160d7370ddf868fe31ae708b7634241e3002814cf565d3fa99b0d0c365658941f2ff377b01342a2d9c2f032228ec83ff65849b35fcfbd6b86c78b3e
data/.rubocop.yml CHANGED
@@ -24,4 +24,4 @@ Style/MutableConstant:
24
24
  Enabled: false
25
25
 
26
26
  Style/SignalException:
27
- EnforcedStyle: 'semantic'
27
+ EnforcedStyle: 'only_fail'
data/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.2.0
6
+
7
+ ### Added
8
+ * Add Asset support
9
+
5
10
  ## v0.1.0 (`rich_text_renderer`)
6
11
 
7
12
  As `RichText` moves from `alpha` to `beta`, we're treating this as a feature release.
@@ -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,
@@ -1,4 +1,4 @@
1
1
  module RichTextRenderer
2
2
  # Gem Version
3
- VERSION = '0.1.0'.freeze
3
+ VERSION = '0.2.0'.freeze
4
4
  end
@@ -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.1.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-15 00:00:00.000000000 Z
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