65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
defmodule Heroicons.Icon do
 | 
						|
  @moduledoc """
 | 
						|
  This module defines the data structure and functions for working with icons stored as SVG files.
 | 
						|
  """
 | 
						|
 | 
						|
  alias __MODULE__
 | 
						|
 | 
						|
  @doc """
 | 
						|
  Defines the Heroicons.Icon struct.
 | 
						|
 | 
						|
  Its fields are:
 | 
						|
 | 
						|
    * `:type` - the type of the icon
 | 
						|
 | 
						|
    * `:name` - the name of the icon
 | 
						|
 | 
						|
    * `:file` - the binary of the icon
 | 
						|
 | 
						|
  """
 | 
						|
  defstruct [:type, :name, :file]
 | 
						|
 | 
						|
  @type t :: %Icon{type: String.t(), name: String.t(), file: binary}
 | 
						|
 | 
						|
  @doc "Parses a SVG file and returns structured data"
 | 
						|
  @spec parse!(String.t()) :: Icon.t()
 | 
						|
  def parse!(filename) do
 | 
						|
    [type, name] =
 | 
						|
      filename
 | 
						|
      |> Path.split()
 | 
						|
      |> Enum.take(-3)
 | 
						|
      |> case do
 | 
						|
        ["20", "solid", name] -> ["mini", name]
 | 
						|
        ["24", "solid", name] -> ["solid", name]
 | 
						|
        ["24", "outline", name] -> ["outline", name]
 | 
						|
      end
 | 
						|
 | 
						|
    name = Path.rootname(name)
 | 
						|
    file = File.read!(filename)
 | 
						|
 | 
						|
    struct!(__MODULE__, type: type, name: name, file: file)
 | 
						|
  end
 | 
						|
 | 
						|
  @doc "Converts opts to HTML attributes"
 | 
						|
  @spec opts_to_attrs(keyword) :: list
 | 
						|
  def opts_to_attrs(opts) do
 | 
						|
    for {key, value} <- opts do
 | 
						|
      key =
 | 
						|
        key
 | 
						|
        |> Atom.to_string()
 | 
						|
        |> String.replace("_", "-")
 | 
						|
        |> Phoenix.HTML.Safe.to_iodata()
 | 
						|
 | 
						|
      value = Phoenix.HTML.Safe.to_iodata(value)
 | 
						|
 | 
						|
      [?\s, key, ?=, ?", value, ?"]
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  @doc "Inserts HTML attributes into an SVG icon"
 | 
						|
  @spec insert_attrs(binary, keyword) :: Phoenix.HTML.safe()
 | 
						|
  def insert_attrs("<svg" <> rest, attrs) do
 | 
						|
    Phoenix.HTML.raw(["<svg", attrs, rest])
 | 
						|
  end
 | 
						|
end
 |