Sha256: ffa1266dd0d06dd8e5136262e57b36c4e42eaeccd64c9a2a7e6231a29938d50b

Contents?: true

Size: 2 KB

Versions: 1

Compression:

Stored size: 2 KB

Contents

require_relative '../commands/context'

module ContentfulMiddleman
  module Mapper
    class Base
      attr_reader :entries

      def initialize(entries)
        @entries = entries
        @children = {}
      end

      def map(context, entry)
        @children = {
          :queue => [{ :context => context, :entry => entry }],
          :discovered => [entry.id] }
        while !@children[:queue].first.nil? do
          nxt = @children[:queue].pop
          context = nxt[:context]
          entry = nxt[:entry]
          map_entry_full(entry, context)
        end
      end

      private

      def map_field(context, field_name, field_value)
        value_mapping = map_value(field_value)
        context.set(field_name, value_mapping)
      end

      def map_value(value)
        case value
        when Contentful::Asset
          map_asset(value)
        when Contentful::Location
          map_location(value)
        when Contentful::Link
          map_link(value)
        when Contentful::DynamicEntry
          map_entry(value)
        when Array
          map_array(value)
        else
          value
        end
      end

      def map_asset(asset)
        context       = Context.new
        context.title = asset.title
        context.url   = asset.file.url

        context
      end

      def map_entry_full(entry, context)
        context.id = entry.id
        entry.fields.each {|k, v| map_field context, k, v}
      end

      def map_entry(entry)
        context = Context.new
        context.id = entry.id
        if !@children[:discovered].include?(entry.id)
          @children[:queue].push({ :context => context, :entry => entry})
          @children[:discovered].push(entry.id)
        end
        context
      end

      def map_location(location)
        location.properties
      end

      def map_link(link)
        context    = Context.new
        context.id = link.id

        context
      end

      def map_array(array)
        array.map {|element| map_value(element)}
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
contentful_middleman-1.1.1 lib/contentful_middleman/mappers/base.rb