# coding=utf-8 """ 通知内容格式转换模块 提供不同推送平台间的格式转换功能 """ import re def strip_markdown(text: str) -> str: """去除文本中的 markdown 语法格式,用于个人微信推送 Args: text: 包含 markdown 格式的文本 Returns: 纯文本内容 """ # 转换链接 [text](url) -> text url(保留 URL) text = re.sub(r'\[([^\]]+)\]\(([^)]+)\)', r'\1 \2', text) # 先保护 URL,避免后续 markdown 清洗误伤链接中的下划线等字符 protected_urls: list[str] = [] def _protect_url(match: re.Match) -> str: protected_urls.append(match.group(0)) return f"@@URLTOKEN{len(protected_urls) - 1}@@" text = re.sub(r'https?://[^\s<>\]]+', _protect_url, text) # 去除粗体 **text** 或 __text__ text = re.sub(r'\*\*(.+?)\*\*', r'\1', text) text = re.sub(r'(? alt text = re.sub(r'!\[(.+?)\]\(.+?\)', r'\1', text) # 去除行内代码 `code` text = re.sub(r'`(.+?)`', r'\1', text) # 去除引用符号 > text = re.sub(r'^>\s*', '', text, flags=re.MULTILINE) # 去除标题符号 # ## ### 等 text = re.sub(r'^#+\s*', '', text, flags=re.MULTILINE) # 去除水平分割线 --- 或 *** text = re.sub(r'^[\-\*]{3,}\s*$', '', text, flags=re.MULTILINE) # 去除 HTML 标签 text -> text text = re.sub(r']*>(.+?)', r'\1', text) text = re.sub(r'<[^>]+>', '', text) # 清理多余的空行(保留最多两个连续空行) text = re.sub(r'\n{3,}', '\n\n', text) # 还原之前保护的 URL for idx, url in enumerate(protected_urls): text = text.replace(f"@@URLTOKEN{idx}@@", url) return text.strip() def convert_markdown_to_mrkdwn(content: str) -> str: """ 将标准 Markdown 转换为 Slack 的 mrkdwn 格式 转换规则: - **粗体** → *粗体* - [文本](url) → - 保留其他格式(代码块、列表等) Args: content: Markdown 格式的内容 Returns: Slack mrkdwn 格式的内容 """ # 1. 转换链接格式: [文本](url) → content = re.sub(r'\[([^\]]+)\]\(([^)]+)\)', r'<\2|\1>', content) # 2. 转换粗体: **文本** → *文本* content = re.sub(r'\*\*([^*]+)\*\*', r'*\1*', content) return content