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:
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