markdown-it和highlight.js的结合渲染代码,并添加自定义行号

一般写博客都采用md格式,快捷方便,但是写好之后为了方便查看,我们需要将md格式的代码解析。

markdown-it

本示例中采用的是markdown-it来解析md格式的代码。

highlight.js

本示例中采用的是highlight.js来进行代码高亮显示。

但是highlight.js不支持行号,这会导致代码看起来不方便,本示例结合给博客的highlight.js添加行号和行号高亮中的方法来给代码添加行号。

const MarkdownIt = require('markdown-it')
const hljs = require('highlight.js')
const md = new MarkdownIt({
  html: true,
  linkify: true,
  typographer: true,
  highlight: function (str, lang) {
  	// 此处判断是否有添加代码语言
    if (lang && hljs.getLanguage(lang)) {
      try {
      	// 得到经过highlight.js之后的html代码
        const preCode = hljs.highlight(lang, str, true).value
        // 以换行进行分割
        const lines = preCode.split(/\n/).slice(0, -1)
        // 添加自定义行号
        let html = lines.map((item, index) => {
          return '<li><span class="line-num" data-line="' + (index + 1) + '"></span>' + item + '</li>'
        }).join('')
        html = '<ol>' + html + '</ol>'
        // 添加代码语言
        if (lines.length) {
          html += '<b class="name">' + lang + '</b>'
        }
        return '<pre class="hljs"><code>' +
          html +
          '</code></pre>'
      } catch (__) {}
    }
	// 未添加代码语言,此处与上面同理
    const preCode = md.utils.escapeHtml(str)
    const lines = preCode.split(/\n/).slice(0, -1)
    let html = lines.map((item, index) => {
      return '<li><span class="line-num" data-line="' + (index + 1) + '"></span>' + item + '</li>'
    }).join('')
    html = '<ol>' + html + '</ol>'
    return '<pre class="hljs"><code>' +
      html +
      '</code></pre>'
  }
})

// req.body.content 代表md代码
let articleContentHtml = md.render(`@[toc]${req.body.content}`)

在vue中的渲染

<template>
  <!-- 渲染生成的html代码 -->
  <div class="article-content" v-html="info.articleContentHtml"></div>
</template>

<script>
// 引入默认样式
import 'highlight.js/scss/default.scss'
// 引入个性化的vs2015样式
import 'highlight.js/styles/vs2015.css'
</script>

<style lang="scss">
// 添加行号样式
pre.hljs {
  padding: 8px 2px;
  border-radius: 5px;
  position: relative;
  ol {
    list-style: decimal;
    margin: 0;
    margin-left: 40px;
    padding: 0;
    li {
      list-style: decimal-leading-zero;
      position: relative;
      padding-left: 10px;
      .line-num {
        position: absolute;
        left: -40px;
        top: 0;
        width: 40px;
        height: 100%;
        border-right: 1px solid rgba(0, 0, 0, .66);
      }
    }
  }
  b.name {
    position: absolute;
    top: 2px;
    right: 12px;
    z-index: 10;
    color: #999;
    pointer-events: none;
  }
}
</style>

渲染之后的样式如下:
在这里插入图片描述
在代码中更详细的使用可查看vue-blogvue-blog-express

使用Vue3脚手架,可以使用marked库将Markdown文件渲染成HTML页面,并通过highlight.js库实现代码块的高亮和行号显示。下面是具体的步骤: 1. 安装所需的库 使用npm或yarn安装marked和highlight.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页面,并且代码块会被高亮并且显示行号
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值