topic_link_util: Support message links in backend.

This commit adds support for message link
(#**stream>topic@message_id**) syntax in the
backend `topic_link_util` module.
This commit is contained in:
Kislay Verma
2025-05-21 12:25:25 +05:30
committed by Tim Abbott
parent 43bf15f0fa
commit 2a120d2717
2 changed files with 43 additions and 3 deletions

View File

@@ -45,10 +45,10 @@ def encode_hash_component(s: str) -> str:
def get_fallback_markdown_link( def get_fallback_markdown_link(
stream_id: int, stream_name: str, topic_name: str | None = None stream_id: int, stream_name: str, topic_name: str | None = None, message_id: int | None = None
) -> str: ) -> str:
""" """
Generates the markdown link syntax for a stream or topic link. Generates the markdown link syntax for a stream/topic/message link.
""" """
escape = escape_invalid_stream_topic_characters escape = escape_invalid_stream_topic_characters
link = f"#narrow/channel/{stream_id}-{encode_hash_component(stream_name.replace(' ', '-'))}" link = f"#narrow/channel/{stream_id}-{encode_hash_component(stream_name.replace(' ', '-'))}"
@@ -59,9 +59,26 @@ def get_fallback_markdown_link(
topic_name = Message.EMPTY_TOPIC_FALLBACK_NAME topic_name = Message.EMPTY_TOPIC_FALLBACK_NAME
text += f" > {escape(topic_name)}" text += f" > {escape(topic_name)}"
if message_id is not None:
link += f"/near/{message_id}"
text += " @ 💬"
return f"[{text}]({link})" return f"[{text}]({link})"
def get_message_link_syntax(
stream_id: int, stream_name: str, topic_name: str, message_id: int
) -> str:
# If the stream/topic name is such that it will
# generate an invalid #**stream>topic@message_id** syntax,
# we revert to generating the normal markdown syntax for a link.
if will_produce_broken_stream_topic_link(topic_name) or will_produce_broken_stream_topic_link(
stream_name
):
return get_fallback_markdown_link(stream_id, stream_name, topic_name, message_id)
return f"#**{stream_name}>{topic_name}@{message_id}**"
def get_stream_topic_link_syntax(stream_id: int, stream_name: str, topic_name: str) -> str: def get_stream_topic_link_syntax(stream_id: int, stream_name: str, topic_name: str) -> str:
# If the stream/topic name is such that it will generate an invalid #**stream>topic** syntax, # If the stream/topic name is such that it will generate an invalid #**stream>topic** syntax,
# we revert to generating the normal markdown syntax for a link. # we revert to generating the normal markdown syntax for a link.

View File

@@ -1,5 +1,9 @@
from zerver.lib.test_classes import ZulipTestCase from zerver.lib.test_classes import ZulipTestCase
from zerver.lib.topic_link_util import get_stream_link_syntax, get_stream_topic_link_syntax from zerver.lib.topic_link_util import (
get_message_link_syntax,
get_stream_link_syntax,
get_stream_topic_link_syntax,
)
class TestTopicLinkUtil(ZulipTestCase): class TestTopicLinkUtil(ZulipTestCase):
@@ -76,3 +80,22 @@ class TestTopicLinkUtil(ZulipTestCase):
get_stream_topic_link_syntax(sweden_id, "Sw*den", ""), get_stream_topic_link_syntax(sweden_id, "Sw*den", ""),
f"[#Sw*den > general chat](#narrow/channel/{sweden_id}-Sw*den/topic/)", f"[#Sw*den > general chat](#narrow/channel/{sweden_id}-Sw*den/topic/)",
) )
def test_message_link_syntax(self) -> None:
sweden_id = self.make_stream("Sweden").id
self.assertEqual(
get_message_link_syntax(sweden_id, "Sweden", "topic", 123),
"#**Sweden>topic@123**",
)
self.assertEqual(
get_message_link_syntax(sweden_id, "Sweden", "", 123),
"#**Sweden>@123**",
)
self.assertEqual(
get_message_link_syntax(sweden_id, "Sw*den", "topic", 123),
f"[#Sw*den > topic @ 💬](#narrow/channel/{sweden_id}-Sw*den/topic/topic/near/123)",
)
self.assertEqual(
get_message_link_syntax(sweden_id, "Sw*den", "", 123),
f"[#Sw*den > general chat @ 💬](#narrow/channel/{sweden_id}-Sw*den/topic//near/123)",
)