defmodule NLdoc.Conversion.Writer.Html.Head do @moduledoc false alias NLdoc.Conversion.Writer.Html.SimpleForm alias NLdoc.Spec.{Document, StringDescriptor} @spec element(Document.t()) :: Floki.html_node() @doc """ Generates head-element based on document. ## Examples iex> NLdoc.Conversion.Writer.Html.Head.element( ...> %NLdoc.Spec.Document{ ...> descriptors: [ ...> %NLdoc.Spec.StringDescriptor{ ...> uri: "http://purl.org/dc/elements/1.1/creator", ...> value: "Example Creator"}, ...> %NLdoc.Spec.StringDescriptor{ ...> uri: "http://example.com/unsupported", ...> value: "Unsupported thus will be skipped."}, ...> %NLdoc.Spec.StringDescriptor{ ...> uri: "http://purl.org/dc/elements/1.1/description", ...> value: "Example Description"}, ...> %NLdoc.Spec.StringDescriptor{ ...> uri: "http://purl.org/dc/elements/1.1/title", ...> value: "Example Title"}]}) {"head", [], [ {"style", [], [ ".lst-circle { list-style-type: circle; }", ".lst-square { list-style-type: square; }", "section.footnotes { border-top: 1px solid; }"]}, {"meta", [{"name", "author"}, {"content", "Example Creator"}], []}, {"meta", [{"name", "description"}, {"content", "Example Description"}], []}, {"title", [], ["Example Title"]}]} """ def element(%Document{descriptors: descriptors}), do: "head" |> SimpleForm.tag() |> SimpleForm.put_children(descriptors |> Enum.flat_map(&descriptor_to_meta/1)) |> SimpleForm.prepend_child( "style" |> SimpleForm.tag() |> SimpleForm.put_children([ ".lst-circle { list-style-type: circle; }", ".lst-square { list-style-type: square; }", "section.footnotes { border-top: 1px solid; }" ]) ) @spec descriptor_to_meta(StringDescriptor.t()) :: [Floki.html_node()] defp descriptor_to_meta(%StringDescriptor{ uri: "http://purl.org/dc/elements/1.1/creator", value: value }), do: [meta_tag("author", value)] defp descriptor_to_meta(%StringDescriptor{ uri: "http://purl.org/dc/elements/1.1/description", value: value }), do: [meta_tag("description", value)] defp descriptor_to_meta(%StringDescriptor{ uri: "http://purl.org/dc/elements/1.1/title", value: value }), do: [title_tag(value)] defp descriptor_to_meta(_), do: [] @spec title_tag(String.t()) :: Floki.html_tag() defp title_tag(content), do: {"title", [], [content]} @spec meta_tag(String.t(), String.t()) :: Floki.html_tag() defp meta_tag(name, content), do: {"meta", [{"name", name}, {"content", content}], []} end