defmodule SvgSprite do @external_resource readme = "README.md" @moduledoc readme |> File.read!() |> String.split("") |> Enum.fetch!(1) import Phoenix.HTML.Tag @base_path Application.get_env(:svg_sprite, :base_path, "/images/") |> String.trim_trailing("/") @doc """ Creates an SVG tag which references a SVG sprite from an external SVG sprite file and returns it as a :safe HTML string. """ def icon(family, icon, opts \\ []) # convert symbols to strings def icon(family, icon, opts) when is_atom(family), do: icon(Atom.to_string(family), icon, opts) def icon(family, icon, opts) when is_atom(icon), do: icon(family, Atom.to_string(icon), opts) # translate from icon family shortname to longname def icon("fas", icon, opts), do: icon("solid", icon, opts) def icon("far", icon, opts), do: icon("regular", icon, opts) def icon("fab", icon, opts), do: icon("brands", icon, opts) def icon("fal", icon, opts), do: icon("light", icon, opts) def icon("fad", icon, opts), do: icon("duotone", icon, opts) # strip the fa- prefix from the icon name def icon(family, "fa-" <> icon, opts), do: icon(family, icon, opts) def icon(family, icon, opts) do opts = Keyword.update(opts, :fill, "currentColor", &Function.identity/1) content_tag(:svg, use_tag(family, icon), opts) end defp use_tag(family, icon) do content_tag(:use, "", href: @base_path <> "/" <> family <> ".svg#" <> icon) end end