Current section

Files

Jump to
microformats2 lib implied url.ex
Raw

lib/implied/url.ex

defmodule Microformats2.Items.Implied.Url do
@moduledoc false
import Microformats2.Helpers
def implied_value(root) do
cond do
href = href_if_is_a_area_and_has_href(root) -> href
href = href_if_direct_child_only_type(root, "a") -> href
href = href_if_direct_child_only_type(root, "area") -> href
href = intermediate_only_child(root, "a") -> href
href = intermediate_only_child(root, "area") -> href
true -> nil
end
end
defp href_if_is_a_area_and_has_href(node) do
{elem, _, _} = node
href = Floki.attribute([node], "href") |> List.first()
if elem in ["a", "area"] && !is_nil(href),
do: href,
else: nil
end
# .h-x>a[href]:only-of-type:not[.h-*]
# .h-x>area[href]:only-of-type:not[.h-*]
defp href_if_direct_child_only_type(node, elem) do
with [elem_node] <- Floki.find([node], ">#{elem}[href]"),
false <- is_a?(elem_node, "h") do
Floki.attribute([elem_node], "href") |> List.first()
else
_ -> nil
end
end
# .h-x>:only-child:not[.h-*]>a[href]:only-of-type:not[.h-*]
# .h-x>:only-child:not[.h-*]>area[href]:only-of-type:not[.h-*]
defp intermediate_only_child(node, elem) do
case node do
{_, _, [only_child]} -> href_if_direct_child_only_type(only_child, elem)
_ -> nil
end
end
end