Prism & highlight.js高亮代码 & 手动添加行号

学习链接

漂亮的代码语法高亮插件Prism.js简单使用文档
Prism官网

Prism高亮代码(html版)

官网下载js和css

官网下载地址>>

在这里插入图片描述

代码1

效果

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引入prism.css -->
    <link rel="stylesheet" href="./prism/prism.css">
</head>

<body>
    <div style="width:500px;margin: 10px auto;">

        <!-- 一定要满足下面代码的dom结构,然后,再引入从prism官网下载的js -->
        <!-- 试了一下:将language-语言, 加在pre这个标签里面也是可以的; 将line-numbers加在code这个标签里也是可以的,都是一样的效果 -->
        <pre class="line-numbers">
            <code class="language-css">p { color: red }</code>
        </pre>

        <pre>
            <code class="language-java">
                package com.zzhua;

                import org.mybatis.spring.annotation.MapperScan;
                import org.springframework.boot.SpringApplication;
                import org.springframework.boot.autoconfigure.SpringBootApplication;

                @SpringBootApplication
                @MapperScan("com.zzhua.mapper")
                public class VueApp {
                    public static void main(String[] args) {
                        SpringApplication.run(VueApp.class);
                    }
                }

            </code>
        </pre>
    </div>
</body>

<!-- 引入jquery操作dom -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script>

<script>
    // 使用代码添加行号(这里是使用jquery给所有的 pre标签 加上 line-number 这个类名,也可以如上面自己手动加入这个类名),然后,再去引入prism.js,让prism生成行号相关的dom结构出来
    $('pre').each(function () {
      
      
        $(this).addClass('line-numbers');
    })
</script>

<!-- 让prism.js处理代码高亮 -->
<script src="./prism/prism.js"></script>

</html>

代码2

但通常使用这个插件的时候,是通过异步加载数据再渲染成html的,所以需要在加载完成之后,再高亮代码

效果

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引入prism.css -->
    <link rel="stylesheet" href="./prism/prism.css">
</head>

<body>
    <div style="width:500px;margin: 10px auto;" id="div1">

        <!-- 一定要满足下面代码的dom结构,然后,再引入从prism官网下载的js -->
        <!-- 试了一下:将language-语言, 加在pre这个标签里面也是可以的; 将line-numbers加在code这个标签里也是可以的,都是一样的效果 -->
        <pre class="line-numbers">
            <code class="language-css">p { color: red }</code>
        </pre>

        <pre>
            <code class="language-java">
                package com.zzhua;

                import org.mybatis.spring.annotation.MapperScan;
                import org.springframework.boot.SpringApplication;
                import org.springframework.boot.autoconfigure.SpringBootApplication;

                @SpringBootApplication
                @MapperScan("com.zzhua.mapper")
                public class VueApp {
                    public static void main(String[] args) {
                        SpringApplication.run(VueApp.class);
                    }
                }

            </code>
        </pre>
    </div>
</body>

<!-- 引入jquery操作dom -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script>

<script>
    // 使用代码添加行号(这里是使用jquery给所有的 pre标签 加上 line-number 这个类名,也可以如上面自己手动加入这个类名),然后,再去引入prism.js,让prism生成行号相关的dom结构出来
    $('pre').each(function () {
      
      
        $(this).addClass('line-numbers');
    })
</script>

<!-- 让prism.js处理代码高亮 -->
<script src="./prism/prism.js"></script>

<!-- 让prism.js处理代码高亮 -->
<script>
    setTimeout(()=>{
      
      
        $('#div1').append($(`
	        <pre class="line-numbers">
	            <code class="language-java">
		            public class Result {
		
		                private Integer code;
		
		                private String msg;
		
		                private T data;
		            }
		        </code>
	        </pre>
        `))
        // 会全局注册一个Prism对象,里面有方法:highlight、highlightAll、highlightElement、highlightAllUnder等书方法
        console.log(Prism)
        
        // Prism.highlightAll(); // 也可以这样
        
		let blocks = document.querySelectorAll("pre code");
        blocks.forEach((block) => {
      
      
            Prism.highlightElement(block);
        });
    }, 2000)
</script>
</html>

Prism高亮代码(vue版)

Vue页面代码高亮展示之Prism语法高亮工具
Vue中使用Prism来显示代码高亮
babel-plugin-prismjs -> www.npmjs.com
Nuxt3中使用prismjs高亮代码

highlight.js高亮代码(html版本)

highlight.js -> www.npmjs.com
JS库之Highlight.js高亮代码
程序员必备的代码高亮插件 Highlight.JS

highlight.js官网
1. 发现highlight.js官网下面的原来可以直接点击选择语言和主题,实时预览效果的阿
2. 在线选字体,使用在线链接:谷歌在线字体

也可以试试:highlight.js中文网,也可以在线预览效果的

代码

效果

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script>
    <style>
        .box {
      
      
            width: 500px;
            margin: 10px auto;
        }

		pre code.hljs {
      
      
            display: block;
            padding: 0;
            overflow-x: auto;
            font-family: 'Consolas', 'Courier New', monospace;
            font-weight: 400;
        }
    </style>
    <!-- 可以直接引入cdn -->
    <!-- <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/atom-one-dark.min.css">
    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script> -->

    <!-- 可以在官网下载 -->
    <script src="./hljs/highlight.min.js"></script><!-- 导入这个highlight.min.js,不要导入highlight.js,不然还要注册语言,有点麻烦 -->
    <link rel="stylesheet" href="./hljs/styles/atom-one-dark.min.css">
    <script>
        window.onload = function () {
      
      
        	// 它会在全局注册一个hljs,里面有highlightAll、highlightElement、highlightBlock、highlight等方法
            console.log(hljs);
            hljs.highlightAll()

            html = hljs.highlight('<h1>Hello World!</h1>', {
      
       language: 'xml' }).value
            console.log(html); // 输出:<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Hello World!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>

            setTimeout(() => {
      
      
                $('#div1').append($(`<pre><code>
                                        public class Result {

                                            private Integer code;

                                            private String msg;

                                            private T data;
                                        }
                                    </code>
                                </pre>`))

                // hljs.highlightAll() // 也可以这样

                let blocks = document.querySelectorAll("pre code");
                document.querySelectorAll('pre code').forEach((el) => {
      
      
                    hljs.highlightElement(el);
                });
            }, 1000)
        }
    </script>
</head>

<body>
    <div class="box">
        <pre>
            <code class="language-java">
                package com.zzhua;
    
                import org.mybatis.spring.annotation.MapperScan;
                import org.springframework.boot.SpringApplication;
                import org.springframework.boot.autoconfigure.SpringBootApplication;
    
                @SpringBootApplication
                @MapperScan("com.zzhua.mapper")
                public class VueApp {
                    public static void main(String[] args) {
                        SpringApplication.run(VueApp.class);
                    }
                }
    
            </code>
        </pre>
        <div id="div1"></div>
    </div>
</body>

</html>

原生js实现手动添加行号

参考:B站视频->给你的网页代码框添加一个行号吧!!!

代码

主要的实现思路:使用highlight.js给pre code添加高亮后,获取code标签下的所有html,在这个html里面,行与行之间有换行符的存在,按换行符分割,创建li,把行号添加进去,塞到ul里面,然后,使用定位把行号定到左边去。滚动条的样式是固定代码。

以下代码的资源代码都是在线的,可以随时复制粘贴测试使用,比较方便,这个字体也是在线的,可能要翻墙才能用吧

效果

在这里插入图片描述
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        /* 整个滚动条 */
        ::-webkit-scrollbar {
      
      
            width: 10px;
            height: 10px;
        }

        /* 滚动条上的滚动滑块,参考: 滚动条样式修改->https://blog.csdn.net/coder_jxd/article/details/124213962 */
        ::-webkit-scrollbar-thumb {
      
      
            background-color: #49b1f5;
            /* 关键代码 */
            background-image: -webkit-linear-gradient(45deg,
                    rgba(255, 255, 255, 0.4) 25%,
                    transparent 25%,
                    transparent 50%,
                    rgba(255, 255, 255, 0.4) 50%,
                    rgba(255, 255, 255, 0.4) 75%,
                    transparent 75%,
                    transparent);
            border-radius: 32px;
        }

        /* 添加行号插件后,它默认把滚动条给覆盖了,所以将padding-left改成margin-left */
        [class*=v-md-prism-] {
      
      
            margin-left: 72px !important;
            padding-left: 0 !important;
        }

        /* 滚动条样式,参考: */
        /* 滚动条轨道 */
        ::-webkit-scrollbar-track {
      
      
            background-color: #dbeffd;
            border-radius: 32px;
        }

        * {
      
      
            margin: 0;
            padding: 0;
            font-size: 18px;
            font-family: 'Dancing Script';
            list-style: none;
        }

        body {
      
      
            height: 100vh;
            padding-top: 10px;
        }

        #code-box {
      
      
            width: 500px;
            border-radius: 6px;
            overflow: hidden;
            margin: 0 auto;

            position: relative;
        }

        #code {
      
      
            padding-left: 61px;
            background-color: #282c34;
        }

        #number-line {
      
      
            position: absolute;
            color: #cdcdcd;
            padding: 0px 15px 18px 10px;
            text-align: right;
            width: 30px;
            margin-top: 18px;
            font-size: 14px;
            font-family: 'Courier New', Courier, monospace;
            border-right: 1px solid #7d7d7d;
        }
    </style>

    <link rel="stylesheet" href="//unpkg.com/@highlightjs/[email protected]/styles/atom-one-dark.min.css">
    <script src="//unpkg.com/@highlightjs/[email protected]/highlight.min.js"></script>

    <script>
        window.onload = () => {
      
      
            hljs.highlightAll()

			/* &lt;<span class="hljs-selector-tag">span</span>&gt;Hello World!&lt;/<span class="hljs-selector-tag">span</span>&gt; */
            console.log(hljs.highlightAuto('<span>Hello World!</span>').value); 
            /* <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Hello World!<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span> */
            console.log(hljs.highlight('<span>Hello World!</span>', {
      
      language: 'xml'}).value); 

            let EL_NUMBER_LINE = document.getElementById('number-line')

			/*
			打印如下:
			<span class="hljs-variable">@SpringBootApplication</span>
			<span class="hljs-variable">@MapperScan</span>(<span class="hljs-string">"com.zzhua.mapper"</span>)
			public class VueApp {
			    <span class="hljs-selector-tag">public</span> <span class="hljs-selector-tag">static</span> <span class="hljs-selector-tag">void</span> <span class="hljs-selector-tag">main</span>(String[] args) {
			        <span class="hljs-selector-tag">SpringApplication</span><span class="hljs-selector-class">.run</span>(VueApp.class); <span class="hljs-selector-tag">SpringApplication</span><span class="hljs-selector-class">.run</span>(VueApp.class);
			    }
			}
			*/
            console.log(document.getElementById('code').childNodes[0].innerHTML);

            let LINE = document.getElementById('code').childNodes[0].innerHTML.split('\n').length
            console.log(LINE);

            for (let i = 1; i <= LINE; i++) {
      
      
                let li = document.createElement('li')
                let lineNum = document.createTextNode(i)
                li.appendChild(lineNum)
                EL_NUMBER_LINE.appendChild(li)
            }
        }
    </script>
</head>

<body>
    <div id="code-box">
        <ul id="number-line"></ul>
        <pre id="code"><code>@SpringBootApplication
@MapperScan("com.zzhua.mapper")
public class VueApp {
    public static void main(String[] args) {
        SpringApplication.run(VueApp.class); SpringApplication.run(VueApp.class);
    }
}</code></pre>
    </div>
</body>

</html>

highlight.js高亮代码(vue版)

效果

  • 原文内容是通过WangEditor编辑保存的,可以参考:WangEdtior富文本编辑器

  • 目录用的tocbot,还没怎么会用这个玩意

  • 手动添加了行号,修改了滚动条样式

  • 实现代码高亮,注意实现代码高亮其实就是把code标签里的代码让highlight.js处理后,然后使用highlight.js提供的主题样式加花里胡哨的颜色。
    在这里插入图片描述

代码

安装highlight.js

npm install highlight.js

vue组件中引入highlight.js 和 主题样式

import hljs from 'highlight.js';
import 'highlight.js/styles/atom-one-dark.css'

ArticleView.vue

<style lang="scss">
@import 'tocbot/src/scss/tocbot';
@import url('https://fonts.font.im/css?family=Roboto');

/* 整个滚动条 */
::-webkit-scrollbar {
      
      
    width: 10px;
    height: 10px;
}

/* 滚动条上的滚动滑块,参考: 滚动条样式修改->https://blog.csdn.net/coder_jxd/article/details/124213962 */
::-webkit-scrollbar-thumb {
      
      
    background-color: #49b1f5;
    /* 关键代码 */
    background-image: -webkit-linear-gradient(45deg,
            rgba(255, 255, 255, 0.4) 25%,
            transparent 25%,
            transparent 50%,
            rgba(255, 255, 255, 0.4) 50%,
            rgba(255, 255, 255, 0.4) 75%,
            transparent 75%,
            transparent);
    border-radius: 32px;
}

/* 添加行号插件后,它默认把滚动条给覆盖了,所以将padding-left改成margin-left */
[class*=v-md-prism-] {
      
      
    margin-left: 72px !important;
    padding-left: 0 !important;
}

/* 滚动条样式,参考: */
/* 滚动条轨道 */
::-webkit-scrollbar-track {
      
      
    background-color: #dbeffd;
    border-radius: 32px;
}

.article {
      
      
    width: 600px;
    margin: 10px auto;

    .article-content {
      
      
        width: 725px;
        padding: 15px;
        // border: 1px solid red;
        border-radius: 5px;
        box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.16);
    }

    #toc-content {
      
      
        position: fixed;
        top: 20px;
        right: 50px;
    }
}


/* 行号相关样式 */
pre {
      
      
    background-color: #282c34;
    border-radius: 6px;
    position: relative;

    .line-numbers {
      
      
        position: absolute;
        color: #e0e0e0;
        font-size: 16px;
        margin: 16px 0;
        padding-right: 10px;
        width: 30px;
        text-align: right;
        font-family: 'Roboto', sans-serif;
        border-right: 1px solid #c5c5c5;
    }
}

code {
      
      
    font-family: 'Roboto', sans-serif;
    border-radius: 6px;

    padding-left: 0 !important;
    margin-left: 3em !important;


}

ul,
li {
      
      
    margin: 0;
    padding: 0;
    list-style: none;
}
</style>

<template>
    <div class="article">
        <!-- <div style="height: 500px;"> </div> -->
        <div class="article-content" id="article-content" v-html="htmlContent"></div>
        <div id="toc-content"></div>
    </div>
</template>

<script>
import {
      
       getArticle } from '@/api/articleApi'

import hljs from 'highlight.js';
import 'highlight.js/styles/atom-one-dark.css'

console.log(hljs);

import tocbot from 'tocbot'
console.log('tocbot', tocbot);

export default {
      
      
    name: 'Article',
    data() {
      
      
        return {
      
      
            htmlContent: ''
        }
    },
    created() {
      
      
        getArticle(this.$route.params.articleId).then(data => {
      
      
            this.htmlContent = data.htmlContent
            this.$nextTick(() => {
      
      
                // console.log('$nextTick...');
                let articleContent = document.querySelector('#article-content')
                let headingTag = ['h1', 'h2', 'h3']
                let children = Array.from(articleContent.children)
                for (let i = 0; i < children.length; i++) {
      
      
                    const e = children[i];
                    e.id = `h-${ 
        i}`
                }

                hljs.highlightAll()

                let codes = document.querySelectorAll('code')

                console.log(codes);
                for (let i = 0; i < codes.length; i++) {
      
      

                    const codeBlock = codes[i];
                    // console.log(codeBlock.innerHTML);
                    let lineTotal = codeBlock.innerHTML.split('\n').length
                    let ul = document.createElement('ul')
                    ul.classList.add('line-numbers')
                    for (let i = 1; i <= lineTotal; i++) {
      
      
                        let li = document.createElement('li')
                        let lineNum = document.createTextNode(i)
                        li.appendChild(lineNum)
                        ul.appendChild(li)
                    }
                    codeBlock.parentNode.prepend(ul)
                }


                tocbot.init({
      
      
                    // Where to render the table of contents.
                    tocSelector: '#toc-content',
                    // Where to grab the headings to build the table of contents.
                    contentSelector: '#article-content',
                    // Which headings to grab inside of the contentSelector element.
                    headingSelector: 'h1, h2, h3, h4, h5, h6',
                    // For headings inside relative or absolute positioned containers within content.
                    hasInnerContainers: true,
                });
            })
        })
    },
    mounted() {
      
      
        // console.log('mounted');

    },
    components: {
      
      
    }
}
</script>

猜你喜欢

转载自blog.csdn.net/qq_16992475/article/details/129978432