from typing import Any, override from cross.tokens import LinkToken, MentionToken, TagToken from util.html import HTMLToTokensParser class StatusParser(HTMLToTokensParser): def __init__(self, status: dict[str, Any]) -> None: super().__init__() self.tags: set[str] = set(tag["url"] for tag in status.get("tags", [])) self.mentions: set[str] = set(m["url"] for m in status.get("mentions", [])) @override def handle_a_endtag(self): label, _attr = self._tag_stack.pop("a") href = _attr.get("href") if href: cls = _attr.get("class", "") if cls: if "hashtag" in cls and href in self.tags: tag = label[1:] if label.startswith("#") else label self.tokens.append(TagToken(tag=tag)) return if "mention" in cls and href in self.mentions: username = label[1:] if label.startswith("@") else label self.tokens.append(MentionToken(username=username, uri=href)) return self.tokens.append(LinkToken(href=href, label=label))