Current section

Files

Jump to
nakai src nakai@internal@render.erl
Raw

src/nakai@internal@render.erl

-module(nakai@internal@render).
-compile([no_auto_import, nowarn_unused_vars]).
-export([render_doctype/1, render_attr/1, render_attrs/1, render_node/1, render_children/1, render_root/1]).
-spec render_doctype(binary()) -> gleam@string_builder:string_builder().
render_doctype(Doctype) ->
gleam@string_builder:from_strings(
[<<"<!DOCTYPE "/utf8>>, Doctype, <<">\n"/utf8>>]
).
-spec render_attr(nakai@html@attrs:attr(any())) -> gleam@string_builder:string_builder().
render_attr(Attr) ->
case Attr of
{attr, Name, Value} ->
Sanitized_value = gleam@string:replace(
Value,
<<"\""/utf8>>,
<<"\\\""/utf8>>
),
gleam@string_builder:from_strings(
[<<" "/utf8>>,
Name,
<<"=\""/utf8>>,
Sanitized_value,
<<"\""/utf8>>]
);
{event, _, _} ->
gleam@string_builder:new()
end.
-spec render_attrs(list(nakai@html@attrs:attr(any()))) -> gleam@string_builder:string_builder().
render_attrs(Attrs) ->
_pipe = Attrs,
_pipe@1 = gleam@list:map(_pipe, fun render_attr/1),
gleam@list:fold(
_pipe@1,
gleam@string_builder:new(),
fun gleam@string_builder:append_builder/2
).
-spec render_node(nakai@html:node_(any())) -> nakai@internal@document:document().
render_node(Tree) ->
case Tree of
{doctype, Doctype} ->
nakai@internal@document:from_doctype(Doctype);
{html, Attrs, Children} ->
_pipe = render_children(Children),
nakai@internal@document:append_html_attrs(
_pipe,
render_attrs(Attrs)
);
{head, Children@1} ->
_pipe@1 = render_children(Children@1),
nakai@internal@document:into_head(_pipe@1);
{fragment, Children@2} ->
render_children(Children@2);
{comment, Content} ->
_pipe@2 = gleam@string_builder:from_strings(
[<<"<!-- "/utf8>>, Content, <<" -->"/utf8>>]
),
nakai@internal@document:from_body(_pipe@2);
{element, Tag, Attrs@1, Children@3} ->
Child_document = render_children(Children@3),
_pipe@3 = gleam@string_builder:concat(
[gleam@string_builder:from_strings([<<"<"/utf8>>, Tag]),
render_attrs(Attrs@1),
gleam@string_builder:from_string(<<">"/utf8>>),
erlang:element(5, Child_document),
gleam@string_builder:from_strings(
[<<"</"/utf8>>, Tag, <<">"/utf8>>]
)]
),
nakai@internal@document:replace_body(Child_document, _pipe@3);
{leaf_element, Tag@1, Attrs@2} ->
_pipe@4 = gleam@string_builder:concat(
[gleam@string_builder:from_strings([<<"<"/utf8>>, Tag@1]),
render_attrs(Attrs@2),
gleam@string_builder:from_string(<<" />"/utf8>>)]
),
nakai@internal@document:from_body(_pipe@4);
{text, Content@1} ->
_pipe@5 = gleam@string_builder:from_string(Content@1),
_pipe@6 = gleam@string_builder:replace(
_pipe@5,
<<"&"/utf8>>,
<<"&amp;"/utf8>>
),
_pipe@7 = gleam@string_builder:replace(
_pipe@6,
<<"<"/utf8>>,
<<"&lt;"/utf8>>
),
_pipe@8 = gleam@string_builder:replace(
_pipe@7,
<<">"/utf8>>,
<<"&gt;"/utf8>>
),
nakai@internal@document:from_body(_pipe@8);
{unsafe_text, Content@2} ->
_pipe@9 = gleam@string_builder:from_string(Content@2),
nakai@internal@document:from_body(_pipe@9);
nothing ->
nakai@internal@document:new()
end.
-spec render_children(list(nakai@html:node_(any()))) -> nakai@internal@document:document().
render_children(Children) ->
_pipe = Children,
_pipe@1 = gleam@list:map(_pipe, fun render_node/1),
gleam@list:fold(
_pipe@1,
nakai@internal@document:new(),
fun nakai@internal@document:merge/2
).
-spec render_root(nakai@html:node_(any())) -> gleam@string_builder:string_builder().
render_root(Tree) ->
Result = render_node(Tree),
gleam@string_builder:concat(
[render_doctype(
begin
_pipe = erlang:element(2, Result),
gleam@option:unwrap(_pipe, <<"html"/utf8>>)
end
),
gleam@string_builder:from_string(<<"<html"/utf8>>),
erlang:element(3, Result),
gleam@string_builder:from_string(
<<">\n<head>"/utf8,
"
<meta charset=\"utf-8\" />
<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />
"/utf8>>
),
erlang:element(4, Result),
gleam@string_builder:from_string(<<"</head>\n<body>"/utf8>>),
erlang:element(5, Result),
gleam@string_builder:from_string(<<"</body>\n</html>\n"/utf8>>)]
).