前端代码高亮显示解决方案: prism

oulae 2020-06-02 原文

前端代码高亮显示解决方案: prism

1. 场景描述

在博客, 文档, 论坛这些性质的网站经常存在着需要显示代码的需求; 对于这种要求要求, 我们可以直接使用textarea 标签显示:

但是这种显示方案非常不美观, 不但没有高亮代码, 而且也没有显示行号, 这对于代码的阅读是非常不友好的;

而一般的网站, 对于代码的显示都会做高亮处理, 如antd Design 文档:

这种方案的原理是先设计一套CSS 显示方案, 例如规定好关键字, 符号, 属性等内容的显示方案; 然后写一套CSS parser, 将代码解析成为特定的字段, 然后将这些字段处理成特定的元素(这些元素为class 带上css 解决方案); 该原理和json parser 很类似
Json Parser 原理: Json Parser 原理

不过在业务场景, 并不推荐自己写一套解析器, 虽然个人感觉实现一套特定规则的代码高亮方案并不会很难, 但是实用性并不强, 因此我们使用现有的解决方案;

而这里介绍的解决方案为 prosmjs, 由于网上论坛(CSDN, 博客园, 掘金) 并没有找到关于React 应用demo, 所以这里记录的是React 使用Prism Demo

2. React Prism

如果你需要在React 应用中使用Prismjs, 那么你需要使用到如下内容:

2.1 prismjs 库

prism 库, 里面包含着prism 的基本内容, 包括js 文件, css文件, 插件, 主题等内容

yarn add prismjs

2.2 babel-plugin-prismjs 插件

webpack 对于prism 打包需要使用到的插件
安装:

yarn add babel-plugin-prismjs

.babelrc 配置:

"plugins": [
    ["prismjs", {
      "languages": ["javascript", "css", "markup"],
      "plugins": ["line-numbers"],
      "theme": "okaidia",
      "css": true
    }]
  ]

3. demo

项目地址: PrismReactDemo

import React from 'react'
import Prism from 'prismjs';

const log = console.log.bind(console)

class PrismjsDemo extends React.Component{
    constructor(props) {
        super(props)
        this.state = {}
    }

    render() {
        const code = `const listMaxValue = (list) => {
let max = list[0]
for(let i = 1, len = list.length; i < len; i++) {
    if(max > list[i]) {
        max = list[i]
    }
}
return max
}`

        log(Prism)

        let codeHtml = {
            // Prism.highlight(text, grammar, language)
            // text: 需要格式化的代码
            // grammar: 需要格式化代码的语法
            // language: 需要格式化代码表示的语言
            __html: Prism.highlight(code, Prism.languages.javascript, 'javascript')
        }

        return (
            <>
                <pre className="language-javascript line-numbers">
                    <code dangerouslySetInnerHTML={codeHtml}></code>
                </pre>
            </>
        )
    }
}

export default PrismjsDemo

运行结果:

4. 注意点

  • 在React 框架汇中, 使用Prism 的格式为: 必须存在pre code 标签, 如果不按照这个格式, 那么代码将不会换行
<pre className="language-javascript line-numbers">
    <code dangerouslySetInnerHTML={codeHtml}></code>
</pre>
  • 如果需要显示主体, 需要显示行号, 必须添加相关的css 类名
<>
    {/* 如果不添加language-, 将不会显示主体('language-' + 语言名称) */}
    {/*如果不添加line-numbers, 将不会显示行号*/}
    <pre className="language-javascript line-numbers">
        <code dangerouslySetInnerHTML={codeHtml}></code>
    </pre>
</>

- 在个人项目中, 显示行号的插件失效了, 具体原因暂时未知(使用antd design UI 框架, 不知道是不是这个原因)

5. 参考链接

  1. prism 官方文档
  2. babel-plugin-prismjs 文档
  3. prism 在Vue 框架中的demo
  4. prism HTML+js Demo
  5. prism 中文介绍
posted on
2020-06-02 22:32 
oulae 
阅读(
评论(
编辑 
收藏

 

版权声明:本文为oulae原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/oulae/p/13034273.html

前端代码高亮显示解决方案: prism的更多相关文章

  1. 博客园使用highlight.js对代码进行高亮,并实现自定义关键词高亮

    看了网上那么多有关highlight.js的教程,自己还没学过JavaScript和CSS,硬是花了3天的时间 […]...

  2. 详解Google Code Prettify代码高亮Prettify.js库使用及其应用

    不管是之前自己的技术博客还是现在的公司官网,作为一个互联网从业者,经常需要写一些博文,这也是我的习惯,而写技术文章很多时候需要在文章中插入代码,如果以普通字符形式展示出来我觉得不能够显示出代码的魅力。而通常大家都是利用代码高亮的方式,让代码在文章中显得更加具体化,就好像我们在用编辑器一样。就那WP来说,大家都知道有一些代码高亮的插件,当然我也曾经尝试过几个,但都不是特别满意,再者大家都知道使用插件的效率相对而言是比较低的。...

随机推荐

  1. 大觅网05Day

    1.Mycat概述   在此前的服务器对数据库的存储数量要求并不高的时候,被经常使用的MySql数据基本能够满 […]...

  2. 注册中心与API网关不是这样用的!

    之前在做顾问和咨询项目的时候,见到了一种非常经典的关于API网关和注册中心的错误用法。这个案例在我的星球里已经 […]...

  3. 建筑行业的新起之秀—BIM

       近年来,BIM在国家在建筑行业的推进下逐渐走近人们的视线,而且BIM技术是作为建筑领域的一项新技术行业发 […]...

  4. TMS320C54x系列DSP指令和编程指南——第1章 汇编语言工具概述 – 湘厦人

    TMS320C54x系列DSP指令和编程指南——第1章 汇编语言工具概述 第1章 汇编语言工具概述       […]...

  5. CGLib 简析

    背景  JDK 动态代理存在的一些问题: 调用效率低  JDK 通过反射实现动态代理调用,这意味着低下的调用效 […]...

  6. java开发webservice的几种方式

      webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相 […]...

  7. 关于PCA降维中遇到的python问题小结

    由于论文需要,开始逐渐的学习CNN关于文本抽取的问题,由于语言功底不好,所以在学习中难免会有很多函数不会用的情 […]...

  8. JVM内存越多,能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。

    一、认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 (有必要说明一下,不同环境会有不同 […]...

展开目录

目录导航