需求 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,正文里已无「猜出来的」代码块
113 lines
2.9 KiB
CSS
113 lines
2.9 KiB
CSS
/**
|
||
* 后台设置页:代码配色预览区布局
|
||
*
|
||
* 🔴 这个文件**只负责把预览框摆好**,绝不改代码块的外观。
|
||
* 代码块的一切外观(背景、边框、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%;
|
||
}
|
||
} |