d16-pearl-diagram.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env node
  2. /**
  3. * D16: PearlDiagram.vue 珍珠图组件清理 (debt 69)
  4. * 22 个行业类别色迁移到 utils/brand-colors.js 的 INDUSTRY_COLORS 导出,页面只引用常量
  5. * template #FFFFFF -> BrandColors.white
  6. */
  7. const fs = require('fs');
  8. const F = 'pages/action-detail/components/PearlDiagram.vue';
  9. let src = fs.readFileSync(F, 'utf8');
  10. let replaced = 0;
  11. function repl(from, to) {
  12. const cnt = src.split(from).length - 1;
  13. if (cnt === 0) { console.warn('NOT FOUND:', from.slice(0, 90)); return; }
  14. src = src.split(from).join(to);
  15. replaced += cnt;
  16. }
  17. // ---- 1. import ----
  18. repl(
  19. "import { addPearlInteraction, updatePearlPriority } from '@/utils/api.js'",
  20. "import { addPearlInteraction, updatePearlPriority } from '@/utils/api.js'\nimport { BrandColors, INDUSTRY_COLORS } from '@/utils/brand-colors.js'"
  21. );
  22. // ---- 2. 行业色引用 ----
  23. const MAP = [
  24. ['#DC2626', 'INDUSTRY_COLORS.PUBLIC_SECURITY'],
  25. ['#EA580C', 'INDUSTRY_COLORS.AUTO'],
  26. ['#D97706', 'INDUSTRY_COLORS.REAL_ESTATE'],
  27. ['#CA8A04', 'INDUSTRY_COLORS.TICKETING'],
  28. ['#B45309', 'INDUSTRY_COLORS.HANDYMAN'],
  29. ['#92400E', 'INDUSTRY_COLORS.APPLIANCE'],
  30. ['#E11D48', 'INDUSTRY_COLORS.CATERING'],
  31. ['#BE123C', 'INDUSTRY_COLORS.FOOD'],
  32. ['#B91C1C', 'INDUSTRY_COLORS.LEGAL'],
  33. ['#FB7185', 'INDUSTRY_COLORS.WEEKEND_EXPERT'],
  34. ['#8B5CF6', 'INDUSTRY_COLORS.GOVERNMENT'],
  35. ['#7C3AED', 'INDUSTRY_COLORS.TAX'],
  36. ['#6D28D9', 'INDUSTRY_COLORS.BUSINESS_ADMIN'],
  37. ['#2563EB', 'INDUSTRY_COLORS.BANK'],
  38. ['#1D4ED8', 'INDUSTRY_COLORS.MEDIA'],
  39. ['#0EA5E9', 'INDUSTRY_COLORS.TRAVEL'],
  40. ['#0891B2', 'INDUSTRY_COLORS.LEADING_ENTERPRISE'],
  41. ['#059669', 'INDUSTRY_COLORS.INDUSTRY_BENCHMARK'],
  42. ['#16A34A', 'INDUSTRY_COLORS.UNIVERSITY'],
  43. ['#84CC16', 'INDUSTRY_COLORS.FINANCE'],
  44. ['#65A30D', 'INDUSTRY_COLORS.SENIOR_LOCAL'],
  45. ['#4D7C0F', 'INDUSTRY_COLORS.KEY_CITY'],
  46. ];
  47. // 只在 color: '#XXX' 上下文中替换,避免误伤(原文件这些色仅出现于 color 字段)
  48. for (const [f, t] of MAP) {
  49. const pat = "color: '" + f + "'";
  50. const cnt = src.split(pat).length - 1;
  51. if (cnt === 0) { console.warn('NOT FOUND color:', f); continue; }
  52. src = src.split(pat).join("color: " + t);
  53. replaced += cnt;
  54. }
  55. // ---- 3. template #FFFFFF ----
  56. repl("color: '#FFFFFF'", "color: BrandColors.white");
  57. fs.writeFileSync(F, src);
  58. console.log('total replaced:', replaced);
  59. const lines = src.split('\n');
  60. let n = 0;
  61. for (let i = 0; i < lines.length; i++) {
  62. const L = lines[i].trim();
  63. if (/#[0-9a-fA-F]{3,8}\b/.test(L)) { console.log('HEX ' + (i + 1) + ': ' + L); n++; }
  64. }
  65. console.log('remaining hex lines:', n);