logo

auto_linker

AutoLinker-shim, based on https://git.pleroma.social/pleroma/auto_linker git clone https://hacktivis.me/git/auto_linker.git
commit: 529014c8f4efc2f953b3e93411234f24f80838d6
parent b044a63910acba524f5e3df24ad1ed1b99088cce
Author: Egor Kislitsyn <egor@kislitsyn.com>
Date:   Fri, 21 Jun 2019 19:05:47 +0700

Drop phone links support

Diffstat:

Mlib/auto_linker/builder.ex34----------------------------------
Mlib/auto_linker/parser.ex47-----------------------------------------------
Mtest/auto_linker_test.exs10++--------
Mtest/builder_test.exs25-------------------------
Mtest/parser_test.exs49++-----------------------------------------------
5 files changed, 4 insertions(+), 161 deletions(-)

diff --git a/lib/auto_linker/builder.ex b/lib/auto_linker/builder.ex @@ -75,34 +75,6 @@ defmodule AutoLinker.Builder do defp strip_prefix(url, _), do: url - def create_phone_link([], buffer, _), do: buffer - - def create_phone_link([h | t], buffer, opts) do - create_phone_link(t, format_phone_link(h, buffer, opts), opts) - end - - def format_phone_link([h | _], buffer, opts) do - val = - h - |> String.replace(~r/[\.\+\- x\(\)]+/, "") - |> format_phone_link(h, opts) - - # val = ~s'<a href="#" class="phone-number" data-phone="#{number}">#{h}</a>' - String.replace(buffer, h, val) - end - - def format_phone_link(number, original, opts) do - tag = opts[:tag] || "a" - class = opts[:class] || "phone-number" - data_phone = opts[:data_phone] || "data-phone" - attrs = format_attributes(opts[:attributes] || []) - href = opts[:href] || "#" - - ~s'<#{tag} href="#{href}" class="#{class}" #{data_phone}="#{number}"#{attrs}>#{original}</#{ - tag - }>' - end - def create_mention_link("@" <> name, _buffer, opts) do mention_prefix = opts[:mention_prefix] @@ -164,10 +136,4 @@ defmodule AutoLinker.Builder do attrs = format_attrs(attrs) ~s(<a #{attrs}>#{uri}</a>) end - - defp format_attributes(attrs) do - Enum.reduce(attrs, "", fn {name, value}, acc -> - acc <> ~s' #{name}="#{value}"' - end) - end end diff --git a/lib/auto_linker/parser.ex b/lib/auto_linker/parser.ex @@ -9,8 +9,6 @@ defmodule AutoLinker.Parser do @match_url ~r{^(?:\W*)?(?<url>(?:https?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~%:\/?#[\]@!\$&'\(\)\*\+,;=.]+$)}u - @match_phone ~r"((?:x\d{2,7})|(?:(?:\+?1\s?(?:[.-]\s?)?)?(?:\(\s?(?:[2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s?\)|(?:[2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s?(?:[.-]\s?)?)(?:[2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s?(?:[.-]\s?)?(?:[0-9]{4}))" - @match_hostname ~r{^\W*(?<scheme>https?:\/\/)?(?:[^@\n]+\\w@)?(?<host>[^:#~\/\n?]+)}u @match_ip ~r"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" @@ -51,15 +49,6 @@ defmodule AutoLinker.Parser do iex> AutoLinker.Parser.parse("Check out google.com") ~s{Check out <a href="http://google.com" class="auto-linker" target="_blank" rel="noopener noreferrer">google.com</a>} - - iex> AutoLinker.Parser.parse("call me at x9999", phone: true) - ~s{call me at <a href="#" class="phone-number" data-phone="9999">x9999</a>} - - iex> AutoLinker.Parser.parse("or at home on 555.555.5555", phone: true) - ~s{or at home on <a href="#" class="phone-number" data-phone="5555555555">555.555.5555</a>} - - iex> AutoLinker.Parser.parse(", work (555) 555-5555", phone: true) - ~s{, work <a href="#" class="phone-number" data-phone="5555555555">(555) 555-5555</a>} """ def parse(input, opts \\ %{}) @@ -88,15 +77,8 @@ defmodule AutoLinker.Parser do do_parse(input, Map.merge(config, opts)) end - defp do_parse(input, %{phone: false} = opts), do: do_parse(input, Map.delete(opts, :phone)) defp do_parse(input, %{url: false} = opts), do: do_parse(input, Map.delete(opts, :url)) - defp do_parse(input, %{phone: _} = opts) do - input - |> do_parse(opts, {"", "", :parsing}, &check_and_link_phone/3) - |> do_parse(Map.delete(opts, :phone)) - end - defp do_parse(input, %{hashtag: true} = opts) do input |> do_parse(opts, {"", "", :parsing}, &check_and_link_hashtag/3) @@ -210,15 +192,6 @@ defmodule AutoLinker.Parser do do_parse({text, user_acc}, opts, {"", acc <> buffer, {:attrs, level}}, handler) end - # default cases where state is not important - defp do_parse( - {" " <> text, user_acc}, - %{phone: _} = opts, - {buffer, acc, state}, - handler - ), - do: do_parse({text, user_acc}, opts, {buffer <> " ", acc, state}, handler) - defp do_parse( {<<char::bytes-size(1), text::binary>>, user_acc}, opts, @@ -273,12 +246,6 @@ defmodule AutoLinker.Parser do if email?(buffer, opts), do: link_email(buffer, opts), else: buffer end - def check_and_link_phone(buffer, opts, _user_acc) do - buffer - |> match_phone - |> link_phone(buffer, opts) - end - def check_and_link_mention(buffer, opts, user_acc) do buffer |> match_mention @@ -340,14 +307,6 @@ defmodule AutoLinker.Parser do def ip?(buffer), do: Regex.match?(@match_ip, buffer) - @doc false - def match_phone(buffer) do - case Regex.scan(@match_phone, buffer) do - [] -> nil - other -> other - end - end - def match_mention(buffer) do case Regex.run(@match_mention, buffer) do [mention] -> mention @@ -402,12 +361,6 @@ defmodule AutoLinker.Parser do defp maybe_update_buffer(out, _match, _buffer), do: out - def link_phone(nil, buffer, _), do: buffer - - def link_phone(list, buffer, opts) do - Builder.create_phone_link(list, buffer, opts) - end - @doc false def link_url(buffer, opts) do Builder.create_link(buffer, opts) diff --git a/test/auto_linker_test.exs b/test/auto_linker_test.exs @@ -2,11 +2,6 @@ defmodule AutoLinkerTest do use ExUnit.Case, async: true doctest AutoLinker - test "phone number" do - assert AutoLinker.link(", work (555) 555-5555", phone: true) == - ~s{, work <a href="#" class="phone-number" data-phone="5555555555">(555) 555-5555</a>} - end - test "default link" do assert AutoLinker.link("google.com") == "<a href=\"http://google.com\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">google.com</a>" @@ -18,13 +13,12 @@ defmodule AutoLinkerTest do end test "all kinds of links" do - text = "hello google.com https://ddg.com 888 888-8888 user@email.com irc:///mIRC" + text = "hello google.com https://ddg.com user@email.com irc:///mIRC" expected = - "hello <a href=\"http://google.com\">google.com</a> <a href=\"https://ddg.com\">ddg.com</a> <a href=\"#\" class=\"phone-number\" data-phone=\"8888888888\">888 888-8888</a> <a href=\"mailto:user@email.com\">user@email.com</a> <a href=\"irc:///mIRC\">irc:///mIRC</a>" + "hello <a href=\"http://google.com\">google.com</a> <a href=\"https://ddg.com\">ddg.com</a> <a href=\"mailto:user@email.com\">user@email.com</a> <a href=\"irc:///mIRC\">irc:///mIRC</a>" assert AutoLinker.link(text, - phone: true, email: true, extra: true, class: false, diff --git a/test/builder_test.exs b/test/builder_test.exs @@ -46,31 +46,6 @@ defmodule AutoLinker.BuilderTest do assert format_mention(%{href: "url"}, "user@host", nil) == expected end - describe "create_phone_link" do - test "finishes" do - assert create_phone_link([], "", []) == "" - end - - test "handles one link" do - phrase = "my exten is x888. Call me." - - expected = - ~s'my exten is <a href="#" class="phone-number" data-phone="888" test=\"test\">x888</a>. Call me.' - - assert create_phone_link([["x888", ""]], phrase, attributes: [test: "test"]) == expected - end - - test "handles multiple links" do - phrase = "555.555.5555 or (555) 888-8888" - - expected = - ~s'<a href="#" class="phone-number" data-phone="5555555555">555.555.5555</a> or ' <> - ~s'<a href="#" class="phone-number" data-phone="5558888888">(555) 888-8888</a>' - - assert create_phone_link([["555.555.5555", ""], ["(555) 888-8888"]], phrase, []) == expected - end - end - test "create_mention_link/3" do expected = "<a href=\"/u/navi\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">@navi</a>" diff --git a/test/parser_test.exs b/test/parser_test.exs @@ -106,22 +106,6 @@ defmodule AutoLinker.ParserTest do end end - describe "match_phone" do - test "valid" do - valid_phone_nunbers() - |> Enum.each(fn number -> - assert number |> match_phone() |> valid_number?(number) - end) - end - - test "invalid" do - invalid_phone_numbers() - |> Enum.each(fn number -> - assert number |> match_phone() |> is_nil - end) - end - end - describe "parse" do test "handle line breakes" do text = "google.com\r\nssss" @@ -157,7 +141,7 @@ defmodule AutoLinker.ParserTest do expected = "<div><a href=\"http://google.com\">google.com</a></div>" - assert parse(text, class: false, rel: false, new_window: false, phone: false) == expected + assert parse(text, class: false, rel: false, new_window: false) == expected text = "Check out <div class='section'>google.com</div>" @@ -196,7 +180,7 @@ defmodule AutoLinker.ParserTest do test "do not link urls" do text = "google.com" - assert parse(text, url: false, phone: true) == text + assert parse(text, url: false) == text end test "do not link `:test.test`" do @@ -260,35 +244,6 @@ defmodule AutoLinker.ParserTest do "555.555.5555" ] - def valid_phone_nunbers, - do: [ - "x55", - "x555", - "x5555", - "x12345", - "+1 555 555-5555", - "555 555-5555", - "555.555.5555", - "613-555-5555", - "1 (555) 555-5555", - "(555) 555-5555", - "1.555.555.5555", - "800 555-5555", - "1.800.555.5555", - "1 (800) 555-5555", - "888 555-5555", - "887 555-5555", - "1-877-555-5555", - "1 800 710-5515" - ] - - def invalid_phone_numbers, - do: [ - "5555", - "x5", - "(555) 555-55" - ] - def custom_tld_scheme_urls, do: [ "http://whatever.null/",