本文首发在我的个人博客:https://jlice.top/p/7vg1g/。欢迎大家前去参观,么么哒~

在hexo博客同步至csdn - 木然轩一文中,我提到了prismjs在尝试渲染C++代码块时不能正确加载node_modules/prismjs/components/prism-cpp.js。于是,我在prismjs的GitHub项目上提交了Pull Request:cpp extend clike by jlice · Pull Request #1914 · PrismJS/prism。不过,prismjs的项目维护者却告诉我,这锅prismjs不背,是markdown-it-prism自己的问题。

其实在提交这个Pull Request时我也觉得奇怪,prismjs的用户基数那么大,而C++也是非常常见的语言,要是出现这种问题早就解决了。不过,我的确是在一顿Debug后找到了出错的位置,但这个出错的位置是错误的果,未必是错误的因。

prismjs

prismjs是一个代码块高亮的库,其作用和highlight.js差不多,有点像Python里的Pygments。大致看了下prismjs的源码,感觉主要就是用正则表达式描述了各编程语言的文法,然后做词法分析,对各种类型的token应用相应的样式。下面是prismjs的目录结构:

components目录是对各语言的定义,plugins是一些功能增强插件,themes就是主题了。例如,prism/components/prism-cpp.js中就定义了C++的文法:

Prism.languages.cpp = Prism.languages.extend('c', {'class-name': {pattern: /(\b(?:class|enum|struct)\s+)\w+/,lookbehind: true},
...

它扩展自C。类似地,在prism/components/prism-c.js中定义了C的文法:

Prism.languages.c = Prism.languages.extend('clike', {...

而clike没有扩展自别的语言,应该在prism作为一种基本的语言类型。

在Debug的过程中,我在prism/components/prism-core.js中发现了DFS递归查找语言定义。心想,都有DFS了,怎么就不能正确加载呢,路径都没问题呀。

loadPrismLang

prismjs维护者提示,找到了问题之所在。位于markdown-it-prism/index.js的loadPrismLang函数内:

require('prismjs/components/prism-' + lang);

对于C++,lang的值应是cpp。这里它就直接调用prismjs/components/prism-cpp这个模块了,可根据前面的分析,它extend自prism-c,而prism-c又extend自prism-clike。因此,像这样直接调用会出错的,应该使用prismjs里提供的loadLanguages,它可以自动处理依赖关系。在prismjs的官方文档上也提到了这一点:

这个函数定义在prism/components/index.js。于是乎,就给markdown-it-prism提交了个Pull Request。

如果通过npm安装markdown-it-prism,可以发现index.js位于build目录下,而markdown-it-prism的GitHub项目里,index.js位于项目的根目录,而且这两个index.js的内容不一样。通过查看项目下的package.json,可以了解到项目是使用babel编译的,用mocha来测试的。编译、测试一下,一切OK。结果GitHub用TravisCI跑一下,在老版本Nodejs上未能通过测试:

不过,这并不代表修改是错误的,也许是测试用例没有更新。

Pull Request

markdown-it-prism项目的维护者Merge了我的Pull Request:

而且,也添加了我的测试用例。

解决markdown-it-prism未能正确加载Languages的BUG相关推荐

  1. 未能加载文件或程序集_完美解决未能正确加载Visual C++资源编辑器包问题

    问题:在使用VS2010过程中,出现未能正确加载"Visual C++ Resource Editor Package"的错误提示,同时工程的资源文件不能打开,出现加载失败. 原因 ...

  2. vs2012 怎样解决 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包的问题

    vs2012 怎样解决 未能正确加载"Microsoft.VisualStudio.Editor.Implementation.EditorPackage"包的问题 参考文章: ( ...

  3. VS2013出现未能正确加载 microsoft.visualstudio.editor.implementation.editorpackage的解决方法

    出现这个问题的原因可能是配置更改或安装了另一个扩展,幸好之前用的不多,重新进行用户配置代价也不高,打开Visual Studio Tools: 选择VS2013 开发人员命令提示: 输入devenv ...

  4. VS未能正确加载 ”Microsoft.VisualStudio.Editor.Implementation.EditorPackate“包错误解决方法...

    VS未能正确加载 "Microsoft.VisualStudio.Editor.Implementation.EditorPackate"包错误解决方法 很久没用VS了,打开后出现 ...

  5. VS2010打开项目提示未能正确加载解决方案中一个或多个项目

    今天打开vs2010项目,竟然提示"未能正确加载解决方案中一个或多个项目",还有什么详细去输出看,我在网上找了下,没有解决,我看输出下边是说"C:\Program Fil ...

  6. Visual studio 2017 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包...

    装完win10更新 发现vs杯具了- 提示 未能正确加载"Microsoft.VisualStudio.Editor.Implementation.EditorPackage"包 ...

  7. 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包。

    最近在升级 Visual Studio 2015 Update 3 的过程中,等了很长时间都没一点进展,于是就强行终止了升级程序,但VS也因此出了问题. 后来经过修复,不行,卸载再重装,仍然提示这个错 ...

  8. 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage“提示信息

        在安装过vs2015之后出现未能正确加载"Microsoft.VisualStudio.Editor.Implementation.EditorPackage"提示信息在V ...

  9. 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage

    未能正确加载"Microsoft.VisualStudio.Editor.Implementation.EditorPackage, Microsoft.VisualStudio.Edito ...

最新文章

  1. python下载教程1001python下载教程-1001种玩法 | Python 学习指南资源
  2. 小程序框架之wepy报错问题
  3. LightOJ 1259 Goldbach`s Conjecture 素数打表
  4. OpenCV使用函数compareHist的实例(附完整代码)
  5. github网址无法访问怎么办?
  6. Ph.D Grind 阅读感想 By 张雄
  7. 扁平化女装shop商城模板
  8. android 签名报错,AndroidStudio生成签名apk报错
  9. matlab2c使用c++实现matlab函数系列教程-cumprod函数
  10. CentOS 7.2.5 安装 Redis 与 远程访问
  11. PostGreSQL8.0.0中文手册
  12. 计算机毕业设计(附源码)python-志愿者管理系统
  13. UE4面试基础知识(一)
  14. Unity Recorder屏幕录制问题
  15. DFS基础-----刷题合集--1(全排列,八皇后,迷宫),让你明白DFS的基础用法
  16. 多可文档管理系统_您的框架有多可扩展性?
  17. openEuler Summit | 江大勇:凝聚创新力量 逐梦数字时代星辰大海
  18. 杭电OJ 1047(C++)
  19. 爬取豆瓣电影中各种类型电影名称与评分
  20. 动态获取织梦CMS最新更新 利于收录的SiteMap.php文件

热门文章

  1. 月薪过万的运维工程师都要会干什么
  2. 显示器接口_显示器接口类型怎么选,4种主流接口要了解
  3. python-某旗小说app的学习过程
  4. 计算机组成原理唐朔飞第二版答案第六章,计算机组成原理第六章部分课后题答案(唐朔飞版)...
  5. 九阴真经 服务器 显示维护,《九阴真经》登陆不上 解决方法攻略
  6. “大灯”到底指近光灯还是远光灯?
  7. xshell突然连接不上
  8. PMP考试如何获取PDU
  9. oracle 表名 添加注释
  10. 你的死工资,正在拖垮你一辈子需要花多少钱