使用marked和highlight.js对GPT接口返回的代码块渲染,高亮显示,支持复制,和选择不同的高亮样式

最近随着chatGPT越来越火,各大公司都基于gpt衍生了一些业务,其中比较多的是使用openAI搭建自己公司内部使用的问答项目,搭配回答问题中,嵌入公司自身的产品等。

openAI接口,返回的回答通过div中dangerouslySetInnerHTML属性嵌入,能够有较好的显示样式,但是对越代码块部分,显示不够显眼,对其中的代码进行高亮和支持代码复制功能变得必不可少。

使用效果:
image.png

marked 是一个流行的 JavaScript 库,用于将 Markdown 格式的文本转换为 HTML。它提供了简单易用的 API,使得在网页中渲染和展示 Markdown 内容变得非常方便。

要使用 marked 插件,首先需要引入 marked 库。你可以通过以下几种方式之一来获取并引入 marked

  1. 通过 CDN 引入:
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
  1. 使用 NPM 安装:
npm install marked

然后在你的 JavaScript 文件中导入 marked

import marked from 'marked';
  1. 使用marked对代码块进行高亮显示和增加复制功能:
<div className={styles["content-items"]}
     dangerouslySetInnerHTML={{ __html: 
     marked(item.content, {
        highlight: function (code, language) {
        // 通过时间戳生成唯一标识
        const codeIndex = parseInt(Date.now() + "") + Math.floor(Math.random() * 10000000);
        // 格式化第一行是右侧language和 “复制” 按钮;
        let html = ` 
            <div class=${styles["code-block-header"]}>
                <span>${language}</span>
                <span id='copy-btn'data-clipboard-action="copy" data-clipboard-target="#copy${codeIndex}">复制代码</span>
            </div>
            `;
        
        //代码部分
        if (code) {
           try {
           // 使用 highlight.js 对代码进行高亮显示
              const preCode = hljs.highlightAuto(code).value;
              // 将代码包裹在 textarea 中,由于防止textarea渲染出现问题,这里将 "<" 用 "&lt;" 代替,不影响复制功能
              return `<pre class='${styles["hljs-customer"]} hljs'>
                          <code>${preCode}</code>
                      </pre>
                      <textarea style="position: absolute;top: -9999px;left: -9999px;z-index: -9999;" id="copy${codeIndex}">${code.replace(/<\/textarea>/g,"&lt;/textarea>")}</textarea>`;
            } catch (error) {
               console.log(error);
              }
          }
        }}) as string,
      =}}
    />
  </div>
  1. 复制部分代码:
const clipboard = new Clipboard("#copy-btn");
    // 复制成功失败的提示
    clipboard.on("success", (e) => {
      message.success(
        intl.formatMessage({
          id: "contentPage.复制成功",
        })
      );
    });
    clipboard.on("error", (e) => {
      message.error(
        intl.formatMessage({
          id: "contentPage.复制失败",
        })
      );
    });

放在项目组件初始化的生命周期函数中,react放在useEffect中,vue放在mounted中。

5.根据喜好,选择不同的highlight样式:
highlight.js提供了多种高亮显示样式,官网链接

image.png

引入样式方式:

import "highlight.js/styles/paraiso-light.css";
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用Vue3脚手架,可以使用marked库将Markdown文件渲染成HTML页面,并通过highlight.js库实现代码块高亮和行号显示。下面是具体的步骤: 1. 安装所需的库 使用npm或yarn安装markedhighlight.js库: ```shell npm install marked highlight.js --save ``` 2. 创建一个Markdown文件 在src目录下创建一个Markdown文件,例如example.md,用于测试渲染Markdown的功能。 ```markdown # Hello, world! 这是一个示例Markdown文件。 ## 代码块 ```js function hello() { console.log("Hello, world!"); } ``` 以上是一个JavaScript代码块。 ## 列表 - 列表项1 - 列表项2 - 列表项3 ``` 3. 创建一个Markdown组件 在src/components目录下创建一个Markdown组件,例如Markdown.vue,用于渲染Markdown文件。 ```vue <template> <div v-html="markdown"></div> </template> <script> import marked from "marked"; import hljs from "highlight.js"; export default { name: "Markdown", props: { source: String, }, computed: { markdown() { return marked(this.source, { highlight: function (code, lang) { if (lang && hljs.getLanguage(lang)) { return hljs.highlight(lang, code).value; } return hljs.highlightAuto(code).value; }, langPrefix: "hljs language-", breaks: true, gfm: true, }); }, }, }; </script> <style> .hljs-line-numbers { text-align: right; border-right: 1px solid #ccc; color: #999; padding-right: 5px; } </style> ``` 在组件中,我们使用marked库将Markdown文件渲染成HTML页面,通过props属性接受Markdown文件的路径或字符串。同时,我们传递一个highlight函数给marked库,使用highlight.js代码块进行高亮。另外,我们使用hljs-line-numbers类为代码块添加行号显示。 4. 在页面中使用Markdown组件 在需要显示Markdown文件的页面中,引入Markdown组件,传递Markdown文件的路径或字符串作为source属性的值。 ```vue <template> <div> <Markdown :source="markdown" /> </div> </template> <script> import Markdown from "@/components/Markdown.vue"; import exampleMarkdown from "@/example.md"; export default { name: "App", components: { Markdown, }, data() { return { markdown: exampleMarkdown, }; }, }; </script> ``` 在页面中引入Markdown组件,并将example.md文件作为markdown属性的值传递给Markdown组件。 这样,当页面加载时,Markdown组件将会把example.md文件渲染成HTML页面,并且代码块会被高亮并且显示行号。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值