From eb1c57117c15e9da45ed178d700a73d1e2e90914 Mon Sep 17 00:00:00 2001 From: Max Veytsman Date: Fri, 2 Sep 2022 05:48:50 -0400 Subject: [PATCH] Refactor & Cleanup --- lib/heroicons/generator.ex | 113 ++++++++++++++++++++++--------------- lib/heroicons/outline.ex | 2 +- priv/templates/icon_set.ex | 58 ------------------- 3 files changed, 67 insertions(+), 106 deletions(-) delete mode 100644 priv/templates/icon_set.ex diff --git a/lib/heroicons/generator.ex b/lib/heroicons/generator.ex index 2f0bf9c..bc559de 100644 --- a/lib/heroicons/generator.ex +++ b/lib/heroicons/generator.ex @@ -7,14 +7,6 @@ defmodule Heroicons.Generator do require Phoenix.Component - if function_exported?(Phoenix.Component, :assigns_to_attributes, 2) do - Module.put_attribute(__CALLER__.module, :assign_mod, Phoenix.Component) - Module.put_attribute(__CALLER__.module, :assigns_to_attrs_mod, Phoenix.Component) - else - Module.put_attribute(__CALLER__.module, :assign_mod, Phoenix.LiveView) - Module.put_attribute(__CALLER__.module, :assigns_to_attrs_mod, Phoenix.LiveView.Helpers) - end - for path <- icon_paths do generate(path) end @@ -22,12 +14,34 @@ defmodule Heroicons.Generator do @doc false def generate(path) do - name = - Path.basename(path, ".svg") - |> String.replace("-", "_") - |> String.to_atom() + name = Heroicons.Generator.name(path) - doc = """ + quote do + @doc Heroicons.Generator.doc(unquote(path)) + def unquote(name)(assigns_or_opts \\ []) + + def unquote(name)(assigns) when is_map(assigns) do + Heroicons.Generator.icon_component(unquote(path), assigns) + end + + def unquote(name)(opts) when is_list(opts) do + Heroicons.Generator.icon_function(unquote(path), opts) + end + end + end + + @doc false + def name(path) do + Path.basename(path, ".svg") + |> String.replace("-", "_") + |> String.to_atom() + end + + @doc false + def doc(path) do + name = name(path) + + """ ![](assets/#{Path.relative_to(path, :code.priv_dir(:heroicons))}) {: width=24px} ## Examples Use as a `Phoenix.Component` @@ -37,44 +51,49 @@ defmodule Heroicons.Generator do <%= #{name}() %> <%= #{name}(class: "h-6 w-6 text-gray-500") %> """ + end - quote do - @doc unquote(doc) - def unquote(name)(assigns_or_opts \\ []) + if function_exported?(Phoenix.Component, :assigns_to_attributes, 2) do + @assign_mod Phoenix.Component + @assigns_to_attrs_mod Phoenix.Component + else + @assign_mod Phoenix.LiveView + @assigns_to_attrs_mod Phoenix.LiveView.Helpers + end - def unquote(name)(var!(assigns)) when is_map(var!(assigns)) do - var!(attrs) = @assigns_to_attrs_mod.assigns_to_attributes(var!(assigns)) - var!(assigns) = @assign_mod.assign(var!(assigns), :attrs, var!(attrs)) + @doc false + def icon_component(path, assigns) when is_map(assigns) do + attrs = @assigns_to_attrs_mod.assigns_to_attributes(assigns) + assigns = @assign_mod.assign(assigns, :attrs, attrs) - EEx.compile_string(" Heroicons.IconCache.icon_body(unquote(path)), - engine: Phoenix.LiveView.HTMLEngine, - file: __ENV__.file, - line: __ENV__.line + 1, - module: __ENV__.module, - indentation: 0, - assigns: var!(assigns) - ) + EEx.compile_string(" Heroicons.IconCache.icon_body(path), + engine: Phoenix.LiveView.HTMLEngine, + file: __ENV__.file, + line: __ENV__.line + 1, + module: __ENV__.module, + indentation: 0, + assigns: assigns + ) + end + + @doc false + def icon_function(path, opts) when is_list(opts) do + attrs = + for {k, v} <- opts do + safe_k = + k |> Atom.to_string() |> String.replace("_", "-") |> Phoenix.HTML.Safe.to_iodata() + + safe_v = v |> Phoenix.HTML.Safe.to_iodata() + + {:safe, [?\s, safe_k, ?=, ?", safe_v, ?"]} end - def unquote(name)(opts) when is_list(opts) do - attrs = - for {k, v} <- opts do - safe_k = - k |> Atom.to_string() |> String.replace("_", "-") |> Phoenix.HTML.Safe.to_iodata() - - safe_v = v |> Phoenix.HTML.Safe.to_iodata() - - {:safe, [?\s, safe_k, ?=, ?", safe_v, ?"]} - end - - {:safe, - [ - " do - @moduledoc """ - <%= moduledoc %> - """ - - use Phoenix.Component - - if function_exported?(Phoenix.Component, :assigns_to_attributes, 2) do - @assign_mod Phoenix.Component - @assigns_to_attrs_mod Phoenix.Component - else - @assign_mod Phoenix.LiveView - @assigns_to_attrs_mod Phoenix.LiveView.Helpers - end - <%= for path <- icon_paths, name = icon_name(path), body = icon_body(path, svg_opts) do %> - @doc """ - ![](assets/<%= Path.relative_to(path, :code.priv_dir(:heroicons)) %>) {: width=24px} - - ## Examples - - Use as a `Phoenix.Component` - - <%= ~s(<.#{name} />) %> - - <%= ~s(<.#{name} class="h-6 w-6 text-gray-500" />) %> - - or as a function - - <%= ~s(<%= #{name}() %>) %> - - <%= ~s(<%= #{name}(class: "h-6 w-6 text-gray-500") %>) %> - """ - def <%= name %>(assigns_or_opts \\ []) - - def <%= name %>(assigns) when is_map(assigns) do - attrs = @assigns_to_attrs_mod.assigns_to_attributes(assigns) - assigns = @assign_mod.assign(assigns, :attrs, attrs) - - ~H""" - - """ - end - - def <%= name %>(opts) when is_list(opts) do - attrs = - for {k, v} <- opts do - safe_k = - k |> Atom.to_string() |> String.replace("_", "-") |> Phoenix.HTML.Safe.to_iodata() - - safe_v = v |> Phoenix.HTML.Safe.to_iodata() - - {:safe, [?\s, safe_k, ?=, ?", safe_v, ?"]} - end - - {:safe, [" body, printable_limit: :infinity %>]} - end -<% end %> -end