From c4362ad535ca001af9b9cb91085577dd7eb67def Mon Sep 17 00:00:00 2001 From: wulan17 Date: Sat, 1 Jun 2024 14:04:45 +0700 Subject: [PATCH] pyrofork: Add blockquote expandable parser Signed-off-by: wulan17 --- pyrogram/enums/message_entity_type.py | 3 +++ pyrogram/parser/html.py | 5 +++++ pyrogram/parser/markdown.py | 14 +++++++++++++- .../types/messages_and_media/message_entity.py | 14 +++++++++++++- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/pyrogram/enums/message_entity_type.py b/pyrogram/enums/message_entity_type.py index 62ff078d..6cb1cf4e 100644 --- a/pyrogram/enums/message_entity_type.py +++ b/pyrogram/enums/message_entity_type.py @@ -69,6 +69,9 @@ class MessageEntityType(AutoName): BLOCKQUOTE = raw.types.MessageEntityBlockquote "Blockquote text" + EXPANDABLE_BLOCKQUOTE = raw.types.MessageEntityBlockquote + "collapsed-by-default block quotation" + TEXT_LINK = raw.types.MessageEntityTextUrl "For clickable text URLs" diff --git a/pyrogram/parser/html.py b/pyrogram/parser/html.py index 7dfb5370..ed80e2ef 100644 --- a/pyrogram/parser/html.py +++ b/pyrogram/parser/html.py @@ -58,6 +58,7 @@ class Parser(HTMLParser): entity = raw.types.MessageEntityStrike elif tag == "blockquote": entity = raw.types.MessageEntityBlockquote + extra["collapsed"] = bool("expandable" in attrs.keys()) elif tag == "code": entity = raw.types.MessageEntityCode elif tag == "pre": @@ -178,6 +179,10 @@ class HTML: language = getattr(entity, "language", "") or "" start_tag = f'<{name} language="{language}">' if language else f"<{name}>" end_tag = f"" + elif entity_type == MessageEntityType.EXPANDABLE_BLOCKQUOTE: + name = "blockquote" + start_tag = f"<{name} expandable>" + end_tag = f"" elif entity_type in ( MessageEntityType.CODE, MessageEntityType.BLOCKQUOTE, diff --git a/pyrogram/parser/markdown.py b/pyrogram/parser/markdown.py index 94646768..d00e7558 100644 --- a/pyrogram/parser/markdown.py +++ b/pyrogram/parser/markdown.py @@ -35,6 +35,7 @@ SPOILER_DELIM = "||" CODE_DELIM = "`" PRE_DELIM = "```" BLOCKQUOTE_DELIM = ">" +BLOCKQUOTE_EXPANDABLE_DELIM = "**>" MARKDOWN_RE = re.compile(r"({d})|\[(.+?)\]\((.+?)\)".format( d="|".join( @@ -78,6 +79,14 @@ class Markdown: result.append(line.strip()) else: result.append(line[1:].strip()) + elif line.startswith(BLOCKQUOTE_EXPANDABLE_DELIM): + if not in_blockquote: + line = re.sub(r'^\*\*> ', OPENING_TAG.format("blockquote expandable"), line) + line = re.sub(r'^\*\*>', OPENING_TAG.format("blockquote expandable"), line) + in_blockquote = True + result.append(line.strip()) + else: + result.append(line[3:].strip()) else: if in_blockquote: line = CLOSING_TAG.format("blockquote") + line @@ -174,7 +183,10 @@ class Markdown: start_tag = f"{PRE_DELIM}{language}\n" end_tag = f"\n{PRE_DELIM}" elif entity_type == MessageEntityType.BLOCKQUOTE: - start_tag = BLOCKQUOTE_DELIM + " " + if entity.collapsed: + start_tag = BLOCKQUOTE_EXPANDABLE_DELIM + " " + else: + start_tag = BLOCKQUOTE_DELIM + " " end_tag = "" blockquote_text = text[start:end] lines = blockquote_text.split("\n") diff --git a/pyrogram/types/messages_and_media/message_entity.py b/pyrogram/types/messages_and_media/message_entity.py index c3f2d37d..62a3c61b 100644 --- a/pyrogram/types/messages_and_media/message_entity.py +++ b/pyrogram/types/messages_and_media/message_entity.py @@ -52,6 +52,9 @@ class MessageEntity(Object): custom_emoji_id (``int``, *optional*): For :obj:`~pyrogram.enums.MessageEntityType.CUSTOM_EMOJI` only, unique identifier of the custom emoji. Use :meth:`~pyrogram.Client.get_custom_emoji_stickers` to get full information about the sticker. + + collapsed (``bool``, *optional*): + For :obj:`~pyrogram.enums.MessageEntityType.BLOCKQUOTE` only, whether the blockquote expandable. """ def __init__( @@ -64,7 +67,8 @@ class MessageEntity(Object): url: str = None, user: "types.User" = None, language: str = None, - custom_emoji_id: int = None + custom_emoji_id: int = None, + collapsed: bool = None ): super().__init__(client) @@ -75,6 +79,7 @@ class MessageEntity(Object): self.user = user self.language = language self.custom_emoji_id = custom_emoji_id + self.collapsed = collapsed @staticmethod def _parse(client, entity: "raw.base.MessageEntity", users: dict) -> Optional["MessageEntity"]: @@ -95,6 +100,7 @@ class MessageEntity(Object): user=types.User._parse(client, users.get(user_id, None)), language=getattr(entity, "language", None), custom_emoji_id=getattr(entity, "document_id", None), + collapsed=getattr(entity, "collapsed", None), client=client ) @@ -117,6 +123,12 @@ class MessageEntity(Object): if self.custom_emoji_id is not None: args["document_id"] = self.custom_emoji_id + if self.type not in [ + enums.MessageEntityType.BLOCKQUOTE, + enums.MessageEntityType.EXPANDABLE_BLOCKQUOTE + ]: + args.pop("collapsed") + entity = self.type.value if entity is raw.types.MessageEntityMentionName: