[Pleroma.Formatter]: Add support for non-HTTP schemes in URIs

The call to the regex in add_links is there just to be sure it’s a legal URI, it can be removed if you want to get more performance.

The URI Schemes list is sorted, but with http(s) at the start (in case it might make it faster for common links).

Closes: https://git.pleroma.social/pleroma/pleroma/issues/127
This commit is contained in:
Haelwenn (lanodan) Monnier 2018-06-18 12:45:15 +02:00
parent ba72c51a0f
commit 3623504e5d
No known key found for this signature in database
GPG Key ID: D5B7A8E43C997DEE

View File

@ -165,8 +165,29 @@ defmodule Pleroma.Formatter do
@emoji @emoji
end end
@link_regex ~r/https?:\/\/[\w\.\/?=\-#\+%&@~'\(\):]+[\w\/]/u @link_regex ~r/[0-9a-z+\-\.]+:[0-9a-z$-_.+!*'(),]+/ui
# IANA got a list https://www.iana.org/assignments/uri-schemes/ but
# Stuff like ipfs isnt in it
# There is very niche stuff
@uri_schemes [
"https://",
"http://",
"dat://",
"dweb://",
"gopher://",
"ipfs://",
"ipns://",
"irc:",
"ircs:",
"magnet:",
"mailto:",
"mumble:",
"ssb://",
"xmpp:"
]
# TODO: make it use something other than @link_regex
def html_escape(text) do def html_escape(text) do
Regex.split(@link_regex, text, include_captures: true) Regex.split(@link_regex, text, include_captures: true)
|> Enum.map_every(2, fn chunk -> |> Enum.map_every(2, fn chunk ->
@ -176,11 +197,14 @@ defmodule Pleroma.Formatter do
|> Enum.join("") |> Enum.join("")
end end
@doc "changes http:... links to html links" @doc "changes scheme:... urls to html links"
def add_links({subs, text}) do def add_links({subs, text}) do
links = links =
Regex.scan(@link_regex, text) text
|> Enum.map(fn [url] -> {Ecto.UUID.generate(), url} end) |> String.split([" ", "\t", "<br>"])
|> Enum.filter(fn word -> String.starts_with?(word, @uri_schemes) end)
|> Enum.filter(fn word -> Regex.match?(@link_regex, word) end)
|> Enum.map(fn url -> {Ecto.UUID.generate(), url} end)
|> Enum.sort_by(fn {_, url} -> -String.length(url) end) |> Enum.sort_by(fn {_, url} -> -String.length(url) end)
uuid_text = uuid_text =