Packages
indieweb
0.0.34
0.0.66
0.0.65
0.0.64
0.0.63
0.0.62
0.0.61
0.0.60
0.0.59
0.0.58
0.0.56
0.0.55
0.0.54
0.0.53
0.0.51
0.0.50
0.0.49
0.0.48
0.0.47
0.0.46
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.29
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.3
0.0.2
0.0.1
Collection of common IndieWeb utilites like authorship resolution, Webmention, post type discovery and IndieAuth.
Current section
Files
Jump to
Current section
Files
lib/microformats2/utility.ex
defmodule Microformats2.Utility do
@moduledoc false
def get_format(mf2, format) do
case Enum.fetch(extract(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 fetch(uri) do
with(
{:ok, %IndieWeb.Http.Response{body: body, code: code}}
when code >= 200 and code < 300 <- IndieWeb.Http.get(uri),
mf2 when is_map(mf2) <- Microformats2.parse(body, uri)
) do
{:ok, mf2}
else
_ -> {:error, :remote_mf2_fetch_failed}
end
end
def extract(mf2) when is_map(mf2) do
mf2 |> Map.take(~w(items children)a) |> Map.values() |> List.flatten()
end
def extract(_), do: []
def extract_deep(mf2) when is_map(mf2) do
items = extract(mf2) ++ do_extract_from_properties(mf2)
children = items |> Enum.map(&extract_deep/1) |> List.flatten()
items ++ children
end
def extract_deep(_), do: []
def extract_deep(mf2, type) do
mf2 |> extract_deep |> Enum.filter(&matches_type?(&1, type))
end
def extract(mf2, type) do
mf2 |> extract |> Enum.filter(&matches_type?(&1, type))
end
def matches_type?(mf2, type) when is_map(mf2) do
Enum.member?(Map.get(mf2, :type, []), "h-#{type}")
end
def matches_type?(_, _), do: false
defp do_extract_from_properties(%{properties: properties}) do
Enum.map(properties, fn {_, items} ->
Enum.map(items, fn
item when is_map(item) ->
item
_ ->
nil
end)
end)
|> List.flatten()
end
defp do_extract_from_properties(_), do: []
end