d12-report-detail.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env node
  2. /**
  3. * D12: report-detail.vue 健康报告详情页清理 (debt 78)
  4. *
  5. * style 全局令牌映射 6 色:
  6. * #D32F2F->$fortune-0-ink, #FFF8E1->$mat-amber-tint, #F57F17->$mat-amber-strong,
  7. * #66BB6A->$mat-green-light-2, #43A047->$mat-green-base-2, #FFD54F->$uni-warning-light
  8. * 专属色(医疗蓝 + Material 渐变 + 暖橙)收编局部 $c-rptd-* 变量
  9. */
  10. const fs = require('fs');
  11. const F = 'pages/health/report-detail.vue';
  12. let src = fs.readFileSync(F, 'utf8');
  13. const styleIdx = src.indexOf('<style');
  14. const before = src.slice(0, styleIdx);
  15. let styleBody = src.slice(styleIdx);
  16. const GLOBAL = [
  17. ['#D32F2F', '$fortune-0-ink'],
  18. ['#FFF8E1', '$mat-amber-tint'],
  19. ['#F57F17', '$mat-amber-strong'],
  20. ['#66BB6A', '$mat-green-light-2'],
  21. ['#43A047', '$mat-green-base-2'],
  22. ['#FFD54F', '$uni-warning-light'],
  23. ];
  24. for (const [f, t] of GLOBAL) {
  25. const esc = f.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  26. styleBody = styleBody.replace(new RegExp(esc + '(?![0-9a-fA-F])', 'gi'), t);
  27. }
  28. const PAL = [
  29. ['#4a90d9', '$c-rptd-blue'], // 医疗蓝 x2
  30. ['#eef4ff', '$c-rptd-blue-bg'], // 医疗蓝浅底
  31. ['#E8EDF2', '$c-rptd-line'], // 浅灰分隔线
  32. ['#F8FAFB', '$c-rptd-card'], // 卡片底(浅灰白)x6
  33. ['#FFF0F0', '$c-rptd-red-bg'], // 警示浅红底
  34. ['#FFC107', '$c-rptd-amber-deep'], // Material 琥珀深档
  35. ['#FF8A65', '$c-rptd-orange-1'], // 低档渐变起
  36. ['#FF5722', '$c-rptd-orange-2'], // 低档渐变终(deep-orange-500)
  37. ['#EF9A9A', '$c-rptd-red-1'], // 无档渐变起
  38. ['#E53935', '$c-rptd-red-2'], // 无档渐变终
  39. ['#FFF0E0', '$c-rptd-orange-tint'],// 浅橙底(提示卡)
  40. ['#FFD4A8', '$c-rptd-orange-line'],// 暖橙描边 x2
  41. ];
  42. for (const [f, t] of PAL) {
  43. const esc = f.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  44. styleBody = styleBody.replace(new RegExp(esc + '(?![0-9a-fA-F])', 'gi'), t);
  45. }
  46. const palette = [
  47. '// ===== 报告详情页专属色阶(医疗蓝 + Material 渐变档 + 暖橙提示;单页专用,约定见 uni.scss §14)=====',
  48. '$c-rptd-blue: #4a90d9; // 医疗蓝(标题/主元素)',
  49. '$c-rptd-blue-bg: #eef4ff; // 医疗蓝浅底',
  50. '$c-rptd-line: #E8EDF2; // 浅灰分隔线',
  51. '$c-rptd-card: #F8FAFB; // 卡片底(浅灰白)',
  52. '$c-rptd-red-bg: #FFF0F0; // 警示浅红底',
  53. '$c-rptd-amber-deep: #FFC107; // Material 琥珀深档',
  54. '$c-rptd-orange-1: #FF8A65; // 低档渐变起',
  55. '$c-rptd-orange-2: #FF5722; // 低档渐变终(deep-orange-500)',
  56. '$c-rptd-red-1: #EF9A9A; // 无档渐变起',
  57. '$c-rptd-red-2: #E53935; // 无档渐变终',
  58. '$c-rptd-orange-tint: #FFF0E0; // 浅橙底(提示卡)',
  59. '$c-rptd-orange-line: #FFD4A8; // 暖橙描边',
  60. ''
  61. ].join('\n');
  62. styleBody = styleBody.replace(/(<style[^>]*>\s*\n)/, '$1' + palette + '\n');
  63. fs.writeFileSync(F, before + styleBody);
  64. console.log('D12 done');
  65. const lines = src.split('\n');
  66. let n = 0;
  67. for (let i = 0; i < lines.length; i++) {
  68. if (/#[0-9a-fA-F]{3,8}\b/.test(lines[i])) {
  69. const L = lines[i].trim();
  70. if (L.indexOf('$c-') !== 0 && !/^\$c-/.test(L)) { console.log('HEX ' + (i + 1) + ': ' + L); n++; }
  71. }
  72. }
  73. console.log('remaining hex (excl palette):', n);