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