分享最近解决的小众需求:如何在浏览器里检测代码文本是什么语言

33 天前
 songray

仓库: https://github.com/ray-d-song/guesslang-js
效果展示: https://ray-d-song.github.io/guesslang-js/

最近我正在完成一个叫 EchoRSS 的阅读器项目,有一个我非常想要的功能,就是拦截订阅中的外链跳转(阅读全文、引用啥的),直接在当前页内显示。

有一个问题是返回的 HTML 代码块失去了语言标注(或者原先在 pre 和 code 标签上就没有标注语言),这样没法用 shiki 或者 prism.js 之类的工具进行代码高亮。

我找到了三个检测代码语言的方案:

1. linguist

这是一个部署在服务器上的 Ruby 项目,Github 用它来检测仓库的语言构成,如果你需要极高的准确度且可以在服务端运算的话,这是最优解。

2. hljs

highlight.js 是一个非常知名的网页代码高亮库,也是唯一一个提供自动代码检测的高亮库。
原理很简单,就是枚举语言的关键词,用这些关键词去一个个匹配文本,最后看哪个的匹配度最高。

hljs 有四个问题。

3. guesslang

guesslang 是一个基于 tensorflow.js 的机器学习项目。
Microsoft 在 2021 年用 tensorflow.js 将这个项目移植到 node.js 上,为 vscode 增加了自动语言检测的功能。

一个越南小哥hieplpvip三年前又将这个项目移植到了浏览器上,不过也有三个问题:

而且这位小哥已经不再维护这个项目,3 月份有个支持 esm 的 feat request 一直没有回复。

所以我提取了 hljs 中的检测模块,又 fork guesslang-js 修复了上面那些问题,对比了一下两种方案,最终 guesslang 胜出,产物就是这个: https://github.com/ray-d-song/guesslang-js

貌似叨太多了,也许未来会有人需要这个,所以 po 一下。

如果有人了解 tensorflow.js 的话,希望可以推荐一些学习材料,我想进一步改为 web gpu 计算来提升效率。

4746 次点击
所在节点    程序员
49 条回复
mahaoqu
33 天前
Java 字符串里写 SQL 的能匹配上两种语言,还是只有其中一种?
mightybruce
33 天前
觉得用大模型来检测,似乎是一种费力不讨好的方案。
毕竟一个语言要高亮的话也就那么一些关键字和语法,你做好匹配不就行了。

我用的很多专业的代码编辑器也就是这么做的而已。
luckykelan
32 天前
@musi 社区氛围就是你这种大聪明多了搞坏的,人楼主正常分享,你跟个二皮似的又说人家不需要结构化输入了,又说人家不应该这么反驳了,你特么咋这么有爹味呢
musi
32 天前
@livid @luckykelan #43 本来还在问题讨论范畴现在直接人生攻击了
luckykelan
32 天前
@musi 你不会真的觉得你跟楼主的对话是在问题讨论吧?啊,那楼主为何发出“这交流环境也太恶劣了.”的感慨啊,你俩讨论啥呢?
musi
32 天前
@luckykelan #45 没事,只要你没否认你人生攻击就行,只要你承认你违反这个社区规则就行
luckykelan
32 天前
@musi 我当然否认了,我都不知道人生攻击是什么意思,你是说人身攻击吗?
musi
32 天前
@luckykelan 哦,原来你只否认人生攻击但不否认人身攻击呀。那没事了,另外你这说话的语气比我也好不了多少,咱俩大哥别说二哥
musi
32 天前
@luckykelan 好了,到这就差不多了,看不顺眼直接 block ,没必要在网上吵架。最近线下事件那么多,我可不想因为一点小事暴发什么事件。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1091666

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX