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 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