评论区「插入代码」面板里可以让访客选语言,其中有四个语言选了也不会有一丁点颜色:
powershell
dos
dockerfile
nginx
选完插入代码块、写进代码、提交 —— 代码块是纯白的一片字,没有报错、没有提示, 页面上也看不出哪里不对。
主题打包的 assets/hljs/highlight.min.js 里根本没有这四种语言。 实测 hljs.listLanguages() 返回的 36 项里不含它们:
assets/hljs/highlight.min.js
hljs.listLanguages()
bash c cpp csharp css diff go graphql ini java javascript json kotlin less lua makefile markdown objectivec perl php php-template plaintext python python-repl r ruby rust scss shell sql swift typescript vbnet wasm xml yaml
hljs 遇到不认识的语言不抛错,只 console.warn 一句 Could not find the language 'powershell' 就退回不高亮。 所以整条链路上没有任何红色信号 —— 这是"静默降级",不是崩溃。
hljs
console.warn
Could not find the language 'powershell'
inc/theme-highlight.php 里的白名单 yang_hl_known_map() 已经在 3.2.43 校正过, 把这四个剔掉了。所以正文文章的渲染是对的(写文章时若标了这四种,会走 highlightAuto 兜底、打虚线标签表示"这是猜的")。
inc/theme-highlight.php
yang_hl_known_map()
highlightAuto
漏掉的是评论区这条独立的链路 —— comments.php 里的语言选项数组是手写的, 没有和 yang_hl_known_map() 同源,仍然列着这四种。
comments.php
yang_hl_known_map() 返回的键就是「真正打包进去的语言」。 评论区那个数组应该从它派生,而不是再手写一份。
⚠️ 注意:不能简单地改成 foreach (yang_hl_known_map() as $k => $v) 就完事 —— 正文那边是 36 项技术语言名,评论区是给访客看的,需要中文友好名 (如 xml 显示成「HTML/XML」、plaintext 显示成「纯文本」)。 正确做法是:保留一份「技术名 => 显示名」的映射表,但用 known_map 过滤它, 过滤掉不在打包里的项。这样以后增减语言只改一处,两边都不会漂。
foreach (yang_hl_known_map() as $k => $v)
xml
plaintext
这个缺陷已经存在一段时间没人发现,因为它不报错。 建议加一条判据:comments.php 里列出的每个 data-lang 都必须在 yang_hl_known_map() 的键里。反向注入:往选项数组里塞一个 'nosuchlang', 判据必须变红。
data-lang
'nosuchlang'
这条判据能一次性拦住以后所有"手写清单与打包不一致"的情况。
低。站内目前这四种语言的使用次数都是 0,尚未实际触发。 但访客随时可能选到,且症状是"没有任何颜色的代码块",很难自查。
按用户确认收尾,交付见上条发布评论。
交付版本:3.2.43(评论区代码语言选项从 yang_hl_known_map() 过滤,白板语言全部剔除)
用户已验收,关闭本单。
No dependencies set.
The note is not visible to the blocked user.
现象
评论区「插入代码」面板里可以让访客选语言,其中有四个语言选了也不会有一丁点颜色:
powershell(PowerShell)dos(Batch)dockerfile(Dockerfile)nginx(Nginx)选完插入代码块、写进代码、提交 —— 代码块是纯白的一片字,没有报错、没有提示,
页面上也看不出哪里不对。
根因(已查明)
主题打包的
assets/hljs/highlight.min.js里根本没有这四种语言。实测
hljs.listLanguages()返回的 36 项里不含它们:hljs遇到不认识的语言不抛错,只console.warn一句Could not find the language 'powershell'就退回不高亮。所以整条链路上没有任何红色信号 —— 这是"静默降级",不是崩溃。
修复点在哪(关键)
inc/theme-highlight.php里的白名单yang_hl_known_map()已经在 3.2.43 校正过,把这四个剔掉了。所以正文文章的渲染是对的(写文章时若标了这四种,会走
highlightAuto兜底、打虚线标签表示"这是猜的")。漏掉的是评论区这条独立的链路 ——
comments.php里的语言选项数组是手写的,没有和
yang_hl_known_map()同源,仍然列着这四种。现成的单一真相源
yang_hl_known_map()返回的键就是「真正打包进去的语言」。评论区那个数组应该从它派生,而不是再手写一份。
⚠️ 注意:不能简单地改成
foreach (yang_hl_known_map() as $k => $v)就完事 ——正文那边是 36 项技术语言名,评论区是给访客看的,需要中文友好名
(如
xml显示成「HTML/XML」、plaintext显示成「纯文本」)。正确做法是:保留一份「技术名 => 显示名」的映射表,但用 known_map 过滤它,
过滤掉不在打包里的项。这样以后增减语言只改一处,两边都不会漂。
顺带要加一条守卫
这个缺陷已经存在一段时间没人发现,因为它不报错。
建议加一条判据:
comments.php里列出的每个data-lang都必须在yang_hl_known_map()的键里。反向注入:往选项数组里塞一个'nosuchlang',判据必须变红。
这条判据能一次性拦住以后所有"手写清单与打包不一致"的情况。
验收标准
yang_hl_known_map()的键,且反证证明它会红。优先级
低。站内目前这四种语言的使用次数都是 0,尚未实际触发。
但访客随时可能选到,且症状是"没有任何颜色的代码块",很难自查。
按用户确认收尾,交付见上条发布评论。
交付版本:3.2.43(评论区代码语言选项从 yang_hl_known_map() 过滤,白板语言全部剔除)
用户已验收,关闭本单。