commit: 150d9f222f344117a41864eac3042808a7c82f8b
parent 6242cebdf9979d5fc912fc30d8dfec79994bc418
Author: Egor Kislitsyn <egor@kislitsyn.com>
Date: Fri, 21 Jun 2019 18:09:52 +0700
Remove `scheme` setting
Diffstat:
3 files changed, 31 insertions(+), 51 deletions(-)
diff --git a/lib/auto_linker.ex b/lib/auto_linker.ex
@@ -27,7 +27,6 @@ defmodule AutoLinker do
* `class: "auto-linker"` - specify the class to be added to the generated link. false to clear
* `rel: "noopener noreferrer"` - override the rel attribute. false to clear
* `new_window: true` - set to false to remove `target='_blank'` attribute
- * `scheme: false` - Set to true to link urls with schema `http://google`
* `truncate: false` - Set to a number to truncate urls longer then the number. Truncated urls will end in `..`
* `strip_prefix: true` - Strip the scheme prefix
* `exclude_class: false` - Set to a class name when you don't want urls auto linked in the html of the give class
diff --git a/lib/auto_linker/parser.ex b/lib/auto_linker/parser.ex
@@ -7,13 +7,11 @@ defmodule AutoLinker.Parser do
@invalid_url ~r/(\.\.+)|(^(\d+\.){1,2}\d+$)/
- @match_url ~r{^[\w\.-]+(?:\.[\w\.-]+)+[\w\-\._~%:/?#[\]@!\$&'\(\)\*\+,;=.]+$}
-
- @match_scheme ~r{^(?:\W*)?(?<url>(?:https?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~%:\/?#[\]@!\$&'\(\)\*\+,;=.]+$)}u
+ @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*https?:\/\/)?(?:[^@\n]+\\w@)?(?<host>[^:#~\/\n?]+)}u
+ @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])$"
@@ -256,7 +254,7 @@ defmodule AutoLinker.Parser do
str = strip_parens(buffer)
if url?(str, opts) do
- case parse_link(str, opts) do
+ case @match_url |> Regex.run(str, capture: [:url]) |> hd() do
^buffer -> link_url(buffer, opts)
url -> String.replace(buffer, url, link_url(url, opts))
end
@@ -265,12 +263,6 @@ defmodule AutoLinker.Parser do
end
end
- defp parse_link(str, %{scheme: true}) do
- @match_scheme |> Regex.run(str, capture: [:url]) |> hd()
- end
-
- defp parse_link(str, _), do: str
-
defp strip_parens("(" <> buffer) do
~r/[^\)]*/ |> Regex.run(buffer) |> hd()
end
@@ -310,11 +302,7 @@ defmodule AutoLinker.Parser do
# @doc false
def url?(buffer, opts) do
- if opts[:scheme] do
- valid_url?(buffer) && Regex.match?(@match_scheme, buffer) && valid_tld?(buffer, opts)
- else
- valid_url?(buffer) && Regex.match?(@match_url, buffer) && valid_tld?(buffer, opts)
- end
+ valid_url?(buffer) && Regex.match?(@match_url, buffer) && valid_tld?(buffer, opts)
end
def email?(buffer, opts) do
@@ -324,24 +312,22 @@ defmodule AutoLinker.Parser do
defp valid_url?(url), do: !Regex.match?(@invalid_url, url)
def valid_tld?(buffer, opts) do
+ [scheme, host] = Regex.run(@match_hostname, buffer, capture: [:scheme, :host])
+
cond do
opts[:validate_tld] == false ->
true
- opts[:validate_tld] == :no_scheme && opts[:scheme] ->
+ ip?(host) ->
+ true
+
+ # don't validate if scheme is present
+ opts[:validate_tld] == :no_scheme and scheme != "" ->
true
true ->
- with [host] <- Regex.run(@match_hostname, buffer, capture: [:host]) do
- if ip?(host) do
- true
- else
- tld = host |> String.split(".") |> List.last()
- MapSet.member?(@tlds, tld)
- end
- else
- _ -> false
- end
+ tld = host |> String.split(".") |> List.last()
+ MapSet.member?(@tlds, tld)
end
end
diff --git a/test/auto_linker_test.exs b/test/auto_linker_test.exs
@@ -26,7 +26,6 @@ defmodule AutoLinkerTest do
assert AutoLinker.link(text,
phone: true,
email: true,
- scheme: true,
extra: true,
class: false,
new_window: false,
@@ -238,7 +237,6 @@ defmodule AutoLinkerTest do
"<a href=\"http://google.com#test\">google.com#test</a> <a href=\"https://example.com/tag/test\">#test</a> <a href=\"http://google.com/#test\">google.com/#test</a> <a href=\"https://example.com/tag/tag\">#tag</a>"
assert AutoLinker.link(text,
- scheme: true,
hashtag: true,
class: false,
new_window: false,
@@ -254,7 +252,6 @@ defmodule AutoLinkerTest do
"<a href=\"https://example.com/tag/漢字\">#漢字</a> <a href=\"https://example.com/tag/は\">#は</a> <a href=\"https://example.com/tag/тест\">#тест</a> <a href=\"https://example.com/tag/ทดสอบ\">#ทดสอบ</a>"
assert AutoLinker.link(text,
- scheme: true,
class: false,
new_window: false,
rel: false,
@@ -271,19 +268,18 @@ defmodule AutoLinkerTest do
expected =
"Hey, check out <a href=\"http://www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2#blabla\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2#blabla</a> ."
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
# no scheme
text = "Hey, check out www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2#blabla ."
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
end
test "turn urls with schema into urls" do
text = "📌https://google.com"
expected = "📌<a href=\"https://google.com\">google.com</a>"
- assert AutoLinker.link(text, scheme: true, class: false, new_window: false, rel: false) ==
- expected
+ assert AutoLinker.link(text, class: false, new_window: false, rel: false) == expected
end
test "hostname/@user" do
@@ -292,53 +288,53 @@ defmodule AutoLinkerTest do
expected =
"<a href=\"https://example.com/@user\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">example.com/@user</a>"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
text = "https://example.com:4000/@user"
expected =
"<a href=\"https://example.com:4000/@user\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">example.com:4000/@user</a>"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
text = "https://example.com:4000/@user"
expected =
"<a href=\"https://example.com:4000/@user\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">example.com:4000/@user</a>"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
text = "@username"
expected = "@username"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
text = "http://www.cs.vu.nl/~ast/intel/"
expected =
"<a href=\"http://www.cs.vu.nl/~ast/intel/\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">cs.vu.nl/~ast/intel/</a>"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
text = "https://forum.zdoom.org/viewtopic.php?f=44&t=57087"
expected =
"<a href=\"https://forum.zdoom.org/viewtopic.php?f=44&t=57087\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">forum.zdoom.org/viewtopic.php?f=44&t=57087</a>"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
text = "https://en.wikipedia.org/wiki/Sophia_(Gnosticism)#Mythos_of_the_soul"
expected =
"<a href=\"https://en.wikipedia.org/wiki/Sophia_(Gnosticism)#Mythos_of_the_soul\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">en.wikipedia.org/wiki/Sophia_(Gnosticism)#Mythos_of_the_soul</a>"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
text = "https://en.wikipedia.org/wiki/Duff's_device"
expected =
"<a href=\"https://en.wikipedia.org/wiki/Duff's_device\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">en.wikipedia.org/wiki/Duff's_device</a>"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
end
end
@@ -386,34 +382,33 @@ defmodule AutoLinkerTest do
expected =
"<a href=\"https://google.com\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">google.com</a>"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
end
test "only existing TLDs with scheme" do
text = "this url https://google.foobar.blah11blah/ has invalid TLD"
expected = "this url https://google.foobar.blah11blah/ has invalid TLD"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
text = "this url https://google.foobar.com/ has valid TLD"
expected =
"this url <a href=\"https://google.foobar.com/\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">google.foobar.com/</a> has valid TLD"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
end
test "only existing TLDs without scheme" do
text = "this url google.foobar.blah11blah/ has invalid TLD"
- expected = "this url google.foobar.blah11blah/ has invalid TLD"
- assert AutoLinker.link(text, scheme: false) == expected
+ assert AutoLinker.link(text) == text
text = "this url google.foobar.com/ has valid TLD"
expected =
"this url <a href=\"http://google.foobar.com/\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">google.foobar.com/</a> has valid TLD"
- assert AutoLinker.link(text, scheme: false) == expected
+ assert AutoLinker.link(text) == expected
end
test "only existing TLDs with and without scheme" do
@@ -422,14 +417,14 @@ defmodule AutoLinkerTest do
expected =
"this url <a href=\"http://google.foobar.com/\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">google.foobar.com/</a> has valid TLD"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
text = "this url google.foobar.com/ has valid TLD"
expected =
"this url <a href=\"http://google.foobar.com/\" class=\"auto-linker\" target=\"_blank\" rel=\"noopener noreferrer\">google.foobar.com/</a> has valid TLD"
- assert AutoLinker.link(text, scheme: true) == expected
+ assert AutoLinker.link(text) == expected
end
end
end