diff --git a/chat_exporter/parse/mention.py b/chat_exporter/parse/mention.py index 7779102..75b4d22 100644 --- a/chat_exporter/parse/mention.py +++ b/chat_exporter/parse/mention.py @@ -68,25 +68,44 @@ async def flow(self): async def escape_mentions(self): + content = "" + previous_match_end = 0 for match in re.finditer("(%s|%s|%s|%s|%s|%s|%s|%s)" % (self.REGEX_ROLES, self.REGEX_MEMBERS, self.REGEX_CHANNELS, self.REGEX_EMOJIS, self.REGEX_ROLES_2, self.REGEX_MEMBERS_2, self.REGEX_CHANNELS_2, self.REGEX_EMOJIS_2), self.content): - pre_content = self.content[:match.start()] + pre_content = self.content[previous_match_end:match.start()] post_content = self.content[match.end():] match_content = self.content[match.start():match.end()] + match_content = await self.escape_mention_starters(match_content) - match_content = match_content.replace("<", self.ESCAPE_LT) - match_content = match_content.replace(">", self.ESCAPE_GT) - match_content = match_content.replace("&", self.ESCAPE_AMP) - - self.content = pre_content + match_content + post_content + content += pre_content + match_content + previous_match_end = match.end() + if previous_match_end < len(self.content) - 1: + content += self.content[previous_match_end:] + self.content = content - async def unescape_mentions(self): - self.content = self.content.replace(self.ESCAPE_LT, "<") - self.content = self.content.replace(self.ESCAPE_GT, ">") - self.content = self.content.replace(self.ESCAPE_AMP, "&") - pass + async def unescape_mentions(self, content: str = None): + had_content = content is not None + if content is None: + content = self.content + content = content.replace(self.ESCAPE_LT, "<") + content = content.replace(self.ESCAPE_GT, ">") + content = content.replace(self.ESCAPE_AMP, "&") + if not had_content: + self.content = content + return content + + async def escape_mention_starters(self, content: str = None): + had_content = content is not None + if content is None: + content = self.content + content = content.replace("<", self.ESCAPE_LT) + content = content.replace(">", self.ESCAPE_GT) + content = content.replace("&", self.ESCAPE_AMP) + if not had_content: + self.content = content + return content async def channel_mention(self): holder = self.REGEX_CHANNELS, self.REGEX_CHANNELS_2 @@ -159,7 +178,7 @@ async def member_mention(self): member_name = member.display_name except AttributeError: member_name = member - + member_name = await self.escape_mention_starters(member_name) if member is not None: replacement = '@%s' \ % (str(member_id), str(member_name)) @@ -170,13 +189,11 @@ async def member_mention(self): replacement) match = re.search(regex, self.content) + + await self.unescape_mentions() async def time_mention(self): holder = self.REGEX_TIME_HOLDER - timezone = pytz.timezone("UTC") - - if hasattr(self.guild, "timezone"): - timezone = pytz.timezone(self.guild.timezone) for p in holder: regex, strf = p @@ -204,11 +221,6 @@ async def time_mention(self): ui_time = ui_time.replace(str(dt.year), str(final_year)) tooltip_time = dt.strftime("%A, %e %B %Y at %H:%M") tooltip_time = tooltip_time.replace(str(dt.year), str(final_year)) - datetime_stamp = datetime.datetime(2010, *time_stamp[1:6], tzinfo=pytz.utc) - ui_time = datetime_stamp.strftime(strf) - ui_time = ui_time.replace(str(datetime_stamp.year), str(time_stamp[0])) - tooltip_time = datetime_stamp.strftime("%A, %e %B %Y at %H:%M") - tooltip_time = tooltip_time.replace(str(datetime_stamp.year), str(time_stamp[0])) original = match.group().replace("<", "<").replace(">", ">") replacement = ( f''