JavaScript奇淫技巧:命令行语法高亮

yumo66621小时前技术文章4

JavaScript奇淫技巧:命令行语法高亮

本文,将实现命令行输出带有语法高亮、带行号的JS代码。

效果如下图所示:

对于JS程序员而言,这个效果是有些惊喜的。

而实现起来,却似乎是出乎意料的简单。

直接上源码:

var js_code = `

function get_copyright(){

var domain = "jshaman.com";

var from_year = 2017;

var copyright = "(c)" + from_year + "-" + (new Date).getFullYear() + "," + domain;

return copyright;

}

console.log(get_copyright());

`;

//高亮显示代码

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

const res = codeFrameColumns(js_code, {}, {

highlightCode: true,

});

console.log(res);

由代码可见,仅仅是使用@babel/code-frame这个NodeJS模块即可直接实现高亮语法。

本着“知其然,知其所以然”的理念,我们再深入探究一下实现语法高亮的原理。

首先,是进行语法分析,从JS代码分离出不同的关键字。

在这一步,可以使用babel的parser获得代码的AST(抽象语法树),再遍历AST进行分析取词。

例如获得变量名、函数名的方式如下:

var parser = require('@babel/parser');

var traverse = require('@babel/traverse').default;

//获得抽象语法树

var ast = parser.parse(js_code);

//遍历语法树

traverse(ast, traverse(ast,{

//函数

"FunctionDeclaration"(path){

var fun_name = path.node.id.name;

console.log("函数名:",fun_name);

},

//变量

"VariableDeclaration"(path){

var var_name = path.node.declarations[0].id.name;

console.log("变量名:",var_name);

},

}));

console.log(js_code)

注:语法分析也有其它办法,比如用正则等。

接着上面的思路,当获得变量名、函数名之后,接下来即可对其进行着色。

写着色功能之前,先来看行代码:

console.log('\u001b[31m JShaman专注于JS代码混淆加密 \u001b[0m');

它会输出带颜色的信息,如下图:

为什么看似有些乱码的console执行时会出现彩色的文字呢?

解释是这样的:

The original specification only had 8 colors, and just gave them names. The SGR parameters 30-37 selected the foreground color, while 40-47 selected the background. Quite a few terminals implemented "bold" (SGR code 1) as a brighter color rather than a different font, thus providing 8 additional foreground colors. Usually you could not get these as background colors, though sometimes inverse video (SGR code 7) would allow that. Examples: to get black letters on white background use ESC[30;47m, to get red use ESC[31m, to get bright red use ESC[31;1m. To reset colors to their defaults, use ESC[39;49m (not supported on some terminals), or reset all attributes with ESC[0m.

大意是:“\u001b”是一个特殊的转意字符,遵从一定的规则,可以用来设置文字或背景颜色。

上面代码中,前面的\u001b[31m用于设定SGR颜色,后面的\u001b[0m相当于一个封闭标签作为前面SGR颜色的作用范围的结束点标记。

有了这个知识储备后,我们就可以继续前面的工作。

当从JS代码中进行分词之后,将代码用此方法进行改造,即可使语法高亮。

运行效果:

至此,便已得知了命令行语法高亮的全部秘密。

最后,奉上本示例完整源码:

var js_code = `

function demo(){

var domain = "jshaman.com";

var from_year = 2017;

var copyright = "(c)" + from_year + "-" + (new Date).getFullYear() + "," + domain;

return copyright;

}

console.log(demo());

`;

//高亮显示代码

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

const res = codeFrameColumns(js_code, {}, {

highlightCode: true,

});

console.log(res);

var parser = require('@babel/parser');

var traverse = require('@babel/traverse').default;

//获得抽象语法树

var ast = parser.parse(js_code);

//遍历语法树

traverse(ast, traverse(ast,{

//函数

"FunctionDeclaration"(path){

var fun_name = path.node.id.name;

console.log("函数名:",fun_name);

js_code = js_code.replace(fun_name,"\u001b[32m" + fun_name + "\u001b[0m");

},

//变量

"VariableDeclaration"(path){

var var_name = path.node.declarations[0].id.name;

console.log("变量名:",var_name);

js_code = js_code.replace(var_name,"\u001b[31m" + var_name + "\u001b[0m");

},

}));

console.log(js_code)

JavaScript奇淫技巧:按键精灵

JavaScript奇淫技巧:收缩控制流

JavaScript奇淫技巧:变速齿轮

JavaScript奇淫技巧:隐写术

JavaScript奇淫技巧:压缩并加密图片

JavaScript奇淫技巧:用try、catch实现JS代码加密解密

相关文章

CSS常用十六进制颜色代码对照表(十六进制颜色代码原理)

我们在做网页时,经常会用到十六进制颜色代码,一个漂亮的网页,它的颜色搭配必定有讲究,下表是一些常用的颜色及十六进制颜色代码对照,记录在此,以便查阅!...

生成引人注目色彩的小型Javascript脚本——randomColor

介绍randomColor是一个生成随机颜色的JavaScript脚本,对于写代码的我们来说,生成一个随机颜色或许并不复杂,但是想要生成一个比较吸引人的随机颜色可能是需要花费一番功夫的,但如果已经有人...

HTML 标签和属性值的基本格式(html标签及属性大全百度资源)

HTML: HyperText Markup Language 超文本标记语言HTML代码不区分大小写, 包括HTML标记、属性、属性值都不区分大小写;任何空格或回车键在代码中都无效,插入空格或回车有...

PC网站建设必备代码知识:HTML基础与应用技巧

在PC网站建设的相关课程里,代码扮演着至关重要的角色。只有熟练运用正确的代码,我们才能打造出功能完善、用户体验出色的PC网站。接下来,我会详细讲解在PC网站建设环节中必须了解的代码知识。HTML基础代...

vb.net的颜色赋值代码(vb颜色表示代码)

有没有人跟我一样,对颜色的名称,除了常用的几种(如红色,白色,黄色,蓝色,绿色,黑色),就无法说出其它颜色的名称来。我解决这个问题的办法,我有一个图,上面都是Color结构已经定义的颜色的名称及对应颜...

html开发笔记08- 字体样式与颜色(标签的属性)

一、标签的分类:双标签和单标签双标签:就是成对出现的,类似于这种 <html> </html>单标签:就是可以单个使用的,类似于 <br> 换行标签 或 <h...