网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

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)

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
黄陂区多位居民反映自来水发臭,官方回应:系切换水源后药剂投量加大所致,已恢复

黄陂区多位居民反映自来水发臭,官方回应:系切换水源后药剂投量加大所致,已恢复

极目新闻
2024-07-01 23:17:39
外国美女晒与中国男友合照,引评论区网暴,辱骂男方像杀人犯马加爵

外国美女晒与中国男友合照,引评论区网暴,辱骂男方像杀人犯马加爵

可达鸭面面观
2024-07-01 20:51:14
外媒:朝鲜4个旅2万大军将于一周后抵达乌东,西方担心的事发生了

外媒:朝鲜4个旅2万大军将于一周后抵达乌东,西方担心的事发生了

小lu侃侃而谈
2024-06-30 21:28:04
闹大了!南方医科大发布招生简章,网友炸锅,评论区一片“骂声”

闹大了!南方医科大发布招生简章,网友炸锅,评论区一片“骂声”

皖声微言
2024-07-01 14:49:13
腾讯宣布打击极端民族主义内容后,有网友宣布自己抵制微信支付

腾讯宣布打击极端民族主义内容后,有网友宣布自己抵制微信支付

映射生活的身影
2024-07-01 13:12:02
牡丹江市委书记代守仑简历已从市政府官网撤下

牡丹江市委书记代守仑简历已从市政府官网撤下

澎湃新闻
2024-07-01 19:32:26
周永康的六个秘书升官与“落马”内幕

周永康的六个秘书升官与“落马”内幕

天闻地知
2024-07-01 14:22:38
反转来得太快,欧盟电动车关税让步,降幅直接让中国傻眼!

反转来得太快,欧盟电动车关税让步,降幅直接让中国傻眼!

谈芯说科技
2024-07-01 20:52:03
16岁中国留学生在新西兰遇袭!公交上被铁棍打掉5颗牙,仅75岁老华人出手相助

16岁中国留学生在新西兰遇袭!公交上被铁棍打掉5颗牙,仅75岁老华人出手相助

不掉线电波
2024-07-01 16:15:53
绿军迎巨变:最大股东计划出售球队 今年刚夺第18冠恐影响卫冕

绿军迎巨变:最大股东计划出售球队 今年刚夺第18冠恐影响卫冕

醉卧浮生
2024-07-02 01:22:57
运动医学专家:现场救治张志杰的医疗人员如果判断是心源性猝死,应马上使用AED

运动医学专家:现场救治张志杰的医疗人员如果判断是心源性猝死,应马上使用AED

红星新闻
2024-07-02 00:22:08
刀片电池2.0版落地!能量密度直逼200Wh/kg,吉利为何快人一步?

刀片电池2.0版落地!能量密度直逼200Wh/kg,吉利为何快人一步?

汽车扒壹扒
2024-06-28 22:42:02
车臣督战队哗变,乌军歼灭俄罗斯女囚突击队,首次俘获女囚

车臣督战队哗变,乌军歼灭俄罗斯女囚突击队,首次俘获女囚

史政先锋
2024-07-01 22:19:50
欧洲杯8强确定6队!3组对决出炉:法国大战葡萄牙 西班牙PK德国

欧洲杯8强确定6队!3组对决出炉:法国大战葡萄牙 西班牙PK德国

念洲
2024-07-02 05:47:27
为什么要少看中国历史?

为什么要少看中国历史?

黑噪音
2024-07-02 01:45:18
深中海地通道开通首日:深圳前往中山,由原来2.5小时,减少到5小时

深中海地通道开通首日:深圳前往中山,由原来2.5小时,减少到5小时

可达鸭面面观
2024-07-01 09:59:18
官宣:歼-31出了新型号,全球独创侧面双弹舱

官宣:歼-31出了新型号,全球独创侧面双弹舱

空天力量
2024-07-01 11:06:50
印尼宣布对中国商品征收200%关税后,有网友宣布以后不买印尼产品

印尼宣布对中国商品征收200%关税后,有网友宣布以后不买印尼产品

映射生活的身影
2024-07-01 12:14:31
在台上:我爱我的国,我的国需要我!下了台:加州伯克利真香!

在台上:我爱我的国,我的国需要我!下了台:加州伯克利真香!

体制内老陈
2024-07-01 15:19:32
一场抬尸大游行,引发数十万知青喷发积怨,成为返城大风暴导火索

一场抬尸大游行,引发数十万知青喷发积怨,成为返城大风暴导火索

拙言问史
2024-06-30 22:59:44
2024-07-02 09:12:49
javascript知识园
javascript知识园
javascript编程知识分享,JS加密、JS混淆等等。
192文章数 419关注度
往期回顾 全部

科技要闻

“5年0息”!特斯拉变相降价

头条要闻

勒庞:法国人民毫不含糊 第二轮投票将是决定性的

头条要闻

勒庞:法国人民毫不含糊 第二轮投票将是决定性的

体育要闻

葡萄牙的神!他拯救C罗拯救葡萄牙

娱乐要闻

今年内娱最大的闹剧,该收场了

财经要闻

酒鬼酒甜蜜素风波后再迎人事变动

汽车要闻

奥迪Q6 e-tron Sportback官图曝光

态度原创

教育
艺术
亲子
房产
时尚

教育要闻

姐姐比妹妹大6岁,姐姐今年14岁,几年后,她们的年龄和是44岁?

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

亲子要闻

小孩哥总是回头看后面的美女姐姐,看完后又害羞地转过头

房产要闻

官宣去库存!海南这一区域商办产品,已无限接近住宅!

夏天这样穿吊带,轻松显瘦又性感

无障碍浏览 进入关怀版