Sha256: 4c977dcc6f4ccf85d587d27e2ff653a896aa6ca6f70529f38e31f91b90fb6b16

Contents?: true

Size: 1.16 KB

Versions: 8

Compression:

Stored size: 1.16 KB

Contents

require_dependency 'solidus_seo/jsonld/base'

module SolidusSeo
  module Jsonld
    class List < SolidusSeo::Jsonld::Base
      attr_accessor :data, :list_items

      def initialize(data)
        @list_items = []
        @data = data.to_a

        parse
      end

      private

      def list_type
        'ItemList'
      end

      def parse
        return {} if @data.blank?
        return @data if already_a_list?

        @data.each do |it|
          list_items << as_list_item(it)
        end

        build_list
      end

      def build_list
        @data = {
          "@context": "http://schema.org",
          "@type": list_type,
          "itemListElement": list_items
        }.with_indifferent_access
      end

      def already_a_list?
        data.is_a?(Hash) && data["@type"] == list_type
      end

      def as_list_item(item)
        {
          '@type': 'ListItem',
          position: list_items.size + 1,
          url: get_list_item_url(item)
        }
      end

      def get_list_item_url(item)
        item = item.try(:to_jsonld) || item
        item.try(:url) || item.try('[]', :url) || raise("ListItem must define an URL")
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
solidus_seo-1.1.2 lib/solidus_seo/jsonld/list.rb
solidus_seo-1.1.1 lib/solidus_seo/jsonld/list.rb
solidus_seo-1.1.0 lib/solidus_seo/jsonld/list.rb
solidus_seo-1.0.13 lib/solidus_seo/jsonld/list.rb
solidus_seo-1.0.12 lib/solidus_seo/jsonld/list.rb
solidus_seo-1.0.11 lib/solidus_seo/jsonld/list.rb
solidus_seo-1.0.10 lib/solidus_seo/jsonld/list.rb
solidus_seo-1.0.8 lib/solidus_seo/jsonld/list.rb