Packages
indieweb
0.0.20
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/indieweb/link_rel.ex
defmodule IndieWeb.LinkRel do
@moduledoc """
Provides a normalizer for link information.
"""
def find(url, value) do
with(
{:ok, %IndieWeb.Http.Response{code: code, body: body, headers: headers}}
when code < 299 and code >= 200 <- IndieWeb.Http.get(url)
) do
header_endpoints =
IndieWeb.Http.extract_link_header_values(headers) |> Map.get(value, [])
rel_endpoints =
case Microformats2.parse(body, url) do
%{rel_urls: rel_url_map} ->
Enum.filter(rel_url_map, fn {_url, %{rels: rels}} ->
value in rels
end)
|> Enum.map(fn {key, _} -> key end)
_ ->
[]
end
(header_endpoints ++ rel_endpoints)
|> Enum.map(&do_normalize_url(&1, url))
else
_ -> []
end
end
defp do_normalize_url(url, page_url) when is_binary(url) do
cond do
# Relative to the site itself.
String.starts_with?(url, "/") ->
%{host: host, scheme: scheme} = URI.parse(page_url)
URI.parse(scheme <> "://" <> host <> url) |> URI.to_string()
# Relative to the current page's path.
%{host: nil, scheme: nil} == URI.parse(url) and
!String.starts_with?(url, "/") ->
page_url <> "/" <> url
url == "" ->
page_url
# It's good enough!
true ->
url
end
end
end