ForcePilot/backend/package/yuxi/channel/extensions/zoomchat/format.py
Kris d5e36d33b7 feat(channel): 添加 Zalo OA、Zoom Chat 和 Zulip 渠道扩展
新增 Zalo OA、Zoom Chat、Zulip 三个渠道扩展。

Zalo OA 渠道扩展主要模块:sidecar_client, config, gateway, outbound, streaming, pairing, security, auth, dedupe, directory, monitor, status, session, reactions, tools

Zoom Chat 渠道扩展主要模块:config, gateway, webhook, outbound, streaming, pairing, security, crypto, dedupe, actions, media, mentions, monitor, status, session, reactions, threading

Zulip 渠道扩展主要模块:client, config, gateway, outbound, streaming, pairing, security, monitor, status
2026-05-21 12:06:26 +08:00

87 lines
2.1 KiB
Python

import re
import logging
logger = logging.getLogger(__name__)
def _strip_strikethrough(text: str) -> str:
return re.sub(r"~~(.+?)~~", r"\1", text)
def _convert_links(text: str) -> str:
def replacer(m):
link_text = m.group(1)
url = m.group(2)
return f"{link_text} ( {url} )"
return re.sub(r"\[([^\]]+)\]\(([^)]+)\)", replacer, text)
def _strip_headings(text: str) -> str:
def replacer(m):
level = len(m.group(1))
heading_text = m.group(2).strip()
if level <= 1:
return f"*{heading_text}*"
return heading_text
return re.sub(r"^(#{1,6})\s+(.+)$", replacer, text, flags=re.MULTILINE)
def _strip_table_syntax(text: str) -> str:
lines = text.split("\n")
result = []
for line in lines:
stripped = line.strip()
if stripped.startswith("|") and stripped.endswith("|"):
if "---" in stripped and "|" in stripped:
continue
cells = [c.strip() for c in stripped.split("|")[1:-1]]
result.append(" ".join(cells))
else:
result.append(line)
return "\n".join(result)
def clean_for_zoom(text: str) -> str:
if not text:
return ""
text = _strip_strikethrough(text)
text = _convert_links(text)
text = _strip_headings(text)
text = _strip_table_syntax(text)
return text.strip()
def markdown_to_zoom(md_text: str) -> str:
return clean_for_zoom(md_text)
def sanitize_text(text: str) -> str:
"""
清理文本以适配 Zoom Chat 的 Markdown 限制。
去除 Zoom 不支持的 Markdown 语法:
- 删除线 (~~text~~) → text
- 链接 ([text](url)) → text ( url )
- 标题 (# title) → *title* (一级) 或 title (其余)
- 表格 → 空格分隔的纯文本
Args:
text: 原始 Markdown 文本
Returns:
清理后的纯文本
"""
return clean_for_zoom(text)
def native_to_markdown(native_content: dict | str) -> str:
if isinstance(native_content, dict):
return native_content.get("content", native_content.get("text", ""))
return str(native_content)