返回顶部
首页 > 资讯 > 精选 >nodejs如何在控制台打印高亮代码
  • 355
分享到

nodejs如何在控制台打印高亮代码

2023-06-15 01:06:10 355人浏览 安东尼
摘要

这篇文章主要介绍了nodejs如何在控制台打印高亮代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。当代码运行报错时,我们会打印错误,错误中有堆栈信息,可以定位到对应的代码位

这篇文章主要介绍了nodejs如何在控制台打印高亮代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

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

比如这样:

nodejs如何在控制台打印高亮代码

这个可以使用 @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

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

nodejs如何在控制台打印高亮代码

有啥思路没?

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

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

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

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

nodejs如何在控制台打印高亮代码

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

nodejs如何在控制台打印高亮代码

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

nodejs如何在控制台打印高亮代码

我们实现了 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 的识别和分类。

nodejs如何在控制台打印高亮代码

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

nodejs如何在控制台打印高亮代码

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

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

@babel/highlight 也是这么做的:

nodejs如何在控制台打印高亮代码

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

如何在控制台打印颜色

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

格式是这样的:

nodejs如何在控制台打印高亮代码

打印一个 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

我们来试一下:

nodejs如何在控制台打印高亮代码

都打印了正确的样式!

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

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

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

nodejs如何在控制台打印高亮代码

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

总结

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

nodejs如何在控制台打印高亮代码

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

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

感谢你能够认真阅读完这篇文章,希望小编分享的“nodejs如何在控制台打印高亮代码”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: nodejs如何在控制台打印高亮代码

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

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

猜你喜欢
  • nodejs如何在控制台打印高亮代码
    这篇文章主要介绍了nodejs如何在控制台打印高亮代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。当代码运行报错时,我们会打印错误,错误中有堆栈信息,可以定位到对应的代码位...
    99+
    2023-06-15
  • nodejs控制台打印高亮代码的实现方法
    前言 当代码运行报错时,我们会打印错误,错误中有堆栈信息,可以定位到对应的代码位置。但有的时候我们希望能够更直接准确的打印报错位置的代码。比如这样: 这个可以使用 @babel/c...
    99+
    2024-04-02
  • 在 PHP 中打印到控制台
    本文介绍了如何在 PHP 中写入控制台。 使用 PHP 中的 JavaScript console.log() 写入控制台 我们可以使用 PHP 中的一些 JavaScript 来写入控制台。...
    99+
    2024-02-27
  • Chcp如何显示活动控制台代码页数量或更改该控制台的活动控制台代码页
    这篇文章给大家分享的是有关Chcp如何显示活动控制台代码页数量或更改该控制台的活动控制台代码页的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Chcp 显示活动控制台代码页数量,或更改该控制台的活动控制台代码页。如...
    99+
    2023-06-09
  • Golang 如何在代码中打印注释?
    Golang 如何在代码中打印注释? 在 Golang 中,注释是一种非常重要的程序文档和代码解释工具。注释可以帮助其他开发者更好地理解代码的含义和逻辑,提高代码的可读性和可维护性。在...
    99+
    2024-02-29
    golang 打印 注释
  • 怎么在springboot中将sql语句打印到控制台
    本篇文章为大家展示了怎么在springboot中将sql语句打印到控制台,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.简介每当写完持久化语句时肯定免不了要查漏补缺一波。这里就可以将执行的sql打...
    99+
    2023-06-15
  • C语言实现在控制台打印余弦曲线
    目录需求 实例代码运行结果代码分析补充需求 在控制台打印余弦曲线。 余弦曲线又叫余弦波(cosinwave),是一种来自数学三角函数中的余弦比例的曲线。也是模拟信号的代表,...
    99+
    2023-02-16
    C语言打印余弦曲线 C语言余弦曲线 C语言 曲线
  • windows xbox控制台如何打开
    本篇内容主要讲解“windows xbox控制台如何打开”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“windows xbox控制台如何打开”吧!xbox控制台打开方法:打开菜单,然后在目录中找...
    99+
    2023-06-30
  • CSS如何控制网页打印样式
    这篇文章主要介绍CSS如何控制网页打印样式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!CSS控制网页打印样式: 使用CSS控制打印样式,握刚刚使用时一塌糊涂,根本不知道CSS中的midia的作用是什么,问到别人说导...
    99+
    2023-06-08
  • Dreamweaver cs5如何打印页面代码
    这篇文章主要介绍Dreamweaver cs5如何打印页面代码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先,我们打开我们的代码视图。然后,我们就可以在这里点击文件(F)按钮。接下来,我们就可以点击打印代码按钮。...
    99+
    2023-06-08
  • redis控制台乱码如何解决
    要解决Redis控制台乱码的问题,可以尝试以下几种方法:1. 检查终端编码:确保终端编码与Redis服务器使用的字符集一致。可以使用...
    99+
    2023-09-01
    redis
  • tomcat控制台乱码如何解决
    要解决Tomcat控制台乱码问题,可以按照以下步骤进行操作:1. 打开Tomcat安装目录下的`conf`文件夹,找到`catali...
    99+
    2023-10-10
    tomcat
  • idea控制台编码如何设置
    控制台编码设置可以通过以下两种方式来实现: 使用Java代码设置: import java.io.UnsupportedEncod...
    99+
    2023-10-27
    idea
  • Android底层C代码如何打印logcat
    文章目录1.c代码如何打印2.java代码如何打印3.__android_log_buf_write 1.c代码如何打印 java和c混合开发调...
    99+
    2022-06-06
    logcat Android
  • windows xbox控制台打不开如何解决
    这篇“windows xbox控制台打不开如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“windows xbox控制...
    99+
    2023-07-01
  • win10 xbox控制台打不开如何解决
    这篇“win10 xbox控制台打不开如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10 xbox控制台打不开...
    99+
    2023-07-01
  • linux shell中如何实现控制台打印各种颜色字体和背景
    这篇文章给大家分享的是有关linux shell中如何实现控制台打印各种颜色字体和背景的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 问题控制台打印各种颜色字体和背景字体颜色#30:黑 #31:红&n...
    99+
    2023-06-09
  • 如何使用PHP脚本控制打印机输出
    近些年来,PHP已经成为了互联网开发领域用得最广泛的语言之一,不仅仅限于Web应用程序,还可以用于各种脚本控制,例如打印机的输出。在这篇文章中,我将向您介绍如何使用PHP脚本控制打印机输出。一、什么是PHP脚本?PHP脚本是一种广泛使用的服...
    99+
    2023-05-14
  • 如何在阿里云服务器上打开命令控制台?
    阿里云服务器是一种可伸缩的计算服务,具有强大的计算能力、稳定性和可用性。为了更好地管理和维护阿里云服务器,掌握如何在阿里云服务器上打开命令控制台是必不可少的。本文将详细介绍如何打开阿里云服务器的命令控制台。 一、在阿里云服务器上打开命令控制...
    99+
    2023-11-01
    阿里 控制台 器上
  • 如何在PyQt5中使用QListView实现一个代码高亮功能
    今天就跟大家聊聊有关如何在PyQt5中使用QListView实现一个代码高亮功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。使用setCurrentIndex(int) 来设置if...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作