Highlight.js实现显示行号(改造highlightjs-line-number)

一、问题描述

看到csdn官方博客在代码块内实现了添加行号的功能,于是百度了一下实现方案,简单的概括一下就是通过正则表达式匹配代码块中换行符替换为

  • 以实现添加行号的功能,但是该方法存在多行注释失效的问题,如下图所示,想了好久都没能找到解决的办法

    Highlight.js实现显示行号(改造highlightjs-line-number)_第1张图片

    二、解决方案

    我通过打开csdn页面,调用浏览器控制台进行搜索发现了csdn使用的添加行号插件的名称,那就是highlightjs-line-numer,但是该插件的语法仍然是老版本的语法,并且代码也存在一些问题,于是直接下载到本地,并进行一点点的修改,代码已经上传到gitee了,git地址为
    [email protected]:zhou-jian-guo/highlight_line_number.git

    可以直接将js代码拷贝到自己的项目内,代码如下,在我的项目中,除了使用这个实现代码添加行号以外,还增加了代码一键复制的按钮:

    Vue.directive('highlight', {
        update(el){
            let blocks = el.querySelectorAll('pre code');
            blocks.forEach((block)=>{
                if(block.getAttribute("highlighted")=="true"){
                    return
                }
                block.setAttribute("highlighted","true")
                let code = block.innerHTML// block.innerHTML="
    "+ "test"+""+block.innerHTML+"
    " hljs.highlightElement(block) lineNumbersBlock(block) block.innerHTML="
    "+ block.className.match(/(?<=language-).*(?= hljs)/).toString()+"
    "+block.innerHTML+"
    " let copyButton = block.querySelector('button') if(copyButton!=null){ copyButton.onclick = function (){ copy(code) Message.success({message:"复制成功!", offset:100}) } } }) } })

    修改行号样式

    .hljs-ln-numbers {
            text-align: center;
            color: #ccc;
            border-right: 1px solid #CCC;
            vertical-align: top;
            padding-right: 5px !important;
    
            /* your custom style here */
        }
    
    /* for block of code */
     .hljs-ln-code {
            padding-left: 5px !important;
    	}

    三、其他注意事项

    使用highlight.js的时候需要按需加载,否则打包后的前端项目包会非常的大,按需加载方法如下图所示

    //按需加载代码高亮组件
    hljs.registerLanguage('bash', require('highlight.js/lib/languages/bash'))
    hljs.registerLanguage('java', require('highlight.js/lib/languages/java'))
    hljs.registerLanguage('javascript', require('highlight.js/lib/languages/javascript'))
    hljs.registerLanguage('python', require('highlight.js/lib/languages/python'))
    hljs.registerLanguage('sql', require('highlight.js/lib/languages/sql'))
    hljs.registerLanguage('html', require('highlight.js/lib/languages/xml'))
    hljs.registerLanguage('css', require('highlight.js/lib/languages/css'))
    hljs.registerLanguage('xml', require('highlight.js/lib/languages/xml'))
    hljs.registerLanguage('c', require('highlight.js/lib/languages/c'))
    hljs.registerLanguage('c++', require('highlight.js/lib/languages/cpp'))
    hljs.registerLanguage('json', require('highlight.js/lib/languages/json'))
    //富文本插件代码块的配置属性
    Vue.prototype.languages=[
        {language: 'bash', label: 'Bash'},
        {language: 'java',label: 'Java'},
        {language: 'javascript',label: 'JavaScript'},
        {language: 'python', label: 'Python'},
        {language: 'sql', label: 'SQL'},
        {language: 'html',label: 'HTML'},
        {language: 'css',label: 'CSS'},
        {language: 'xml',label: 'XML'},
        { language: 'c', label: 'C' },
        {language: 'c++', label: 'C++'},
        {language: 'json',label: 'JSON'}
    ]
  • 你可能感兴趣的:(个人笔记,前端,javascript)