|
@ -7,7 +7,6 @@ defmodule Linkify.Parser do |
|
|
|
|
|
|
|
|
@invalid_url ~r/(\.\.+)|(^(\d+\.){1,2}\d+$)/ |
|
|
@invalid_url ~r/(\.\.+)|(^(\d+\.){1,2}\d+$)/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@match_youtube ~r{http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?[\w\?=]*)?}u |
|
|
@match_youtube ~r{http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?[\w\?=]*)?}u |
|
|
|
|
|
|
|
|
@match_url ~r{^(?:\W*)?(?<url>(?:https?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~%:\/?#[\]@!\$&'\(\)\*\+,;=.]+$)}u |
|
|
@match_url ~r{^(?:\W*)?(?<url>(?:https?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~%:\/?#[\]@!\$&'\(\)\*\+,;=.]+$)}u |
|
@ -57,7 +56,7 @@ defmodule Linkify.Parser do |
|
|
~s{Check out <a href="http://google.com">google.com</a>} |
|
|
~s{Check out <a href="http://google.com">google.com</a>} |
|
|
""" |
|
|
""" |
|
|
|
|
|
|
|
|
@types [:youtube, :url, :email, :hashtag, :mention, :extra] |
|
|
|
|
|
|
|
|
@types [:url, :email, :hashtag, :mention, :extra, :youtube] |
|
|
|
|
|
|
|
|
def parse(input, opts \\ %{}) |
|
|
def parse(input, opts \\ %{}) |
|
|
def parse(input, opts) when is_binary(input), do: {input, %{}} |> parse(opts) |> elem(0) |
|
|
def parse(input, opts) when is_binary(input), do: {input, %{}} |> parse(opts) |> elem(0) |
|
@ -65,16 +64,13 @@ defmodule Linkify.Parser do |
|
|
|
|
|
|
|
|
def parse(input, opts) do |
|
|
def parse(input, opts) do |
|
|
opts = Map.merge(@default_opts, opts) |
|
|
opts = Map.merge(@default_opts, opts) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Enum.reduce(opts, input, fn |
|
|
Enum.reduce(opts, input, fn |
|
|
{type, true}, input when type in @types -> |
|
|
|
|
|
IO.puts inspect type |
|
|
|
|
|
|
|
|
{type, true}, input when type in @types -> |
|
|
do_parse(input, opts, {"", "", :parsing}, type) |
|
|
do_parse(input, opts, {"", "", :parsing}, type) |
|
|
|
|
|
|
|
|
_, input -> |
|
|
|
|
|
IO.puts inspect input |
|
|
|
|
|
|
|
|
a, input -> |
|
|
input |
|
|
input |
|
|
end) |
|
|
|
|
|
|
|
|
end) |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
defp do_parse({"", user_acc}, _opts, {"", acc, _}, _handler), |
|
|
defp do_parse({"", user_acc}, _opts, {"", acc, _}, _handler), |
|
@ -176,22 +172,12 @@ defmodule Linkify.Parser do |
|
|
defp do_parse({<<ch::8>> <> text, user_acc}, opts, {buffer, acc, state}, type), |
|
|
defp do_parse({<<ch::8>> <> text, user_acc}, opts, {buffer, acc, state}, type), |
|
|
do: do_parse({text, user_acc}, opts, {buffer <> <<ch::8>>, acc, state}, type) |
|
|
do: do_parse({text, user_acc}, opts, {buffer <> <<ch::8>>, acc, state}, type) |
|
|
|
|
|
|
|
|
def check_and_link(:youtube, buffer, opts, _user_acc) do |
|
|
|
|
|
str = strip_parens(buffer) |
|
|
|
|
|
|
|
|
|
|
|
if url?(str, opts) do |
|
|
|
|
|
case @match_youtube |> Regex.run(str, capture: [:youtube]) |> hd() do |
|
|
|
|
|
^buffer -> link_url(buffer, opts) |
|
|
|
|
|
youtube -> String.replace(buffer, youtube, link_url(youtube, opts)) |
|
|
|
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
buffer |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
def check_and_link(:youtube, buffer, opts, _user_acc) do |
|
|
|
|
|
if youtube?(buffer, opts), do: link_youtube(buffer, opts), else: buffer |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
def check_and_link(:url, buffer, opts, _user_acc) do |
|
|
def check_and_link(:url, buffer, opts, _user_acc) do |
|
|
str = strip_parens(buffer) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
str = strip_parens(buffer) |
|
|
if url?(str, opts) do |
|
|
if url?(str, opts) do |
|
|
case @match_url |> Regex.run(str, capture: [:url]) |> hd() do |
|
|
case @match_url |> Regex.run(str, capture: [:url]) |> hd() do |
|
|
^buffer -> link_url(buffer, opts) |
|
|
^buffer -> link_url(buffer, opts) |
|
@ -232,6 +218,10 @@ defmodule Linkify.Parser do |
|
|
|
|
|
|
|
|
defp strip_parens(buffer), do: buffer |
|
|
defp strip_parens(buffer), do: buffer |
|
|
|
|
|
|
|
|
|
|
|
def youtube?(buffer, opts) do |
|
|
|
|
|
valid_url?(buffer) && Regex.match?(@match_youtube, buffer) && valid_tld?(buffer, opts) |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
def url?(buffer, opts) do |
|
|
def url?(buffer, opts) do |
|
|
valid_url?(buffer) && Regex.match?(@match_url, buffer) && valid_tld?(buffer, opts) |
|
|
valid_url?(buffer) && Regex.match?(@match_url, buffer) && valid_tld?(buffer, opts) |
|
|
end |
|
|
end |
|
@ -325,6 +315,11 @@ defmodule Linkify.Parser do |
|
|
|
|
|
|
|
|
defp maybe_update_buffer(out, _match, _buffer), do: out |
|
|
defp maybe_update_buffer(out, _match, _buffer), do: out |
|
|
|
|
|
|
|
|
|
|
|
@doc false |
|
|
|
|
|
def link_youtube(buffer, opts) do |
|
|
|
|
|
Builder.create_youtube(buffer, opts) |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
@doc false |
|
|
@doc false |
|
|
def link_url(buffer, opts) do |
|
|
def link_url(buffer, opts) do |
|
|
Builder.create_link(buffer, opts) |
|
|
Builder.create_link(buffer, opts) |
|
|