d1-comprehensive-survey.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/env node
  2. /**
  3. * D 批 1/5:ComprehensiveSurvey.vue 暖棕系收编为页面级局部变量
  4. * 约定:单页专有色阶由页面级局部变量承载(uni.scss §14),同值全局令牌优先外联
  5. * 本页暖棕系 10 色均为问卷页专属(#4A3728 深棕 / #B08968 中棕 / #6B5744 次棕 /
  6. * #FFF3E6 浅橙底 / #FFE6D2 浅橙描边 / #FFD4B8 边框 / #F7EFE6 分隔 / #C4A98E 极淡 /
  7. * #FFFDFA 近白底 / #E53E3E 警示红)
  8. */
  9. const fs = require('fs');
  10. const F = 'pages/health/components/ComprehensiveSurvey.vue';
  11. let src = fs.readFileSync(F, 'utf8');
  12. const MAP = [
  13. ['#FFF3E6', '$c-survey-warm'], // 浅橙底 x10
  14. ['#4A3728', '$c-survey-ink'], // 深棕主文字 x9
  15. ['#B08968', '$c-survey-text'], // 中棕次要文字 x7
  16. ['#6B5744', '$c-survey-sub'], // 次棕补充文字 x6
  17. ['#FFE6D2', '$c-survey-warm-soft'], // 浅橙描边·最浅 x3
  18. ['#E53E3E', '$c-survey-alert'], // 警示红(删除键 / 风险徽章)x2
  19. ['#F7EFE6', '$c-survey-divider'], // 分隔线 x2
  20. ['#FFD4B8', '$c-survey-warm-line'], // 浅橙描边·副档 x2
  21. ['#C4A98E', '$c-survey-faint'], // 极淡棕提示 x1
  22. ['#FFFDFA', '$c-survey-paper'], // 近白底(量表卡)x1
  23. ];
  24. // 按 hex 长度降序,避免前缀误匹配(#FFF 不匹配 #FFF3E6 等,这里全部 7 位无冲突)
  25. MAP.sort((a, b) => b[0].length - a[0].length);
  26. const styleIdx = src.indexOf('<style');
  27. const before = src.slice(0, styleIdx);
  28. let styleBody = src.slice(styleIdx);
  29. let total = 0;
  30. for (const [hex, token] of MAP) {
  31. const esc = hex.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  32. const re = new RegExp(esc + '(?![0-9a-fA-F])', 'g');
  33. styleBody = styleBody.replace(re, () => { total++; return token; });
  34. }
  35. // 在 <style lang="scss"> 后插入局部调色板声明
  36. const palette = [
  37. '// ===== 问卷页专属色阶(单页专用,同值全局令牌已在其它页复用;约定见 uni.scss §14)=====',
  38. '$c-survey-warm: #FFF3E6; // 浅橙底(输入区 / 选中态)',
  39. '$c-survey-warm-soft: #FFE6D2; // 浅橙描边·最浅档',
  40. '$c-survey-warm-line: #FFD4B8; // 浅橙描边·副档(虚线 / 主描边)',
  41. '$c-survey-ink: #4A3728; // 深棕主文字(标题 / 输入值)',
  42. '$c-survey-text: #B08968; // 中棕次要文字(辅助说明 / 删除符)',
  43. '$c-survey-sub: #6B5744; // 次棕补充文字(标签 / 按钮)',
  44. '$c-survey-faint: #C4A98E; // 极淡棕提示(单位说明)',
  45. '$c-survey-divider: #F7EFE6; // 分隔线(浅暖灰)',
  46. '$c-survey-paper: #FFFDFA; // 近白底(量表卡)',
  47. '$c-survey-alert: #E53E3E; // 警示红(删除 / 风险徽章)',
  48. ''
  49. ].join('\n');
  50. styleBody = styleBody.replace(/(<style[^>]*>\s*\n)/, '$1' + palette + '\n');
  51. fs.writeFileSync(F, before + styleBody);
  52. console.log('replaced occurrences:', total);
  53. const rest = (before + styleBody).match(/#[0-9a-fA-F]{3,8}\b/g) || [];
  54. console.log('remaining uniq hex (含 palette 声明):', [...new Set(rest)]);