Files
wordpress-kratos-yang/assets/css/highlight-admin.css
T
laoyang 03b0bc6cc1 3.2.44: 后台配色实时预览 + 全站代码块语言标注统一 #13
需求 A —— 主题设置里选「代码配色」时能当场看到效果:
- 新增 assets/css/highlight-admin.css:只负责预览区布局,不改代码块外观
- 新增 assets/js/highlight-admin.js:监听下拉框,删旧 link 再插新 link,
  回调里重新上色
- inc/theme-highlight.php:新增 yang_hl_admin_assets()/yang_hl_admin_preview_html()
- inc/theme-options.php:在配色下拉框后插入 type=info 的预览面板

几个关键取舍(都有实测依据):
- 切换配色必须真正删掉旧 <link>。20 套配色的规则是裸选择器
  (.hljs-keyword 之类),同场会互相压制,切换看起来像「没反应」。
- 预览复用前台同一份 CSS,另写一套必然与前台不一致。
- 不用 highlightElement(会在已上色元素上再套一层,颜色变脏),
  改为从 textContent 取原文重新 highlight。
- 实测 hljs 的 HTML 转义无损(392 字符逐字符可还原),所以不需要额外的
  data-raw 暂存;那是两份状态,不同步就是 bug 源头。已删该冗余。

需求 B —— 全站代码块语言标注统一(数据侧,不在本次 diff 里):
- 284 块 / 71 篇全部统一为 <pre lang="xxx">,清掉 Enlighter 私有标记与
  code 上的 language-* 类
- 关键发现:站内没有「完全无标注」的块(0 个),但有 87 块标注无效
  (text 47 / generic 28 / raw 8 / jsp 2 / latex 2)—— 问题不是没标,是标是假的
- 87 块逐块判定:bash 174、plaintext 45、yaml 13、ini 9、xml 8、python 8、
  javascript 7、php 6、json 5、java 5、ruby 2、sql 2
- 判定表优先级必须高于「沿用旧标注」:产品把 generic/raw/text 兜底成
  plaintext,而 plaintext 在白名单里,旧逻辑会走 keep 把判定表整批丢弃
  (第一版实测 87 条只有 4 条生效,且结果看起来是成功的)
- 同一篇文章里有 11 对块原文完全相同,str_replace 会全局替换导致整片标错;
  改为按文内序号 + 内容签名定位

验证:
- 后台预览 jsdom 测试 22/0,反向注入 6 组全部真红
- 语言/属性单测 44/0 与 24/0,语言反向 10/0
- 独立审计脚本(另一套扫描逻辑)全绿;反向 3/3 真红
  (去掉 lang / 改成 cobol / 塞回 enlighter 各自都能抓出来)
- 真实页面 4 篇:data-guess 全为 0,正文里已无「猜出来的」代码块
2026-10-26 11:37:42 +08:00

113 lines
2.9 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 后台设置页:代码配色预览区布局
*
* 🔴 这个文件**只负责把预览框摆好**,绝不改代码块的外观。
* 代码块的一切外观(背景、边框、token 颜色)都来自两个前台文件:
* assets/hljs/styles/<配色>.min.css → token 颜色
* assets/css/highlight.css → 卡片骨架
* 在这里另写一套样式会让"预览"和"前台"不一致,比没有预览更误导人。
*
* 唯一必须在这里做的是**作用域隔离**:后台页面没有正文容器
* (.k-main .details .article .content),highlight.css 里大量规则带这个前缀,
* 单看 .cb 的规则在后台也能生效(那些规则都写了无前缀的兜底选择器),
* 但行号槽之类的尺寸依赖父级字号,所以这里要显式给一个正常的正文环境。
*/
.yang-hl-preview {
margin: 12px 0 4px;
padding: 14px 16px 10px;
border: 1px solid #dcdcde;
border-radius: 6px;
background: #fff;
max-width: 860px;
box-sizing: border-box;
}
.yang-hl-preview-head {
display: flex;
align-items: baseline;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 10px;
padding-bottom: 8px;
border-bottom: 1px solid #f0f0f1;
}
.yang-hl-preview-title {
font-size: 13px;
font-weight: 600;
color: #1d2327;
}
.yang-hl-preview-name {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 12px;
font-weight: 600;
color: #2271b1;
padding: 1px 7px;
border-radius: 4px;
background: #f0f6fc;
border: 1px solid #c5d9ed;
}
.yang-hl-preview-hint {
font-size: 12px;
color: #646970;
}
.yang-hl-preview-note {
margin: 8px 0 0;
font-size: 12px;
color: #646970;
line-height: 1.6;
}
/* 预览里的卡片:
* ① 给一个明确的字号基准(后台正文字号是 13px,代码用 12.5px 与前台一致)
* ② 限制高度,样例只有 13 行不需要滚动,但要防止窄屏下溢出 */
.yang-hl-preview .cb {
margin: 0;
}
.yang-hl-preview .cb pre,
.yang-hl-preview .cb code {
font-size: 12.5px;
line-height: 1.62;
}
/* 复制按钮在预览里没有实际功能(disabled),视觉上弱化,避免用户以为能点 */
.yang-hl-preview .cb-copy[disabled] {
opacity: .45;
cursor: default;
pointer-events: none;
}
/* 后台配色切换时,卡片边框跟着深浅走,避免"深色代码 + 白边框"的割裂感。
* 这里只调边框和顶栏,token 颜色一律交给配色 CSS。 */
.yang-hl-preview .cb[data-kind="dark"] {
border-color: #3a3f46;
}
.yang-hl-preview .cb[data-kind="dark"] .cb-bar {
background: #21262d;
border-bottom-color: #3a3f46;
}
.yang-hl-preview .cb[data-kind="dark"] .cb-lang {
color: #adbac7;
background: #2d333b;
border-color: #444c56;
}
.yang-hl-preview .cb[data-kind="dark"] .cb-body {
background: #22272e;
}
@media screen and (max-width: 782px) {
.yang-hl-preview {
padding: 10px 10px 8px;
}
.yang-hl-preview-hint {
flex-basis: 100%;
}
}