Current section

Files

Jump to
nldoc_conversion_writer_html lib nldoc conversion writer html head.ex
Raw

lib/nldoc/conversion/writer/html/head.ex

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