logo

auto_linker

AutoLinker-shim, based on https://git.pleroma.social/pleroma/auto_linker
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:

Mlib/auto_linker.ex63++-------------------------------------------------------------
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