55 lines
1.6 KiB
Elixir
55 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">></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
|