- @finmoji [
- "a_trusted_friend",
- "alandislands",
- "association",
- "auroraborealis",
- "baby_in_a_box",
- "bear",
- "black_gold",
- "christmasparty",
- "crosscountryskiing",
- "cupofcoffee",
- "education",
- "fashionista_finns",
- "finnishlove",
- "flag",
- "forest",
- "four_seasons_of_bbq",
- "girlpower",
- "handshake",
- "happiness",
- "headbanger",
- "icebreaker",
- "iceman",
- "joulutorttu",
- "kaamos",
- "kalsarikannit_f",
- "kalsarikannit_m",
- "karjalanpiirakka",
- "kicksled",
- "kokko",
- "lavatanssit",
- "losthopes_f",
- "losthopes_m",
- "mattinykanen",
- "meanwhileinfinland",
- "moominmamma",
- "nordicfamily",
- "out_of_office",
- "peacemaker",
- "perkele",
- "pesapallo",
- "polarbear",
- "pusa_hispida_saimensis",
- "reindeer",
- "sami",
- "sauna_f",
- "sauna_m",
- "sauna_whisk",
- "sisu",
- "stuck",
- "suomimainittu",
- "superfood",
- "swan",
- "the_cap",
- "the_conductor",
- "the_king",
- "the_voice",
- "theoriginalsanta",
- "tomoffinland",
- "torillatavataan",
- "unbreakable",
- "waiting",
- "white_nights",
- "woollysocks"
- ]
-
- @finmoji_with_filenames Enum.map(@finmoji, fn (finmoji) ->
- {finmoji, "/finmoji/128px/#{finmoji}-128.png"}
- end)
-
- @emoji_from_file (with {:ok, file} <- File.read("config/emoji.txt") do
- file
- |> String.trim
- |> String.split("\n")
- |> Enum.map(fn(line) ->
- [name, file] = String.split(line, ", ")
- {name, file}
- end)
- else
- _ -> []
- end)
-
- @emoji @finmoji_with_filenames ++ @emoji_from_file
-
- def emojify(text, additional \\ nil) do
- all_emoji = if additional do
- Map.to_list(additional) ++ @emoji
- else
- @emoji
- end
-
- Enum.reduce(all_emoji, text, fn ({emoji, file}, text) ->
- String.replace(text, ":#{emoji}:", "<img height='32px' width='32px' alt='#{emoji}' title='#{emoji}' src='#{file}' />")
- end)
+ @doc "changes scheme:... urls to html links"
+ def add_links({subs, text}) do
+ links =
+ text
+ |> String.split([" ", "\t", "<br>"])
+ |> Enum.filter(fn word -> String.starts_with?(word, @valid_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)
+
+ uuid_text =
+ links
+ |> Enum.reduce(text, fn {uuid, url}, acc -> String.replace(acc, url, uuid) end)
+
+ subs =
+ subs ++
+ Enum.map(links, fn {uuid, url} ->
+ {uuid, "<a href=\"#{url}\">#{url}</a>"}
+ end)
+
+ {subs, uuid_text}
+ end
+
+ @doc "Adds the links to mentioned users"
+ def add_user_links({subs, text}, mentions) do
+ mentions =
+ mentions
+ |> Enum.sort_by(fn {name, _} -> -String.length(name) end)
+ |> Enum.map(fn {name, user} -> {name, user, Ecto.UUID.generate()} end)
+
+ uuid_text =
+ mentions
+ |> Enum.reduce(text, fn {match, _user, uuid}, text ->
+ String.replace(text, match, uuid)
+ end)
+
+ subs =
+ subs ++
+ Enum.map(mentions, fn {match, %User{id: id, ap_id: ap_id, info: info}, uuid} ->
+ ap_id =
+ if is_binary(info.source_data["url"]) do
+ info.source_data["url"]
+ else
+ ap_id
+ end
+
+ short_match = String.split(match, "@") |> tl() |> hd()
+
+ {uuid,
+ "<span><a data-user='#{id}' class='mention' href='#{ap_id}'>@<span>#{short_match}</span></a></span>"}
+ end)
+
+ {subs, uuid_text}