# Portions of this file are derived from Pleroma: # Pleroma: A lightweight social networking server # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Mobilizon.Service.RichMedia.Parsers.TwitterCard do @moduledoc """ Module to parse Twitter tags data in HTML pages """ alias Mobilizon.Service.RichMedia.Parsers.MetaTagsParser require Logger @twitter_card_properties [ :card, :site, :creator, :title, :description, :image, :"image:alt" ] @spec parse(String.t(), map()) :: {:ok, map()} | {:error, String.t()} def parse(html, data) do Logger.debug("Using Twitter card parser") with {:ok, data} <- parse_name_attrs(data, html), {:ok, data} <- parse_property_attrs(data, html) do data = transform_tags(data) Logger.debug("Data found with Twitter card parser") Logger.debug(inspect(data)) data end end @spec parse_name_attrs(map(), String.t()) :: {:ok, map()} | {:error, String.t()} defp parse_name_attrs(data, html) do MetaTagsParser.parse( html, data, "twitter", "No twitter card metadata found", :name, :content, [:"twitter:card"] ) end @spec parse_property_attrs(map(), String.t()) :: {:ok, map()} | {:error, String.t()} defp parse_property_attrs(data, html) do MetaTagsParser.parse( html, data, "twitter", "No twitter card metadata found", :property, :content, @twitter_card_properties ) end @spec transform_tags(map()) :: map() defp transform_tags(data) do data |> Enum.reject(fn {_, v} -> is_nil(v) end) |> Enum.map(fn {k, v} -> {k, String.trim(v)} end) |> Map.new() |> Map.update(:image_remote_url, Map.get(data, :image), & &1) end end