split into Parser and Builder modules
This commit is contained in:
parent
a84a17d01e
commit
12f80c9edb
1 changed files with 2 additions and 61 deletions
|
@ -17,6 +17,8 @@ defmodule AutoLinker do
|
|||
"<a href='http://google.com'>google.com</a>"
|
||||
"""
|
||||
|
||||
import AutoLinker.Parser
|
||||
|
||||
@doc """
|
||||
Auto link a string.
|
||||
"""
|
||||
|
@ -29,66 +31,5 @@ defmodule AutoLinker do
|
|||
parse text, opts
|
||||
end
|
||||
|
||||
# state = {buffer, acc, state}
|
||||
defp parse(text, opts) do
|
||||
parse(text, Keyword.get(opts, :scheme, false), opts, {"", "", false})
|
||||
end
|
||||
|
||||
defp parse("", _scheme, _opts ,{_, acc, _}), do: acc
|
||||
|
||||
defp parse(text, scheme, opts, {buffer, acc, state}) do
|
||||
acc = acc <> create_link(text, opts)
|
||||
parse("", scheme, opts, {buffer, acc, state})
|
||||
end
|
||||
|
||||
defp create_link(url, opts) do
|
||||
[]
|
||||
|> build_attrs(url, opts, :rel)
|
||||
|> build_attrs(url, opts, :target)
|
||||
|> build_attrs(url, opts, :class)
|
||||
|> build_attrs(url, opts, :scheme)
|
||||
|> format_url(url, opts)
|
||||
end
|
||||
|
||||
defp build_attrs(attrs, _, opts, :rel) do
|
||||
if rel = Keyword.get(opts, :rel, "noopener noreferrer"),
|
||||
do: [{:rel, rel} | attrs], else: attrs
|
||||
end
|
||||
defp build_attrs(attrs, _, opts, :target) do
|
||||
if Keyword.get(opts, :new_window, true),
|
||||
do: [{:target, :_blank} | attrs], else: attrs
|
||||
end
|
||||
defp build_attrs(attrs, _, opts, :class) do
|
||||
if cls = Keyword.get(opts, :class, "auto-linker"),
|
||||
do: [{:class, cls} | attrs], else: attrs
|
||||
end
|
||||
defp build_attrs(attrs, url, _opts, :scheme) do
|
||||
if String.starts_with?(url, ["http://", "https://"]),
|
||||
do: [{:href, url} | attrs], else: [{:href, "http://" <> url} | attrs]
|
||||
end
|
||||
|
||||
defp format_url(attrs, url, opts) do
|
||||
url =
|
||||
url
|
||||
|> strip_prefix(Keyword.get(opts, :strip_prefix, true))
|
||||
|> truncate(Keyword.get(opts, :truncate, false))
|
||||
attrs =
|
||||
attrs
|
||||
|> Enum.map(fn {key, value} -> ~s(#{key}='#{value}') end)
|
||||
|> Enum.join(" ")
|
||||
"<a #{attrs}>" <> url <> "</a>"
|
||||
end
|
||||
|
||||
defp truncate(url, false), do: url
|
||||
defp truncate(url, len) when len < 3, do: url
|
||||
defp truncate(url, len) do
|
||||
if String.length(url) > len, do: String.slice(url, 0, len - 2) <> "..", else: url
|
||||
end
|
||||
|
||||
defp strip_prefix(url, true) do
|
||||
url
|
||||
|> String.replace(~r/^https?:\/\//, "")
|
||||
|> String.replace(~r/^www\./, "")
|
||||
end
|
||||
defp strip_prefix(url, _), do: url
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue