Normalize URLs to the format you need.
Add Norma to your list of dependencies in mix.exs:
def deps do
[
# get always the latest ñ___ñ
{:norma, ">= 0.0.0"}
]
endNorma depends heavily on the implementation of the URI module (part of the standard library), which was recently changed when adding support for Erlang 20. Use the module history as a guide if you encounter any weird error (specially if you suspect it's related to a regex).
iex> Norma.normalize("mazing.studio")
> "http://mazing.studio"
iex> Norma.normalize_if_valid("mazing.studio")
> {:ok, "http://mazing.studio"}
iex> Norma.normalize_if_valid("mazing")
> {:error, "Not an URL."}
iex> options = %{remove_fragment: true, force_root_path: true, remove_www: true}
iex> Norma.normalize("//www.mazing.studio:1337/test#test", options)
> "http://mazing.studio/"-
Remove scheme:
iex> Norma.normalize("https://mazing.studio", %{remove_scheme: true}) > "mazing.studio"
-
Remove fragment:
iex> Norma.normalize("https://mazing.studio#test", %{remove_fragment: true}) > "https://mazing.studio"
-
Add trailing slash:
iex> Norma.normalize("https://mazing.studio/test", %{add_trailing_slash: true}) > "https://mazing.studio/test/"
-
Force root path:
iex> Norma.normalize("https://mazing.studio/test", %{force_root_path: true}) > "https://mazing.studio/"
-
Remove
www:iex> Norma.normalize("https://www.mazing.studio", %{remove_www: true}) > "https://mazing.studio"
-
Downcase host:
iex> Norma.normalize("https://EXAMPLE.COM/FAQS", %{downcase_host: true}) > "https://example.com/FAQS"
def creation_changeset(params) do
norma_options = %{
remove_www: true,
force_root_path: true,
remove_fragment: true
}
%MyEntity{}
|> cast(params, @fields)
|> put_change(:url, Norma.normalize(params.url, norma_options))
end- Add support for the option in
/lib/norma/normalizer.ex. Prefer pattern matching and guards overifs andcases. - Add a test in
/test/norma_test.exs. - Add documentation to the
README. - Send a PR 🎉
Sponsored by Mazing Studio
We love to solve problems using Elixir and Go.
Have a project you need help with? Tell us about it!