lib/datocms/graphql_client/meta_tag_helpers.ex

defmodule DatoCMS.GraphQLClient.MetaTagHelpers do
  def dato_meta_tags(%{_seoMetaTags: tags} = _item) do
    stringify_tags(tags)
  end

  def dato_favicon_meta_tags(locale) do
    site = DatoCMS.GraphQLClient.fetch_localized!(
      :_site,
      locale,
      dato_favicon_meta_tags_query()
    )
    tags = site.icon ++ site.apple ++ site.ms
    stringify_tags(tags)
  end

  defp dato_favicon_meta_tags_query do
    """
    {
      icon: faviconMetaTags(variants: icon) {
        attributes
        content
        tag
      }
      apple: faviconMetaTags(variants: appleTouchIcon) {
        attributes
        content
        tag
      }
      ms: faviconMetaTags(variants: msApplication) {
        attributes
        content
        tag
      }
    }
    """
  end

  def seo_meta_tags_fragment do
    """
    _seoMetaTags {
      attributes
      content
      tag
    }
    """
  end

  defp stringify_tags(tags) do
    Enum.map(tags, fn (tag) ->
      attributes = if tag[:attributes] do
          tag[:attributes]
          |> Enum.map(fn ({k, v}) -> "#{k}=\"#{v}\"" end)
          |> Enum.join(" ")
        else
          ""
        end
      if tag[:content] do
        "<#{tag.tag} #{attributes}>#{tag.content}</#{tag.tag}>"
      else
        "<#{tag.tag} #{attributes}/>"
      end
    end)
    |> Enum.join("\n")
  end
end