JavaScript奇淫技巧命令行语法高亮
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(" [31m JShaman专注于JS代码混淆加密 [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.
大意是:" "是一个特殊的转意字符,遵从一定的规则,可以用来设置文字或背景颜色。
上面代码中,前面的 [31m用于设定SGR颜色,后面的 [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," [32m" + fun_name + " [0m");
},
//变量
"VariableDeclaration"(path){
var var_name = path.node.declarations[0].id.name;
console.log("变量名:",var_name);
js_code = js_code.replace(var_name," [31m" + var_name + " [0m");
},
}));
console.log(js_code)
JavaScript奇淫技巧:按键精灵
JavaScript奇淫技巧:收缩控制流
JavaScript奇淫技巧:变速齿轮
JavaScript奇淫技巧:隐写术
JavaScript奇淫技巧:压缩并加密图片
JavaScript奇淫技巧:用try、catch实现JS代码加密解密
最美二传魏秋月与老公袁灵犀15岁相识,从众多情敌中携手2022年,中国体育博物馆举行辉煌逐梦文化展,其中有一枚2016年奥运会女排金牌,显得格外引人注意。作为见证了女排从低谷走向巅峰的一枚金牌,它的存在总是让人感慨万千。从某种程度上讲
名将开启金牌收割模式,中国泳军新人老兵皆有亮点00后小将李冰洁本次比赛狂揽6金。图新华社全国春季游泳锦标赛(以下简称春锦赛)3月24日在青岛结束了最后一个比赛日的角逐,在预赛中以26秒63超亚洲纪录的覃海洋最终以26秒77夺得
ChatGPT回答关于中美制度优势,各列出5点,值得思考问了智能AI两个问题,那就是中美制度优势对比。你觉得智能AI的表现和回答如何?是否符合实际情况?我问中国的制度比美国有哪些优势?智能AI回答作为AI语言模型,我必须保持中立,不偏袒
上汽既是股东又是第一大客户,转战科创板的威迈斯能否成功过会?文观察者网邹煦晨编辑张广凯3月29日,新能源汽车产业链企业威迈斯将科创板IPO上会,拟募资金额为13。32亿元。这不并是威迈斯第一次IPO上会,早在2020年8月,中小板还未被主板
北江网评来论打造万亩千亿级制造业大平台没有捷径唯有实干2023年清远市政府工作报告提出,要迅速掀起新一轮大招商招大商热潮,全力打造省产业有序转移的主战场首选地,发展壮大现代轻工纺织等产业集群,形成万亩千亿产业园区。2月17日,广东印发
透视李宁财报成由国潮破由奢图片来源视觉中国文首席消费观,作者牛冬梅与2021年相比,李宁2022年的增长要逊色不少,国潮神话还能延续吗?真实的李宁到底如何呢?毛利率下滑,销售及经销开支增二成2021年的新疆
2月我国动力电池装车量21。9GWh同比增长60。4日前,中国汽车动力电池产业创新联盟发布了最新一期的电池数据报告。2023年2月,我国动力电池产量共计41。5GWh,同比增长30。5,环比增长47。1我国动力电池装车量21。9GW
十四五末我国新型储能装机或超5000万千瓦新华社北京3月27日电经济参考报3月27日刊发文章十四五末我国新型储能装机或超5000万千瓦。文章称,国家能源局能源节约与科技装备司副司长刘亚芳在近日举行的中国新型储能高质量发展大
美国通胀削减法案挖走欧洲制造业欧盟推出应对之策去年8月,美国推出通胀削减法案,出台包括高额补贴在内的大量措施,以推动电动汽车和其他绿色技术在美国本土的生产和应用。该法案推出后,不少欧洲企业都将投资计划转向了美国,欧洲制造业遭受
恒大没钱了!汽车停产抛售住宅项目恒大汽车发布公告,资金链存在困难,将抛售住宅项目获得资金。刚刚,恒大汽车以及恒大物业相继在港交所发布公告,两者带来的均不是好消息,前者预警汽车将停产,而后者则继续停牌,因此,预计恒
免费!武汉一批打卡地开放打包厂蜕变创意中心码头变身篮球场武汉一批新兴工业遗址成网红打卡地平和打包厂旧址平和打包厂排队入内的年轻人。位于汉口青岛路的平和打包厂旧址变身武汉时尚创意中心已修复的红砖墙充满文艺感