Packages

A library of convenience functions for manipulating datasets.

Current section

Files

Jump to
fitz lib parsers uri.ex
Raw

lib/parsers/uri.ex

defmodule Fitz.URI do
def merge_query(uri) do
query = query(uri)
if query do
query = if Enum.count(query) < 2 do query ++ [%{"filter" => "true"}] else query end
Enum.reduce(query, fn(x, acc)->
h = "#{Map.keys(x) |> Enum.at(0)}=#{Map.values(x) |> Enum.at(0)}"
r =
"#{h}&#{
if is_map(acc) do
"#{Map.keys(acc) |> Enum.at(0)}=#{Map.values(acc) |> Enum.at(0)}"
else
acc
end}"
end)
end
end
def transform(x) do
"#{Map.keys(x) |> Enum.at(0)}=#{Map.values(x) |> Enum.at(0)}"
end
def query(uri) do
if uri && is_bitstring(uri) do
query =
if String.contains?(uri, "?") do
String.split(uri, "?") |> Enum.slice(1..-1) |> Enum.join
else
uri
end
String.split(query, "&")
|> Enum.map(fn(x)->
k = String.split(x, "=")
%{Enum.at(k, 0) => Enum.at(k, 1)}
end)
|> Fitz.Map.flatten
|> Enum.uniq_by(fn{k, _} -> k end)
|> Enum.map(fn{k, v}-> %{k => v} end)
else
nil
end
end
def parse(uri) do
uri =
URI.parse(uri)
query_string =
if uri.query do
"?" <> uri.query
else
nil
end
parsed_uri =
Map.new
|> Map.put(:root_domain, root(uri.host))
|> Map.put(:query_map, query(query_string))
|> Map.put(:query_string, uri.query)
|> Map.put(:domain, uri.authority)
|> Map.put(:path, uri.path)
|> Map.put(:hash, uri.fragment)
|> Map.put(:port, uri.port)
end
def root(host) do
if host do
String.split(host, ".")
|> Enum.slice(-2..-1)
|> Enum.join(".")
else
nil
end
end
end