解析代码块
javascript
import hljs from 'highlight.js'; // 导入 highlight.js 库,用于代码语法高亮
import hljsVba from 'highlightjs-vba'; // 导入 VBA 语言支持
import { Renderer } from 'marked'; // 从 marked 库中导入 Renderer 类
// 注册 VBA 语言到 highlight.js
hljs.registerLanguage('vba', hljsVba);
// 页面加载时初始化代码高亮
hljs.initHighlightingOnLoad();
/**
* 自定义 MarkedRenderer 类,继承自 marked 的 Renderer 类
*/
export class MarkedRenderer extends Renderer {
/**
* 重写 code 方法,用于处理代码块的渲染。
*
* @param code - 代码内容字符串。
* @param language - 代码语言(可选)。
* @returns 包含高亮和工具栏的 HTML 字符串。
*/
override code(code: string, language: string) {
// 根据指定语言进行语法高亮,如果未指定语言则自动检测
const result = language && hljs.getLanguage(language)
? hljs.highlight(language, code)
: hljs.highlightAuto(code);
// 定义代码块工具栏的 HTML,包括显示语言和复制按钮
const toolbar = `<div class="codeblock-toolbar">
<div class="codeblock-language">${result.language}</div>
<div class="codeblock-copy">
<svg class="codeblock-copy-before" viewBox="0 0 24 24" style="width: 16px; height: 16px;">
<path fill="#fff" d="M19,3H14.82C14.4,1.84 13.3,1 12,1C10.7,1 9.6,1.84 9.18,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M12,3A1,1 0 0,1 13,4A1,1 0 0,1
A12,A5,A1,A1,A11,A4,A1,A1,A12,A3M7,A7,H17,V5,H19,V19,H5,V5,H7,V7Z"></path>
</svg>
<svg class="codeblock-copy-after" viewBox="64 64 896 896" focusable="false" fill="currentColor" width="1em" height="1em" data-icon="check" aria-hidden="true">
<path d="M912..."></path>
</svg>
</div>
</div>`;
// 定义代码内容的 HTML,包含预格式化标签和代码标签,并应用高亮样式
const content = `<pre><code class="hljs language-${result.language}">${result.value}</code></pre>`;
// 返回完整的代码块 HTML,包括工具栏和内容
return `<div class="codeblock">${toolbar}${content}</div>`;
}
/**
* 重写 link 方法,用于处理链接的渲染。
*
* @param href - 链接地址。
* @param title - 链接标题(可选)。
* @param text - 链接文本。
* @returns 渲染后的链接 HTML 字符串。
*/
override link(href: string, title: string | null | undefined, text: string) {
if (title === undefined) {
// 如果没有 title,则不生成链接(可以根据需求修改逻辑)
return '';
}
// 调用父类的 link 方法生成基础链接 HTML
const link = Renderer.prototype.link.call(this, href, title, text);
if (text.length === 1) {
// 如果链接文本长度为1,添加 target='_blank' 和 'custom-link' 类名
return link.replace('<a', '<a target="_blank" class="custom-link"');
} else {
// 否则仅添加 target='_blank'
return link.replace('<a', '<a target="_blank"');
}
}
}