Current section
Files
Jump to
Current section
Files
src/nakai@render.erl
-module(nakai@render).
-compile(no_auto_import).
-export([render/2, render_attr/1, render_attrs/1, render_children/1, render_doctype/1, render_node/1]).
-spec render(nakai@node:doctype(), nakai@node:node_()) -> binary().
render(Doctype, Root) ->
gleam@string_builder:to_string(
gleam@string_builder:concat(
[render_doctype(Doctype),
render_node(Root),
gleam@string_builder:from_string(<<"\n"/utf8>>)]
)
).
-spec render_attr(nakai@html@attrs:attr()) -> gleam@string_builder:string_builder().
render_attr(Attr) ->
gleam@string_builder:from_strings(
[<<" "/utf8>>,
erlang:element(2, Attr),
<<"=\""/utf8>>,
erlang:element(3, Attr),
<<"\""/utf8>>]
).
-spec render_attrs(list(nakai@html@attrs:attr())) -> gleam@string_builder:string_builder().
render_attrs(Attrs) ->
_pipe = Attrs,
_pipe@1 = gleam@list:map(_pipe, fun render_attr/1),
gleam@string_builder:concat(_pipe@1).
-spec render_children(list(nakai@node:node_())) -> gleam@string_builder:string_builder().
render_children(Children) ->
_pipe = Children,
_pipe@1 = gleam@list:map(_pipe, fun render_node/1),
gleam@string_builder:concat(_pipe@1).
-spec render_doctype(nakai@node:doctype()) -> gleam@string_builder:string_builder().
render_doctype(Doctype) ->
gleam@string_builder:from_strings(
[<<"<!DOCTYPE "/utf8>>, erlang:element(2, Doctype), <<">"/utf8>>]
).
-spec render_node(nakai@node:node_()) -> gleam@string_builder:string_builder().
render_node(Tree) ->
case Tree of
{comment, Content} ->
gleam@string_builder:from_strings(
[<<"<!-- "/utf8>>, Content, <<" -->"/utf8>>]
);
{component, Factory} ->
render_node(Factory());
{element, Tag, Attrs, Children} ->
gleam@string_builder:concat(
[gleam@string_builder:from_strings([<<"<"/utf8>>, Tag]),
render_attrs(Attrs),
gleam@string_builder:from_string(<<">"/utf8>>),
render_children(Children),
gleam@string_builder:from_strings(
[<<"</"/utf8>>, Tag, <<">"/utf8>>]
)]
);
{fragment, Children@1} ->
render_children(Children@1);
{leaf_element, Tag@1, Attrs@1} ->
gleam@string_builder:concat(
[gleam@string_builder:from_strings([<<"<"/utf8>>, Tag@1]),
render_attrs(Attrs@1),
gleam@string_builder:from_string(<<" />"/utf8>>)]
);
none ->
gleam@string_builder:new();
{text, Content@1} ->
gleam@string_builder:from_string(Content@1)
end.