#!/usr/bin/env node /** * D16: PearlDiagram.vue 珍珠图组件清理 (debt 69) * 22 个行业类别色迁移到 utils/brand-colors.js 的 INDUSTRY_COLORS 导出,页面只引用常量 * template #FFFFFF -> BrandColors.white */ const fs = require('fs'); const F = 'pages/action-detail/components/PearlDiagram.vue'; let src = fs.readFileSync(F, 'utf8'); let replaced = 0; function repl(from, to) { const cnt = src.split(from).length - 1; if (cnt === 0) { console.warn('NOT FOUND:', from.slice(0, 90)); return; } src = src.split(from).join(to); replaced += cnt; } // ---- 1. import ---- repl( "import { addPearlInteraction, updatePearlPriority } from '@/utils/api.js'", "import { addPearlInteraction, updatePearlPriority } from '@/utils/api.js'\nimport { BrandColors, INDUSTRY_COLORS } from '@/utils/brand-colors.js'" ); // ---- 2. 行业色引用 ---- const MAP = [ ['#DC2626', 'INDUSTRY_COLORS.PUBLIC_SECURITY'], ['#EA580C', 'INDUSTRY_COLORS.AUTO'], ['#D97706', 'INDUSTRY_COLORS.REAL_ESTATE'], ['#CA8A04', 'INDUSTRY_COLORS.TICKETING'], ['#B45309', 'INDUSTRY_COLORS.HANDYMAN'], ['#92400E', 'INDUSTRY_COLORS.APPLIANCE'], ['#E11D48', 'INDUSTRY_COLORS.CATERING'], ['#BE123C', 'INDUSTRY_COLORS.FOOD'], ['#B91C1C', 'INDUSTRY_COLORS.LEGAL'], ['#FB7185', 'INDUSTRY_COLORS.WEEKEND_EXPERT'], ['#8B5CF6', 'INDUSTRY_COLORS.GOVERNMENT'], ['#7C3AED', 'INDUSTRY_COLORS.TAX'], ['#6D28D9', 'INDUSTRY_COLORS.BUSINESS_ADMIN'], ['#2563EB', 'INDUSTRY_COLORS.BANK'], ['#1D4ED8', 'INDUSTRY_COLORS.MEDIA'], ['#0EA5E9', 'INDUSTRY_COLORS.TRAVEL'], ['#0891B2', 'INDUSTRY_COLORS.LEADING_ENTERPRISE'], ['#059669', 'INDUSTRY_COLORS.INDUSTRY_BENCHMARK'], ['#16A34A', 'INDUSTRY_COLORS.UNIVERSITY'], ['#84CC16', 'INDUSTRY_COLORS.FINANCE'], ['#65A30D', 'INDUSTRY_COLORS.SENIOR_LOCAL'], ['#4D7C0F', 'INDUSTRY_COLORS.KEY_CITY'], ]; // 只在 color: '#XXX' 上下文中替换,避免误伤(原文件这些色仅出现于 color 字段) for (const [f, t] of MAP) { const pat = "color: '" + f + "'"; const cnt = src.split(pat).length - 1; if (cnt === 0) { console.warn('NOT FOUND color:', f); continue; } src = src.split(pat).join("color: " + t); replaced += cnt; } // ---- 3. template #FFFFFF ---- repl("color: '#FFFFFF'", "color: BrandColors.white"); fs.writeFileSync(F, src); console.log('total replaced:', replaced); const lines = src.split('\n'); let n = 0; for (let i = 0; i < lines.length; i++) { const L = lines[i].trim(); if (/#[0-9a-fA-F]{3,8}\b/.test(L)) { console.log('HEX ' + (i + 1) + ': ' + L); n++; } } console.log('remaining hex lines:', n);