diff --git a/src/backend/html_markdown.py b/src/backend/html_markdown.py
index 37978ac4..9c1f9902 100644
--- a/src/backend/html_markdown.py
+++ b/src/backend/html_markdown.py
@@ -138,6 +138,16 @@ class HTMLProcessor:
user_id_regex, room_id_regex, room_alias_regex,
]]
+ link_is_user_id_regex = re.compile(
+ r"https?://matrix.to/#/@.+", re.IGNORECASE,
+ )
+ link_is_room_id_regex = re.compile(
+ r"https?://matrix.to/#/!.+", re.IGNORECASE,
+ )
+ link_is_room_alias_regex = re.compile(
+ r"https?://matrix.to/#/#.+", re.IGNORECASE,
+ )
+
inline_quote_regex = re.compile(r"(^|⏎)(\s*>[^⏎\n]*)", re.MULTILINE)
quote_regex = re.compile(
@@ -224,7 +234,10 @@ class HTMLProcessor:
)
for a_tag in tree.iterdescendants("a"):
- self._matrix_toify(a_tag, room_id)
+ self._mentions_to_matrix_to_links(a_tag, room_id)
+
+ if not outgoing:
+ self._matrix_to_links_add_classes(a_tag)
html = etree.tostring(tree, encoding="utf-8", method="html").decode()
html = sanit.sanitize(html).rstrip("\n")
@@ -258,7 +271,7 @@ class HTMLProcessor:
inlines_attributes = {
"font": {"color"},
- "a": {"href"},
+ "a": {"href", "class"},
"code": {"class"},
}
attributes = {**inlines_attributes, **{
@@ -398,8 +411,10 @@ class HTMLProcessor:
return el
- def _matrix_toify(self, el: HtmlElement, room_id: str = "") -> HtmlElement:
- """Turn userID, usernames, roomID, room aliases into matrix.to URL."""
+ def _mentions_to_matrix_to_links(
+ self, el: HtmlElement, room_id: str = "",
+ ) -> HtmlElement:
+ """Turn user ID/names and room ID/aliases into matrix.to URL."""
if el.tag != "a" or not el.attrib.get("href"):
return el
@@ -410,16 +425,36 @@ class HTMLProcessor:
for regex in id_regexes:
if regex.match(el.attrib["href"]):
- el.attrib["href"] = f"https://matrix.to/#/{el.attrib['href']}"
+ el.attrib["href"] = f"https://matrix.to/#/{el.attrib['href']}"
if room_id not in self.rooms_user_id_names:
return el
for user_id, username in self.rooms_user_id_names[room_id].items():
if unquote(el.attrib["href"]) == username:
- el.attrib["href"] = f"https://matrix.to/#/{user_id}"
+ el.attrib["href"] = f"https://matrix.to/#/{user_id}"
+
+ return el
+
+
+ def _matrix_to_links_add_classes(self, el: HtmlElement) -> HtmlElement:
+ href = el.attrib.get("href")
+
+ if not href:
+ return el
+
+ if self.link_is_user_id_regex.match(href):
+ if el.text.lstrip().startswith("@"):
+ el.attrib["class"] = "mention user-id-mention"
+ else:
+ el.attrib["class"] = "mention username-mention"
+
+ elif self.link_is_room_id_regex.match(href):
+ el.attrib["class"] = "mention room-id-mention"
+
+ elif self.link_is_room_alias_regex.match(href):
+ el.attrib["class"] = "mention room-alias-mention"
- # print("ret 3", el.tag, el.attrib, el.text, el.tail, sep="||")
return el