https://github.com/mazingstudio/norma
Normalize URLs to the format you need
https://github.com/mazingstudio/norma
elixir elixir-lang library
Last synced: 10 months ago
JSON representation
Normalize URLs to the format you need
- Host: GitHub
- URL: https://github.com/mazingstudio/norma
- Owner: mazingstudio
- Created: 2017-10-12T19:21:06.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2022-08-01T17:48:40.000Z (over 3 years ago)
- Last Synced: 2025-03-26T23:11:21.473Z (10 months ago)
- Topics: elixir, elixir-lang, library
- Language: Elixir
- Homepage: https://hex.pm/packages/norma
- Size: 31.3 KB
- Stars: 22
- Watchers: 3
- Forks: 2
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Norma
[]()
[]()
[]()
[]()
[](https://github.com/mazingstudio/norma/issues)
[]()
Normalize URLs to the format you need.
## Installation
Add `Norma` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
# get always the latest ñ___ñ
{:norma, ">= 0.0.0"}
]
end
```
### 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](https://github.com/elixir-lang/elixir/issues/5851). Use [the module history](https://github.com/elixir-lang/elixir/commits/master/lib/elixir/lib/uri.ex) as a guide if you encounter any weird error (specially if you suspect it's related to a regex).
## Usage
```elixir
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
- Remove scheme:
```elixir
iex> Norma.normalize("https://mazing.studio", %{remove_scheme: true})
> "mazing.studio"
```
- Remove fragment:
```elixir
iex> Norma.normalize("https://mazing.studio#test", %{remove_fragment: true})
> "https://mazing.studio"
```
- Add trailing slash:
```elixir
iex> Norma.normalize("https://mazing.studio/test", %{add_trailing_slash: true})
> "https://mazing.studio/test/"
```
- Force root path:
```elixir
iex> Norma.normalize("https://mazing.studio/test", %{force_root_path: true})
> "https://mazing.studio/"
```
- Remove `www`:
```elixir
iex> Norma.normalize("https://www.mazing.studio", %{remove_www: true})
> "https://mazing.studio"
- Downcase host:
```elixir
iex> Norma.normalize("https://EXAMPLE.COM/FAQS", %{downcase_host: true})
> "https://example.com/FAQS"
```
### With Ecto
```elixir
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
```
## Contributing
### Adding options
1. Add support for the option in `/lib/norma/normalizer.ex`. Prefer pattern matching and guards over `if`s and `case`s.
2. Add a test in `/test/norma_test.exs`.
2. Add documentation to the `README`.
3. Send a PR 🎉
### Maintainers
- [Zura Guerra](https://github.com/ZuraGuerra) - [@grafofilia](https://twitter.com/grafofilia)
---
## A Mazing project

Sponsored by [_Mazing Studio_](https://mazing.studio)
We love to solve problems using Elixir and Go.
Have a project you need help with? [Tell us about it!](https://mazing.studio/#section-form)