logo

auto_linker

AutoLinker-shim, based on https://git.pleroma.social/pleroma/auto_linker
commit: f02b733c9123b3028e8998f0fdba27d106ae7633
parent: 14484e867139fb9c6f68c14e38648e49d6cd79c7
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Wed, 27 Feb 2019 04:24:33 +0100

Support mailto: prefixed emails only, ignore email option

Diffstat:

Mlib/auto_linker.ex2+-
Mlib/auto_linker/parser.ex37+++++++++++++------------------------
Mtest/auto_linker_test.exs15++++++++++-----
3 files changed, 24 insertions(+), 30 deletions(-)

diff --git a/lib/auto_linker.ex b/lib/auto_linker.ex @@ -40,7 +40,7 @@ defmodule AutoLinker do * `exclude_id: false` - Set to an element id when you don't want urls auto linked in the html of the give element * `exclude_patterns: ["```"]` - Don't link anything between the the pattern * `markdown: false` - link markdown style links - * `email: false` - link email links + * `email: false` - ignored * `mention: false` - link @mentions (when `true`, requires `mention_prefix` or `mention_handler` options to be set) * `mention_prefix: nil` - a prefix to build a link for a mention (example: `https://example.com/user/`) * `mention_handler: nil` - a custom handler to validate and formart a mention diff --git a/lib/auto_linker/parser.ex b/lib/auto_linker/parser.ex @@ -41,8 +41,7 @@ defmodule AutoLinker.Parser do @match_mention ~r/^@[a-zA-Z\d_-]+@[a-zA-Z0-9_-](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*|@[a-zA-Z\d_-]+/u # https://www.w3.org/TR/html5/forms.html#valid-e-mail-address - # credo:disable-for-next-line - @match_email ~r/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/u + @valid_email ~r/.*@.*/u @match_hashtag ~r/^(?<tag>\#[[:word:]_]*[[:alpha:]_·][[:word:]_·]*)/u @@ -116,12 +115,6 @@ defmodule AutoLinker.Parser do |> do_parse(Map.delete(opts, :markdown)) end - defp do_parse(input, %{email: true} = opts) do - input - |> do_parse(opts, {"", "", :parsing}, &check_and_link_email/3) - |> do_parse(Map.delete(opts, :email)) - end - defp do_parse({text, user_acc}, %{url: _} = opts) do input = with exclude <- Map.get(opts, :exclude_patterns), @@ -257,16 +250,22 @@ defmodule AutoLinker.Parser do defp do_parse({<<ch::8>> <> text, user_acc}, opts, {buffer, acc, state}, handler), do: do_parse({text, user_acc}, opts, {buffer <> <<ch::8>>, acc, state}, handler) - def check_and_link(buffer, opts, _user_acc) do + def check_and_link("mailto:" <> _ = buffer, opts, _user_acc) do buffer - |> is_url?() + |> is_email?() |> link_url(buffer, opts) end - def check_and_link_email(buffer, opts, _user_acc) do + def check_and_link("xmpp:" <> _ = buffer, opts, _user_acc) do buffer - |> is_email? - |> link_email(buffer, opts) + |> is_email?() + |> link_url(buffer, opts) + end + + def check_and_link(buffer, opts, _user_acc) do + buffer + |> is_url?() + |> link_url(buffer, opts) end def check_and_link_phone(buffer, opts, _user_acc) do @@ -287,12 +286,6 @@ defmodule AutoLinker.Parser do |> link_hashtag(buffer, opts, user_acc) end - def check_and_link_extra("xmpp:" <> handle, opts, _user_acc) do - handle - |> is_email? - |> link_extra("xmpp:" <> handle, opts) - end - def check_and_link_extra(buffer, opts, _user_acc) do buffer |> String.starts_with?(@prefix_extra) @@ -313,11 +306,7 @@ defmodule AutoLinker.Parser do end def is_email?(buffer) do - if Regex.match?(@invalid_url, buffer) do - false - else - @match_email |> Regex.match?(buffer) - end + is_url?(buffer) and Regex.match?(@valid_email, buffer) end def is_ip?(buffer) do diff --git a/test/auto_linker_test.exs b/test/auto_linker_test.exs @@ -302,13 +302,16 @@ defmodule AutoLinkerTest do expected = "<a href=\"xmpp:user@example.com\" class=\"auto-linker\">xmpp:user@example.com</a>" - assert AutoLinker.link(text, extra: true, new_window: false, rel: false) == expected + assert AutoLinker.link(text, new_window: false, rel: false) == expected end test "email" do text = "user@example.com" - expected = "<a href=\"mailto:user@example.com\" class=\"auto-linker\">user@example.com</a>" - assert AutoLinker.link(text, email: true) == expected + + expected = + "<a href=\"mailto:user@example.com\" class=\"auto-linker\">mailto:user@example.com</a>" + + assert AutoLinker.link(text) == expected end test "magnet" do @@ -318,7 +321,8 @@ defmodule AutoLinkerTest do expected = "<a href=\"magnet:?xt=urn:btih:a4104a9d2f5615601c429fe8bab8177c47c05c84&dn=ubuntu-18.04.1.0-live-server-amd64.iso&tr=http%3A%2F%2Ftorrent.ubuntu.com%3A6969%2Fannounce&tr=http%3A%2F%2Fipv6.torrent.ubuntu.com%3A6969%2Fannounce\" class=\"auto-linker\">magnet:?xt=urn:btih:a4104a9d2f5615601c429fe8bab8177c47c05c84&dn=ubuntu-18.04.1.0-live-server-amd64.iso&tr=http%3A%2F%2Ftorrent.ubuntu.com%3A6969%2Fannounce&tr=http%3A%2F%2Fipv6.torrent.ubuntu.com%3A6969%2Fannounce</a>" - assert AutoLinker.link(text, extra: true, new_window: false, rel: false) == expected + assert AutoLinker.link(text, extra_prefixes: ["magnet:?"], new_window: false, rel: false) == + expected end test "dweb" do @@ -328,7 +332,8 @@ defmodule AutoLinkerTest do expected = "<a href=\"dweb://584faa05d394190ab1a3f0240607f9bf2b7e2bd9968830a11cf77db0cea36a21+v1.0.0/path/to/file.txt\" class=\"auto-linker\">dweb://584faa05d394190ab1a3f0240607f9bf2b7e2bd9968830a11cf77db0cea36a21+v1.0.0/path/to/file.txt</a>" - assert AutoLinker.link(text, extra: true, new_window: false, rel: false) == expected + assert AutoLinker.link(text, extra_prefixes: ["dweb://"], new_window: false, rel: false) == + expected end end end