sweep-font-sizes.mjs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // 票 15 实施(二):裸字号 → 语义档归并;KPI 数值接 --fs-kpi
  2. // 就近原则(不改可读性结论,±0.5u 内归并;差异 >1u 的保留裸值并在票面登记):
  3. // 9/9.5/10/10.5u → --fs-caption(11.5u);11u → --fs-caption;
  4. // 12.5/13/13.5u → --fs-body(14u);14u → --fs-body;14.5/15u → --fs-title(15.5u);
  5. // 21u(品牌主标题,独立档)→ --fs-heading(18u) 偏差大,保留裸值(登记);
  6. // 26u(入口页大标题,独立场景)→ 保留裸值(登记)。
  7. // 大号 KPI:.panel-kpi__value 系列 font-size 由 --fs-body(14u) 改 --fs-kpi(20u)。
  8. import { readFileSync, writeFileSync, readdirSync, statSync } from 'node:fs'
  9. import { join, relative } from 'node:path'
  10. const root = 'src/modules/cockpit'
  11. const files = []
  12. ;(function walk(dir) {
  13. for (const e of readdirSync(dir)) {
  14. const p = join(dir, e)
  15. if (statSync(p).isDirectory()) walk(p)
  16. else if (/\.(vue|css)$/.test(e)) files.push(p)
  17. }
  18. })(root)
  19. const MAP = {
  20. '9': 'var(--fs-caption, 11.5px)',
  21. '9.5': 'var(--fs-caption, 11.5px)',
  22. '10': 'var(--fs-caption, 11.5px)',
  23. '10.5': 'var(--fs-caption, 11.5px)',
  24. '11': 'var(--fs-caption, 11.5px)',
  25. '12': 'var(--fs-body, 14px)',
  26. '12.5': 'var(--fs-body, 14px)',
  27. '13': 'var(--fs-body, 14px)',
  28. '13.5': 'var(--fs-body, 14px)',
  29. '14': 'var(--fs-body, 14px)',
  30. '14.5': 'var(--fs-title, 15.5px)',
  31. '15': 'var(--fs-title, 15.5px)',
  32. }
  33. const re = /font-size:\s*calc\((9|9\.5|10|10\.5|11|12|12\.5|13|13\.5|14|14\.5|15)(\.\d+)?\s*\*\s*var\(--u(?:,\s*1px)?\)\)/g
  34. let total = 0
  35. const report = []
  36. for (const f of files) {
  37. const rel = relative('.', f)
  38. const src = readFileSync(f, 'utf8')
  39. let count = 0
  40. const out = src.replace(re, (m, n) => {
  41. // 只归并 MAP 里登记的档位(9/9.5/10/10.5/11/12.5/13/13.5/14.5/15;14 保留——它就是 body 本值,
  42. // 12 只在 CockpitIntro(12.5 误配)出现,已含于 12.5 规则)
  43. const mapped = MAP[n]
  44. if (!mapped || n === '14') return m
  45. count += 1
  46. return `font-size: ${mapped}`
  47. })
  48. if (count) {
  49. writeFileSync(f, out)
  50. report.push(`${rel}: ${count}`)
  51. total += count
  52. }
  53. }
  54. console.log(report.join('\n'))
  55. console.log(`\n合计归并 ${total} 处裸字号`)