laoyang
|
05b4b56bf6
|
4.0.0 引用块首尾加引号,让引用文字与正文段落对齐 #32
用户诉求(原话):引用块有色块和左侧宽度,导致块内文字比正文段落更靠右,
缩进不一致。方案:色块保留,在引用首尾各加一个引号,用引号占住那段缩进。
改前实测(1440 视口,线上真实文章):
正文段落 p 文字起点 99
blockquote 框内沿 89,块内 p 文字起点 121
⇒ 引用文字比正文靠右 22px,且块内段落还叠了一层 32px 首行缩进
修法:
· border-left 6 + padding-left 26 = 32 = 正文 text-indent:2em(16px×2)
· 块内 > p 的 text-indent 归零,消除「块内缩 + 段首缩进」双层叠加
· 左引号 position:absolute 悬浮在 padding 区(inline 会被 block 级 p
挤成匿名块行,跑到段落上方)
· 右引号挂 > p:last-of-type,display:inline-block + line-height:0
+ height:0 + overflow:visible —— 行盒贡献 0,不撑高(否则块高 89→121)
· 引号放大到 60/56px,淡色 #c6d2dd 做装饰;暗色降到 #3d4b58
两个踩到的坑(都只有像素级测量能发现):
① CJK 全角字形左侧 side bearing ≈ 0.62em。30px 字号下伪元素盒在
x=12(完全正确),但引号墨迹在 30.5~40,正压在首字 32.5 上 ——
「盒对了」≠「字形画在那儿」。指定 Georgia 等拉丁衬线字体后
side bearing 降到 ≈0.03em,再用 left:2px/top:15px/font-size:60px。
② 窄屏(≤768px)kratos.css 把 .content p 降到 15px ⇒ 2em=30,
硬编码的 32 就多 2px。不能写 calc(2em - 6px)(em 基数是 blockquote
自己的 15px,不随视口变),只能在同一个断点覆盖;且这个 @media
必须放在 ::before 基础规则之后,否则同特异性被后出现的 left:2px 压掉。
版本号 3.2.64 → 4.0.0(用户要求跳大版本:引用块渲染方式变了,
第三方 CSS 若针对 blockquote 内部做微调会受影响)。
验证:
_geom32.js 48/0(3 篇 × 5 视口,对齐差全部 0.00px)
_pix400.py 76/0(像素差分:墨迹落在缩进空白内、不压字、不撑高)
_mkzip400.py 61/0
_mkzip400_falsify 20/0(18 组注入全部报红在预期判据)
_pix400_falsify 8/0
_readme400.py 36/0(readme 15 节,181195 字节)
php -l 97 文件 / 0 失败
包 kratos_yang-4.0.0.zip md5 bc23f478d5f5170524aec3921b10e6ff
已发 /theme-update/,update.json 指向 4.0.0,PUC 实测 getUpdate=4.0.0。
主题目录未覆盖(仍是 3.2.64),等用户在后台点升级。
|
2026-10-28 12:15:38 +08:00 |
|
laoyang
|
ac1575fbbb
|
fix(theme): 内容块宽度改为流式取值 + 1440px 封顶,消除档位跳变(#31)
现象:窗口从宽拖窄时,中间内容块宽度离散跳档(540/720/960/1280 四档),
档内两侧留白极宽 —— 1920 视口每边白 320px,占整个窗口约 1/3。
根因:bootstrap.min.css 的 .container 只有 4 个固定 max-width 档位,
档内宽度恒定不变,跨断点瞬间跳一格。不是"断点太少",而是宽度只有 4 个取值。
改法(assets/css/site.css +134 行):
1) .container 宽度改成连续函数
width: min(1440px, 100% - 2 * max(16px, 2.5vw))
min() 是连续取值,@media 是离散判断 —— 这是两者的本质区别。
上限 1440 由用户选定;边距 max(16px, 2.5vw) 做窄屏保底 + 宽屏按比例。
同时 max-width: none 显式压掉 Bootstrap 的 4 个档位(缺它宽屏仍被
1280 卡住,等于没改)。
2) padding 归零 + .row 负 margin 同步归零
Bootstrap 原本靠 container 的 15px padding 与 .row 的 -15px margin 相互
抵消。现在边距由 width 公式承担,padding 必须归零(否则双重扣减,
窄屏吃 30px);.row 的 -15px 也必须归零(否则内容外顶 15px、贴到容器边)。
列自身的 15px padding 保留,它是两列间隙的来源。
3) 导航容器单独对齐(三版才修对)
.k-nav 同时带 Bootstrap 的 .navbar,左右各有 16px padding,容器嵌在
已内缩的盒子里。直接用正文公式会得到正确宽度但差 16px 位置。
正确解是同公式 + margin:auto 在已内缩的盒子里居中。
两个失败版本记在注释里:① calc(100% + 32px) 因 100% 在绝对定位盒里
解析成视口宽 ⇒ 满宽 320@0;② 负 margin 把容器顶到父级 padding 之外
⇒ 左边缘变 0 而非 36。
验证(_tooling/yang_theme_test/,均为线上真实页面 + 拦截替换待发布 CSS):
- _diag_width3.js 改前定量:4 档平台 540×192 / 720×224 / 960×318 / 1280×609,
跳变 89.5/119.5/158.5px,1920 视口 521 个宽度留白 ≥60px
- _geom31.js 16/0:逐 1px 扫 320~1920 共 1601 档,W1 无固定档位(唯一平台
1440 封顶段)、W2 单步 ≤2px(实测 1px)、W3 单调、W4 封顶 1440 且对称、
W5 留白 ≤40px、W6 无横向溢出、W7 三容器一致、W8 正文占比 66.7%、
W9 正文缩进 15px;四条反证全部红在预期条目
- _shot31.js 33/0:7 档截图 + 表格/代码/图片不溢出、页脚同宽、目录块不越界、
暗色模式,另含 V4b 防空靶子守卫
- _align31.js 5/0:导航/正文/页脚容器左边缘逐像素一致,logo 与首段偏移
-31px 跨 7 档零漂移
- _mkzip364.py 43/0 + _mkzip364_falsify.py 11/0(10 条注入全部命中)
侧栏行为按用户要求保持现状(992px 以下隐藏、正文整行),该处宽度变化
是侧栏出现/消失导致,非台阶,不在本版范围。
Refs #31
|
2026-10-28 09:28:06 +08:00 |
|
laoyang
|
0c8cee9094
|
style: 标题编号字号改成与各级标题一致(3.2.63)#30
用户反馈 0.62em 那版太小、"很不协调,看着难受",要求字号和每一级标题一样。
改动:
- .yang-h-num 的 font-size 从 0.62em 改成 1em:
h2 编号 24px、h3 20px、h4 17px,逐级与标题同大。
弱化只靠颜色(#a8abb2)和字重(400),不再靠缩字号。
- margin-right 从 0.35em 收到 0.25em:em 是相对编号自身字号的,
字号从 14.88 变 24 后同一个 0.35em 会从 5.2px 涨到 8.4px,间距偏宽。
- display:inline-block + line-height:1 保留:实测同字号后已不撑高,
但留着防回归(以后改回小号不会复发 3px),且编号成原子盒不跨行断开。
- site.css 与 readme 的相关注释同步重写,删掉过期的「落在 12~15px 区间」。
验证(全部在线上真实文章页上量实际渲染值):
- 几何 71/0:h2 24/24、h3 20/20、h4 17/17,逐级与标题相等;
标题高度加/不加编号差 0.00px;编号与文字不重叠、不跨行。
- 三条反证全部红在预期条目:小字号+inline+inherit(3.00px)、
display:block(24.00px)、字号回 0.62em(G8)。
- 编号判据 44/0、真实数据 20/0、目录等价 7/0、反证 22/0。
- 打包自检 61/0,注入反证 8/0(含新增的字号/margin 两组)。
- PHP 语法 97 个文件 0 错。
包:kratos_yang-3.2.63.zip md5 ce757f325c0928f44d0e053d834c7da7
已发到 /theme-update/,update.json 已切 3.2.63,后台可见更新。
|
2026-10-28 08:59:31 +08:00 |
|
laoyang
|
76c69b31e8
|
正文标题自动编号,与目录编号共用同一份计算 #30
需求:目录里有编号、正文标题没有,读长文时要回头去目录找对应关系。
本版给 h1/h2/h3 加编号,样式为灰色小号(标题字号的 0.62 倍),
不抢标题视觉重心,与目录 .yang-toc-num 同风格。
编号规则(编号范围跟着后台 toc_levels 设置走,默认 1/2/3):
- 按「实际出现的最外层」归一,没有 h1 时 h2 直接是一级(1/2/3),
不会编成 2/2.1。天然满足用户"h1 没有就是 h2 一级"的要求。
- 作者已手写编号的标题跳过并占位(1./1、/1)/1.2/一、/(一)/第一章
等写法),不叠加成"3.1 1. xxx",但编号序列不错位。
实现要点:
- 抽出 yang_toc_pick / yang_toc_depths / yang_toc_number_map 三个纯函数,
目录与正文共用同一份编号计算,杜绝两边漂移(用户痛点正是"两边不一致")。
- 插入按 id 回填:条目清单只来自 scan() 那一份,id 是唯一键。
- 用 preg_match_all + PREG_OFFSET_CAPTURE 拿字节偏移、从后往前拼接插入。
早期写成 preg_replace_callback('#<h([1-6])([^>]*)>(.{0,120})#is'),
那个 .{0,120} 贪婪跨过块边界,导致 5 个标题只有第 1 个拿到编号且不报错。
- 幂等用 strncmp(substr($html,$end), $needle, strlen($needle)),不手数字节
(写成固定 26 而实际 25 会让幂等静默失效、编号插两层)。
CSS 修一个自己造的问题:编号把标题撑高 3px。
line-height:inherit 无效——同行高下小字号半行距更大,盒底反而更往下探
(h2 46→49)。改为 display:inline-block + line-height:1 成为原子行内盒,
实测 46→46、37→37。八组隔离试验数据见 _tooling/_diag362b.js。
验证(全部本地/线上实跑,非推断):
- 正向判据 43/0;反证 22/0(10 组注入均红在预期条目)
- 线上 4 篇真实文章 20/0(含"只有 h3"、"h1+h2"、"h2+h3"三种形态)
- 新旧两版目录 HTML 逐字节比对 7/0(4/4 篇相同,证明重构没改坏老行为)
- 几何判据 68/0,含两条反证:回到 inline+inherit ⇒ 高度差 3.00px;
编号 display:block 掉行 ⇒ G3 差 14.88px
- 打包自检 59/0 + 4 组注入反证全红
|
2026-10-28 08:27:53 +08:00 |
|
laoyang
|
264a6ec06a
|
3.2.61 修 h2/h3 层级倒挂:h2 提到 24/700,h4 降到 500 参与分层 #29
3.2.60 我自己造出的问题:只把 h3 提到 20px/600,h2 一直是 20px/500
⇒ 两级同字号、h3 还粗 100,三级标题比二级更抢眼,层级是倒的。
根因不是实现难,是判据漏了:3.2.60 写了 52 条断言全绿,但**没有任何
一条断言 h2 > h3**(只查了 h3 > 正文),倒挂在全绿里完全隐形。
改法(用户选 D 方案,并要求 h4 一起调)
h2 24px / 700 / 左 5px 蓝条 + 浅灰底(行高 41→46)
h3 20px / 600 / 左 3px 蓝条 + 底 1px 细线,无底色
h4 17px / 500 / 纯文字
p 16px / 350
两处细节的理由
· h4 600→500:600 与 h3 同重,只剩 3px 字号差,看着像"同一级被缩小"。
降到 500 让字重也参与分层;仍明显重于正文 350(差 150),不会糊回正文。
· h2 行高 41→46:24px 字配 41px 行高,灰底上下各只剩 8.5px、看着发扁。
写进注释的两条铁律
① 字号与字重必须同时严格递减:24>20>17>16、700>600>500>350
② 装饰强度也递减:蓝条+灰底 > 蓝条+细线 > 无 > 无
任一级调了要回头核对相邻两级,不能只盯自己那一级。
验证
· _geom361_route.js 56 / 0(双端面,新增 G1~G8 层级递减 + H 装饰 + I 行高)
G7/G8 是「严格」递减,不允许相等 —— 只写 >= 的话 h2=h3=20px 照样能过
· _falsify361.js 10 / 10
R1 = 把整份 CSS 退回 3.2.60 的倒挂状态 ⇒ 56→40,红 16 条,G1/G2 命中
(这一项通过才证明上一轮的盲区真的堵住了)
· _css360_selfcheck.js 28 / 0(改动后它主动报红提示 h4 期望过期,更新后全绿)
|
2026-10-28 07:38:09 +08:00 |
|
laoyang
|
cca7497553
|
3.2.60 正文插图不吃段落缩进 + h3/h4 提升层级区分度 #28 #29
#28 图片左缩进导致右侧溢出正文块
根因是 text-indent 可继承:段落写了 2em(32px),图片若在段落内
就被一起推走;而 max-width:100% 的 100% 是容器内容宽度、不是
缩进后剩余宽度,所以左缩进多少右边就溢出多少,两者永远相等。
🔴 只给 img 清零不够:灯箱把它包进 <a class="yang-lb-item">,
那个盒子是 inline-block,本身就是参与父级行内排版的主体,
起点照样被推。链接和图片两处都要清。
修法:图片自成一行、左右都不缩进、水平居中;灯箱链接一起块级化。
#29 h3 与正文区分度太低
改前 h3 只有 18px/500,正文 16px/350,只差 2px 字号 + 150 字重,
且无任何装饰。改后:
h2 20px/500/左5px蓝条+浅灰底
h3 20px/600/左3px蓝条+底1px细线
h4 17px/600/纯加粗
p 16px/350
两处让路:h3.ar-year(归档页年份,本身在 .content 里,会多出
竖线和第二条底线)、评论区的 h3(不在 .content 内,未受影响,已验)。
验证
· 判据 52/0(真实页面 + 拦截替换新 CSS,桌面 1440 / 手机 390 双端面)
· 反证 10/10 注入全被抓到,阴性对照未误报
· CSS 自检 25/0(含浏览器 replaceSync 逐块重插无丢弃)
|
2026-10-27 23:11:05 +08:00 |
|
laoyang
|
b7dcdc1602
|
分类挂件下拉面板列出全部层级并缩进 #24
需求(2026-10-27):把多级目录也放进去,现在只显示第一级,把其他的
也放进去,注意缩进。线上实测 29 个分类(8 一级 + 21 二级,无第三层),
因此面板从「只列一级」改成「有几层列几层」。
inc/theme-widgets.php
- get_tree() 从写死两层改成任意深度递归。带 $seen 已访问集合 +
$max_depth=10 双重保护:parent 成环时只跳过、不抛异常 —— 侧栏
挂件白屏会把整站带下去,宁可少显示一条也不能崩。
- 排序递归到所有层(原来只排前两层,第三层往后顺序与「按文章数排」不一致)。
- 新增 find_name():触发条文案与面板渲染共用同一套遍历。原来两段各自
硬编码两层,层数一变必漏一处。
- 新增 render_level():widget() 面板改成单次递归调用。关闭 children
时把 children 清空交给同一函数,不另写一份循环 —— 两份循环必然漂移。
- 下一层 <ul> 放在本层 li 内部(HTML 里 ul 的直接子元素只能是 li)。
- children 兜底值 false → true,**两处**(widget 第 1501 行、form 第
1701 行)。线上实例 categories-3 没有这个键 ⇒ 走兜底 ⇒ 用户零操作生效。
assets/css/kratos.css
- .yang-cats-item 加 flex-wrap:wrap;子级 ul 用 flex:0 0 100% 独占
一整行,落在父级 li 的内容盒里 ⇒ 缩进逐层累加且所有层共用一个右边界。
- 缩进只由子级 li 的 padding-left 给,**子级 ul 的 padding-left 归零**。
第一版两处都给了 12px,几何实测每层缩进 24px(stepPx=[24,24,18]),
第 3 层名字只剩 148px,收敛规则也一起失效。
- 第 4 层起收缩到 6px([style*="--cat-d:3"] 起),避免深层吃光面板宽度。
- 每层 padding-right 一律 0,右侧 12px 只由顶层统一给 ⇒ 任意深度的
数字右沿都在同一竖线(数字要竖着比大小,错开一列就没法比)。
assets/css/kratos.min.css 重新压缩;style.css 版本号 → 3.2.56。
验证
- 端到端(真实 WordPress):120 通过 / 0 失败;旧代码 100 / 17
- 反证 20 组(R1~R19 + R13b)全部命中
- 视觉几何(线上真实页面):56 通过 / 0 失败
- 打包内容自检 26 项全过;发布判据 79 条全过
- 发布:update.json → 3.2.56,md5 0aa90b30e76d754de41febcb9271ddef
- 红线:服务器主题目录仍 3.2.55(未覆盖),等用户在后台点升级
|
2026-10-27 13:33:53 +08:00 |
|
laoyang
|
f5fd363dce
|
fix(widgets): 分类挂件改成「点开才占一行」的下拉面板 #24
需求改判:3.2.54 做的「父级常显 + 子级折叠树」被否,用户要的是
「不点只有一行,点开把所有一级分类拉出来」的真下拉面板。
## 改了什么
- widget() 重写:`<details class="yang-cats-drop">` + `<summary>` 触发条
+ `position:absolute` 浮层面板。收起时整个挂件只占一行(40.5px),
展开时面板盖在下方内容上,不把后面的挂件推走。
- children 兜底值 true → false。线上实例的配置里本来没有这个键,
所以走 pick() 兜底 ⇒ 改兜底就等于改线上行为,用户零操作即变成
「只列一级分类」,不用进后台勾一次。
- 子级不再嵌套 <details>(3.2.54 是嵌套)。现在父级与子级的 DOM
结构完全一致,3.2.54 那个「space-between 推不动、数字右边界差
7.1px」的缺陷从结构上消失了,不需要 flex:1 补丁。
- 补一段渐进增强脚本,只做「点外部收起 / Esc 收起并还焦点」两件事,
不接管开合本身(关掉 JS 仍能正常展开跳转)。
- CSS:.w-cats 区块整块重写。修掉子级 li 右内边距叠加的缺陷 ——
子级 ul 嵌在已 padding:0 12px 的父级 li 里,子级 li 又写了一遍
右内边距 ⇒ 叠加成 24px,导致子级数字比父级多缩进 12px、父子排不成
一列,竖着比大小时会错位。改成 0 后父子数字同列。
- style.css 版本号 3.2.54 → 3.2.55(3.2.54 已落过 update.json,
同号重发会让 WP 的 version_compare 判「没有新版本」)。
## 验证
- 端到端(线上真实 WordPress,96 项):全通过
- 反证:内容判据 12 组 + 端到端 3 组,全部真红,无一组空跑
- 视觉几何(真实浏览器 50 项):全通过
- 上一版(3.2.53)老代码跑同一套端到端判据:88 项失败
- 包内 PHP lint 96 个全过;zip 无 1980 时间戳(防 OPcache 误判)
## 发布
只写 theme-update/:zip + readme + update.json → 3.2.55。
线上主题目录仍是 3.2.54,等用户在后台点升级(红线)。
|
2026-10-27 13:00:37 +08:00 |
|
laoyang
|
4c1d67b86b
|
3.2.54 主题接管「文章分类」挂件:父子折叠树替代核心下拉框(#24)
原来侧栏那个分类挂件是 WP 核心的 WP_Widget_Categories,实例配置
dropdown=1,输出的是 <select> 下拉框。主题 CSS 里那套
`.widget_categories ul li` 只匹配 ul li,下拉框里没有 ul
⇒ 写了但一条都没生效。不是"没写样式",是样式和渲染形态对不上。
做法:沿用核心的 id_base `categories` 直接顶替(不是新建独立挂件)。
- option 名不变,_register_widgets() 照旧认领存量实例 categories-3
- 用户升级后什么都不用做:就地变新样式、位置不变、标题沿用
- 代价:update() 需容忍核心的 dropdown/hierarchical 老字段
(不读也不显式删,用户重存表单时自然收敛掉)
呈现:父级常显 + 子级可折叠,用 <details>/<summary> 原生实现,零 JS。
父级链接放在 <summary> 里不会误触折叠 —— HTML 规范规定 <summary>
的"激活即折叠"只在点击目标非 interactive content 时触发。
显式 pad_counts:核心是在 show_count && hierarchical 时隐式打开的
(category-template.php:392)。不显式给的话父级数字 220→188,
用户会以为丢了 32 篇文章。
orderby=count 不交给 SQL:WP_Term_Query 翻成 ORDER BY tt.count
(原始值),而 pad_counts 是查询后由 PHP 补的 ⇒ 数字大的排在小的
后面。改成本地取回后按补过的 count 排,并做 strnatcasecmp tie-break。
分类名不 decode:实测 esc_html() 对 & 的输出恒为 &,所以库里
存 & 还是存 &,最终 HTML 字节一致、浏览器显示也一致。decode
是冗余且有多一层绕过风险。(建单时判断错了,此处自我纠正。)
删掉失效的 .widget_categories ul li 整套规则及 @media 里的宽度规则。
样式三个缺陷(线上真实页面量坐标才发现,不是看代码能看出来的):
1. 主题全局 ul>li{margin-bottom:6px;padding-left:2px;list-style:circle}
(kratos.css:74) 未被重置 ⇒ 每行多 6px,8 行累积 42px 行距发虚
2. 同上 padding-left:2px 只覆盖了 :not(.has-children) ⇒ 带箭头行错位 2px
3. 有子级行的 li 里只有 <details> 一个 flex 子项,space-between 推不动;
<details> 默认按内容收缩 ⇒ 数字右边界差 7.1px(实测
[220.5,220.5,227.6,227.6,220.5])
验证:
- 端到端(真实 WP 加载待测副本)77 通过 / 0 失败
- 反证 12 组全部命中预期判据,无一组空跑
- CSS 视觉反向验证 3 组:三处缺陷逐个注回,全部被量出来
- 视觉几何 18 项全绿(行距/胶囊/对齐/留白/悬停/箭头)
- 用 3.2.53 老代码跑同一套判据:11 通过 / 57 失败
过程中修掉 5 条假判据(全在我自己的测试脚本里)。用老代码跑时它
居然"通过 16 条",逐条查全是假绿,根因同一个:否定式断言作用在
空靶上(与 pitfalls #424 同一族)。最典型的一条:
/@media[^{]*\{[^}]*widget_categories/ 的 [^}]* 遇到块内第一个 }
就截断 ⇒ 永远匹配不到 ⇒ 恒真。老代码 2354 行明明有那条规则。
改成按花括号配对切块后,老代码从「16 通过/50 失败」变「11/57」。
包 kratos_yang-3.2.54.zip:4783259 字节 / 237 成员 / 0 个 1980 时间戳
readme 45 个版本标题 · update.json → 3.2.54
服务器主题目录仍 3.2.53,未被覆盖
|
2026-10-27 12:18:53 +08:00 |
|
laoyang
|
baa1d16fd1
|
3.2.52: 新增「最近评论」挂件(替代 Comments Widget Plus 插件)#22
主题自带一个好看的最近评论挂件,用户不必再装插件。
新挂件 widget_recent_comments(id_base = yang_recent_comments):
- 头像 40px 圆形 + object-fit:cover,带 max-width/max-height 双保险
- 摘要按字符截断(mb_substr),先剥标签再压空白,不走 wp_html_excerpt(按字节切半个汉字)
- 作者 · 相对时间 · 文章标题三段各自成 span,不拼 i18n 句式
- 三层字号:摘要 15px / 作者 14px / 文章 13px(文章字号继承自 meta)
- 条间虚线,最后一条去掉
- 后台九项设置:标题、条数、头像、头像尺寸、摘要、摘要字数、排除 pingback、评论类型、文章类型
实现要点:
- CSS 不依赖 .k-main .sidebar 祖先,只依到 .w-comments 自身
(3.2.51 的红线:带祖先的选择器在后台「外观→小工具」预览里一条不生效)
- .w-comments 自己不写 padding,交给 widget 基类,避免与其它挂件错位
- 只查 status=approve 且 post_status=publish,草稿文章评论不露出
同时修一个前后台不一致的 bug:
- form() 的 post_type 原来走 pick(),pick() 把空串当"没填"回落 'post'
⇒ 老实例(存空串)在后台下拉框显示「文章」,前台却按「全部类型」渲染。
改为 widget() 与 form() 都直接读原值,两处都识别空串/any 为「全部类型」。
验证:行为 112/0 · 行为反证 25/25 + CSS 10/10 · 几何 50/0 ·
线上真实页面 30/0 · 静态反证 23/0 · 发布脚本 22 组反证全真红。
|
2026-10-27 08:40:53 +08:00 |
|
laoyang
|
c1dde099d7
|
「个人简介」挂件:头像/昵称/简介/背景四项可单独填 + 修大图撑爆 #21
一、头像 / 昵称 / 简介原来**只读主题设置**,挂件表单里没有字段
· 用户点开侧栏「个人简介」只能改背景图,头像和那句话得跑去
「主题设置 → 站长信息」改全站共用的那份。
· 现在四项都是挂件实例字段:avatar / nickname / introduce / background。
· 取值顺序:实例 → 主题设置 → 内置兜底,**留空即回落**,
老站点升级后显示一点不变。
· pick() 判空统一用「trim 后是不是空串」,不用 empty()
(!empty('0') 是 false,昵称就叫「0」会被当没填)。
· 简介用 sanitize_textarea_field(保留换行),URL 用 esc_url_raw
(不做 HTML 实体化,避免与 esc_attr 双重转义)。
二、后台 form() 补齐五个字段
· 头像 / 背景各带「选择图片」按钮(调媒体库),背景另有「清除」。
· 输入框显示用户填的原始值,缩略图显示前台最终会用的那张,刻意分开。
· 资源加载统一到 yang_widget_admin_assets(),不再每个挂件各挂一次。
三、大图撑爆挂件的真因:CSS 选择器依赖三层祖先
· 老规则是 `.k-main .sidebar .w-about .wrapper img`,而后台
「外观 → 小工具」预览里没有 `.k-main .sidebar` 这层祖先,
规则一条都不生效 ⇒ 头像按原图 2136×2136 铺开、背景塌成 0。
前台看着正常是因为前台恰好有那层祖先,问题被完全掩盖。
· 改为只管 `.w-about` 内部元素,并补 max-width/max-height 双保险。
· 老规则必须**删掉**而不是并存:它是 (0,3,1),新规则是 (0,2,1),
并存时老规则在前台永远赢,新规则只对后台生效。
· 保留 `.k-main .sidebar .w-about { padding:0 }`:通用规则
`.k-main .sidebar .widget` 是 (0,3,0),少了这条会多出内边距、整体高 57px。
· 头像保持 inline(display:block 会让它脱离 text-align:center 的居中)。
· 顺带:object-fit 从 fill 改 cover(超宽图不再压扁);
背景 url() 补引号(文件名带空格时不再整条声明作废)。
验证
· 行为测试 67 条全通过;反向验证 13 组全部真红。
· 浏览器几何 76 条全通过(前台/后台 × 四种极端原图)。
· 修复前 CSS 跑同一套判据:38 条报红,精确复现用户症状
(后台挂件高 2217、头像 2136×2136、横向滚动 2146)。
· 线上真实页面 + 新版 CSS:16 条全通过。
|
2026-10-26 23:51:20 +08:00 |
|
laoyang
|
8367231e91
|
侧栏挂件一致性:标题可配、标签列数、重复 id、URL 转义 (3.2.50) #20
一并修掉上一轮列出的 5 处侧栏挂件遗留问题:
1. 标题不读 $args(4 个挂件标题在后台改不了)
新增 yang_widget_title($args, $instance, $fallback, $id_base),5 个挂件
统一走它:读 $instance['title'] → 空则回落 $fallback → 过 widget_title
过滤器 → 输出用 $args['before_title']/after_title → 仍为空则整个节点不输出。
四个挂件的 update() 补 title,form() 补输入框 + 「留空则不显示标题」说明。
widget_tags 留空回落「标签聚合」,老站点显示不变。
2. 标签列数随屏宽反转(1440 一列、1180 反而两列)
逐视口实测:真实断点在 1311→1310,@media(max-width:1310px) 只把格子压成
110px 而不改侧栏宽度(侧栏 992px 以上恒为容器 1/3),于是格子变小反而能
塞下 3 个。改为 .w-tags .item a / .widget_links ul li 用
width: calc(50% - 2px) + 父容器 font-size:0(消掉 inline-block 之间的
空白宽度),并在 1310 断点里删掉这两条 110px 规则(分类/归档的 110px
不是网格,保留)。判据守的是「列数单调不增」而不是「某视口恰好两列」。
3. 重复 id nav-tab(桌面一份、手机一份)
两份导航合并为一份,id 全部带实例后缀:yang_widget_uid($this) 取
$widget->id(如 widget_posts-2),输出 {uid}-tab / {uid}-new 等,
aria-controls / aria-labelledby 同步指向真实 id,两实例并用也不撞。
4. 搜索框固定 id(searchform / search / searchsubmit)
同样改为 {uid}-form / {uid}-field / {uid}-submit,并补
<label class="sr-only" for="{uid}-field">搜索</label>。
5. 图片 URL 未加引号 + 未转义
src/href 一律加引号 + esc_url(),alt 用 wp_strip_all_tags + esc_attr,
简介用 nl2br(esc_html())。背景图踩了一个自己写出来的坑:一开始写成
esc_url() 套在 esc_attr() 里 = 双重转义,& 变 &amp;,CSS 里拿到
字面量 amp,背景图 404。改为 url() 内部用 esc_url_raw()(只做协议/字符
清洗,不入实体),整个 style 属性交给 esc_attr() 统一转义一次。
顺带把侧栏标签页图标在窄屏隐藏(<1200px),避免三个 tab 挤在一起。
验证:
- _widgets_consistency.php 68 通过 / 0 失败
- _widgets_consistency_falsify.php 24 通过 / 0 失败(基线1·自检3·注入20)
- _widgets_hot_test.php 33 / 0
- _widgets_hot_falsify.php 20 / 0
- _widgets_hot_geom.js 24 / 0(真实浏览器几何)
- _widgets_ids_dom.js 5 / 0(真实 DOM 查重复 id)
- _widgets_visual20.js 30 / 0(像素级:图片 naturalWidth>0、
标题装饰线、标签等宽、tab 点击)
- _widgets_icon_wide.js 7 / 0(断点精确在 1200)
- _widgets_tags_geom.js 5 / 0(列数单调性)
- 发布脚本 R1~R10 十组注入全部真红
|
2026-10-26 23:04:28 +08:00 |
|
laoyang
|
492d8e11a6
|
3.2.48: 归档倒序/字号/底边对齐/共N篇 + 评论标题线等长 + 工具条分隔线统一 #18
工单 #18 八条诉求逐条落地:
1. 月份、日期、年份全部倒序(最近的在最上面)
- PHP 侧 `krsort($years[$y]['months'])`(原来是 ksort)
- JS 侧 `Object.keys(...).sort((a,b)=>b-a)` —— 对象键序对纯数字整数键
会强制升序,服务端顺序传不过来,必须前端自己再排一次
- 年份本来就是 krsort,日期本来就是倒序,本次只补月份
2. 年份字体再大一点
- 原来 CSS 写的 22px **从来没有生效过**:`.yang-archives .ar-year` 是
(0,2,0),被 `.k-main .details .article .content h3` 的 (0,4,1) 压死,
线上实际是 18px
- 改为带 `.k-main` 前缀(提到 (0,5,0))+ 26px + 700
- `.ar-month-title` 同一个坑,一并修(写 14px/600,线上实际 16px/500)
3. 「共 N 篇」太高、比年份还高 → 下移与年份底边对齐
- `.ar-head` 的 `align-items: center` → `flex-end`
- `.ar-year` 的 margin 显式清零(kratos 的 `h1..h6 { margin: 0 0 30px 0 }`)
- 窄屏媒体查询同步改,否则手机上又回到居中
- 注意 `flex-end` 对的是 margin box,所以 margin 不清零等于没改
4. 每月后面的裸数字 → 「共 N 篇」
- PHP:`sprintf(esc_html__('共 %s 篇'), number_format_i18n(...))`
- JS:同一个文案键 `i18n.monthCount`,服务端输出到 `yangArchivesData`
- 新增 `monthCount` 键,**没有复用** `totalFmt`(两处语义不同,
以后要分别改文案时不至于互相牵连)
5. 上一年/下一年按钮看不清 → 与「写下你的评论」同款观感
- 平时:`1px solid #cfe6fb` 浅蓝框 + 透明底 + `--yq-primary-dark` 蓝字
- 悬停:主色实底 + 白字(`.ar-nav-year` / `.ar-nav-arrow` 也要跟白,
否则图标还是蓝的在蓝底上看不见)
- 禁用态保持灰(`is-disabled` + opacity .42),不能跟可用态一个样
6. 评论「评论者」下面的灰线太短 → 延长到与评论分隔线等长、右侧到头
- 🔴 这里改过一次方案:一开始以为把 h3 `flex: 1 1 auto` 撑宽就行,
实测发现 `.comments-head` 是 flex 行,右边还有「写下你的评论」按钮
(flex: 0 0 auto),h3 撑满也只能长到按钮左边缘 —— 原理上到不了右端
(实测 h3 110.5px / li 561.98px,差的 451px 就是按钮 + gap)
- 最终方案:**线从 h3 搬到 `.comments-head` 容器上**,
h3 显式 `border-bottom: none` 干掉 kratos 的 #f0f0f0,
否则会出现一短一长两条线,比原来更难看
- 容器那条规则**还必须带 `.k-main` 前缀**((0,5,0)),否则压不过
kratos 的 `.comments .title`。发布判据当场抓到这一条:注释里写了
「带 .k-main 前缀」,代码里漏了 —— 注释不能当证据
7. 工具条分隔细线不统一 → 5 个按钮 4 条线
- 原来 B/I 之间没有线,其余有 ⇒ 现在统一
- 写成「每条后面跟一条」会在末尾多出贴容器边缘的孤线,所以是 5 按钮 4 线
8. 清理无用 JS/CSS
- 四轮查证结论:**没有可安全删除的**,代码一行未动
- 排查过程已作为评论发到工单
测试:归档单测 113/0(反向 13 真红)、归档 e2e 112/0(反向 24 真红)、
评论几何 157/0(反向含新增 5 条,覆盖"线搬回标题""两处都画"两种错误形态)。
线上真实页面几何探针发布前 17 通过/16 失败(每条都对应上面某一条诉求),
发布后要求全绿。
|
2026-10-26 18:42:40 +08:00 |
|
laoyang
|
7047ab3ece
|
3.2.46: 新增 [Archives] 归档短代码 + 评论关闭时整块零输出 #15
需求一:[Archives] 短代码 —— 归档式全站文章列表
· 在文章/页面正文写一行 [Archives],该位置渲染全站文章的年月归档
· 默认显示今年,按月份归类;每篇带浏览/评论/点赞三个数
· 上下两排各有一组「上一年 / 下一年」按钮(四角),JS 切换不刷新页面
· 地址栏同步 ?arc_year=,刷新与分享链接都能保持同一年
· 只在用到短代码的页面才加载 assets/js|css/archives.js|css
· 参数:year="2025" 指定首年;month="0" 不按月分组
需求二:评论关闭时评论区整块消失
· comments.php 在**任何输出之前** `if (!comments_open()) return;`
—— 零字节,不是空容器、不是 display:none、不留提示文字
· 已有评论的老文章关评论后也不再显示(需求原话:正文之外什么都没有)
· inc/theme-comments.php 的资源守卫与之同口径:关评论时不加载
约 10KB 的 comments.css / comments.js
· 删掉 .comments-closed 样式与两处「评论已关闭」提示分支
开发中实测抓到并修掉的三个真实 bug(都是"测试把期望值写对之后"才显形):
· 年份标题 / 导航年份过了 number_format_i18n() ⇒ 输出「2,025」,
而 JS 侧 String(year) 输出「2025」⇒ 首屏与切年后不一致
· 月份标题同样过 number_format_i18n(),与 JS 侧 String(m) 口径不一致
· yang_archives_render_nav() 把 ar-nav-top 写死,而下排也调它生成
⇒ 下排被叫成 top(视觉上被更高特异性规则压住,看不出问题)
验证:
归档 _archives_unit.php 94 通过 / 0 失败
_archives_e2e.js 109 通过 / 0 失败
_archives_e2e_falsify.js 反证 25 真红 / 0 无效
_archives_unit_falsify.py 反证 6 真红 / 0 无效
评论 _comments_closed_test.php 54 通过 / 0 失败
_comments_closed_falsify.py 反证 13 真红 / 0 无效
回归 _test_comments.php 64 通过 / 0 失败
_hl_unit_run.py 24 通过 / 0 失败
全量 96 个 PHP 文件语法检查通过;包内 lint 通过
发布 已推 3.2.46 到 /theme-update/,update.json 已落 3.2.46;
服务器 wp-content/themes/kratos_yang/ 仍为 3.2.45(未覆盖)
另:把 _archives_unit.php 从 `__DIR__` 定位改为接受根目录参数,
否则它无法登记进 verify_all.sh,只能手动跑(手动跑 = 长期不跑)。
5 个新套件已登记进 verify_all.sh(2j ~ 2o)。
|
2026-10-26 13:25:51 +08:00 |
|
laoyang
|
9da5e9e2df
|
后台代码配色预览不上色 + donate.png 404 一并修复 #14
Bug 1:后台预览的示例代码没有高亮。三层原因叠在一起。
① yang_hl_admin_assets() 从未 enqueue hljs 本体,而 yang_hl_enqueue()
开头 `if (is_admin() || is_feed()) return;` 挡掉后台
⇒ 后台 window.hljs 恒 undefined ⇒ recolor() 静默 return。
卡片的边框/顶栏是 data-kind 驱动的纯 CSS,切深浅配色时照样会变,
看起来像"预览在工作,只是代码没颜色"。
② init() 里 applyTheme(sel.value, true) 传 noRecolor=true ⇒ 首屏永不上色,
只有手动拨下拉框才有颜色(正是报障的"下面的示例代码并没有高亮")。
③ recolor() 缺 hljs 时只是 return,控制台零输出 ⇒ 极难定位。
修法:
- inc/theme-highlight.php:后台 enqueue hljs 本体,并作为 preview 脚本的
硬依赖(不靠 WP 的加载顺序碰运气);前台 yang_hl_enqueue() 仍挡后台。
- assets/js/highlight-admin.js:删掉 noRecolor 这个"能否跳过核心动作"的
参数(调用方迟早会用错);首屏与切换走同一条路径。
- 缺 hljs / 上色失败时 console.error 出声,并给 code 打
data-unhighlighted、给卡片打 data-hl-failed;CSS 画橙色虚线框 +
顶栏文字,让失败在画面上也看得出来,不再是一坨单色字。
- 配色样式加载主路径改为 setTimeout(once, 125),link.onload 只作加速。
onload 三情形不触发:样式表已在缓存、link 移除后重插、jsdom 无网络。
Bug 2:后台设置页报 donate.png 404。
库里 g_donate_alipay / g_donate_wechat 存的是旧主题目录名
`.../themes/kratos-master/assets/img/donate.png` 的绝对 URL。前台走
yang_option_image() 有 yang_image_url_is_stale() 兜底,后台
class-options-media-uploader.php 直接 echo $value,绕过检测。
修在渲染处:预览图与"浏览文件"href 走检测后的 $preview(带
function_exists 兜底),输入框仍显示库里的原值,不偷偷改用户数据。
版本 3.2.44 → 3.2.45。
|
2026-10-26 12:20:33 +08:00 |
|
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 |
|
laoyang
|
8f8cffd69e
|
3.2.43: 修代码块重影与语言识别,含 4 个静默 bug (#12)
排查结论:不是插件冲突,对手是主题自己的 kratos.css。
现象一「重影/阴影」的真实成因是 CSS 优先级 + 行高错位:
kratos.css 的 .content code(0,4,1) / .content pre code(0,4,2) 抢走了
border-radius:4px、color:#333、font-size:13px。字号被顶到 13px 后
行高算成 21.06px,而行号槽是 12.5px/20.25px,每行错开 0.81px,
30 行累计 24px —— 视觉上就是「两层东西叠在一起」。
现象二「多一个 copy 按钮」未能复现:2 个页面实测每张卡恰好 1 个
.cb-copy;Prism.plugins 只有 autoloader,copy-to-clipboard 未注册;
Enlighter 插件目录不存在。已请用户指认页面。
修复:
- highlight.css 的选择器提到与原主题同级 (0,4,2),靠出现更晚取胜,
不用 !important。
- 顺带修掉 4 个静默 bug(都不报错、页面看着正常):
1. header.php 从未调 body_class(),裸 <body> ⇒ 所有挂 body_class
过滤器的类全部静默失效,包括行号开关 opt-ln(选项已开却不显示)。
2. 79 个代码块的语言写在 <pre lang=> 或 data-enlighter-language 上,
只读 <code> class 必然读不到 ⇒ 标签显示「—」。
3. 白名单 4 项指向未打包语言(powershell/dos/dockerfile/nginx)。
hljs 遇到不认识的语言不抛错,只 warn 一句就退回不高亮 ⇒
整块白板。站内这 4 种用量均为 0,属潜伏 bug。
4. hljs 把 plaintext 块改写成 language-undefined;highlightAuto
对纯文本返回字符串 'undefined',if (r.language) 会误当真值。
顺带收敛:yang_hl_languages() 原本手写第二份清单,与 yang_hl_norm_lang()
里的表互相漂移,改为从 yang_hl_known_map() 单一来源派生。
验证:
- 单测 44 + 24 断言全通过
- 反向验证 10 组注入全部变红(含专门注入「恢复手写清单」验证新判据)
- 全站 284 块直连数据库校验:568 通过 / 0 失败,
语言覆盖率 71.8% → 98.6%,残留与污染全 0
- 剩余 4 块显示「—」是正确降级(jsp×2、latex×2 未打包进 hljs)
- 夹具对照:新版 0 失败 vs 全旧版 10 失败
|
2026-10-26 11:00:47 +08:00 |
|
laoyang
|
da0d9ae4a1
|
代码高亮整套自研:10 浅 + 10 深配色、语言标签、评论区贴代码 (#11)
不再依赖第三方高亮插件,全部由主题自己实现。
主题配色(20 套)
- 浅色 10:github / vs / atom-one-light / idea / xcode /
stackoverflow-light / intellij-light / googlecode / magula / color-brewer
- 深色 10:github-dark / atom-one-dark / monokai / github-dark-dimmed /
a11y-dark / stackoverflow-dark / night-owl / srcery /
panda-syntax-dark / tomorrow-night-blue
- 深色卡片带 data-kind="dark",顶栏跟着换深色底
- 只加载当前选中的一套(20 套全加载会让后出现的规则压前面的,
切换配色容易"看起来没变")
代码语言标签(用户要求:防止复制错语言)
- 作者标了 language-xxx → 实线边框、正体
- 自动识别猜出来的 → 虚线边框、斜体
- 认不出来 → 显示 "—",仍保持虚线斜体(不冒充作者标注)
行号
- 默认关;行号槽在 <pre> 外面,复制天然不带行号
- 改掉原主题的 word-break:break-all(任意字符断行,代码像乱码)
- 归零 hljs 主题自带的 pre code.hljs{padding:1em},
否则代码被压低 1em、与行号槽错位 15.5px
复制
- 默认开;安全上下文判断 + execCommand 退路(HTTP 下 clipboard 是 undefined)
- 取 textContent 而非 innerHTML
- 默认 opacity:0、hover 显示、触屏覆盖回 1
(旧写法只在 @media(hover:none) 里写 1,等于空操作)
自动识别
- 做成选项,默认开
- 只对没标语言的块生效;站内实测长块准确率 22%,不能覆盖作者标注
评论区贴代码
- 评论工具条加"代码"按钮 + 29 种语言面板
- kses 放行 pre 并给 pre/code 放开 class
(WP 默认 pre 整条剥掉、code 属性全清,此前根本贴不了代码)
- 放行 pre 之后 wpautop/wptexturize/make_clickable 自动让路,
代码里的连续空行、引号、URL 都不会被改写
- comments.js 用占位符保护代码块,避免 walk() 的 /\n{3,}/ 压缩
其它
- 资源版本号改为读主题头,不再写死(写死会导致以后升级后
浏览器一直用旧缓存,改了 CSS/JS 完全不生效)
- 删除 footer.php 里旧的 Prism 兜底(两套高亮器同页会互相打架)
验收
- 用线上 284 个真实代码块跑产品代码:284/284 全部变卡片,内容丢字 0、双转义 0
- 47 个 text 标记全部映射到 plaintext(hljs 无 text 语言,不映射会静默不上色)
- 80 个裸 <pre>(无 code 子元素)全部覆盖
- 核心纯函数 65/65;核心反向 10/10 变红
- 浏览器端到端 32/32;行号几何逐行对齐偏差 0.00px,几何反向 4/4 变红
- 端到端反向 7/7 变红;语言标签反向 2/2 变红
- 全量 PHP 语法 95 文件 0 错误
发布:走 theme-update 通道(zip + readme + update.json),
未覆盖服务器主题目录;线上主题目录仍是 3.2.41,待后台升级。
|
2026-10-26 09:00:17 +08:00 |
|
laoyang
|
f3583e07c5
|
perf(lightbox): 点开图片不再白屏干等,先糊后清 #10
用户反馈:点一张图之后先是白背景渲染出来,图片迟迟不出现,感觉特别慢。
实测归因(_v40_slow.py,自建慢速 HTTP 服务,3.2 Mbps):
· 遮罩可见 31ms —— 纯 CSS 底色,一帧就画完,从来不是瓶颈
· 图片有像素 6 秒后仍然没有
线上原图最大 3.2MB(PUA的两面性与界定-scaled.png),3Mbps 下要 8 秒以上,
这段时间屏幕上是整片白 + 一个 0x0 的空 img。
三层改造:
1. 缩略图占位(blur-up):点开瞬间把正文里已经解码过的 currentSrc 顶上,
0 延迟就有像素;原图到了再淡入覆盖。
2. 原图淡入:is-ready 后 opacity 0→1,避免看到渐进渲染的半张图。
3. 空闲预取:requestIdleCallback 里串行预取视口上下 1.5 屏内的原图,
用 new Image() 不塞 DOM;尊重 saveData / slow-2g。
CSS 的 .yang-lb-stage 从 flex 改 grid,占位层/原图/转圈都 grid-area:1/1
叠在同一个格子(flex 会让子元素并排,absolute 又不参与居中)。
实测(_v40_opt2.py,5/0):
立刻点(最坏) 遮罩 25ms · 首帧有像素 25ms · 原图 15012ms
读 12 秒后点 遮罩 25ms · 首帧有像素 25ms · 原图 25ms(预取命中)
服务端各收到 1 次请求,预取一次命中、没有重复下载。
验证:交互 245/0(新增 J 段占位层与加载态 45 条)· 服务端 55/0(8.4+8.5)
· 演示页 34/0 · 反向验证 27/27(新增 U11~U14)
Refs #10
|
2026-10-25 23:03:13 +08:00 |
|
laoyang
|
7125fdd3ce
|
feat(lightbox): 正文图片点击在当前页放大、多图轮播、键盘切换
新增主题自带的图片灯箱,替代「点图片跳新标签页」的旧行为,
不再依赖第三方灯箱插件。
主要能力
· 正文里的图片链接改写成「在当前页覆盖展示原图」,不跳转
· 原图优先按附件 ID 取 full size(wp_get_attachment_image_src),
取不到才退回 href 自己 —— 不在前端从缩略图文件名反推原图地址
· 原图地址写在 href 里而不是 data-full:主题的 CDN 是整页输出缓冲
改写,只认 src= / href= 与 CSS url(),写 data-* 会绕回源站
· 多图左右箭头轮播(到头循环),键盘 ←↑ / →↓ 切换、Esc 关闭、
Home / End 跳首尾,点空白关闭,打开时锁滚动并在关闭后归还焦点
· 两套遮罩配色(白色默认 / 深色)与九档不透明度(默认 80%)
· 图片本身始终保持不透明:透明度只作用在遮罩底色上
兼容性处理
· 剥掉第三方灯箱插件留下的触发属性(data-rel / data-imagelightbox /
data-rl_title 等)。线上实测 100 篇文章 112 张图**全部**带这些属性,
若只「让给插件」则主题灯箱永不生效;同时关掉开关时一律不动,
插件可照常工作
· 移除 imgnofollow() 给图片链接加的 target="_blank" 与 rel,
链接不再承担跳转职责
· 无 JS 时 href 仍在,右键「在新标签页打开图片」照常可用
可读性
· 半透明遮罩下底部说明条自带更实的底(≥0.9),并按「遮罩底下是
纯黑」的最坏情况验证文字对比度 ≥ 4.5:1
· 行内不透明度样式用 [data-theme] 选择器,避免被样式表默认值压掉
(裸类名优先级不足,会让深色配色下透明度静默失效)
验证
· 服务端正文改写探针 51 通过 / 0 失败(PHP 8.4 与 8.5)
· 浏览器真实交互探针 200 通过 / 0 失败(两配色 × 80%,含 50%/100%)
· 上述两者的反向验证 21 项注入全部按预期捕获
· 三个改动文件 php -l 通过
Refs #10
|
2026-10-25 22:05:24 +08:00 |
|
laoyang
|
4a2d62b1aa
|
3.2.31 目录「正文内显示」与「浮动显示」拆成两个独立开关(#1)
原来「目录位置」是一个三选一下拉:正文中间 / 页面左侧 / 页面右侧,
等于把「放进正文」和「浮在页边」当成互斥的一件事 —— 想同时在正文
开头放一份、又在边上浮一份,做不到。
改成两个独立勾选,各自带子选项:
· 在正文中显示 → 正文中的对齐(靠左 / 靠右)+ 自动插入位置
· 浮动显示 → 浮动方向(页面左侧 / 页面右侧)
两个都勾就同时出现两份,只勾一个就只出现一种。四种组合都在后台
联动里逐个验证过(探针 70/0)。
新增能力「正文内靠左 / 靠右」是本单的主要新需求。实现上两个要点:
1. 必须给正文目录一个宽度上限(max-width: min(100%, 28em))。
块级盒子默认撑满正文栏,此时 margin:auto 没有剩余空间可分配,
「靠左/靠右」会是一个属性正确、画面纹丝不动的空操作。
2. 用 data-align 属性把方向带下去,CSS 只需两条规则,
不随方向数量膨胀。属性在 yang_toc_slot_html() 里输出。
语义收窄:手写 [TOC] 以前会让整份自动处理全停(连带 rail=false),
现在只手管「正文那一份」—— 手写位置优先,浮动仍由 float 开关独立
决定。这样「精确定位正文位置」和「全站边上都有目录」可以并存。
顺手修掉一处默认值错配:checkbox 用 !empty() 判断会把「键不存在」
和「键明确为空」混成一件事,导致新装站点后台框显示勾上、页面却
不出目录。改用 array_key_exists() 区分的三态判断。
老配置不迁移:3.2.30 的 toc_place 直接作废,不做兼容。
默认 inline=1 / float=0,升级后页面与升级前一致。
重构:把内容过滤器拆成 yang_toc_apply()(纯执行层)+ 运行时壳,
使设置组合能在单进程单测里逐个喂进去(PHP 无法重置函数 static)。
验证
逻辑 101/0 · 逻辑反向 15/15
旧回归 53/0
静态契约 58/0 · 反向 11/11
后台几何+交互 70/0 · 反向 11/11
侧栏几何 73/0 · 反向 8/8
正文对齐几何 23/0 · 反向 5/5(含阴性对照)
包内容契约 59/0 · 反向 9/9
正文对齐的几何探针量到真实的 Δleft = 348px(靠右比靠左),
而不是只断言 data-align 字符串存在。
|
2026-10-25 13:37:26 +08:00 |
|
laoyang
|
6f51d50a58
|
3.2.30: 文章目录进后台(新增「自动目录」标签页)—— 位置/插入点/默认展开可配,手写 [TOC] 永远优先
后台「主题设置」新增第 5 个标签页「自动目录」,7 个选项:
目录位置 正文中间 / 页面左侧(浮动)/ 页面右侧(浮动)
添加方式 手动(只认 [TOC])/ 自动
自动插入位置 文章开头 / 第一个 H1、H2 之前 / 文章结尾
默认状态 默认显示 / 默认隐藏
另外:目录标题、收录层级(H1~H4)、是否显示序号
设计要点:
- 插入方式拆成 toc_mode(manual/auto) x toc_anchor(start/first/end) 两个正交
字段,不合成一个四值下拉:侧栏模式下插入位置毫无意义,合并会产生歧义。
- 手写 [TOC] 绝对优先:yang_toc_plan() 里 $has_marker 最先返回,inline_at
='marker' 且 rail=false —— 否则同一篇会出现两份目录,老文章升级后突然多
出一个目录。这条是刻意守住的。
- 纯函数 + 薄壳分层:normalize_settings / plan / inject / build_list 全部不查库,
单进程可喂几十种组合;settings() 只负责读库 + 调纯函数 + static 缓存。
- <details open> 是唯一可靠的「默认收起」手段:展开态不接受 CSS 覆盖,只能
由 open 属性决定,所以隐藏时必须不输出该属性。
- 侧栏收起态必须 translateX(±100%) 完全移出视口:只做 opacity 会让透明面板
留在原位吃掉正文点击(探针 elementFromPoint 才抓得到)。
- yang_toc_rail_ready() 开关:侧栏在 wp_footer 输出,那时正文可能没走
the_content(缓存插件/OEmbed),标题没 id ⇒ 侧栏链接全跳不动却看起来正常。
宁可不出侧栏。
- 后台联动隐藏「插入位置」不用 jQuery show()/hide():会把 .section 的行内
display 写成 block,悄悄回退 3.2.28 的 display:flow-root BFC 修复。改用
class + display:none!important。
验证(全部在本轮重跑):
_test_toc.php 53/0 旧 TOC 行为回归
_toc330_logic.php 88/0 逻辑判据
_toc330_falsify 13/13 注入全变红且红对地方
_geo330_rail.js 73/0 侧栏真实几何(左/右 x 展开/收起 x 宽窄屏)
_geo330_falsify 8/8
_guard330.php 46/0 后台控件与运行时默认值双向一致
_guard330_falsify 8/8
_admin330_tab_check 36/0 新标签页几何 + 联动 + 载入态
_admin330_falsify 8/8
_admin328_check 13/0 3.2.28 布局回归
发布:只发 zip + readme + update.json 到 theme-update/,不动服务器主题目录,
用户在 WP 后台自行升级(沿用 3.2.24 起的策略)。
|
2026-10-25 12:18:52 +08:00 |
|
laoyang
|
677de0f24e
|
3.2.29: 把「自定义 CSS」里的站点样式并入主题公共样式 assets/css/site.css(段落缩进/h2 蓝条/列表缩进与行距),配置项默认置空并一次性清库迁移;自定义 CSS 内联输出改挂 kratos-site 以保持在最末
|
2026-10-25 10:36:29 +08:00 |
|
laoyang
|
0239cbeb2a
|
3.2.27: 评论嵌套引导线按层变色(1层浅蓝/2层深蓝/3层点赞色/更深扩展色轮换,深层线恢复绘制);导航多级下拉修复(depth=2 截断改 0,深层父项 dropdown-submenu + hover 右侧弹出,移动端平铺)
|
2026-10-25 09:52:07 +08:00 |
|
laoyang
|
92ffced7cf
|
3.2.26: 评论布局重排(姓名/时间垂直居中于头像、正文全宽下移 10px,锚点黄底不再压作者徽章);引导线与子块留 8px 空隙并与缩进同源(--yq-my-indent);修深层缩进晚一层生效的存量 bug;后台设置页标题 margin 收编(项间空白 42→22px)
|
2026-10-24 23:58:55 +08:00 |
|
laoyang
|
fb12d58067
|
3.2.25: 评论框改为所见即所得编辑器(B/I/颜色/表情可视化+序列化白名单+纯文本粘贴);后台资源 enqueue 版本号改跟 THEME_VERSION(修设置页重排被浏览器缓存挡住的问题)
|
2026-10-24 22:38:10 +08:00 |
|
laoyang
|
fd27b4d218
|
3.2.24: 评论富文本工具条(B/I/颜色/表情移入)+ kses 放行 span+style + 后台设置页标签左列竖排重排
|
2026-10-24 21:59:06 +08:00 |
|
laoyang
|
78fce2d87d
|
3.2.23 评论区:引导线和输入框聚焦统一成主色
用户对 3.2.22 的反馈:
「这蓝色有点奇怪啊,应该用主题颜色,就是评论的那个按钮背景色。
把评论回复左侧那个竖着的小蓝条,改成这个颜色,下面输入框被选中的
时候,周边的颜色,也变成这个颜色。」
1. 引导线 #cfe6fb → var(--yq-primary)
浅蓝和「发布评论」按钮的背景色(#00a2ff)不是一个蓝,
页面上两蓝并存反而显乱。改成引用主色变量,以后改主色线自动跟。
2. 输入框聚焦变主色 —— 顺带翻出一个藏了三版的老问题
实测发现正文输入框聚焦后边框仍是灰色:kratos.css 里
.k-main .details .comments .comment-respond .comment-textarea
{ border: 1px solid #eee; ... }
特异性 0,6,0,把 comments.css 的静态边框(0,1,0)、hover 变深
(0,2,0)、focus 变主色(0,2,0)全部压死。也就是说 3.2.20 重做
以来,正文框的边框色、圆角、浅底、悬停变色、聚焦变色**全部
从未真正上线**,用户看到的一直是基础主题的 #eee / 3px / 灰底,
聚焦时只有一圈很淡的外环是主色的。
修法:textarea 的静态 / hover / focus 三态都改用同样的
0,6,0 选择器收编(本表依赖 kratos 后加载,每条稳定压过)。
不去改 kratos.css —— 那是基础主题,改它等于放弃覆盖层架构。
姓名/邮箱/网址那排 input 不受影响(kratos.css 没对它们写边框),
聚焦本来就是主色。
3. 新增线上判据并先证明它能红
④ 引导线颜色 = 主色(动态取 .comment-submit 背景色做参照,
不写死 RGB,主色一改判据自动跟);
⑧ 真实点击姓名框与正文框、等 0.16s 过渡结束后量边框色。
部署前在 3.2.22 线上跑:④⑧ 正确变红、几何项依旧全绿——
判据有效,不是空转。
只改样式表与版本号,评论的取数、分页、回复、加载更多逻辑未动。
|
2026-10-24 20:49:41 +08:00 |
|
laoyang
|
420605f462
|
3.2.22 评论区:引导线跟着右移到正文左边缘,锚点高亮改回黄色
用户对 3.2.21 的反馈:
「回复的内容和上面评论的正文是对齐了,但是回复内容左侧有一条蓝色的线
还是没有对齐。那条蓝色的线也要向右移,让那条线和上面评论的内容正文对齐。
如果是为了突出显示打开文章时的锚点,那还是用黄色吧。」
1. 引导线右移
原来线写在容器的 border-left 上。边框只能贴在盒子外沿,也就是父评论的
最左边(父头像那一列),而子回复整块已经右移到父正文的位置了,中间
空出 55px,线与内容脱节。
现在改成绝对定位的 ::before,位置由缩进算出:
left: calc(var(--yq-indent) - var(--yq-guide-w))
线的右边缘正好压住正文左边缘。断点里改缩进,线自动跟着走,
不需要另写一遍。三档屏幕实测误差 0px。
取右边缘对齐而不是左边缘,是因为线宽 2px:若左边缘对齐,线会压住
子头像左侧(头像有一圈 1px 描边,压上去发脏)。
2. 缩进值 53 → 55(连带 44→46、40→42)
旧值扣掉了 2px,因为那时线是 border,而 padding 从边框内侧算起。
线不再占布局后,那 2px 不该再扣,否则子回复整体左移 2px。
缩进回到最朴素的形式:头像宽 + 列间距。以后改这一个数,
线和内容一起动,不会再出现「只对一半」。
3. 锚点高亮改回暖黄 #fffbe8
3.2.21 改成浅蓝的理由是「全站只有待审核用暖色」。但用户指出它
是用于突出显示锚点,该用黄色。这个判断是对的:锚点高亮需要在一整片
蓝白里「跳出来」,浅蓝与引导线、按钮描边同色系,反而被当成背景噪音。
与「刚提交」的分工因此清楚:
:target → 暖黄(一次性,指路)
is-new → 浅蓝(即时反馈,我刚发的)
同页出现也能分辨。
深层(第三个 children 容器起)仍然不画线,改用 content: none 关掉,
而不是以前的 border-left-color: transparent —— 伪元素没有"透明的线"
这种语义,直接不生成更干净。
只改样式表与版本号,评论的取数、分页、回复、加载更多逻辑未动。
|
2026-10-24 20:12:23 +08:00 |
|
laoyang
|
5cb42f1716
|
3.2.21 评论区:去掉多余的装饰,把回复对齐到正文
用户在 3.2.20 上线后提了 5 条,逐条对应:
1. 去掉「评论」左侧的蓝色竖条。它本身是多余的视觉噪音,
而且逼着标题让出 12px 左内边距,让标题和下方评论正文对不齐。
连带断点里为它让路的 11px 一起删掉。
2. 去掉标题下方的灰色横线。它和评论容器自己的上边框只隔十几像素,
两条平行线挨得太近,像是重复画了一次。
3. 回复内容对齐到父评论正文的左边缘。上一版缩进 18px 是拍脑袋定的,
结果子回复正文比父正文又右偏 20px,左边缘错开一小截。
这一版按布局算:父评论一行是「头像 42 + 列间距 13 + 正文」,
子容器是父 li 的直接子元素、从父 li 左边缘起算,自身还有 2px 引导线,
而 padding-left 从边框内侧算起,所以
缩进 = 42 + 13 − 2 = 53px
窄屏同步为 36+10−2=44、32+10−2=40。实测四个视口误差均为 0。
缩进改存成 CSS 变量,在 .comments 作用域定义、断点里重新赋值,
避免三处写死改一漏二。
同时收住深层累加:padding-left 逐层叠加,53×3=159px 会把
390px 屏的正文切成竖条。第三层起换用更小的缩进并去掉引导线,
三层累计 136px 仍有递进感。
4. 回复左侧的引导线换成主题浅蓝 #cfe6fb,与「写下你的评论」
按钮的描边同一个色系;原来的灰蓝在一片灰白里发闷。
5. 统一高亮底色。原来「有些回复有黄色背景、有些没有」并不是随机:
暖黄只出现在 :target 命中的那一条,也就是链接末尾带了
#comment-1234 锚点的时候(从评论通知邮件点进来就是这种)。
正常打开文章一条都不黄。加上刚发出的 is-new 原本也是暖黄,
两个黄叠在同一页面上更难分辨。
现在两者统一为 --yq-primary-soft(#eaf6ff)。徽标里的
「待审核」暖色保留 —— 那是状态色,需要区分度。
只改样式表与版本号,评论的取数、分页、回复、加载更多逻辑未动。
|
2026-10-24 19:38:08 +08:00 |
|
laoyang
|
b97f265142
|
feat(comments): 评论区样式重做,修掉三处可读性不达标与窄屏头像溢出(3.2.20)
用无头浏览器把评论区的计算样式逐条量出来之后,确认「不好看」里有三处
是硬指标不达标,不是主观审美:
· 时间戳 #a4abb5 对白底对比度 2.32 → 4.83(WCAG AA 正文需 ≥4.5)
· 回复按钮 #8a9099 对比度 3.22 → 6.0 (可点元素同样需 ≥4.5)
· 顶层分隔线 #f5f6f8 对白底 ≈1.04 → 1.17(可见,此前等于没有分隔)
顺带修掉一个只在窄屏出现的真 bug:768px 断点里 avatar 的 width 组
只写了容器与占位符、漏了 img,容器缩到 36px 而图片仍是 42px,
溢出 6px 压在正文上。400px 断点同类问题一并补齐。
这个 bug 之所以能活过多个版本,是因为几何探针量的是容器宽度 ——
容器确实等于 36,98 条断言全绿。已在探针里新增 3 条直接量 img 的断言,
并在反向验证里加入对应的注入用例。
其余为层次与细节调整:
· 新增 .comments 作用域内的局部设计变量层(--yq-*),信息性颜色带兜底
· 标题加主色竖条;外框圆角 4→6、阴影对齐整站 .widget 的档位
· 头像边框改外描边,不占布局,直径保持精确 42px
· 缩进 20→18px、引导线加深;正文 14→14.5px、行高 1.8
· 新增 :target 高亮与 prefers-reduced-motion 分支
保持不变的 DOM 契约(已在文件头注明):.yang-comment 仍为 grid、
子容器缩进仍只加 padding-left、头像断点节奏仍为 42/36/32。
验证:verify_all.sh 30 组全通过;本地几何 107/0、反向注入 25/0、
AJAX 34/0;线上四视口几何 52/0;线上实测时间 4.83、按钮 6.0、分隔线 1.17。
|
2026-10-24 12:16:30 +08:00 |
|
laoyang
|
cbe0f2dc59
|
3.2.18: 清明按节气换算、主题内 [TOC] 目录、重建评论区替代 wpDiscuz
三项功能:
1. 清明不再用固定 04-04
清明是节气,日期在 4/4~4/6 之间浮动。硬编码 04-04 实测 1900-2100
共 201 年里只有 76 年是对的(约 38%)。改为内嵌逐年表换算真实日期,
超出 1900-2100 返回 null 明确放弃,不退化成近似值。
兼容 3.2.17 及以前勾过的 '04-04' 键,升级后勾选不会被静默丢弃。
2. 主题内实现 [TOC]
文章里写 [TOC],该位置输出本文目录,点击跳到对应标题。
在 the_content 优先级 9 处理(早于 wpautop 10 / do_shortcode 11),
保证"补 id"与"扫目录"用的是同一份文本,href 与 id 必然对得上。
嵌套用深度归一化,h1→h3 跳级不会算错层级。
scroll-margin-top 声明式让位,原生锚点/外部 #hash/后退全都生效。
3. 重建评论区
旧实现的问题:列表渲染与 AJAX 渲染各写一份 HTML,已经分叉
(AJAX 返回的新评论没有回复按钮);<li> 被 <div> 包着,嵌套回复错位。
现在统一到 yang_comment_html() 单一渲染函数,列表与 AJAX 只差一个
is-new 类。同时修掉三处真实缺陷:
· 评论项用 flex 会把 <ol class="yang-children"> 当成第三个 flex 项,
子评论跑到父评论右侧、正文被挤到 156px、页面横向溢出 75px —— 改 grid
· 成功提示在 exitReplyMode() 之前设置,被其末尾的 setStatus('','')
擦掉,用户提交成功却看不到反馈 —— 调整顺序
· 窄屏媒体查询打不过深层选择器(媒体查询不增加特异性),
嵌套头像反向变大 —— 补深层覆盖
与 wpDiscuz 解耦:邮件模块不再无条件 return false(那等于永久关掉
notify_postauthor 且不报错);插件在场时不加载主题评论资源,
避免双份表单互抢。
验证:PHP 语法 73/73;_static_qingming 36、_test_toc 53、
_test_comments 62、_test_comments_falsify 17、
_toc_geometry 121、_toc_geometry_falsify 9、
_comments_geometry 98、_comments_geometry_falsify 23,全部 0 失败。
线上端到端 29/0(真实文章渲染目录 + 真实评论数据渲染)。
|
2026-10-24 01:03:36 +08:00 |
|
laoyang
|
0799268661
|
3.2.16: 删三项无用功能、选项重排为 10 组、修移动端提示条偏左
删除
- 微信二维码:配置项 s_wechat / 隐藏上传 s_wechat_url、footer 浮动块、
默认图注册表条目、CSS 规则、wechat.png
- Font Awesome:选项 g_fontawesome、theme-core 入队、58KB 样式、
assets/fonts/webfonts 全套字体(2.8MB,CSS 删后零引用)
- 多人模式:选项 multiusers、page-content / page-toolbar 两处分支
选项重排(9 组 → 10 组)
全站配置 / 顶部导航 / 首页配置 / 文章配置 / 站长信息 /
页脚配置 / 哀悼模式 / 收录与统计 / 邮件通知 / 自定义代码
哀悼 5 个字段从「首页配置」独立成「哀悼模式」——它不是首页专属功能。
g_404/g_chrome/g_animate/g_gravatar 等归「全站配置」,s_copyright 归「页脚配置」。
修复
- footer.php 版权行此前无条件硬编码,后台 s_copyright 填了不生效
- 附加日期命中时 yang_mourning_today_name() 返回空串,提示条退化成
只说「今天是纪念日」而不给名字
- 小屏哀悼提示条 padding 写成 `7px 40px 7px 12px`(右宽左窄给关闭按钮
让位),内容盒中心 181 vs 视口中心 195,整体偏左 14px。关闭按钮本就
absolute 不占内部流,改为左右等宽 + 缩小按钮。桌面端同类错误 3.2.14 已修,
此处漏了同一个断点。
加载顺序
theme-options.php 可能早于 theme-mourning.php / theme-custom-code.php 加载,
新增 yang_opt_* 四个 function_exists 包装,避免裸调用导致后台白屏。
验证:静态断言 62/0 · 后台面板 14/0 · 反向验证 7/7 与 44/0 ·
提示条 4 视口几何 20/0(注入旧 bug 精确复现 -14px)· 线上 3 视口 33/0
|
2026-10-23 22:56:10 +08:00 |
|
laoyang
|
ef9a58dc51
|
v3.2.13 图片选项全部自带默认图,新装站点不再出现空洞/破图
根本原因:kratos_option() 运行时只读数据库,`std` 仅在后台表单预填和
「恢复默认」时生效,前台根本读不到。因此新装站点所有图片项都是空值。
另外 isset() 挡不住「用户清空」——of_sanitize_upload() 对空输入返回 '',
键存在且值为空串,调用方传的兜底值被绕过。
同时不能把绝对 URL 写进 std:它会随保存一起写库,主题目录改名/换 CDN/
迁站后永久 404。本站 s_wechat_url / g_donate_alipay / g_donate_wechat
三项就指向已删除的 kratos-master 目录,一直在破图(这三项是 hidden 字段,
后台界面上看不到,所以坏了很久没人发现)。
做法:
- 新增 inc/theme-option-defaults.php,图片默认值注册表(11 项),
默认图一律运行时给出,不写数据库。
- yang_option_image() 三层判断:空/纯空白 → 默认图;指向已不存在的主题
目录 → 默认图;文件不存在则不输出地址(避免换来一个 404)。
- 陈旧判断用 get_template()(主题 slug)而非 basename(目录名),避免本地
开发目录名与 slug 不一致时误伤当前主题自己的图。
- 模板统一走取值函数:header(logo/favicon/banner)、footer(微信码/国旗)、
404、index、article 缩略图、widgets 头像、page-toolbar、theme-core 赞赏码。
- 国旗与 favicon 的渲染抽成 yang_flag_block() / yang_favicon_tag(),
空值时不输出空 src / 空 href。
- 后台 9 处 std 改为 yang_options_default_img(),与前台默认图同源;
该包装函数自带 function_exists 防护,单独加载 theme-options.php 不会 Fatal。
新增图片(本地生成,合计 291KB):default-404 / default-share /
default-empty / default-avatar / default-banner / default-flag / favicon.ico。
favicon 为 WordPress 风格自绘(品牌蓝圆底 + 白色 W),非站长个人专用那张。
验证:run_tests 146 条(新增第 4 组图片默认值 22+ 条);falsify 35 条注入
全部能被抓住(新增 10 条);verify_all.sh 14 组全绿。
|
2026-10-23 19:50:07 +08:00 |
|
laoyang
|
4f0d19fb91
|
版本号 3.2.4 -> 3.2.5(修 Prism 报错,项目地址改为自建 Git)
## 修 Prism is not defined
首页控制台报 `Uncaught ReferenceError: Prism is not defined`,来源是
wp-editormd 插件(不是本主题):它在 Prism 脚本加载之前就无条件执行了
`Prism.plugins.autoloader.languages_path = "..."`。
线上页面里的真实顺序:
第 668 行 该赋值语句
第 695 行 prism-core.min.js
第 696 行 prism-autoloader.min.js
在 `wp_head` 优先级 0 垫一个最小空壳 `window.Prism`(含 plugins.autoloader
这条访问链路),让那句赋值有地方可写。已核对 prism-core.min.js 源码:它开头
只读 `u.Prism.manual` 与 `u.Prism.disableWorkerMessageHandler`,结尾
`global.Prism = Prism` 整体覆盖 —— 空壳必定被真实对象替换,不承担持久职责,
只为吸收那条过早的赋值。已用 jsdom 验证:去掉空壳重现原始报错,加上后消失,
且之后 `Prism.highlightAll` 仍可正常调用。
## 项目地址统一到 code.yangyq.net
原作者署名、原主题地址、README、语言包、JS 里的控制台横幅全部换成自建仓库地址。
LICENSE 文件保持原样不动(MIT 要求保留原始版权声明)。
## CDN 分支改成拿不到就回退本地
原来的 `g_cdn` 分支指向 `cdn.jsdelivr.net/gh/vtrois/kratos`,本仓库在自建
Gitea 上,jsDelivr 只认 github/npm/wordpress,实测该地址 404。现改为仅在
`YANG_THEME_CDN_REPO` 常量存在时才走 CDN,否则一律用
`get_template_directory_uri()`。留一个 404 的地址比留空更危险:页面能开、
样式全丢,极难排查。
## 顺带
- `.gitattributes` 补 `*.mo binary`:原来是靠"含 NUL"启发式判定,不是契约
- `update.json` 的版本号跟进到 3.2.5
- `kratos.min.js` / `kratos.min.css` 用压缩器重新生成,不手工改产物
|
2026-10-23 12:55:41 +08:00 |
|
laoyang
|
ffbe1b9b73
|
修复压缩产物丢失的代码块样式,并把主题更新源收进主站
1. kratos.min.css 补回 6 条代码块样式
上次为了注释掉 max-height 把单行压缩版手工展开,展开时整组丢了
.content 下的 pre / code / kbd / pre code / pre ol / pre li,
而未压缩的 kratos.css 里它们都在,源与产物从此不一致。
表现是行内 code 与 kbd 没有样式(代码块因插件主题覆盖才没露馅)。
改为用 clean-css 从 kratos.css 重新生成,不再手工维护产物。
2. 删掉 max-height / text-overflow 两条声明,而不是注释掉
注释会被压缩器剥掉,产物里等于没改过。
3. 补上 Prism 代码高亮兜底(此前只存在于线上,仓库里没有)
语言包路径改用 plugins_url() 动态生成,换域名或加 CDN 不会静默 404。
4. 主题更新元数据从独立子域名迁到主站 /theme-update/
地址可用 wp-config.php 的 YANG_THEME_UPDATE_URL 覆盖,换域名不必改主题代码。
5. footer 的主题链接指向自建源库;补文档说明自动升级会覆盖主题目录、
以及发布新版本必须"先打包再改版本号"的顺序。
6. 顺带去掉 .a-post .header .label 里重复声明的 position。
|
2026-10-23 09:06:16 +08:00 |
|
杨永全
|
61d0111e0b
|
因chrome版本更新,导致其中.k-main .board .article-panel .a-post .header这个标签中的max-height: 25px;失效,因此注释掉。
|
2026-07-03 13:11:34 +00:00 |
|
laoyang
|
a604cc28bd
|
Update kratos.css
|
2022-07-21 11:03:26 +08:00 |
|
laoyang
|
a826b26bee
|
从gitee代码库中初始化项目。
|
2022-01-07 11:15:42 +08:00 |
|