diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index d02c71374..7c64fdb0c 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -456,6 +456,24 @@ http://www.fish.com/""" views.status.format_links(url), f'{url[8:]}' ) + def test_format_mentions_with_at_symbol_links(self, *_): + """A link with an @username shouldn't treat the username as a mention""" + content = "a link to https://example.com/user/@mouse" + mentions = views.status.find_mentions(self.local_user, content) + self.assertEqual( + views.status.format_mentions(content, mentions), + "a link to https://example.com/user/@mouse", + ) + + def test_format_hashtag_with_pound_symbol_links(self, *_): + """A link with an @username shouldn't treat the username as a mention""" + content = "a link to https://example.com/page#anchor" + hashtags = views.status.find_or_create_hashtags(content) + self.assertEqual( + views.status.format_hashtags(content, hashtags), + "a link to https://example.com/page#anchor", + ) + def test_to_markdown(self, *_): """this is mostly handled in other places, but nonetheless""" text = "_hi_ and http://fish.com is rad" diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index 82d033d7c..a8c874c13 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -96,34 +96,22 @@ class CreateStatus(View): # inspect the text for user tags content = status.content - for (mention_text, mention_user) in find_mentions( - request.user, content - ).items(): + mentions = find_mentions(request.user, content) + for (_, mention_user) in mentions.items(): # add them to status mentions fk status.mention_users.add(mention_user) + content = format_mentions(content, mentions) - # turn the mention into a link - content = re.sub( - rf"{mention_text}\b(?!@)", - rf'{mention_text}', - content, - ) # add reply parent to mentions if status.reply_parent: status.mention_users.add(status.reply_parent.user) # inspect the text for hashtags - for (mention_text, mention_hashtag) in find_or_create_hashtags(content).items(): + hashtags = find_or_create_hashtags(content) + for (_, mention_hashtag) in hashtags.items(): # add them to status mentions fk status.mention_hashtags.add(mention_hashtag) - - # turn the mention into a link - content = re.sub( - rf"{mention_text}\b(?!@)", - rf'' - + rf"{mention_text}", - content, - ) + content = format_hashtags(content, hashtags) # deduplicate mentions status.mention_users.set(set(status.mention_users.all())) @@ -150,6 +138,31 @@ class CreateStatus(View): return redirect_to_referer(request) +def format_mentions(content, mentions): + """Detect @mentions and make them links""" + for (mention_text, mention_user) in mentions.items(): + # turn the mention into a link + content = re.sub( + rf"(?{mention_text}', + content, + ) + return content + + +def format_hashtags(content, hashtags): + """Detect #hashtags and make them links""" + for (mention_text, mention_hashtag) in hashtags.items(): + # turn the mention into a link + content = re.sub( + rf"(?' + + rf"{mention_text}", + content, + ) + return content + + @method_decorator(login_required, name="dispatch") class DeleteStatus(View): """tombstone that bad boy"""