logo

auto_linker

AutoLinker-shim, based on https://git.pleroma.social/pleroma/auto_linker git clone https://hacktivis.me/git/auto_linker.git
commit: 150d9f222f344117a41864eac3042808a7c82f8b
parent 6242cebdf9979d5fc912fc30d8dfec79994bc418
Author: Egor Kislitsyn <egor@kislitsyn.com>
Date:   Fri, 21 Jun 2019 18:09:52 +0700

Remove `scheme` setting

Diffstat:

Mlib/auto_linker.ex1-
Mlib/auto_linker/parser.ex40+++++++++++++---------------------------
Mtest/auto_linker_test.exs41++++++++++++++++++-----------------------
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