All Files (100.0% covered at 3.69 hits/line)
52 files in total.
429 relevant lines.
429 lines covered and
0 lines missed
- 1
require_relative './structured_text_renderer/renderer'
- 1
require_relative './structured_text_renderer/version'
- 1
module StructuredTextRenderer
# Base class for all NodeRenderers
- 1
class BaseNodeRenderer
- 1
attr_reader :mappings
- 1
def initialize(mappings = {})
- 156
@mappings = mappings
end
- 1
protected
- 1
def find_renderer(node)
- 91
renderer = mappings[node['nodeType']]
- 91
return mappings[nil].new(mappings) if renderer.nil? && mappings.key?(nil)
- 90
renderer.new(mappings) unless renderer.nil?
end
end
end
- 1
require_relative './block_renderers/hr_renderer'
- 1
require_relative './block_renderers/quote_renderer'
- 1
require_relative './block_renderers/paragraph_renderer'
- 1
require_relative './block_renderers/hyperlink_renderer'
- 1
require_relative './block_renderers/entry_block_renderer'
- 1
require_relative './block_renderers/heading_one_renderer'
- 1
require_relative './block_renderers/heading_two_renderer'
- 1
require_relative './block_renderers/heading_six_renderer'
- 1
require_relative './block_renderers/heading_five_renderer'
- 1
require_relative './block_renderers/heading_four_renderer'
- 1
require_relative './block_renderers/heading_three_renderer'
- 1
require_relative './block_renderers/list_item_renderer'
- 1
require_relative './block_renderers/ordered_list_renderer'
- 1
require_relative './block_renderers/unordered_list_renderer'
- 1
require_relative '../base_node_renderer'
- 1
module StructuredTextRenderer
# Base renderer for block type nodes
- 1
class BaseBlockRenderer < BaseNodeRenderer
# Renders block type nodes.
- 1
def render(node)
- 50
"<#{render_tag}>#{render_content(node)}</#{render_tag}>"
end
- 1
protected
- 1
def render_content(node)
node['content'].each_with_object([]) do |content_node, result|
- 53
renderer = find_renderer(content_node)
- 53
result << renderer.render(content_node)
- 52
end.join
end
- 1
def render_tag
- 4
'div'
end
end
end
- 1
require_relative '../base_node_renderer'
- 1
module StructuredTextRenderer
# Default embedded entry renderer.
# Dumps entry to string.
# This renderer should be overridden for your particular applications.
- 1
class EntryBlockRenderer < BaseNodeRenderer
# Renders embedded entry node.
- 1
def render(node)
- 4
"<div>#{node['data']}</div>"
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# H5 node renderer.
- 1
class HeadingFiveRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 4
'h5'
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# H4 node renderer.
- 1
class HeadingFourRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 4
'h4'
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# H1 node renderer.
- 1
class HeadingOneRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 8
'h1'
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# H6 node renderer.
- 1
class HeadingSixRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 4
'h6'
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# H3 node renderer.
- 1
class HeadingThreeRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 4
'h3'
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# H2 node renderer.
- 1
class HeadingTwoRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 6
'h2'
end
end
end
- 1
require_relative '../base_node_renderer'
- 1
module StructuredTextRenderer
# hr node renderer
- 1
class HrRenderer < BaseNodeRenderer
# Renders an hr node
- 1
def render(_node)
- 1
'<hr />'
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# a node renderer.
- 1
class HyperlinkRenderer < BaseBlockRenderer
# Renders hyperlink
- 1
def render(node)
- 2
"<a href=\"#{node['data']['uri']}\">#{render_content(node)}</a>"
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# li node renderer.
- 1
class ListItemRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 12
'li'
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# ol node renderer.
- 1
class OrderedListRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 4
'ol'
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# P node renderer.
- 1
class ParagraphRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 42
'p'
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# blockquote node renderer.
- 1
class QuoteRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 4
'blockqoute'
end
end
end
- 1
require_relative './base_block_renderer'
- 1
module StructuredTextRenderer
# ul node renderer.
- 1
class UnorderedListRenderer < BaseBlockRenderer
- 1
protected
- 1
def render_tag
- 4
'ul'
end
end
end
- 1
require_relative './document_renderers/document_renderer'
- 1
require_relative '../base_node_renderer'
- 1
module StructuredTextRenderer
# Document renderer.
- 1
class DocumentRenderer < BaseNodeRenderer
# Renders all nodes in the document.
- 1
def render(document)
document['content'].each_with_object([]) do |node, result|
- 36
result << find_renderer(node).render(node)
- 4
end.join("\n")
end
end
end
- 1
require_relative './base_node_renderer'
- 1
module StructuredTextRenderer
# Catch-all renderer for missing node types
- 1
class NullRenderer < BaseNodeRenderer
# Will raise an exception indicating the missing node type.
- 1
def render(node)
- 5
fail "No renderer defined for '#{node_type(node)}' nodes"
end
- 1
private
- 1
def node_type(node)
- 5
return node['nodeType'] if node.key?('nodeType')
- 3
return node['type'] if node.key?('type')
- 1
node
end
end
end
- 1
require_relative './text_renderers'
- 1
require_relative './block_renderers'
- 1
require_relative './document_renderers'
- 1
require_relative './base_node_renderer'
- 1
require_relative './null_renderer'
# StructuredTextRenderer Namespace
- 1
module StructuredTextRenderer
# Renderer for StructuredText field from Contentful
- 1
class Renderer < BaseNodeRenderer
# Default Renderers
- 1
DEFAULT_MAPPINGS = {
nil => NullRenderer,
'document' => DocumentRenderer,
'heading-1' => HeadingOneRenderer,
'heading-2' => HeadingTwoRenderer,
'heading-3' => HeadingThreeRenderer,
'heading-4' => HeadingFourRenderer,
'heading-5' => HeadingFiveRenderer,
'heading-6' => HeadingSixRenderer,
'quote' => QuoteRenderer,
'hyperlink' => HyperlinkRenderer,
'paragraph' => ParagraphRenderer,
'list-item' => ListItemRenderer,
'ordered-list' => OrderedListRenderer,
'unordered-list' => UnorderedListRenderer,
'embedded-entry-block' => EntryBlockRenderer,
'hr' => HrRenderer,
'text' => TextRenderer,
'bold' => BoldRenderer,
'code' => CodeRenderer,
'italic' => ItalicRenderer,
'underline' => UnderlineRenderer
}
- 1
def initialize(mappings = {})
- 2
@mappings = DEFAULT_MAPPINGS.merge(mappings)
end
# Returns a rendered StructuredText document
- 1
def render(document)
- 2
renderer = find_renderer(document)
- 2
renderer.render(document) unless renderer.nil?
end
end
end
- 1
require_relative './text_renderers/text_renderer'
- 1
require_relative './text_renderers/bold_renderer'
- 1
require_relative './text_renderers/code_renderer'
- 1
require_relative './text_renderers/italic_renderer'
- 1
require_relative './text_renderers/underline_renderer'
- 1
require_relative '../base_node_renderer'
- 1
module StructuredTextRenderer
# Base renderer for inline nodes.
- 1
class BaseInlineRenderer < BaseNodeRenderer
# Renders inline nodes.
- 1
def render(node)
- 29
"<#{render_tag}>#{node['value']}</#{render_tag}>"
end
- 1
protected
- 1
def render_tag
- 2
'span'
end
end
end
- 1
require_relative './base_inline_renderer'
- 1
module StructuredTextRenderer
# B node renderer.
- 1
class BoldRenderer < BaseInlineRenderer
- 1
protected
- 1
def render_tag
- 38
'b'
end
end
end
- 1
require_relative './base_inline_renderer'
- 1
module StructuredTextRenderer
# code node renderer.
- 1
class CodeRenderer < BaseInlineRenderer
- 1
protected
- 1
def render_tag
- 2
'code'
end
end
end
- 1
require_relative './base_inline_renderer'
- 1
module StructuredTextRenderer
# I node renderer.
- 1
class ItalicRenderer < BaseInlineRenderer
- 1
protected
- 1
def render_tag
- 8
'i'
end
end
end
- 1
require_relative '../base_node_renderer'
- 1
module StructuredTextRenderer
# Renderer for Text nodes.
- 1
class TextRenderer < BaseNodeRenderer
# Renders text nodes with all markings.
- 1
def render(node)
- 63
node = Marshal.load(Marshal.dump(node)) # Clone the node
- 63
node.fetch('marks', []).each do |mark|
- 29
renderer = mappings[mark['type']]
- 29
return mappings[nil].new(mappings).render(mark) if renderer.nil? && mappings.key?(nil)
- 28
node['value'] = renderer.new(mappings).render(node) unless renderer.nil?
end
- 62
node['value']
end
end
end
- 1
require_relative './base_inline_renderer'
- 1
module StructuredTextRenderer
# U node renderer.
- 1
class UnderlineRenderer < BaseInlineRenderer
- 1
protected
- 1
def render_tag
- 8
'u'
end
end
end
- 1
require 'spec_helper'
- 1
mock_data_node = {
"data" => {"target" => {"sys" => {"id" => "foo", "type" => "Link", "linkType" => "Entry"}}}
}
- 1
describe StructuredTextRenderer::EntryBlockRenderer do
- 2
subject { described_class.new }
- 1
describe '#render' do
- 1
it 'will stringify node data' do
- 1
expect(subject.render(mock_data_node)).to eq '<div>{"target"=>{"sys"=>{"id"=>"foo", "type"=>"Link", "linkType"=>"Entry"}}}</div>'
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
- 1
mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
- 1
describe StructuredTextRenderer::HeadingFiveRenderer do
- 1
subject do
- 2
described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a h5' do
- 1
expect(subject.render(mock_node)).to eq "<h5>foo</h5>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<h5><b>foo</b></h5>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
- 1
mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
- 1
describe StructuredTextRenderer::HeadingFourRenderer do
- 1
subject do
- 2
described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a h4' do
- 1
expect(subject.render(mock_node)).to eq "<h4>foo</h4>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<h4><b>foo</b></h4>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
- 1
mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
- 1
describe StructuredTextRenderer::HeadingOneRenderer do
- 1
subject do
- 2
described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a h1' do
- 1
expect(subject.render(mock_node)).to eq "<h1>foo</h1>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<h1><b>foo</b></h1>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
- 1
mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
- 1
describe StructuredTextRenderer::HeadingSixRenderer do
- 1
subject do
- 2
described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a h6' do
- 1
expect(subject.render(mock_node)).to eq "<h6>foo</h6>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<h6><b>foo</b></h6>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
- 1
mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
- 1
describe StructuredTextRenderer::HeadingThreeRenderer do
- 1
subject do
- 2
described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a h3' do
- 1
expect(subject.render(mock_node)).to eq "<h3>foo</h3>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<h3><b>foo</b></h3>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
- 1
mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
- 1
describe StructuredTextRenderer::HeadingTwoRenderer do
- 1
subject do
- 2
described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a h2' do
- 1
expect(subject.render(mock_node)).to eq "<h2>foo</h2>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<h2><b>foo</b></h2>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"nodeType" => "hr"}
- 1
describe StructuredTextRenderer::HrRenderer do
- 2
subject { described_class.new }
- 1
describe '#render' do
- 1
it 'will render an hr' do
- 1
expect(subject.render(mock_node)).to eq '<hr />'
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"data" => {"uri" => "https://foobar.com"}, "content" => [{"value" => "foo", "nodeType" => "text"}]}
- 1
mock_node_with_marks = {"data" => {"uri" => "https://foobar.com"}, "content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
- 1
describe StructuredTextRenderer::HyperlinkRenderer do
- 1
subject do
- 2
described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders an a' do
- 1
expect(subject.render(mock_node)).to eq '<a href="https://foobar.com">foo</a>'
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq '<a href="https://foobar.com"><b>foo</b></a>'
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
- 1
mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
- 1
describe StructuredTextRenderer::ListItemRenderer do
- 1
subject do
- 2
described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a li' do
- 1
expect(subject.render(mock_node)).to eq "<li>foo</li>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<li><b>foo</b></li>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [
{
"content" => [{
"content" => [{
"value" => "foo",
"nodeType" => "text",
"nodeClass" => "text"
}],
"nodeType" => "paragraph",
"nodeClass" => "block"
}],
"nodeType" => "list-item",
"nodeClass" => "block"
}]
}
- 1
mock_node_with_marks = {"content" => [
{
"content" => [{
"content" => [{
"marks" => [{"type" => "bold"}],
"value" => "foo",
"nodeType" => "text",
"nodeClass" => "text"
}],
"nodeType" => "paragraph",
"nodeClass" => "block"
}],
"nodeType" => "list-item",
"nodeClass" => "block"
}]
}
- 1
describe StructuredTextRenderer::OrderedListRenderer do
- 1
subject do
- 2
described_class.new(
'paragraph' => StructuredTextRenderer::ParagraphRenderer,
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer,
'list-item' => StructuredTextRenderer::ListItemRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a ol' do
- 1
expect(subject.render(mock_node)).to eq "<ol><li><p>foo</p></li></ol>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<ol><li><p><b>foo</b></p></li></ol>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [{"value" => "foo", "nodeType" => "text"}]}
- 1
mock_node_with_marks = {"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
- 1
mock_node_with_multiple_content_nodes = {"content" => [{"value" => "foo", "nodeType" => "text"}, {"value" => " bar", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}
- 1
describe StructuredTextRenderer::ParagraphRenderer do
- 1
subject do
- 3
described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a p' do
- 1
expect(subject.render(mock_node)).to eq "<p>foo</p>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<p><b>foo</b></p>"
end
- 1
it 'will properly render multiple content nodes' do
- 1
expect(subject.render(mock_node_with_multiple_content_nodes)).to eq "<p>foo<b> bar</b></p>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [{"nodeType" => "paragraph", "content" => [{"value" => "foo", "nodeType" => "text"}]}]}
- 1
mock_node_with_marks = {"content" => [{"nodeType" => "paragraph", "content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}]}]}
- 1
describe StructuredTextRenderer::QuoteRenderer do
- 1
subject do
- 2
described_class.new(
'paragraph' => StructuredTextRenderer::ParagraphRenderer,
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a blockqoute' do
- 1
expect(subject.render(mock_node)).to eq "<blockqoute><p>foo</p></blockqoute>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<blockqoute><p><b>foo</b></p></blockqoute>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"content" => [
{
"content" => [{
"content" => [{
"value" => "foo",
"nodeType" => "text",
"nodeClass" => "text"
}],
"nodeType" => "paragraph",
"nodeClass" => "block"
}],
"nodeType" => "list-item",
"nodeClass" => "block"
}]
}
- 1
mock_node_with_marks = {"content" => [
{
"content" => [{
"content" => [{
"marks" => [{"type" => "bold"}],
"value" => "foo",
"nodeType" => "text",
"nodeClass" => "text"
}],
"nodeType" => "paragraph",
"nodeClass" => "block"
}],
"nodeType" => "list-item",
"nodeClass" => "block"
}]
}
- 1
describe StructuredTextRenderer::UnorderedListRenderer do
- 1
subject do
- 2
described_class.new(
'paragraph' => StructuredTextRenderer::ParagraphRenderer,
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer,
'list-item' => StructuredTextRenderer::ListItemRenderer
)
end
- 1
describe '#render' do
- 1
it 'renders a ul' do
- 1
expect(subject.render(mock_node)).to eq "<ul><li><p>foo</p></li></ul>"
end
- 1
it 'will propagate marks to text renderers' do
- 1
expect(subject.render(mock_node_with_marks)).to eq "<ul><li><p><b>foo</b></p></li></ul>"
end
end
end
- 1
require 'spec_helper'
- 1
mock_document = {
"nodeType" => "document",
"content" => [
{
"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}],
"nodeType" => "heading-1",
}
],
}
- 1
mock_document_with_unknown_nodetype = {
"nodeType" => "document",
"content" => [
{
"content" => [{"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}],
"nodeType" => "unknown",
}
],
}
- 1
describe StructuredTextRenderer::DocumentRenderer do
- 1
subject do
- 2
described_class.new(
'heading-1' => StructuredTextRenderer::HeadingOneRenderer,
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer,
nil => StructuredTextRenderer::NullRenderer
)
end
- 1
describe '#render' do
- 1
it 'propagates rendering to renderers' do
- 1
expect(subject.render(mock_document)).to eq "<h1><b>foo</b></h1>"
end
- 1
it 'will raise an error unknown node types' do
- 2
expect { subject.render(mock_document_with_unknown_nodetype) }.to raise_error "No renderer defined for 'unknown' nodes"
end
end
end
- 1
require 'spec_helper'
- 1
describe StructuredTextRenderer::NullRenderer do
- 4
subject { described_class.new }
- 1
describe 'null renderer will raise errors for unknown nodes' do
- 1
it 'will look for nodeType' do
- 2
expect { subject.render({'nodeType' => 'foo'}) }.to raise_error "No renderer defined for 'foo' nodes"
end
- 1
it 'will look for type' do
- 2
expect { subject.render({'type' => 'foo'}) }.to raise_error "No renderer defined for 'foo' nodes"
end
- 1
it 'if none of the above found, will dump the node' do
- 2
expect { subject.render({'foo' => 'bar'}) }.to raise_error "No renderer defined for '{\"foo\"=>\"bar\"}' nodes"
end
end
end
- 1
require 'spec_helper'
- 1
full_document = {
"content" => [
{
"data" => {},
"content" => [
{
"marks" => [],
"value" => "Some heading",
"nodeType" => "text",
"nodeClass" => "text",
}
],
"nodeType" => "heading-1",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {
"target" => {
"sys" => {
"id" => "49rofLvvxCOiIMIi6mk8ai",
"type" => "Link",
"linkType" => "Entry",
}
}
},
"content" => [
{"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
],
"nodeType" => "embedded-entry-block",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{
"marks" => [],
"value" => "Some subheading",
"nodeType" => "text",
"nodeClass" => "text",
}
],
"nodeType" => "heading-2",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{
"marks" => [{"data" => {}, "type" => "bold", "object" => "mark"}],
"value" => "Some bold",
"nodeType" => "text",
"nodeClass" => "text",
}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{
"marks" => [{"data" => {}, "type" => "italic", "object" => "mark"}],
"value" => "Some italics",
"nodeType" => "text",
"nodeClass" => "text",
}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{
"marks" => [{"data" => {}, "type" => "underline", "object" => "mark"}],
"value" => "Some underline",
"nodeType" => "text",
"nodeClass" => "text",
}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {
"target" => {
"sys" => {
"id" => "5ZF9Q4K6iWSYIU2OUs0UaQ",
"type" => "Link",
"linkType" => "Entry",
}
}
},
"content" => [
{"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
],
"nodeType" => "embedded-entry-block",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{
"marks" => [],
"value" => "Some raw content",
"nodeType" => "text",
"nodeClass" => "text",
}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{
"marks" => [],
"value" => "An unpublished embed:",
"nodeType" => "text",
"nodeClass" => "text",
}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
{
"data" => {
"target" => {
"sys" => {
"id" => "q2hGXkd5tICym64AcgeKK",
"type" => "Link",
"linkType" => "Entry",
}
}
},
"content" => [
{"marks" => [], "value" => "", "nodeType" => "text", "nodeClass" => "text"}
],
"nodeType" => "embedded-entry-block",
"nodeClass" => "block",
},
{
"data" => {},
"content" => [
{
"marks" => [],
"value" => "Some more content",
"nodeType" => "text",
"nodeClass" => "text",
}
],
"nodeType" => "paragraph",
"nodeClass" => "block",
},
],
"nodeType" => "document",
"nodeClass" => "document",
}
- 1
describe StructuredTextRenderer::Renderer do
- 2
subject { described_class.new }
- 1
describe '#render' do
- 1
it 'by default renders html' do
- 1
expect(subject.render(full_document)).to eq [
"<h1>Some heading</h1>",
"<p></p>",
'<div>{"target"=>{"sys"=>{"id"=>"49rofLvvxCOiIMIi6mk8ai", "type"=>"Link", "linkType"=>"Entry"}}}</div>',
"<h2>Some subheading</h2>",
"<p><b>Some bold</b></p>",
"<p><i>Some italics</i></p>",
"<p><u>Some underline</u></p>",
"<p></p>",
"<p></p>",
'<div>{"target"=>{"sys"=>{"id"=>"5ZF9Q4K6iWSYIU2OUs0UaQ", "type"=>"Link", "linkType"=>"Entry"}}}</div>',
"<p></p>",
"<p>Some raw content</p>",
"<p></p>",
"<p>An unpublished embed:</p>",
"<p></p>",
'<div>{"target"=>{"sys"=>{"id"=>"q2hGXkd5tICym64AcgeKK", "type"=>"Link", "linkType"=>"Entry"}}}</div>',
"<p>Some more content</p>",
].join("\n")
end
end
- 1
describe 'with all renderers overridden' do
- 1
subject do
- 1
described_class.new(
'heading-1' => HeadingOneMarkdownRenderer,
'heading-2' => HeadingTwoMarkdownRenderer,
'paragraph' => ParagraphMarkdownRenderer,
'embedded-entry-block' => EntryBlockMarkdownRenderer,
'bold' => BoldMarkdownRenderer,
'italic' => ItalicMarkdownRenderer,
'underline' => UnderlineMarkdownRenderer
)
end
- 1
it 'renders with the overridden renderers' do
- 1
expect(subject.render(full_document)).to eq [
"# Some heading",
"",
"",
"",
"",
"```",
'{"target"=>{"sys"=>{"id"=>"49rofLvvxCOiIMIi6mk8ai", "type"=>"Link", "linkType"=>"Entry"}}}',
"```",
"",
"## Some subheading",
"",
"**Some bold**",
"",
"",
"*Some italics*",
"",
"",
"__Some underline__",
"",
"",
"",
"",
"",
"",
"",
"",
"```",
'{"target"=>{"sys"=>{"id"=>"5ZF9Q4K6iWSYIU2OUs0UaQ", "type"=>"Link", "linkType"=>"Entry"}}}',
"```",
"",
"",
"",
"",
"",
"Some raw content",
"",
"",
"",
"",
"",
"An unpublished embed:",
"",
"",
"",
"",
"",
"```",
'{"target"=>{"sys"=>{"id"=>"q2hGXkd5tICym64AcgeKK", "type"=>"Link", "linkType"=>"Entry"}}}',
"```",
"",
"",
"Some more content",
""
].join("\n")
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"value" => "foo"}
- 1
describe StructuredTextRenderer::BaseInlineRenderer do
- 2
subject { described_class.new }
- 1
it 'renders as a span' do
- 1
expect(subject.render(mock_node)).to eq "<span>foo</span>"
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"value" => "foo"}
- 1
describe StructuredTextRenderer::BoldRenderer do
- 2
subject { described_class.new }
- 1
it 'renders as a b' do
- 1
expect(subject.render(mock_node)).to eq "<b>foo</b>"
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"value" => "foo"}
- 1
describe StructuredTextRenderer::CodeRenderer do
- 2
subject { described_class.new }
- 1
it 'renders as a code' do
- 1
expect(subject.render(mock_node)).to eq "<code>foo</code>"
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"value" => "foo"}
- 1
describe StructuredTextRenderer::ItalicRenderer do
- 2
subject { described_class.new }
- 1
it 'renders as a i' do
- 1
expect(subject.render(mock_node)).to eq "<i>foo</i>"
end
end
- 1
require 'spec_helper'
- 1
mock_node_underline_only = {"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "underline"}]}
- 1
mock_node_italic_only = {"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "italic"}]}
- 1
mock_node_bold_only = {"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "bold"}]}
- 1
mock_node_multiple_marks = {
"value" => "foo",
"nodeType" => "text",
"marks" => [{"type" => "underline"}, {"type" => "italic"}, {"type" => "bold"}],
}
- 1
mock_node_unsupported_mark = {"value" => "foo", "nodeType" => "text", "marks" => [{"type" => "foobar"}]}
- 1
describe StructuredTextRenderer::TextRenderer do
- 1
subject do
- 3
described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => StructuredTextRenderer::BoldRenderer,
'italic' => StructuredTextRenderer::ItalicRenderer,
'underline' => StructuredTextRenderer::UnderlineRenderer,
nil => StructuredTextRenderer::NullRenderer
)
end
- 1
describe '#render' do
- 1
it 'can render with a single mark' do
- 1
expect(subject.render(mock_node_bold_only)).to eq "<b>foo</b>"
- 1
expect(subject.render(mock_node_italic_only)).to eq "<i>foo</i>"
- 1
expect(subject.render(mock_node_underline_only)).to eq "<u>foo</u>"
end
- 1
it 'can render multiple marks' do
- 1
expect(subject.render(mock_node_multiple_marks)).to eq "<b><i><u>foo</u></i></b>"
end
- 1
it 'raises an error for unsupported marks' do
- 2
expect { subject.render(mock_node_unsupported_mark) }.to raise_error "No renderer defined for 'foobar' nodes"
end
- 1
it 'supports custom renderers' do
- 1
subject = described_class.new(
'text' => StructuredTextRenderer::TextRenderer,
'bold' => BoldMarkdownRenderer,
nil => StructuredTextRenderer::NullRenderer
)
- 1
expect(subject.render(mock_node_bold_only)).to eq "**foo**"
end
end
end
- 1
require 'spec_helper'
- 1
mock_node = {"value" => "foo"}
- 1
describe StructuredTextRenderer::UnderlineRenderer do
- 2
subject { described_class.new }
- 1
it 'renders as a u' do
- 1
expect(subject.render(mock_node)).to eq "<u>foo</u>"
end
end