iis服务器助手广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >nodejs控制台打印高亮代码的实现方法
  • 237
分享到

nodejs控制台打印高亮代码的实现方法

2024-04-02 19:04:59 237人浏览 八月长安
摘要

前言 当代码运行报错时,我们会打印错误,错误中有堆栈信息,可以定位到对应的代码位置。但有的时候我们希望能够更直接准确的打印报错位置的代码。比如这样: 这个可以使用 @babel/c

前言

当代码运行报错时,我们会打印错误,错误中有堆栈信息,可以定位到对应的代码位置。但有的时候我们希望能够更直接准确的打印报错位置的代码。比如这样:

这个可以使用 @babel/code-frames 来做到:


const { codeFrameColumns } = require('@babel/code-frame');

const res = codeFrameColumns(code, {
  start: { line: 2, column: 1 },
  end: { line: 3, column: 5 },
}, {
  highlightCode: true,
  message: '这里出错了'
});

console.log(res);

有没有感觉比较神奇,它是怎么做到的打印出上面的代码格式的(code frame)?

本文我们就来探究下原理。

主要会解答三个问题:

  • 如何打印出标记相应位置代码的 code frame(就是上图的打印格式)
  • 如何实现语法高亮
  • 如何在控制台打印颜色

如何打印 code frame

我们先不管高亮,实现这样的格式的打印:

有啥思路没?

其实也比较容易想到,传入了源代码、标记开始和结束的行列号,那么我们就能够计算出显示标记(marker)的行是哪些,以及这些行的哪些列,然后依次对每一行代码做处理,如果本行没有标记则保持原样,如果本行有标记的话,那么就在开始打印一个 marker “>”,并且在下面打印一行 marker "^",最后一个标记行还要打印错误信息。

我们来看一下 @babel/code-frame 的实现:

首先,分割字符串成每一行的数组,然后根据传入的位置计算出 marker 所在的位置。

比如图中第二行的第 1 到 12 列,第三行的 0 到 5 列。

然后对每一行做处理,如果本行有标记,则拼成 marker + gutter(行号) + 代码的格式,下面再打印一行 marker,最后的 marker 行打印 message。没有标记不处理。

这样最终拼出的就是这样的 code frame:

我们实现了 code frame 的拼接,暂时忽略了高亮,那么怎么做语法高亮呢?

如何实现语法高亮

实现语法高亮需要理解代码,但是如果只是高亮,词法分析就足够了。babel 也是这么做的,@babel/highlight 包里面完成了高亮代码的逻辑。

先看效果:


const a = 1;
const b = 2;
console.log(a + b);

上面的源码被分成了 token 数组

[
  [ 'whitespace', '\n' ], [ 'keyWord', 'const' ],
  [ 'whitespace', ' ' ],  [ 'name', 'a' ],
  [ 'whitespace', ' ' ],  [ 'punctuator', '=' ],
  [ 'whitespace', ' ' ],  [ 'number', '1' ],
  [ 'punctuator', ';' ],  [ 'whitespace', '\n' ],
  [ 'keyword', 'const' ], [ 'whitespace', ' ' ],
  [ 'name', 'b' ],        [ 'whitespace', ' ' ],
  [ 'punctuator', '=' ],  [ 'whitespace', ' ' ],
  [ 'number', '2' ],      [ 'punctuator', ';' ],
  [ 'whitespace', '\n' ], [ 'name', 'console' ],
  [ 'punctuator', '.' ],  [ 'name', 'log' ],
  [ 'bracket', '(' ],     [ 'name', 'a' ],
  [ 'whitespace', ' ' ],  [ 'punctuator', '+' ],
  [ 'whitespace', ' ' ],  [ 'name', 'b' ],
  [ 'bracket', ')' ],     [ 'punctuator', ';' ],
  [ 'whitespace', '\n' ]
]

token 怎么分的呢?

一般来说词法分析就是有限状态自动机(DFA),但是这里实现比较简单,是通过正则匹配的:

js-tokens 这个包暴露出来一个正则,一个函数,正则是用来识别 token 的,其中有很多个分组,而函数里面是对不同的分组下标返回了不同的类型,这样就能完成 token 的识别和分类。

在 @babel/highlight 包里也是这样用的:

(正则来做词法分析有很多限制条件,比如不能处理递归的情况,所以这种方式不是通用的,通用词法分析还是得用状态机 DFA。)

有了分类之后,不同 token 显示不同颜色,建立个 map 就行了。

@babel/highlight 也是这么做的:

我们知道了怎么做语法高亮,使用 chalk 的 api 就可以打印颜色,那控制台打印颜色的原理是什么呢?

如何在控制台打印颜色

控制台打印的是 ASCII 码,并不是所有的编码都对应可见字符,ASCII 码有一部分字符是对应控制字符的,比如 27 是 ESC,就是我们键盘上的 ESC 键,是 escape 的缩写,按下它可以完成一些控制功能,这里我们可以通过打印 ESC 的 ASCII 码来进入控制打印颜色的状态。

格式是这样的:

打印一个 ESC 的 ASCII 码,之后是 [ 代表开始,m 代表结束,中间是用 ; 分隔的 n 个控制字符,可以控制很多样式,比如前景色、背景色、加粗、下划线等等。

ESC 的 ASCII 码是 27,有好几种写法:一种是字符表示的 \e ,一种是 16 进制的 \0x1b(27 对应的 16进制),一种是 8 进制的 \033,这三种都表示 ESC。

我们来试验一下:1 表示加粗、36 表示前景色为青色、4 表示下划线,下面三种写法等价:


\e[36;1;4m
\033[36;1;4m
\0x1b[36;1;4m

我们来试一下:

图片都打印了正确的样式!

当然,加了样式还要去掉,可以加一个 \e[0m 就可以了(\033[0m,\0x1b[0m 等价)。

chalk(nodejs 的在终端打印颜色的库)的不同方法就是封装了这些 ASCII 码的颜色控制字符。

上面每行代码被高亮过以后的代码是:

这样也就实现了不同颜色的打印。

总结

至此,我们能实现开头的效果了:支持 code frame 的打印,支持语法高亮,能够打印颜色

本文我们探究了这种效果的实现原理,先从 code frame 是怎么拼接的,然后每一行的代码是怎么做高亮的,之后是高亮具体是怎么打印颜色的。

不管是 code frame 的打印,还是语法高亮或者控制台打印颜色,都是特别常见的功能,希望这篇文章能够帮你彻底掌握这 3 方面的原理。

到此这篇关于nodejs控制台打印高亮代码的文章就介绍到这了,更多相关nodejs控制台打印高亮内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: nodejs控制台打印高亮代码的实现方法

本文链接: https://www.lsjlt.com/news/125630.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • nodejs控制台打印高亮代码的实现方法
    前言 当代码运行报错时,我们会打印错误,错误中有堆栈信息,可以定位到对应的代码位置。但有的时候我们希望能够更直接准确的打印报错位置的代码。比如这样: 这个可以使用 @babel/c...
    99+
    2024-04-02
  • nodejs如何在控制台打印高亮代码
    这篇文章主要介绍了nodejs如何在控制台打印高亮代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。当代码运行报错时,我们会打印错误,错误中有堆栈信息,可以定位到对应的代码位...
    99+
    2023-06-15
  • Mybatis控制台打印SQL语句的方法
    小编给大家分享一下Mybatis控制台打印SQL语句的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!问题描述在使用mybatis进行开发的时候,由于可以动态拼接sql,这样大大方便了我们。但是也有一定的问题,当我们动态...
    99+
    2023-06-14
  • Mybatis控制台打印SQL语句的两种方式实现
    问题描述 在使用mybatis进行开发的时候,由于可以动态拼接sql,这样大大方便了我们。但是也有一定的问题,当我们动态sql拼接的块很多的时候,我们要想从*mapper.xml中...
    99+
    2024-04-02
  • springboot实现执行sql语句打印到控制台
    springboot 执行sql语句打印到控制台 1.简介 每当写完持久化语句时肯定免不了要查漏补缺一波。这里就可以将执行的sql打印到控制台来检查sql语句哪里出了问题。 2.配置...
    99+
    2024-04-02
  • React使用highlight.jsClipboard.js实现代码高亮复制
    目录正文安装 highlight.js 和 Clipboard.js配置 highlight.js 支持的语言创建 CodeBlock 组件使用 CodeBlock 组件效果展示正文...
    99+
    2023-05-17
    React代码高亮复制 React highlight.js Clipboard.js
  • C语言实现在控制台打印余弦曲线
    目录需求 实例代码运行结果代码分析补充需求 在控制台打印余弦曲线。 余弦曲线又叫余弦波(cosinwave),是一种来自数学三角函数中的余弦比例的曲线。也是模拟信号的代表,...
    99+
    2023-02-16
    C语言打印余弦曲线 C语言余弦曲线 C语言 曲线
  • CMD打开mysql控制台的方法
    CMD打开mysql控制台的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!CMD打开mysql的控制台方法:首先右键“...
    99+
    2024-04-02
  • log4j控制台不打印日志的故障解决方案
    前言 接管了别的项目组的一个代码,在IDAE调试程序的过程中,发现log4j日志居然没有打印在控制台上,日志相关代码也没有问题。 在网上搜索了一圈,总结了一下个人解决这个问题的流程。 流程 1. 判断...
    99+
    2023-09-06
    log4j apache java
  • vue3引入highlight.js进行代码高亮的方法实例
    目录背景描述:一、安装依赖:二、在vue3主入口main文件,对highlight进行引入和注册:三、页面使用:四、看下效果展示吧:五、一些优化:1.问题2.解决方法3. 处理后的效...
    99+
    2024-04-02
  • java实现控制台斗地主的方法
    小编给大家分享一下java实现控制台斗地主的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,...
    99+
    2023-06-14
  • Java控制台输入scanner的方法及代码详解
    Java控制台输入scanner的方法有哪些?编程网的小编来告诉大家。 含义 读取控制台数据 常用的方法 Scanner scanner = new Scanner(System.i...
    99+
    2022-11-13
    Java scanner
  • C++实现控制台随机迷宫的示例代码
    我全程使用TCHAR系列函数,亲测可以不改动代码兼容Unicode/ANSI开发环境,功能正常。大概有100行代码是来自网络的,我也做了改动,侵权请联系删除。 这个代码不能算是完美,...
    99+
    2024-04-02
  • Google的代码高亮工具Syntaxhighlighter使用方法
    Google没有名为Syntaxhighlighter的官方代码高亮工具。然而,有许多第三方代码高亮工具可以在Google中使用。以...
    99+
    2023-09-27
    使用方法
  • C/C++中实现让控制台暂停的方法
    目录让控制台暂停的方法运行结果中让控制台停住下面针对这个问题给出以下几种解决方案让控制台暂停的方法 在程序调试的时候,有时控制台会出现闪烁之后又消失的情况,对于控制台中出现的结果可能...
    99+
    2024-04-02
  • MyBatis控制台显示SQL语句的方法实现
    一、单独使用MyBatis (1)在mybatis.xml配置文件中添加如下配置 <setting name="logImpl" value="STDOUT_LOGGING...
    99+
    2024-04-02
  • vue打印插件vue-print-nb的实现代码
    1.引入插件npm install vue-print-nb --save 在main.js中引入 import Print from 'vue-print-nb'Vue.use(P...
    99+
    2024-04-02
  • linux shell中如何实现控制台打印各种颜色字体和背景
    这篇文章给大家分享的是有关linux shell中如何实现控制台打印各种颜色字体和背景的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 问题控制台打印各种颜色字体和背景字体颜色#30:黑 #31:红&n...
    99+
    2023-06-09
  • java实现轻轻松松控制台斗地主的示例代码
    实现在控制台斗地主 今天给大家一起分享一下,最近回头学习java基础实现的一个控制台版的斗地主。先给大家简单看一下要求: 有地主,有2个农民,地主有额外3张牌。 游戏开始时,显示地主...
    99+
    2024-04-02
  • vue实战:打印小票的实现方法
    vue也能实现打印小票?下面本篇文章就带大家详细了解一下怎么通过安装 lodop 打印控件,实现打印小票,本文附有详细实例代码哦,希望对大家有所帮助!lodop 打印控件安装 lodop 打印控件lodop地址: http://www.c-...
    99+
    2023-05-14
    Vue
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作