评论区代码语言选项里有 4 个语言根本不支持,选了只会得到白板代码块 #16

Closed
opened 2026-10-26 05:26:38 +00:00 by laoyang · 1 comment
Owner

现象

评论区「插入代码」面板里可以让访客选语言,其中有四个语言选了也不会有一丁点颜色:

  • powershell(PowerShell)
  • dos(Batch)
  • dockerfile(Dockerfile)
  • nginx(Nginx)

选完插入代码块、写进代码、提交 —— 代码块是纯白的一片字,没有报错、没有提示,
页面上也看不出哪里不对。

根因(已查明)

主题打包的 assets/hljs/highlight.min.js 里根本没有这四种语言。
实测 hljs.listLanguages() 返回的 36 项里不含它们:

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' 就退回不高亮。
所以整条链路上没有任何红色信号 —— 这是"静默降级",不是崩溃。

修复点在哪(关键)

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',
判据必须变红。

这条判据能一次性拦住以后所有"手写清单与打包不一致"的情况。

验收标准

  1. 评论区「插入代码」面板里不再出现 PowerShell / Batch / Dockerfile / Nginx 四个选项。
  2. 其余选项一个不少(正文那边语言覆盖不能因此缩水)。
  3. 每选中一个语言插入代码块、提交后,该代码块确实有颜色(不再有白板)。
  4. 新增硬件守卫:选项数组 ⊆ yang_hl_known_map() 的键,且反证证明它会红。

优先级

低。站内目前这四种语言的使用次数都是 0,尚未实际触发。
但访客随时可能选到,且症状是"没有任何颜色的代码块",很难自查。

## 现象 评论区「插入代码」面板里可以让访客选语言,其中**有四个语言选了也不会有一丁点颜色**: - `powershell`(PowerShell) - `dos`(Batch) - `dockerfile`(Dockerfile) - `nginx`(Nginx) 选完插入代码块、写进代码、提交 —— 代码块是**纯白的一片字**,没有报错、没有提示, 页面上也看不出哪里不对。 ## 根因(已查明) 主题打包的 `assets/hljs/highlight.min.js` 里**根本没有这四种语言**。 实测 `hljs.listLanguages()` 返回的 36 项里不含它们: ``` 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'` 就退回不高亮。 所以整条链路上没有任何红色信号 —— 这是"静默降级",不是崩溃。 ## 修复点在哪(关键) `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'`, 判据必须变红。 这条判据能一次性拦住以后所有"手写清单与打包不一致"的情况。 ## 验收标准 1. 评论区「插入代码」面板里不再出现 PowerShell / Batch / Dockerfile / Nginx 四个选项。 2. 其余选项一个不少(正文那边语言覆盖不能因此缩水)。 3. 每选中一个语言插入代码块、提交后,该代码块**确实有颜色**(不再有白板)。 4. 新增硬件守卫:选项数组 ⊆ `yang_hl_known_map()` 的键,且反证证明它会红。 ## 优先级 低。站内目前这四种语言的使用次数都是 0,尚未实际触发。 但访客随时可能选到,且症状是"没有任何颜色的代码块",很难自查。
Author
Owner

按用户确认收尾,交付见上条发布评论。

交付版本:3.2.43(评论区代码语言选项从 yang_hl_known_map() 过滤,白板语言全部剔除)

用户已验收,关闭本单。

按用户确认收尾,交付见上条发布评论。 交付版本:3.2.43(评论区代码语言选项从 yang_hl_known_map() 过滤,白板语言全部剔除) 用户已验收,关闭本单。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/wordpress-kratos-yang#16