// 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;