# coding=utf-8 """ 报告辅助函数模块 提供报告生成相关的通用辅助函数 """ import re from typing import List def clean_title(title: str) -> str: """清理标题中的特殊字符 清理规则: - 将换行符(\n, \r)替换为空格 - 将多个连续空白字符合并为单个空格 - 去除首尾空白 Args: title: 原始标题字符串 Returns: 清理后的标题字符串 """ if not isinstance(title, str): title = str(title) cleaned_title = title.replace("\n", " ").replace("\r", " ") cleaned_title = re.sub(r"\s+", " ", cleaned_title) cleaned_title = cleaned_title.strip() return cleaned_title def html_escape(text: str) -> str: """HTML特殊字符转义 转义规则(按顺序): - & → & - < → < - > → > - " → " - ' → ' Args: text: 原始文本 Returns: 转义后的文本 """ if not isinstance(text, str): text = str(text) return ( text.replace("&", "&") .replace("<", "<") .replace(">", ">") .replace('"', """) .replace("'", "'") ) def format_rank_display(ranks: List[int], rank_threshold: int, format_type: str) -> str: """格式化排名显示 根据不同平台类型生成对应格式的排名字符串。 当最小排名小于等于阈值时,使用高亮格式。 Args: ranks: 排名列表(可能包含重复值) rank_threshold: 高亮阈值,小于等于此值的排名会高亮显示 format_type: 平台类型,支持: - "html": HTML格式 - "feishu": 飞书格式 - "dingtalk": 钉钉格式 - "wework": 企业微信格式 - "telegram": Telegram格式 - "slack": Slack格式 - 其他: 默认markdown格式 Returns: 格式化后的排名字符串,如 "[1]" 或 "[1 - 5]" 如果排名列表为空,返回空字符串 """ if not ranks: return "" unique_ranks = sorted(set(ranks)) min_rank = unique_ranks[0] max_rank = unique_ranks[-1] # 根据平台类型选择高亮格式 if format_type == "html": highlight_start = "" highlight_end = "" elif format_type == "feishu": highlight_start = "**" highlight_end = "**" elif format_type == "dingtalk": highlight_start = "**" highlight_end = "**" elif format_type == "wework": highlight_start = "**" highlight_end = "**" elif format_type == "telegram": highlight_start = "" highlight_end = "" elif format_type == "slack": highlight_start = "*" highlight_end = "*" else: # 默认 markdown 格式 highlight_start = "**" highlight_end = "**" # 生成排名显示 if min_rank <= rank_threshold: if min_rank == max_rank: return f"{highlight_start}[{min_rank}]{highlight_end}" else: return f"{highlight_start}[{min_rank} - {max_rank}]{highlight_end}" else: if min_rank == max_rank: return f"[{min_rank}]" else: return f"[{min_rank} - {max_rank}]"