# coding=utf-8 """ 平台标题格式化模块 提供多平台标题格式化功能 """ from typing import Dict from trendradar.report.helpers import clean_title, html_escape, format_rank_display def format_title_for_platform( platform: str, title_data: Dict, show_source: bool = True ) -> str: """统一的标题格式化方法 为不同平台生成对应格式的标题字符串。 Args: platform: 目标平台,支持: - "feishu": 飞书 - "dingtalk": 钉钉 - "wework": 企业微信 - "bark": Bark - "telegram": Telegram - "ntfy": ntfy - "slack": Slack - "html": HTML 报告 title_data: 标题数据字典,包含以下字段: - title: 标题文本 - source_name: 来源名称 - time_display: 时间显示 - count: 出现次数 - ranks: 排名列表 - rank_threshold: 高亮阈值 - url: PC端链接 - mobile_url: 移动端链接(优先使用) - is_new: 是否为新增标题(可选) show_source: 是否显示来源名称 Returns: 格式化后的标题字符串 """ rank_display = format_rank_display( title_data["ranks"], title_data["rank_threshold"], platform ) link_url = title_data["mobile_url"] or title_data["url"] cleaned_title = clean_title(title_data["title"]) if platform == "feishu": if link_url: formatted_title = f"[{cleaned_title}]({link_url})" else: formatted_title = cleaned_title title_prefix = "🆕 " if title_data.get("is_new") else "" if show_source: result = f"[{title_data['source_name']}] {title_prefix}{formatted_title}" else: result = f"{title_prefix}{formatted_title}" if rank_display: result += f" {rank_display}" if title_data["time_display"]: result += f" - {title_data['time_display']}" if title_data["count"] > 1: result += f" ({title_data['count']}次)" return result elif platform == "dingtalk": if link_url: formatted_title = f"[{cleaned_title}]({link_url})" else: formatted_title = cleaned_title title_prefix = "🆕 " if title_data.get("is_new") else "" if show_source: result = f"[{title_data['source_name']}] {title_prefix}{formatted_title}" else: result = f"{title_prefix}{formatted_title}" if rank_display: result += f" {rank_display}" if title_data["time_display"]: result += f" - {title_data['time_display']}" if title_data["count"] > 1: result += f" ({title_data['count']}次)" return result elif platform in ("wework", "bark"): # WeWork 和 Bark 使用 markdown 格式 if link_url: formatted_title = f"[{cleaned_title}]({link_url})" else: formatted_title = cleaned_title title_prefix = "🆕 " if title_data.get("is_new") else "" if show_source: result = f"[{title_data['source_name']}] {title_prefix}{formatted_title}" else: result = f"{title_prefix}{formatted_title}" if rank_display: result += f" {rank_display}" if title_data["time_display"]: result += f" - {title_data['time_display']}" if title_data["count"] > 1: result += f" ({title_data['count']}次)" return result elif platform == "telegram": if link_url: formatted_title = f'{html_escape(cleaned_title)}' else: formatted_title = cleaned_title title_prefix = "🆕 " if title_data.get("is_new") else "" if show_source: result = f"[{title_data['source_name']}] {title_prefix}{formatted_title}" else: result = f"{title_prefix}{formatted_title}" if rank_display: result += f" {rank_display}" if title_data["time_display"]: result += f" - {title_data['time_display']}" if title_data["count"] > 1: result += f" ({title_data['count']}次)" return result elif platform == "ntfy": if link_url: formatted_title = f"[{cleaned_title}]({link_url})" else: formatted_title = cleaned_title title_prefix = "🆕 " if title_data.get("is_new") else "" if show_source: result = f"[{title_data['source_name']}] {title_prefix}{formatted_title}" else: result = f"{title_prefix}{formatted_title}" if rank_display: result += f" {rank_display}" if title_data["time_display"]: result += f" `- {title_data['time_display']}`" if title_data["count"] > 1: result += f" `({title_data['count']}次)`" return result elif platform == "slack": # Slack 使用 mrkdwn 格式 if link_url: # Slack 链接格式: formatted_title = f"<{link_url}|{cleaned_title}>" else: formatted_title = cleaned_title title_prefix = "🆕 " if title_data.get("is_new") else "" if show_source: result = f"[{title_data['source_name']}] {title_prefix}{formatted_title}" else: result = f"{title_prefix}{formatted_title}" # 排名(使用 * 加粗) rank_display = format_rank_display( title_data["ranks"], title_data["rank_threshold"], "slack" ) if rank_display: result += f" {rank_display}" if title_data["time_display"]: result += f" `- {title_data['time_display']}`" if title_data["count"] > 1: result += f" `({title_data['count']}次)`" return result elif platform == "html": rank_display = format_rank_display( title_data["ranks"], title_data["rank_threshold"], "html" ) link_url = title_data["mobile_url"] or title_data["url"] escaped_title = html_escape(cleaned_title) escaped_source_name = html_escape(title_data["source_name"]) if link_url: escaped_url = html_escape(link_url) formatted_title = f'[{escaped_source_name}] {escaped_title}' else: formatted_title = ( f'[{escaped_source_name}] {escaped_title}' ) if rank_display: formatted_title += f" {rank_display}" if title_data["time_display"]: escaped_time = html_escape(title_data["time_display"]) formatted_title += f" - {escaped_time}" if title_data["count"] > 1: formatted_title += f" ({title_data['count']}次)" if title_data.get("is_new"): formatted_title = f"
🆕 {formatted_title}
" return formatted_title else: return cleaned_title