diff --git a/yuthon_ai_agent/static/src/css/ai_chat.css b/yuthon_ai_agent/static/src/css/ai_chat.css index 6ef96cd39..52aecc9a7 100644 --- a/yuthon_ai_agent/static/src/css/ai_chat.css +++ b/yuthon_ai_agent/static/src/css/ai_chat.css @@ -157,13 +157,6 @@ font-size: 12px; white-space: nowrap; } -.o_ai_link_url { - font-size: 11px; - opacity: 0.7; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} /* === 消息中附件缩略图 === */ .ai-chat-msg-attachments { diff --git a/yuthon_ai_agent/static/src/css/ai_floating.css b/yuthon_ai_agent/static/src/css/ai_floating.css index 218b97fdc..85bc69b4e 100644 --- a/yuthon_ai_agent/static/src/css/ai_floating.css +++ b/yuthon_ai_agent/static/src/css/ai_floating.css @@ -366,13 +366,6 @@ font-size: 12px; white-space: nowrap; } -.o_ai_link_url { - font-size: 11px; - opacity: 0.7; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} /* === 消息中的附件缩略图 === */ .o_ai_msg_attachments { diff --git a/yuthon_ai_agent/static/src/js/ai_chat_action.js b/yuthon_ai_agent/static/src/js/ai_chat_action.js index c0f784c49..673d1daf1 100644 --- a/yuthon_ai_agent/static/src/js/ai_chat_action.js +++ b/yuthon_ai_agent/static/src/js/ai_chat_action.js @@ -35,7 +35,24 @@ export class AiChatAction extends Component { .replace(/【附件:[^】]+】[\s\S]*?--- 附件内容结束 ---/g, '') .replace(/\[附件[::]\s*[^\]]+\]\n?/g, '') .trim() || safe; - // 不做额外处理,URL 保持纯文本显示 + // 1) 先处理 Markdown 风格链接 [显示名](url) → 卡片使用自定义名称 + display = display.replace( + /\[([^\]]+)\]\((https?:\/\/[^\s<>"')\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]+)\)/g, + (_, label, url) => { + const rawUrl = url.replace(/&/g, '&'); + return `${this._escapeHtml(label)}`; + } + ); + // 2) 再处理裸 URL → 域名作为卡片名称 + display = display.replace( + /(https?:\/\/[^\s<>"'\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]+)/g, + (url) => { + const rawUrl = url.replace(/&/g, '&'); + let domain = ''; + try { domain = new URL(rawUrl).hostname; } catch (_) { domain = rawUrl; } + return `${this._escapeHtml(domain)}`; + } + ); return display.replace(/\n/g, '
'); } diff --git a/yuthon_ai_agent/static/src/js/ai_floating.js b/yuthon_ai_agent/static/src/js/ai_floating.js index e0f36358b..3d21abca8 100644 --- a/yuthon_ai_agent/static/src/js/ai_floating.js +++ b/yuthon_ai_agent/static/src/js/ai_floating.js @@ -235,7 +235,28 @@ function renderContent(text) { .replace(/【附件:[^】]+】[\s\S]*?--- 附件内容结束 ---/g, '') .replace(/\[附件[::]\s*[^\]]+\]\n?/g, '') .trim() || safe; // 若 strip 后为空,回退到 safe 继续处理 URL - // 不做额外处理,URL 保持纯文本显示 + // 1) 先处理 Markdown 风格链接 [显示名](url) → 卡片使用自定义名称 + display = display.replace( + /\[([^\]]+)\]\((https?:\/\/[^\s<>"')\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]+)\)/g, + (_, label, url) => { + const rawUrl = url.replace(/&/g, '&'); + return `${escapeHtml(label)}`; + } + ); + // 2) 再处理裸 URL → 域名作为卡片名称 + display = display.replace( + /(https?:\/\/[^\s<>"'\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]+)/g, + (url) => { + const rawUrl = url.replace(/&/g, '&'); + let domain = ''; + try { + domain = new URL(rawUrl).hostname; + } catch (_) { + domain = rawUrl; + } + return `${escapeHtml(domain)}`; + } + ); // 换行转
display = display.replace(/\n/g, '
'); return display;