logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma
commit: 423194520e3fd1d2b285e7cf34a8ad7476276f5d
parent: a0a0d166323e7dabed185eab6e9083a9f73003f3
Author: Roger Braun <roger@rogerbraun.net>
Date:   Mon, 15 May 2017 18:25:21 +0200

Fix mention replacing.

Diffstat:

Mlib/pleroma/web/twitter_api/twitter_api.ex16+++++++++++++++-
Mtest/web/twitter_api/twitter_api_test.exs11+++++++----
2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -243,7 +243,21 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end def add_user_links(text, mentions) do - Enum.reduce(mentions, text, fn ({match, %User{ap_id: ap_id}}, text) -> String.replace(text, match, "<a href='#{ap_id}'>#{match}</a>") end) + mentions = mentions + |> Enum.sort_by(fn ({name, _}) -> -String.length(name) end) + |> Enum.map(fn({name, user}) -> {name, user, Ecto.UUID.generate} end) + + # This replaces the mention with a unique reference first so it doesn't + # contain parts of other replaced mentions. There probably is a better + # solution for this... + step_one = mentions + |> Enum.reduce(text, fn ({match, _user, uuid}, text) -> + String.replace(text, match, uuid) + end) + + Enum.reduce(mentions, step_one, fn ({match, %User{ap_id: ap_id}, uuid}, text) -> + String.replace(text, uuid, "<a href='#{ap_id}'>#{match}</a>") + end) end def register_user(params) do diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs @@ -236,27 +236,30 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do end test "it can parse mentions and return the relevant users" do - text = "@gsimg According to @archaeme , that is @daggsy." + text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me" gsimg = insert(:user, %{nickname: "gsimg"}) archaeme = insert(:user, %{nickname: "archaeme"}) + archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) expected_result = [ {"@gsimg", gsimg}, - {"@archaeme", archaeme} + {"@archaeme", archaeme}, + {"@archaeme@archae.me", archaeme_remote}, ] assert TwitterAPI.parse_mentions(text) == expected_result end test "it adds user links to an existing text" do - text = "@gsimg According to @archaeme , that is @daggsy." + text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me" gsimg = insert(:user, %{nickname: "gsimg"}) archaeme = insert(:user, %{nickname: "archaeme"}) + archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) mentions = TwitterAPI.parse_mentions(text) - expected_text = "<a href='#{gsimg.ap_id}'>@gsimg</a> According to <a href='#{archaeme.ap_id}'>@archaeme</a> , that is @daggsy." + expected_text = "<a href='#{gsimg.ap_id}'>@gsimg</a> According to <a href='#{archaeme.ap_id}'>@archaeme</a>, that is @daggsy. Also hello <a href='#{archaeme_remote.ap_id}'>@archaeme@archae.me</a>" assert TwitterAPI.add_user_links(text, mentions) == expected_text end