Current section

Files

Jump to
indieweb lib microformats2 utility.ex
Raw

lib/microformats2/utility.ex

defmodule Microformats2.Utiltiy 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)) |> 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