代码高亮两项:后台主题实时预览 + 全站代码块语言标注统一(含大模型识别) #13

Closed
opened 2026-10-26 03:07:47 +00:00 by laoyang · 4 comments
Owner

需求(用户原话整理)

两件事,都围绕"代码高亮"的使用体验。

需求 A:后台选择高亮主题时要有预览

现在后台选代码高亮配色,只看到一个下拉框里的主题名,不知道长什么样,
只能先保存再刷新前台看,不行再改回来。对比:选自动头像风格时下方有演示图,
体验好得多。

要求:选择高亮主题时,旁边/下方给出实时样例(代码片段渲染成该配色的样子)。

验收:在后台切换下拉框,无需保存、无需刷新,就能看到该配色下的代码块效果。

需求 B:全站代码块的语言标注要统一,缺的用大模型判断

这个博客多年下来装过各种代码高亮插件,<pre> / <code> 上的语言标记
写法五花八门(有的是 lang,有的是别的),并不规范。

要求:

  1. 通过数据库把全部文章(正文)和评论过一遍。
  2. 发现代码块 → 统一改写成本主题的正规写法:lang="xxx"。
  3. 不再依赖 JS / highlight.js 库去猜语言(highlightAuto 那条路要去掉作用)。
  4. 没有标注的块,用大模型判断它是什么语言。
  5. 大模型也判不出来(比如代码太短)→ 给纯文本标记(plaintext)。
  6. 最终目标:文章里所有代码块都有统一的语言标注,且都有标注(不允许留空)。

验收:

  • 全站代码块 100% 有 lang="xxx",无一处例外。
  • 排序/统计脚本直连数据库即可核对,不需要抓页面。
  • 改写前必须能回滚(原始内容留档)。

硬约束(用户之前明确要求,必须遵守)

  • 全站排查一律写 PHP 直连数据库,禁止大规模 HTTP 请求站点页面(会被限流 / 封 IP)。
  • 脏数据改写属于不可逆操作,必须先做完整备份 + 可回滚。
  • 未确认前不要动线上数据。

待办

  • 普查:全站代码块的语言标注形态分布
  • 需求 A:后台主题预览
  • 需求 B:批量规范化 + 大模型识别
  • 验证与发布
## 需求(用户原话整理) 两件事,都围绕"代码高亮"的使用体验。 ### 需求 A:后台选择高亮主题时要有预览 现在后台选代码高亮配色,只看到一个下拉框里的主题名,**不知道长什么样**, 只能先保存再刷新前台看,不行再改回来。对比:选自动头像风格时下方有演示图, 体验好得多。 **要求**:选择高亮主题时,旁边/下方给出**实时样例**(代码片段渲染成该配色的样子)。 **验收**:在后台切换下拉框,无需保存、无需刷新,就能看到该配色下的代码块效果。 ### 需求 B:全站代码块的语言标注要统一,缺的用大模型判断 这个博客多年下来装过各种代码高亮插件,`<pre>` / `<code>` 上的语言标记 写法五花八门(有的是 `lang`,有的是别的),并不规范。 **要求**: 1. 通过**数据库**把全部文章(正文)**和评论**过一遍。 2. 发现代码块 → 统一改写成**本主题的正规写法**:`lang="xxx"`。 3. **不再依赖 JS / highlight.js 库去猜语言**(`highlightAuto` 那条路要去掉作用)。 4. 没有标注的块,**用大模型判断**它是什么语言。 5. 大模型也判不出来(比如代码太短)→ 给**纯文本**标记(`plaintext`)。 6. 最终目标:**文章里所有代码块都有统一的语言标注,且都有标注**(不允许留空)。 **验收**: - 全站代码块 100% 有 `lang="xxx"`,无一处例外。 - 排序/统计脚本直连数据库即可核对,**不需要抓页面**。 - 改写前必须能回滚(原始内容留档)。 ## 硬约束(用户之前明确要求,必须遵守) - **全站排查一律写 PHP 直连数据库**,禁止大规模 HTTP 请求站点页面(会被限流 / 封 IP)。 - 脏数据改写属于**不可逆操作**,必须先做完整备份 + 可回滚。 - 未确认前不要动线上数据。 ## 待办 - [ ] 普查:全站代码块的语言标注形态分布 - [ ] 需求 A:后台主题预览 - [ ] 需求 B:批量规范化 + 大模型识别 - [ ] 验证与发布
Author
Owner

进度:需求 A(后台配色实时预览)已完成并通过验证

实现

  • 新增 assets/css/highlight-admin.css(只做预览框布局,不改代码块外观)
  • 新增 assets/js/highlight-admin.js(监听下拉框 → 换 <link> → 重新上色)
  • inc/theme-highlight.php:新增 yang_hl_admin_assets() + yang_hl_admin_preview_html()
  • inc/theme-options.php:在「代码配色」下拉框后插入 type=info 的预览面板

几个关键取舍(都有实测依据)

  1. 切换配色必须删旧 <link> 再插新的,不能改 href、也不能 20 套一起加载。
    20 套配色的规则是裸选择器(.hljs-keyword 等),同场会互相压制,最后加载的赢
    —— 视觉上就是「切换没反应」。
  2. 预览复用前台同一份 CSS(assets/hljs/styles/<key>.min.css + assets/css/highlight.css),
    另写一套必然和前台不一致,那预览就没意义了。
  3. 不用 highlightElement,改为从 textContent 取原文重新 highlight()。
    highlightElement 会在已上色元素上再套一层,颜色变脏。
  4. 实测发现 hljs 的 HTML 转义是无损的(392 字符原文,上色后 textContent 逐字符还原),
    所以不需要额外存 data-raw —— 那只是两份状态,不同步就是 bug 源头。已删掉该冗余。

验证

  • 正向:_admin_preview_test.js(jsdom)22 通过 / 0 失败
    • 覆盖:卡片与前台同构、行号数=行数、link 增删、data-theme/data-kind 跟随、
      配色名跟随、连切 20 次不残留、上色无损且幂等、无三层嵌套 span
  • 反向:_admin_preview_falsify.js 6 组注入全部真红,源码未被改动
    • ① 不删旧 link → 2 条、23 条 ② 不切 data-kind → dark 不回落
    • ③ 不更新配色名 → 停在 Monokai ④ 行号算法退回 +1 → 14 vs 13
    • ⑤ 改成从 innerHTML 重算 → 文本 301 vs 284、span 16→0

踩到并记录的坑

  • 测试里自己实现一遍被测逻辑 = 自己测自己:第一版在测试里直接调 hljs.highlight
    比对,产品改坏也照样绿(注入 ⑤ 全绿才暴露)。改成真的切 select 让产品自己跑。
  • 判据量法错 vs 产品错:span 0 → 17 那条红是基准取在"尚未上色"状态,
    量的其实是"有没有上色",不是"重复上色会不会套娃"。
  • 把产品改成喂 innerHTML 会让进程 heap OOM(不是红、是崩)⇒ 补了一条确定性外部探针
    「产品交给 hljs 的必须是纯文本原文(阈值 600 字符)」。
## 进度:需求 A(后台配色实时预览)已完成并通过验证 ### 实现 - 新增 `assets/css/highlight-admin.css`(只做预览框布局,不改代码块外观) - 新增 `assets/js/highlight-admin.js`(监听下拉框 → 换 `<link>` → 重新上色) - `inc/theme-highlight.php`:新增 `yang_hl_admin_assets()` + `yang_hl_admin_preview_html()` - `inc/theme-options.php`:在「代码配色」下拉框后插入 `type=info` 的预览面板 ### 几个关键取舍(都有实测依据) 1. **切换配色必须删旧 `<link>` 再插新的**,不能改 href、也不能 20 套一起加载。 20 套配色的规则是裸选择器(`.hljs-keyword` 等),同场会互相压制,最后加载的赢 —— 视觉上就是「切换没反应」。 2. **预览复用前台同一份 CSS**(`assets/hljs/styles/<key>.min.css` + `assets/css/highlight.css`), 另写一套必然和前台不一致,那预览就没意义了。 3. **不用 `highlightElement`**,改为从 `textContent` 取原文重新 `highlight()`。 `highlightElement` 会在已上色元素上再套一层,颜色变脏。 4. 实测发现 **hljs 的 HTML 转义是无损的**(392 字符原文,上色后 textContent 逐字符还原), 所以不需要额外存 `data-raw` —— 那只是两份状态,不同步就是 bug 源头。已删掉该冗余。 ### 验证 - 正向:`_admin_preview_test.js`(jsdom)**22 通过 / 0 失败** - 覆盖:卡片与前台同构、行号数=行数、link 增删、data-theme/data-kind 跟随、 配色名跟随、连切 20 次不残留、上色无损且幂等、无三层嵌套 span - 反向:`_admin_preview_falsify.js` **6 组注入全部真红**,源码未被改动 - ① 不删旧 link → 2 条、23 条 ② 不切 data-kind → dark 不回落 - ③ 不更新配色名 → 停在 Monokai ④ 行号算法退回 +1 → 14 vs 13 - ⑤ 改成从 innerHTML 重算 → 文本 301 vs 284、span 16→0 ### 踩到并记录的坑 - **测试里自己实现一遍被测逻辑 = 自己测自己**:第一版在测试里直接调 `hljs.highlight` 比对,产品改坏也照样绿(注入 ⑤ 全绿才暴露)。改成真的切 select 让产品自己跑。 - **判据量法错 vs 产品错**:`span 0 → 17` 那条红是基准取在"尚未上色"状态, 量的其实是"有没有上色",不是"重复上色会不会套娃"。 - 把产品改成喂 innerHTML 会让进程 heap OOM(不是红、是崩)⇒ 补了一条确定性外部探针 「产品交给 hljs 的必须是纯文本原文(阈值 600 字符)」。
Author
Owner

进度:需求 B(全站代码块语言标注统一)已完成,数据已改写并复核

一、先纠正一个前提:站内没有「完全无标注」的代码块

普查全库(直连 MySQL,零抓页)的结果与直觉相反:

项 实测
已发布文章正文代码块 284 块 / 71 篇
完全没有任何语言标记的块 0
但标记无效(等价于没标)的块 87
评论里的真代码块 0(8637 条评论;仅 1 条含 &lt;pre,是被转义的纯文本)
revision 历史修订里的块 119(不动,历史存档不应篡改)

87 个无效标记的构成:text 47(Prism 遗留)、generic 28 + raw 8(Enlighter 的「不高亮」语义)、
jsp 2 与 latex 2(hljs 未打包,会静默白板)。

所以真正的问题不是「没有标注」,而是「标注是假的」 —— 这正是此前要靠 JS highlightAuto
去猜的原因,而 autodetect 在站内实测准确率只有 22%。

二、统一后的规范形态

语言一律写在 <pre> 自己的 lang 属性上:<pre lang="python">…</pre>

同时清掉所有「第二份真相」:

  • data-enlighter-language / class="EnlighterJSRAW"(别的插件的私有标记)
  • <code class="language-xxx"> 里的 language-*(只保留 line-numbers 这类纯样式类)

理由:一个块上留两种语言标注早晚会打架,而且以后再统计又是不一致。

三、大模型判定:87 条,逐块看过内容

判定表的优先级必须高于「沿用旧标注」,这是本轮修掉的一个实质 bug:
产品会把 generic/raw/text 兜底成 plaintext,而 plaintext 本身在白名单里 ⇒
旧逻辑 in_array($cur,$WHITE) 成立 ⇒ 走「保留」⇒ 判定表被静默丢弃。
第一版实测 87 条只有 4 条生效,其余 42 条非 plaintext 判定全丢,
而且结果看起来是成功的(每块都有 lang,只是大部分是 plaintext)。

最终分布:

语言 块数 说明
bash 174 命令、带 root@host# 提示符的会话
plaintext 45 报错输出、目录路径、LaTeX(hljs 无 latex)、快捷键说明
yaml 13 conda 配置
ini 9 sources.list / vimrc / sudoers
xml 8 Apache VirtualHost(apache 未打包,xml 能正确标出指令名)
python 8
javascript 7
php / json / java 6 / 5 / 5
ruby 2 GitLab 的 nginx['enable']=true 配置语法
sql 2

45 个标 plaintext 的不是「判不出来」,而是内容本来就不该高亮(报错散文、LaTeX 片段、中文提示)。
按「判不出来给纯文本」的要求,这些正好落在该有的位置。

四、改写安全性

  • 备份:/tmp/lang_norm_20261026_113042/
    • rollback.sql 160KB(可执行回滚)
    • orig_posts.json / new_posts.json(逐篇逐字可比对)
  • 事务写入,66 篇全成功才提交
  • 只动 post_type='post' AND post_status='publish';revision、评论一律不碰
  • 定位用 post_id + 文内第几块,再加内容签名校验(判定表基于某时刻的库导出,
    签名不符就报错跳过,绝不盲改)

踩到一个会静默写错块的坑:同一篇文章里有 11 对块原文完全相同
(如 post=5074 的 idx 4 与 15)。用 str_replace($orig,$new,$content) 会全局替换,
如果这两块该得到不同语言就会整片标错。改成 preg_replace_callback + 计数器按序号替换。

五、验证

项目 结果
改写脚本 --verify 284 块全部合规,需改写 0
独立审计脚本(另一套扫描逻辑,不复用改写代码) 全部通过
审计判据 无 lang=0 · lang 无效=0 · 残留 Enlighter=0 · 残留 language-*=0 · 评论 0 · revision 仍 21 篇 · 71 篇未变 · 分布合计=284
审计的反向验证(往库里真注入破坏再还原) 3/3 真红:去掉 lang → 无 lang=1;改成 cobol → 无效=1;塞回 enlighter → 无效=1 且残留=1
真实页面渲染(4 篇) figure.cb 数与块数一致,data-guess 全为 0(已确认,没有一块是猜的)
既有回归套件 语言/属性单测 44/0 与 24/0,语言反向 10/0,后台预览 22/0,预览反向 6/0

六、这轮抓到的两个「判据空壳」(都值得记)

  1. PHP 变量名会吞掉全角括号:"无 lang 的块 = $noLang(必须 0)" 实际解析成
    $noLang(必须 —— 未定义变量 ⇒ 输出空 ⇒ '' === 0 恒真。
    审计第一版 4 条核心断言全是空壳,却显示「全部通过」。
    修法:插值一律写 {$var}。(同族红线:否定式断言在空输出上恒真。)

  2. 判据被前面的 continue 遮蔽:注入 <pre data-enlighter-language="generic" lang="javascript">
    时,判据 B 用产品函数校验会先读到 data-enlighter 返回 plaintext ≠ javascript ⇒
    立刻 continue ⇒ 判据 C(残留 Enlighter)永远走不到,成了「从来没红过」的绿灯。
    修法:三条判据先各自算布尔,最后统一判定,谁命中就报谁。

七、顺带发现的一个独立问题(未在本单处理)

评论区代码块工具栏(.comment-code-lang 那排按钮)里有 powershell / dos / dockerfile / nginx
四个选项,但 hljs 打包的 36 种语言里没有这四个。用户选完插入,代码块会是白板。
与本单无关(本单只改文章内容),建议另开一单处理。

## 进度:需求 B(全站代码块语言标注统一)已完成,数据已改写并复核 ### 一、先纠正一个前提:站内**没有**「完全无标注」的代码块 普查全库(直连 MySQL,零抓页)的结果与直觉相反: | 项 | 实测 | |---|---| | 已发布文章正文代码块 | **284** 块 / 71 篇 | | 完全没有任何语言标记的块 | **0** | | 但标记**无效**(等价于没标)的块 | **87** | | 评论里的真代码块 | **0**(8637 条评论;仅 1 条含 `&lt;pre`,是被转义的纯文本) | | revision 历史修订里的块 | 119(**不动**,历史存档不应篡改) | 87 个无效标记的构成:`text` 47(Prism 遗留)、`generic` 28 + `raw` 8(Enlighter 的「不高亮」语义)、 `jsp` 2 与 `latex` 2(hljs 未打包,会静默白板)。 **所以真正的问题不是「没有标注」,而是「标注是假的」** —— 这正是此前要靠 JS `highlightAuto` 去猜的原因,而 autodetect 在站内实测准确率只有 22%。 ### 二、统一后的规范形态 语言一律写在 **`<pre>` 自己的 `lang` 属性**上:`<pre lang="python">…</pre>` 同时清掉所有「第二份真相」: - `data-enlighter-language` / `class="EnlighterJSRAW"`(别的插件的私有标记) - `<code class="language-xxx">` 里的 `language-*`(只保留 `line-numbers` 这类纯样式类) 理由:一个块上留两种语言标注早晚会打架,而且以后再统计又是不一致。 ### 三、大模型判定:87 条,逐块看过内容 **判定表的优先级必须高于「沿用旧标注」**,这是本轮修掉的一个实质 bug: 产品会把 `generic`/`raw`/`text` 兜底成 `plaintext`,而 `plaintext` 本身在白名单里 ⇒ 旧逻辑 `in_array($cur,$WHITE)` 成立 ⇒ 走「保留」⇒ 判定表被静默丢弃。 第一版实测 87 条只有 4 条生效,其余 42 条非 plaintext 判定全丢, **而且结果看起来是成功的**(每块都有 lang,只是大部分是 plaintext)。 最终分布: | 语言 | 块数 | 说明 | |---|---|---| | bash | 174 | 命令、带 `root@host#` 提示符的会话 | | plaintext | 45 | 报错输出、目录路径、LaTeX(hljs 无 latex)、快捷键说明 | | yaml | 13 | conda 配置 | | ini | 9 | sources.list / vimrc / sudoers | | xml | 8 | Apache VirtualHost(apache 未打包,xml 能正确标出指令名) | | python | 8 | | | javascript | 7 | | | php / json / java | 6 / 5 / 5 | | | ruby | 2 | GitLab 的 `nginx['enable']=true` 配置语法 | | sql | 2 | | 45 个标 `plaintext` 的**不是「判不出来」**,而是内容本来就不该高亮(报错散文、LaTeX 片段、中文提示)。 按「判不出来给纯文本」的要求,这些正好落在该有的位置。 ### 四、改写安全性 - 备份:`/tmp/lang_norm_20261026_113042/` - `rollback.sql` 160KB(可执行回滚) - `orig_posts.json` / `new_posts.json`(逐篇逐字可比对) - 事务写入,66 篇全成功才提交 - 只动 `post_type='post' AND post_status='publish'`;revision、评论一律不碰 - 定位用 `post_id + 文内第几块`,再加**内容签名校验**(判定表基于某时刻的库导出, 签名不符就报错跳过,绝不盲改) **踩到一个会静默写错块的坑**:同一篇文章里有 **11 对块原文完全相同** (如 post=5074 的 idx 4 与 15)。用 `str_replace($orig,$new,$content)` 会全局替换, 如果这两块该得到不同语言就会整片标错。改成 `preg_replace_callback` + 计数器按序号替换。 ### 五、验证 | 项目 | 结果 | |---|---| | 改写脚本 `--verify` | 284 块全部合规,需改写 0 | | **独立**审计脚本(另一套扫描逻辑,不复用改写代码) | 全部通过 | | 审计判据 | 无 lang=0 · lang 无效=0 · 残留 Enlighter=0 · 残留 language-*=0 · 评论 0 · revision 仍 21 篇 · 71 篇未变 · 分布合计=284 | | **审计的反向验证**(往库里真注入破坏再还原) | 3/3 真红:去掉 lang → 无 lang=1;改成 cobol → 无效=1;塞回 enlighter → 无效=1 且残留=1 | | 真实页面渲染(4 篇) | `figure.cb` 数与块数一致,`data-guess` 全为 **0**(已确认,没有一块是猜的) | | 既有回归套件 | 语言/属性单测 44/0 与 24/0,语言反向 10/0,后台预览 22/0,预览反向 6/0 | ### 六、这轮抓到的两个「判据空壳」(都值得记) 1. **PHP 变量名会吞掉全角括号**:`"无 lang 的块 = $noLang(必须 0)"` 实际解析成 `$noLang(必须` —— 未定义变量 ⇒ 输出空 ⇒ `'' === 0` 恒真。 审计第一版 4 条核心断言**全是空壳**,却显示「全部通过」。 修法:插值一律写 `{$var}`。(同族红线:否定式断言在空输出上恒真。) 2. **判据被前面的 continue 遮蔽**:注入 `<pre data-enlighter-language="generic" lang="javascript">` 时,判据 B 用产品函数校验会先读到 data-enlighter 返回 plaintext ≠ javascript ⇒ 立刻 continue ⇒ 判据 C(残留 Enlighter)**永远走不到**,成了「从来没红过」的绿灯。 修法:三条判据先各自算布尔,最后统一判定,谁命中就报谁。 ### 七、顺带发现的一个独立问题(未在本单处理) 评论区代码块工具栏(`.comment-code-lang` 那排按钮)里有 **powershell / dos / dockerfile / nginx** 四个选项,但 hljs 打包的 36 种语言里**没有**这四个。用户选完插入,代码块会是白板。 与本单无关(本单只改文章内容),建议另开一单处理。
Author
Owner

已发布 3.2.44,等待实测确认

交付内容

项 状态
需求 A:后台配色实时预览 ✅ 已实现并验证
需求 B:全站 284 块语言标注统一 ✅ 数据已改写并复核
版本号 3.2.43 → 3.2.44
发布通道 https://yangyq.net/theme-update/(只发 zip + readme + update.json,未覆盖服务器主题目录)
commit 03b0bc6(带 #13)

请在 WordPress 后台升级到 3.2.44,然后按这几条确认

需求 A(约 30 秒)

  1. 主题设置 → 代码高亮 → 找到「代码配色」下拉框
  2. 下拉框正下方应出现一段 PHP 样例代码(带顶栏、语言标签「PHP」、行号、复制按钮)
  3. 依次切几个配色(试试 GitHub → Monokai → Night Owl):
    • 样例颜色应当立刻变,不用保存、不用刷新
    • 顶栏也跟着变(切深色配色时顶栏应一起变深,不会出现「深色代码配浅色顶栏」)
    • 样例标题应显示当前配色名

需求 B(约 1 分钟)

  1. 随便打开几篇带代码的老文章(比如 2023 年那些 Anaconda / GitLab 的)
  2. 每块代码右上角应该都有语言名,且全部是实线正体
    —— 以前有些块是虚线斜体(表示"这是程序猜的"),现在正文里应该一个都没有了
  3. 报错输出、目录路径那类块会显示「纯文本」,这是有意的(它们本来就不该上色)

如果发现问题

数据改写有完整回滚:

  • 备份目录:服务器 /tmp/lang_norm_20261026_113042/
  • rollback.sql 可直接回滚 66 篇文章
  • 主题回滚:后台「主题」里重装 kratos_yang-3.2.32.zip(更新通道里还留着旧包)

另外说明两件事

① 顺手补了 3.2.43 的更新记录。 上一批(#12)版本号升到了 3.2.43,但更新说明里忘了加这一条,
线上 readme 最新还停在 3.2.42。这次补上了,现在 readme 顶部是 3.2.44 → 3.2.43 → 3.2.42。

② 发现一个与本单无关的独立问题,建议另开一单:
评论区贴代码的那个工具栏,「选语言」那排按钮里有 PowerShell / Batch(dos) / Dockerfile / Nginx
四个选项,但主题打包的高亮库(36 种语言)里没有这四种。
用户选完这四个插入代码块,在页面上会是白板(不上色、语言标签也不对)。
本单只改文章正文内容,没动评论区工具栏。要修的话是另一件事。

待办

  • 需求 A 实现 + 验证
  • 需求 B 数据改写 + 复核
  • 3.2.44 打包 + 走更新通道发布
  • commit 带 #13 并推送
  • 等你实测确认后关闭本单
## 已发布 3.2.44,等待实测确认 ### 交付内容 | 项 | 状态 | |---|---| | 需求 A:后台配色实时预览 | ✅ 已实现并验证 | | 需求 B:全站 284 块语言标注统一 | ✅ 数据已改写并复核 | | 版本号 | 3.2.43 → **3.2.44** | | 发布通道 | `https://yangyq.net/theme-update/`(只发 zip + readme + update.json,**未覆盖服务器主题目录**) | | commit | `03b0bc6`(带 `#13`) | ### 请在 WordPress 后台升级到 3.2.44,然后按这几条确认 **需求 A(约 30 秒)** 1. 主题设置 → 代码高亮 → 找到「代码配色」下拉框 2. 下拉框**正下方**应出现一段 PHP 样例代码(带顶栏、语言标签「PHP」、行号、复制按钮) 3. 依次切几个配色(试试 `GitHub` → `Monokai` → `Night Owl`): - 样例颜色应当**立刻变**,不用保存、不用刷新 - 顶栏也跟着变(切深色配色时顶栏应一起变深,不会出现「深色代码配浅色顶栏」) - 样例标题应显示当前配色名 **需求 B(约 1 分钟)** 1. 随便打开几篇带代码的老文章(比如 2023 年那些 Anaconda / GitLab 的) 2. 每块代码右上角应该都有语言名,且**全部是实线正体** —— 以前有些块是**虚线斜体**(表示"这是程序猜的"),现在正文里应该一个都没有了 3. 报错输出、目录路径那类块会显示「纯文本」,这是有意的(它们本来就不该上色) ### 如果发现问题 数据改写有完整回滚: - 备份目录:服务器 `/tmp/lang_norm_20261026_113042/` - `rollback.sql` 可直接回滚 66 篇文章 - 主题回滚:后台「主题」里重装 `kratos_yang-3.2.32.zip`(更新通道里还留着旧包) ### 另外说明两件事 **① 顺手补了 3.2.43 的更新记录。** 上一批(#12)版本号升到了 3.2.43,但更新说明里忘了加这一条, 线上 readme 最新还停在 3.2.42。这次补上了,现在 readme 顶部是 3.2.44 → 3.2.43 → 3.2.42。 **② 发现一个与本单无关的独立问题,建议另开一单:** 评论区贴代码的那个工具栏,「选语言」那排按钮里有 **PowerShell / Batch(dos) / Dockerfile / Nginx** 四个选项,但主题打包的高亮库(36 种语言)里**没有这四种**。 用户选完这四个插入代码块,在页面上会是**白板**(不上色、语言标签也不对)。 本单只改文章正文内容,没动评论区工具栏。要修的话是另一件事。 ### 待办 - [x] 需求 A 实现 + 验证 - [x] 需求 B 数据改写 + 复核 - [x] 3.2.44 打包 + 走更新通道发布 - [x] commit 带 `#13` 并推送 - [ ] **等你实测确认后关闭本单**
Author
Owner

已交付并发布(3.2.44)

需求已全部实现并上线,用户确认可以关闭。

需求 A:后台「代码配色」实时预览

下拉框旁加预览面板,切换配色立刻生效、不用保存/刷新。

  • 新增 assets/css/highlight-admin.css(只管布局,不改代码块外观)+ assets/js/highlight-admin.js
  • 20 套配色不能同场:规则是裸选择器(.hljs-keyword),会互相压制
    ⇒ 切换时必须真的 removeChild 旧 <link> 再插新 <link>
  • highlightElement 会在已上色元素上再套一层 ⇒ 每轮从 textContent 取原文重算

需求 B:全站代码块语言标注统一

直连库统计:正文 284 块(71 篇),评论中 0 块,revision 21 篇 119 块(历史修订,不动)。
完全无语言标记的为 0 —— 所以问题不是"没标",是"标了但不认"(87 块标注无效:
text 47 / generic 28 / raw 8 / jsp 2 / latex 2)。

大模型判定 87 条后统一写库:--apply 需改 267 / 已合规 17,写入 66 篇并提交事务,
备份 /tmp/lang_norm_20261026_113042/(rollback.sql + orig_posts.json);
--verify 284/284 合规。

最终分布:bash 174、plaintext 45、yaml 13、ini 9、xml 8、python 8、javascript 7、
php 6、json 5、java 5、ruby 2、sql 2。

验证:探针 22/0、反向 6/0;独立复核脚本(不复用产品函数生成标签)全绿、反向 3/3 真红;
真实页面 4 篇 data-guess 全 0,anaconda 28 块全确认、LaTeX 5 块全「纯文本」。

发布:kratos_yang.zip md5 9f1cfb47d66924da9eae199e3a096194,commit 03b0bc6 带 #13,
readme 补上了 3.2.43 + 3.2.44 两条(35 条版本标题、历史 33 条完整),走 /theme-update/ 通道。

已由 3.2.45 修掉的遗留:本版的后台预览有两个问题(后台未加载 hljs ⇒ 预览单色;
首屏跳过上色),已并入 #14 修完并发布。

## 已交付并发布(3.2.44) 需求已全部实现并上线,用户确认可以关闭。 ### 需求 A:后台「代码配色」实时预览 下拉框旁加预览面板,切换配色立刻生效、不用保存/刷新。 - 新增 `assets/css/highlight-admin.css`(只管布局,不改代码块外观)+ `assets/js/highlight-admin.js` - **20 套配色不能同场**:规则是裸选择器(`.hljs-keyword`),会互相压制 ⇒ 切换时必须真的 `removeChild` 旧 `<link>` 再插新 `<link>` - **`highlightElement` 会在已上色元素上再套一层** ⇒ 每轮从 `textContent` 取原文重算 ### 需求 B:全站代码块语言标注统一 直连库统计:正文 **284** 块(71 篇),评论中 **0** 块,revision **21 篇 119 块**(历史修订,不动)。 完全无语言标记的为 **0** —— 所以问题不是"没标",是"**标了但不认**"(87 块标注无效: text 47 / generic 28 / raw 8 / jsp 2 / latex 2)。 大模型判定 87 条后统一写库:`--apply` 需改 267 / 已合规 17,写入 **66 篇并提交事务**, 备份 `/tmp/lang_norm_20261026_113042/`(`rollback.sql` + `orig_posts.json`); `--verify` **284/284 合规**。 最终分布:bash 174、plaintext 45、yaml 13、ini 9、xml 8、python 8、javascript 7、 php 6、json 5、java 5、ruby 2、sql 2。 **验证**:探针 22/0、反向 6/0;独立复核脚本(不复用产品函数生成标签)全绿、反向 3/3 真红; 真实页面 4 篇 `data-guess` 全 0,anaconda 28 块全确认、LaTeX 5 块全「纯文本」。 **发布**:`kratos_yang.zip` md5 `9f1cfb47d66924da9eae199e3a096194`,commit `03b0bc6` 带 `#13`, readme 补上了 3.2.43 + 3.2.44 两条(35 条版本标题、历史 33 条完整),走 `/theme-update/` 通道。 **已由 3.2.45 修掉的遗留**:本版的后台预览有两个问题(后台未加载 hljs ⇒ 预览单色; 首屏跳过上色),已并入 #14 修完并发布。
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#13