From d46061592e117a64357c666c6c487efeba1bd9f8 Mon Sep 17 00:00:00 2001 From: Clark Kampfe Date: Tue, 27 Jun 2023 18:23:45 -0500 Subject: [PATCH 1/3] precompute tag to_string variants --- lib/sneeze/internals.ex | 40 +++++++++++++++++++++++++++++++++++----- lib/sneeze/macros.ex | 17 +++++++++++++++++ 2 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 lib/sneeze/macros.ex diff --git a/lib/sneeze/internals.ex b/lib/sneeze/internals.ex index cfb8e5f..9ddd527 100644 --- a/lib/sneeze/internals.ex +++ b/lib/sneeze/internals.ex @@ -1,4 +1,33 @@ defmodule Sneeze.Internal do + require Sneeze.Macros + + Sneeze.Macros.define_tags_to_strings([ + :a, + :span, + :li, + :div, + :td, + :br, + :ul, + :tr, + :link, + :p, + :title, + :script, + :style, + :button, + :label, + :code, + :h1, + :h2, + :h3, + :h4, + :h5, + :meta, + :body, + :head + ]) + def void_tags() do [ :area, @@ -29,25 +58,25 @@ defmodule Sneeze.Internal do end def render_opening_tag(tag_name) do - ["<", to_string(tag_name), ">"] + ["<", tag_to_string(tag_name), ">"] end def render_opening_tag(tag_name, attribs) do attrib_iolist = attributes_to_iolist(attribs) - ["<", to_string(tag_name), attrib_iolist, ">"] + ["<", tag_to_string(tag_name), attrib_iolist, ">"] end def render_closing_tag(tag_name) do - [""] + [""] end def render_void_tag(tag_name) do - ["<", to_string(tag_name), " />"] + ["<", tag_to_string(tag_name), " />"] end def render_void_tag(tag_name, attribs) do attrib_iolist = attributes_to_iolist(attribs) - ["<", to_string(tag_name), attrib_iolist, " ", "/>"] + ["<", tag_to_string(tag_name), attrib_iolist, " ", "/>"] end def render_tag(tag) do @@ -57,4 +86,5 @@ defmodule Sneeze.Internal do def render_tag(tag, attributes) do [render_opening_tag(tag, attributes), render_closing_tag(tag)] end + end diff --git a/lib/sneeze/macros.ex b/lib/sneeze/macros.ex new file mode 100644 index 0000000..35357b1 --- /dev/null +++ b/lib/sneeze/macros.ex @@ -0,0 +1,17 @@ +defmodule Sneeze.Macros do + @moduledoc false + + defmacro define_tags_to_strings(tags) do + quote bind_quoted: [tags: tags] do + Enum.each(tags, fn tagname -> + as_str = to_string(tagname) + + defp tag_to_string(unquote(tagname)) do + unquote(as_str) + end + end) + + defp tag_to_string(unknown_tag), do: to_string(unknown_tag) + end + end +end From 0d8a7fbffe9567feba98680986fbe6607c245bfe Mon Sep 17 00:00:00 2001 From: Clark Kampfe Date: Wed, 28 Jun 2023 17:18:30 -0500 Subject: [PATCH 2/3] fix formatting --- lib/sneeze/internals.ex | 1 - lib/sneeze/macros.ex | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/sneeze/internals.ex b/lib/sneeze/internals.ex index 9ddd527..575fd01 100644 --- a/lib/sneeze/internals.ex +++ b/lib/sneeze/internals.ex @@ -86,5 +86,4 @@ defmodule Sneeze.Internal do def render_tag(tag, attributes) do [render_opening_tag(tag, attributes), render_closing_tag(tag)] end - end diff --git a/lib/sneeze/macros.ex b/lib/sneeze/macros.ex index 35357b1..1048e5f 100644 --- a/lib/sneeze/macros.ex +++ b/lib/sneeze/macros.ex @@ -4,11 +4,11 @@ defmodule Sneeze.Macros do defmacro define_tags_to_strings(tags) do quote bind_quoted: [tags: tags] do Enum.each(tags, fn tagname -> - as_str = to_string(tagname) + as_str = to_string(tagname) - defp tag_to_string(unquote(tagname)) do - unquote(as_str) - end + defp tag_to_string(unquote(tagname)) do + unquote(as_str) + end end) defp tag_to_string(unknown_tag), do: to_string(unknown_tag) From 54271450f7d1b028925dfc0e12ca3b8057a899d5 Mon Sep 17 00:00:00 2001 From: Clark Kampfe Date: Wed, 28 Jun 2023 17:29:47 -0500 Subject: [PATCH 3/3] tweak tag_to_string fn generation set --- lib/sneeze/internals.ex | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/lib/sneeze/internals.ex b/lib/sneeze/internals.ex index 575fd01..1098d91 100644 --- a/lib/sneeze/internals.ex +++ b/lib/sneeze/internals.ex @@ -3,29 +3,22 @@ defmodule Sneeze.Internal do Sneeze.Macros.define_tags_to_strings([ :a, + :div, :span, :li, - :div, - :td, :br, - :ul, - :tr, - :link, :p, - :title, - :script, - :style, - :button, - :label, - :code, - :h1, - :h2, - :h3, - :h4, - :h5, + :link, :meta, - :body, - :head + :td, + :tr, + :ul, + :h3, + :h2, + :img, + :code, + :svg, + :button ]) def void_tags() do