commit: 12f80c9edb87bde3205129eba230edca77e23480
parent: a84a17d01e782e1589e20cd40ac13c10ff877187
Author: Stephen M. Pallen <smpallen99@yahoo.com>
Date:   Wed, 29 Mar 2017 10:58:06 -0400
split into Parser and Builder modules
Diffstat:
1 file changed, 2 insertions(+), 61 deletions(-)
diff --git a/lib/auto_linker.ex b/lib/auto_linker.ex
@@ -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