mazingstudio/norma
Normalize URLs to the format you need
{ "createdAt": "2017-10-12T19:21:06Z", "defaultBranch": "master", "description": "Normalize URLs to the format you need", "fullName": "mazingstudio/norma", "homepage": "https://hex.pm/packages/norma", "language": "Elixir", "name": "norma", "pushedAt": "2022-08-01T17:48:40Z", "stargazersCount": 22, "topics": [ "elixir", "elixir-lang", "library" ], "updatedAt": "2023-09-01T10:59:17Z", "url": "https://github.com/mazingstudio/norma"}Normalize URLs to the format you need.
Installation
Section titled “Installation”Add Norma to your list of dependencies in mix.exs:
def deps do [ # get always the latest ñ___ñ {:norma, ">= 0.0.0"} ]endNote on compatibility
Section titled “Note on compatibility”Norma 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/"Options
Section titled “Options”-
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"
With Ecto
Section titled “With Ecto”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))endContributing
Section titled “Contributing”Adding options
Section titled “Adding options”- 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 🎉
Maintainers
Section titled “Maintainers”A Mazing project
Section titled “A Mazing project”Sponsored by Mazing Studio
We love to solve problems using Elixir and Go.
Have a project you need help with? Tell us about it!