Packages
phoenix_kit
1.7.206
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/modules/storage/variant_naming.ex
defmodule PhoenixKit.Modules.Storage.VariantNaming do
@moduledoc """
Utilities for naming and parsing storage variant names.
Variant names follow the convention:
- Primary: `"medium"` (dimension name only)
- Alternative format: `"medium_webp"` (dimension name + format suffix)
The parser splits on the last underscore and checks whether the suffix
is a known image format. If it is, the variant is an alternative format.
"""
@known_formats ~w(jpg jpeg png webp avif gif)
@doc """
Parses a variant name into `{base_dimension, format}`.
## Examples
iex> parse_variant_name("medium")
{"medium", nil}
iex> parse_variant_name("medium_webp")
{"medium", "webp"}
iex> parse_variant_name("video_thumbnail")
{"video_thumbnail", nil}
iex> parse_variant_name("thumbnail_avif")
{"thumbnail", "avif"}
"""
def parse_variant_name(variant_name) when is_binary(variant_name) do
case String.split(variant_name, "_") do
[single] ->
{single, nil}
parts ->
suffix = List.last(parts)
if suffix in @known_formats do
base = parts |> Enum.drop(-1) |> Enum.join("_")
{base, suffix}
else
{variant_name, nil}
end
end
end
@doc """
Builds a variant name from a base dimension name and format.
## Examples
iex> variant_name("medium", nil)
"medium"
iex> variant_name("medium", "webp")
"medium_webp"
"""
def variant_name(base, nil), do: base
def variant_name(base, format), do: "#{base}_#{format}"
@doc """
Returns the list of known image format suffixes.
"""
def known_formats, do: @known_formats
@doc """
Returns the MIME type for a format string.
## Examples
iex> mime_type_for_format("webp")
"image/webp"
iex> mime_type_for_format("avif")
"image/avif"
"""
def mime_type_for_format("jpg"), do: "image/jpeg"
def mime_type_for_format("jpeg"), do: "image/jpeg"
def mime_type_for_format("png"), do: "image/png"
def mime_type_for_format("webp"), do: "image/webp"
def mime_type_for_format("avif"), do: "image/avif"
def mime_type_for_format("gif"), do: "image/gif"
def mime_type_for_format(_), do: "application/octet-stream"
end