prismicio-community / ruby-kit

Community maintained development kit for Prismic and the Ruby language
https://prismic.io
Apache License 2.0
45 stars 35 forks source link

Label Spans within paragraphs are Failing #47

Closed smd686s closed 10 years ago

smd686s commented 10 years ago

Spans with the new type of 'label' are failing. The issue seems to be in


module Prismic
  module JsonParser
    class << self

      def structured_text_parser(json)
        def self.span_parser(span)
          case span['type']
          when 'em'
            Prismic::Fragments::StructuredText::Span::Em.new(span['start'], span['end'], span['label'])
          when 'strong'
            Prismic::Fragments::StructuredText::Span::Strong.new(span['start'], span['end'], span['label'])
          when 'hyperlink'
            Prismic::Fragments::StructuredText::Span::Hyperlink.new(span['start'], span['end'], link_parser(span['data']), span['label'])
          else
            puts "Unknown span_parser type: #{span['type']}"
          end
        end

I've monkeypatched the ruby kit to create a generic tag:


module Prismic
  module JsonParser
    class << self

      def structured_text_parser(json)
        def self.span_parser(span)
          case span['type']
          when 'em'
            Prismic::Fragments::StructuredText::Span::Em.new(span['start'], span['end'], span['label'])
          when 'strong'
            Prismic::Fragments::StructuredText::Span::Strong.new(span['start'], span['end'], span['label'])
          when 'hyperlink'
            Prismic::Fragments::StructuredText::Span::Hyperlink.new(span['start'], span['end'], link_parser(span['data']), span['label'])
          when 'label'
            Prismic::Fragments::StructuredText::Span::SpanTag.new(span['start'], span['end'], span['data']['label'])
          else
            puts "Unknown span_parser type: #{span['type']}"
          end
        end

        blocks = json['value'].map do |block|
          case block['type']
          when 'paragraph'
            spans = block['spans'].map {|span| span_parser(span) }
            Prismic::Fragments::StructuredText::Block::Paragraph.new(block['text'], spans, block['label'])
          when 'preformatted'
            spans = block['spans'].map {|span| span_parser(span) }
            Prismic::Fragments::StructuredText::Block::Preformatted.new(block['text'], spans, block['label'])
          when /^heading(\d+)$/
            heading = $1
            spans = block['spans'].map {|span| span_parser(span) }
            Prismic::Fragments::StructuredText::Block::Heading.new(
              block['text'],
              spans,
              heading.to_i,
              block['label']
            )
          when 'o-list-item'
            spans = block['spans'].map {|span| span_parser(span) }
            Prismic::Fragments::StructuredText::Block::ListItem.new(
              block['text'],
              spans,
              true,  # ordered
              block['label']
            )
          when 'list-item'
            spans = block['spans'].map {|span| span_parser(span) }
            Prismic::Fragments::StructuredText::Block::ListItem.new(
              block['text'],
              spans,
              false,  # unordered
              block['label']
            )
          when 'image'
            view = Prismic::Fragments::Image::View.new(
              block['url'],
              block['dimensions']['width'],
              block['dimensions']['height'],
              block['alt'],
              block['copyright'],
              block['linkTo'] ? link_parser(block['linkTo']) : nil
            )
            Prismic::Fragments::StructuredText::Block::Image.new(view, block['label'])
          when 'embed'
            boembed = block['oembed']
            Prismic::Fragments::Embed.new(
              boembed['type'],
              boembed['provider_name'],
              boembed['provider_url'],
              boembed['html'],
              boembed
            )
          else
            puts "Unknown bloc type: #{block['type']}"
          end
        end
        Prismic::Fragments::StructuredText.new(blocks)
      end

    end
  end
end

module Prismic
  module Fragments
    class StructuredText < Fragment

      class Span

        class SpanTag < Span
          def serialize(text, link_resolver = nil)
            "<span#{class_code}>#{text}</span>"
          end
        end

      end

    end
  end
end

Thoughts? I'd like to see if the tag approach is worth submitting a pull request.

Best,

Sean

erwan commented 10 years ago

Hi, this is fixed in 1.0.1 (in RubyGems).

smd686s commented 10 years ago

Thanks!