lib/wcc/contentful/rich_text/node.rb in wcc-contentful-1.4.0 vs lib/wcc/contentful/rich_text/node.rb in wcc-contentful-1.5.0.rc1
- old
+ new
@@ -26,35 +26,59 @@
tuple = [key.to_s, self.[](key)]
yield tuple if block_given?
tuple
end
end
+
+ # Set the renderer to use when rendering this node to HTML.
+ # By default a node does not have a renderer, and #to_html will raise an ArgumentError.
+ # However if a WCC::Contentful::RichText::Document node is created by the WCC::Contentful::ModelBuilder,
+ # it will inject the renderer configured in WCC::Contentful::Services#rich_text_renderer into the node.
+ attr_accessor :renderer
+
+ # Render the node to HTML using the configured renderer.
+ # See WCC::Contentful::RichTextRenderer for more information.
+ def to_html
+ unless renderer
+ raise ArgumentError,
+ 'No renderer provided during tokenization. ' \
+ 'Please configure the rich_text_renderer in your WCC::Contentful configuration.'
+ end
+
+ renderer.call(self)
+ end
end
class_methods do
# Default value for node_type covers most cases
def node_type
name.demodulize.underscore.dasherize
end
- def tokenize(raw, context = nil)
- raise ArgumentError, "Expected '#{node_type}', got '#{raw['nodeType']}'" unless raw['nodeType'] == node_type
+ def matches?(node_type)
+ self.node_type == node_type
+ end
+ def tokenize(raw, renderer: nil)
+ raise ArgumentError, "Expected '#{node_type}', got '#{raw['nodeType']}'" unless matches?(raw['nodeType'])
+
values =
members.map do |symbol|
val = raw[symbol.to_s]
case symbol
when :content
- WCC::Contentful::RichText.tokenize(val, context)
- # when :data
- # TODO: resolve links...
+ WCC::Contentful::RichText.tokenize(val, renderer: renderer)
else
val
end
end
- new(*values)
+ new(*values).tap do |node|
+ next unless renderer
+
+ node.renderer = renderer
+ end
end
end
end
end