图片识别
This commit is contained in:
@@ -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(/&/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(/&/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>');
|
||||
}
|
||||
|
||||
|
||||
@@ -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 `<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(/&/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;
|
||||
|
||||
Reference in New Issue
Block a user