图片识别

This commit is contained in:
李鹏宇
2026-06-12 16:51:35 +08:00
parent 3f8dc84241
commit 3c88e17986
4 changed files with 40 additions and 16 deletions
@@ -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 {
@@ -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 {
@@ -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(/&amp;/g, '&');
return `<a class="o_ai_link_card" href="${rawUrl}" target="_blank" rel="noopener noreferrer" title="${rawUrl}"><span class="o_ai_link_icon"><i class="fa fa-external-link"></i></span><span class="o_ai_link_domain">${this._escapeHtml(label)}</span></a>`;
}
);
// 2) 再处理裸 URL → 域名作为卡片名称
display = display.replace(
/(https?:\/\/[^\s<>"'\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]+)/g,
(url) => {
const rawUrl = url.replace(/&amp;/g, '&');
let domain = '';
try { domain = new URL(rawUrl).hostname; } catch (_) { domain = rawUrl; }
return `<a class="o_ai_link_card" href="${rawUrl}" target="_blank" rel="noopener noreferrer" title="${rawUrl}"><span class="o_ai_link_icon"><i class="fa fa-external-link"></i></span><span class="o_ai_link_domain">${this._escapeHtml(domain)}</span></a>`;
}
);
return display.replace(/\n/g, '<br>');
}
+22 -1
View File
@@ -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(/&amp;/g, '&');
return `<a class="o_ai_link_card" href="${rawUrl}" target="_blank" rel="noopener noreferrer" title="${rawUrl}"><span class="o_ai_link_icon"><i class="fa fa-external-link"></i></span><span class="o_ai_link_domain">${escapeHtml(label)}</span></a>`;
}
);
// 2) 再处理裸 URL → 域名作为卡片名称
display = display.replace(
/(https?:\/\/[^\s<>"'\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]+)/g,
(url) => {
const rawUrl = url.replace(/&amp;/g, '&');
let domain = '';
try {
domain = new URL(rawUrl).hostname;
} catch (_) {
domain = rawUrl;
}
return `<a class="o_ai_link_card" href="${rawUrl}" target="_blank" rel="noopener noreferrer" title="${rawUrl}"><span class="o_ai_link_icon"><i class="fa fa-external-link"></i></span><span class="o_ai_link_domain">${escapeHtml(domain)}</span></a>`;
}
);
// 换行转 <br>
display = display.replace(/\n/g, '<br>');
return display;