d6b-profile-hoist.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/env node
  2. /**
  3. * D6b: profile.vue palette hoist
  4. * 局部变量 $c-wisdom-mid/$c-danger-ant/$c-pink/$c-pink-deep 均有全局等值令牌 ->
  5. * 提升为全局引用(删声明 + 使用处替换),仅保留无令牌的 $c-fill-2b
  6. */
  7. const fs = require('fs');
  8. const F = 'pages/profile-main/profile.vue';
  9. let lines = fs.readFileSync(F, 'utf8').split('\n');
  10. const HOIST = [
  11. ['$c-wisdom-mid', '$dim-wisdom-deep', '#4F46E5'],
  12. ['$c-danger-ant', '$status-danger-2', '#FF4D4F'],
  13. ['$c-pink-deep', '$accent-pink-deep', '#DB2777'],
  14. ['$c-pink', '$accent-pink', '#EC4899'],
  15. ];
  16. let src = lines.join('\n');
  17. // 先删除这 4 行声明(含其 hex 定义)
  18. for (const [v] of HOIST) {
  19. const re = new RegExp('^\\s*' + v.replace(/\$/g, '\\$') + '\\s*:[^\\n]*;[^\\n]*\\n', 'm');
  20. if (!re.test(src)) { console.warn('DECL NOT FOUND:', v); }
  21. src = src.replace(re, '');
  22. }
  23. // 再替换使用处(顺序:先 pink-deep 再 pink,避免前缀误伤)
  24. for (const [v, token] of HOIST) {
  25. const re = new RegExp(v.replace(/\$/g, '\\$') + '(?![a-zA-Z0-9-])', 'g');
  26. const before = src;
  27. src = src.replace(re, token);
  28. if (before === src) console.warn('USE NOT REPLACED:', v);
  29. }
  30. fs.writeFileSync(F, src);
  31. console.log('hoisted 4 vars to global tokens');
  32. // 校验剩余
  33. lines = src.split('\n');
  34. let n = 0;
  35. for (let i = 0; i < lines.length; i++) {
  36. if (/#[0-9a-fA-F]{3,8}\b/.test(lines[i])) { console.log('HEX ' + (i + 1) + ': ' + lines[i].trim()); n++; }
  37. }
  38. console.log('remaining hex lines:', n);