ForcePilot/backend/package/yuxi/channel/extensions/twitter/format.py
Kris 1c590097be feat(channel): 添加 Twitter 和 Viber 渠道扩展
新增 Twitter 和 Viber 两个渠道扩展。

Twitter 渠道扩展功能模块:
- auth: OAuth 认证管理
- config: 渠道配置管理
- gateway: SSE/WebSocket 网关接入
- webhook: Webhook 事件处理
- outbound: 外发消息管理
- streaming: 流式消息处理
- pairing: 用户配对与绑定
- security: 安全校验
- dedupe: 消息去重
- monitor: 渠道状态监控
- status: 会话状态管理
- session: 会话管理
- tweets: 推文管理
- social: 社交互动
- reactions: 表情反应
- media: 媒体资源处理

Viber 渠道扩展功能模块:
- config: 渠道配置管理
- gateway: SSE/WebSocket 网关接入
- webhook: Webhook 事件处理
- outbound: 外发消息管理
- streaming: 流式消息处理
- pairing: 用户配对与绑定
- security: 安全校验
- dedupe: 消息去重
- monitor: 渠道状态监控
- status: 会话状态管理
- rate_limiter: 速率限制
- media: 媒体资源处理
2026-05-21 11:57:22 +08:00

63 lines
1.7 KiB
Python

from __future__ import annotations
import re
TEXT_CHUNK_LIMIT = 10000
_MD_IMAGE_RE = re.compile(r"!\[.*?\]\([^)]+\)")
_MD_LINK_RE = re.compile(r"\[([^\]]+)\]\(([^)]+)\)")
_MD_BOLD_RE = re.compile(r"\*\*(.+?)\*\*")
_MD_ITALIC_RE = re.compile(r"(?<!\w)[*_](.+?)[*_](?!\w)")
_MD_CODE_RE = re.compile(r"`([^`]+)`")
_MD_CODE_BLOCK_RE = re.compile(r"```[\s\S]*?```")
def markdown_to_plain_text(md_text: str) -> str:
text = md_text
text = _MD_IMAGE_RE.sub("[图片]", text)
text = _MD_LINK_RE.sub(r"\1 (\2)", text)
text = _MD_BOLD_RE.sub(r"\1", text)
text = _MD_ITALIC_RE.sub(r"\1", text)
text = _MD_CODE_BLOCK_RE.sub("", text)
text = _MD_CODE_RE.sub(r"\1", text)
text = text.replace("\r\n", "\n").replace("\r", "\n")
text = re.sub(r"\n{3,}", "\n\n", text)
return text.strip()
def split_text_chunks(text: str, limit: int = TEXT_CHUNK_LIMIT) -> list[str]:
if len(text) <= limit:
return [text]
chunks: list[str] = []
paragraphs = text.split("\n\n")
current = ""
for para in paragraphs:
if len(current) + len(para) + 2 <= limit:
current = (current + "\n\n" + para) if current else para
else:
if current:
chunks.append(current)
if len(para) > limit:
for i in range(0, len(para), limit):
chunks.append(para[i : i + limit])
current = ""
else:
current = para
if current:
chunks.append(current)
return chunks if chunks else [text]
def markdown_to_native(md_text: str) -> str:
return markdown_to_plain_text(md_text)
def native_to_markdown(native_content: str) -> str:
return native_content