pyrofork: Add blockquote expandable parser

Signed-off-by: wulan17 <wulan17@nusantararom.org>
This commit is contained in:
wulan17 2024-06-01 14:04:45 +07:00
parent 4cec859126
commit c4362ad535
No known key found for this signature in database
GPG key ID: 318CD6CD3A6AC0A5
4 changed files with 34 additions and 2 deletions

View file

@ -69,6 +69,9 @@ class MessageEntityType(AutoName):
BLOCKQUOTE = raw.types.MessageEntityBlockquote BLOCKQUOTE = raw.types.MessageEntityBlockquote
"Blockquote text" "Blockquote text"
EXPANDABLE_BLOCKQUOTE = raw.types.MessageEntityBlockquote
"collapsed-by-default block quotation"
TEXT_LINK = raw.types.MessageEntityTextUrl TEXT_LINK = raw.types.MessageEntityTextUrl
"For clickable text URLs" "For clickable text URLs"

View file

@ -58,6 +58,7 @@ class Parser(HTMLParser):
entity = raw.types.MessageEntityStrike entity = raw.types.MessageEntityStrike
elif tag == "blockquote": elif tag == "blockquote":
entity = raw.types.MessageEntityBlockquote entity = raw.types.MessageEntityBlockquote
extra["collapsed"] = bool("expandable" in attrs.keys())
elif tag == "code": elif tag == "code":
entity = raw.types.MessageEntityCode entity = raw.types.MessageEntityCode
elif tag == "pre": elif tag == "pre":
@ -178,6 +179,10 @@ class HTML:
language = getattr(entity, "language", "") or "" language = getattr(entity, "language", "") or ""
start_tag = f'<{name} language="{language}">' if language else f"<{name}>" start_tag = f'<{name} language="{language}">' if language else f"<{name}>"
end_tag = f"</{name}>" end_tag = f"</{name}>"
elif entity_type == MessageEntityType.EXPANDABLE_BLOCKQUOTE:
name = "blockquote"
start_tag = f"<{name} expandable>"
end_tag = f"</{name}>"
elif entity_type in ( elif entity_type in (
MessageEntityType.CODE, MessageEntityType.CODE,
MessageEntityType.BLOCKQUOTE, MessageEntityType.BLOCKQUOTE,

View file

@ -35,6 +35,7 @@ SPOILER_DELIM = "||"
CODE_DELIM = "`" CODE_DELIM = "`"
PRE_DELIM = "```" PRE_DELIM = "```"
BLOCKQUOTE_DELIM = ">" BLOCKQUOTE_DELIM = ">"
BLOCKQUOTE_EXPANDABLE_DELIM = "**>"
MARKDOWN_RE = re.compile(r"({d})|\[(.+?)\]\((.+?)\)".format( MARKDOWN_RE = re.compile(r"({d})|\[(.+?)\]\((.+?)\)".format(
d="|".join( d="|".join(
@ -78,6 +79,14 @@ class Markdown:
result.append(line.strip()) result.append(line.strip())
else: else:
result.append(line[1:].strip()) 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: else:
if in_blockquote: if in_blockquote:
line = CLOSING_TAG.format("blockquote") + line line = CLOSING_TAG.format("blockquote") + line
@ -174,7 +183,10 @@ class Markdown:
start_tag = f"{PRE_DELIM}{language}\n" start_tag = f"{PRE_DELIM}{language}\n"
end_tag = f"\n{PRE_DELIM}" end_tag = f"\n{PRE_DELIM}"
elif entity_type == MessageEntityType.BLOCKQUOTE: elif entity_type == MessageEntityType.BLOCKQUOTE:
start_tag = BLOCKQUOTE_DELIM + " " if entity.collapsed:
start_tag = BLOCKQUOTE_EXPANDABLE_DELIM + " "
else:
start_tag = BLOCKQUOTE_DELIM + " "
end_tag = "" end_tag = ""
blockquote_text = text[start:end] blockquote_text = text[start:end]
lines = blockquote_text.split("\n") lines = blockquote_text.split("\n")

View file

@ -52,6 +52,9 @@ class MessageEntity(Object):
custom_emoji_id (``int``, *optional*): custom_emoji_id (``int``, *optional*):
For :obj:`~pyrogram.enums.MessageEntityType.CUSTOM_EMOJI` only, unique identifier of the custom emoji. 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. 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__( def __init__(
@ -64,7 +67,8 @@ class MessageEntity(Object):
url: str = None, url: str = None,
user: "types.User" = None, user: "types.User" = None,
language: str = None, language: str = None,
custom_emoji_id: int = None custom_emoji_id: int = None,
collapsed: bool = None
): ):
super().__init__(client) super().__init__(client)
@ -75,6 +79,7 @@ class MessageEntity(Object):
self.user = user self.user = user
self.language = language self.language = language
self.custom_emoji_id = custom_emoji_id self.custom_emoji_id = custom_emoji_id
self.collapsed = collapsed
@staticmethod @staticmethod
def _parse(client, entity: "raw.base.MessageEntity", users: dict) -> Optional["MessageEntity"]: 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)), user=types.User._parse(client, users.get(user_id, None)),
language=getattr(entity, "language", None), language=getattr(entity, "language", None),
custom_emoji_id=getattr(entity, "document_id", None), custom_emoji_id=getattr(entity, "document_id", None),
collapsed=getattr(entity, "collapsed", None),
client=client client=client
) )
@ -117,6 +123,12 @@ class MessageEntity(Object):
if self.custom_emoji_id is not None: if self.custom_emoji_id is not None:
args["document_id"] = self.custom_emoji_id 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 entity = self.type.value
if entity is raw.types.MessageEntityMentionName: if entity is raw.types.MessageEntityMentionName: