25/lib/mse25_web/components/breadcrumbs.ex

54 lines
1.6 KiB
Elixir

defmodule Mse25Web.Breadcrumbs do
use Mse25Web, :html
def breadcrumbs_html(assigns) do
~H"""
<div class="breadcrumbs">
<span class="sr-only">Du är här:</span>
<span class="trail" itemscope itemtype="https://schema.org/BreadcrumbList">
<span itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="/" rel="home">
<span itemprop="name">madr.se</span>
</a>
<meta itemprop="position" content="1" />
</span>
<%= for {index, {parent_slug, parent_name}} <- breadcrumbs(@trail) do %>
<span class="sr-only">&gt;</span>
<span itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href={parent_slug}>
<span itemprop="name"><%= parent_name %></span>
</a>
<meta itemprop="position" content={index} />
</span>
<% end %>
</span>
</div>
"""
end
defp breadcrumbs(nodes) do
breadcrumbs([], "", 1, nodes)
end
defp breadcrumbs(seen, _path, _index, []) do
Enum.reverse(seen)
end
defp breadcrumbs(seen, path, index, [{slug, name} | nodes]) do
breadcrumbs(
[{index + 1, {path <> "/" <> to_string(slug), name}} | seen],
path <> "/" <> to_string(slug),
index + 1,
nodes
)
end
defp breadcrumbs(seen, path, index, [{slug, name, custom_prefix} | nodes]) do
breadcrumbs(
[{index + 1, {custom_prefix <> "/" <> to_string(slug), name}} | seen],
path <> "/" <> to_string(slug),
index + 1,
nodes
)
end
end