优化: MCP 收尾(update原子CAS治TOCTOU/advance_task数据变更映射/list_trash分页) + miniapp渲染收尾(mention chip可视化/代码块语言标签) + 销账
This commit is contained in:
@@ -130,23 +130,34 @@ function inlineHljs(html: string): string {
|
||||
})
|
||||
}
|
||||
|
||||
/** 代码块语言徽标(rich-text 内联 style;块代码顶部展示 fence lang,无 lang 不调用)。 */
|
||||
function codeLangBadge(lang: string): string {
|
||||
// 块级 div(pre 深底上浅灰标签 + 圆角,pre 自身已有内边距),放 <code> 前占据顶部一行
|
||||
return `<div style="font-size:10px;color:#9e9e9e;background-color:#2e2e2e;padding:1px 8px;border-radius:4px;margin-bottom:6px">${lang}</div>`
|
||||
}
|
||||
|
||||
/**
|
||||
* 块代码语法高亮:仅处理已知语言,未知/无语言兜底原样(确定性强,不做自动猜测)。
|
||||
* marked 已对代码内容做 HTML 转义,先反转还原再交给 hljs(hljs 输出自带转义)。
|
||||
* 同时补语言徽标:围栏有 lang 即显示(用原始标识如 ts,更贴近用户书写),无 lang 不显示。
|
||||
*/
|
||||
function highlightCodeBlocks(html: string): string {
|
||||
return html.replace(/<pre><code([^>]*)>([\s\S]*?)<\/code><\/pre>/gi, (m, attrs: string, inner: string) => {
|
||||
const langMatch = /class="language-([^"]+)"/i.exec(attrs)
|
||||
const langRaw = langMatch ? langMatch[1] : ''
|
||||
const lang = LANG_ALIASES[langRaw] ?? langRaw
|
||||
if (!lang || !hljs.getLanguage(lang)) return m
|
||||
const badge = langRaw ? codeLangBadge(langRaw) : ''
|
||||
if (!lang || !hljs.getLanguage(lang)) {
|
||||
// 未注册语言:不高亮但保留徽标(fence 有 lang 时),避免 ` ```未知lang ` 丢语言标签
|
||||
return badge ? `<pre><code${attrs}>${badge}${inner}</code></pre>` : m
|
||||
}
|
||||
let value: string
|
||||
try {
|
||||
value = hljs.highlight(unescapeCode(inner), { language: lang, ignoreIllegals: true }).value
|
||||
} catch {
|
||||
return m
|
||||
return badge ? `<pre><code${attrs}>${badge}${inner}</code></pre>` : m
|
||||
}
|
||||
return `<pre><code${attrs}>${inlineHljs(value)}</code></pre>`
|
||||
return `<pre><code${attrs}>${badge}${inlineHljs(value)}</code></pre>`
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user