Commit Graph
4 Commits
Author SHA1 Message Date
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 677de0f24e 3.2.29: 把「自定义 CSS」里的站点样式并入主题公共样式 assets/css/site.css(段落缩进/h2 蓝条/列表缩进与行距),配置项默认置空并一次性清库迁移;自定义 CSS 内联输出改挂 kratos-site 以保持在最末 2026-10-25 10:36:29 +08:00