defmodule Microformats2.Utility do @moduledoc false def get_format(mf2, format) do case Enum.fetch(extract_all(mf2, format), 0) do {:ok, mf2} -> mf2 _ -> nil end end def get_value(mf2, property, default_value \\ []) def get_value(%{properties: properties}, property, default_value) do Map.get(properties, property, default_value) end def get_value(_, _, _), do: {:error, :no_properties} def extract_all(mf2, format) do items = Map.take(mf2, ~w(items children)a) |> Map.values() |> List.flatten() Stream.flat_map(items, fn item -> do_parse_item(item, format) end) end defp do_parse_item(item, format) do types = Map.get(item, :type, []) if Enum.member?(types, "h-#{format}") do [item] else Stream.concat( do_extract_from_properties(item, format), extract_all(item, format) ) end end defp do_extract_from_properties(%{properties: properties}, format) do Stream.flat_map(properties, fn {_, items} -> Stream.flat_map(items, fn item when is_map(item) -> do_parse_item(item, format) _ -> [] end) end) end defp do_extract_from_properties(_, _), do: [] end