chiya/lib/chiya_web/outline_renderer.ex
2023-09-09 23:46:37 +02:00

38 lines
892 B
Elixir

defmodule ChiyaWeb.OutlineRenderer do
import Phoenix.HTML, only: [safe_to_string: 1]
import Phoenix.HTML.Tag, only: [content_tag: 3, content_tag: 2]
def render_outline(content) do
children =
content
|> ChiyaWeb.Outline.get()
|> Enum.map(&do_render_outline/1)
root = content_tag(:ul, do: children)
safe_to_string(root)
end
def has_outline?(content) do
outline_empty =
content
|> ChiyaWeb.Outline.get()
|> Enum.empty?()
!outline_empty
end
def do_render_outline(%{text: text, children: children, level: _level}) do
slug = Slugger.slugify_downcase(text)
list_item = content_tag(:li, do: content_tag(:a, text, href: "##{slug}"))
if Enum.empty?(children) do
[list_item]
else
[
list_item,
content_tag(:ul, do: Enum.map(children, &do_render_outline/1))
]
end
end
end