// src/components/Citation/CitedContent.js import React from 'react'; import { Typography, Tag } from 'antd'; import { RobotOutlined } from '@ant-design/icons'; import CitationMark from './CitationMark'; import { processCitationData } from '../../utils/citationUtils'; import { logger } from '../../utils/logger'; const { Text } = Typography; /** * 带引用标注的内容组件(块级模式) * 展示拼接的文本,每句话后显示上标引用【1】【2】【3】 * 支持鼠标悬浮和点击查看引用来源 * AI 标识统一显示在右上角,不占用布局高度 * * @param {Object} props * @param {Object} props.data - API 返回的原始数据 { data: [...] } * @param {string} props.title - 标题文本,默认 "AI 分析结果" * @param {string} props.prefix - 内容前的前缀标签,如 "机制:"(可选) * @param {Object} props.prefixStyle - 前缀标签的自定义样式(可选) * @param {boolean} props.showAIBadge - 是否显示右上角 AI 标识,默认 true(可选) * @param {Object} props.containerStyle - 容器额外样式(可选) * @param {string} props.textColor - 文本颜色,默认自动判断背景色(可选) * @param {string} props.titleColor - 标题颜色,默认继承 textColor(可选) * * @example * */ const CitedContent = ({ data, title = 'AI 分析结果', prefix = '', prefixStyle = {}, showAIBadge = true, containerStyle = {}, textColor, titleColor }) => { // 处理数据 const processed = processCitationData(data); // 如果数据无效,不渲染 if (!processed) { logger.warn('CitedContent', '无效数据,不渲染', { hasData: !!data, title }); return null; } // 自动判断文本颜色:如果容器背景是深色,使用浅色文本 const bgColor = containerStyle.backgroundColor; const isDarkBg = bgColor && ( bgColor.includes('rgba(0,0,0') || bgColor.includes('rgba(0, 0, 0') || bgColor === 'transparent' || bgColor.includes('#1A202C') || bgColor.includes('#171923') ); const finalTextColor = textColor || (isDarkBg ? '#E2E8F0' : '#262626'); const finalTitleColor = titleColor || finalTextColor; return (
{/* 标题栏 */} {title && (
{title}
)} {/* 带引用的文本内容 */}
{/* AI 标识 - 行内显示在文字前面 */} {showAIBadge && ( } color="purple" style={{ fontSize: 12, padding: '2px 8px', marginRight: 8, verticalAlign: 'middle', display: 'inline-flex', }} className="ai-badge-responsive" > AI合成 )} {/* 前缀标签(如果有) */} {prefix && ( {prefix} )} {processed.segments.map((segment, index) => ( {/* 文本片段 */} {segment.text} {/* 引用标记 */} {/* 在片段之间添加逗号分隔符(最后一个不加) */} {index < processed.segments.length - 1 && ( )} ))}
{/* 响应式样式 */}
); }; export default CitedContent;