const fs = require('fs') const path = require('path') // 从本地文件读取CSS const cssFilePath = path.resolve(__dirname, 'style.css') const css = fs.readFileSync(cssFilePath, 'utf-8') // 用于存储变量及其值的对象 const cssVariables = {} // 正则表达式用于匹配CSS变量及其值 const cssVarRegex = /--\w+[^:]*:\s*([^;]*);/g const cssVarReferenceRegex = /var\((--\w+)\)/g // 解析CSS变量及其值 let match while ((match = cssVarRegex.exec(css))) { const variable = match[0].split(':')[0].trim() const value = match[1].trim() cssVariables[variable] = value } // 对变量进行排序,确保被引用的变量在引用它的变量之前 const sortedVariables = Object.keys(cssVariables) // 按类别对变量进行分组 const groups = { colors: [], typography: [], spacing: [], border: [], boxShadow: [], body: [], block: [], panel: [], button: [], checkbox: [], input: [], table: [], other: [], } sortedVariables.forEach((variable) => { const value = cssVariables[variable] const isColor = value.startsWith('#') || value.includes('rgb') || value.includes('color') || variable.includes('color') || variable.includes('fill') || variable.includes('neutral') const isTypography = variable.includes('text') || variable.includes('font') || variable.includes('prose') || variable.includes('link') const isSpacing = variable.includes('spacing') || variable.includes('padding') || variable.includes('gap') || variable.includes('margin') value.includes('padding') || value.includes('margin') const isBorder = variable.includes('radius') || variable.includes('border') const isBoxShadow = variable.includes('shadow') if (variable.includes('--body')) { groups.body.push(variable) } else if (variable.includes('--block')) { groups.block.push(variable) } else if (variable.includes('--panel')) { groups.panel.push(variable) } else if (variable.includes('--button')) { groups.button.push(variable) } else if (variable.includes('--checkbox')) { groups.checkbox.push(variable) } else if (variable.includes('--input')) { groups.input.push(variable) } else if (variable.includes('--table')) { groups.table.push(variable) } else if (isBorder) { groups.border.push(variable) } else if (isBoxShadow) { groups.boxShadow.push(variable) } else if (isColor) { groups.colors.push(variable) } else if (isTypography) { groups.typography.push(variable) } else if (isSpacing) { groups.spacing.push(variable) } else { groups.other.push(variable) } }) // 生成排序后的CSS变量 const generateGroupCss = (groupName) => { const cache = groups[groupName].map((variable) => `${variable}: ${cssVariables[variable]};`) const firstPart = cache.filter((item) => item.includes('var')) const secondPart = cache.filter((item) => !item.includes('var')) return [...secondPart, ...firstPart].join('\n') } const sortedCss = '#output {\n' + `/* Colors */\n` + generateGroupCss('colors') + `\n\n/* Typography */\n` + generateGroupCss('typography') + `\n\n/* Spacing */\n` + generateGroupCss('spacing') + `\n\n/* Border */\n` + generateGroupCss('border') + `\n\n/* BoxShadow */\n` + generateGroupCss('boxShadow') + `\n\n/* Body */\n` + generateGroupCss('body') + `\n\n/* Block */\n` + generateGroupCss('block') + `\n\n/* Panel */\n` + generateGroupCss('panel') + `\n\n/* Button */\n` + generateGroupCss('button') + `\n\n/* Checkbox */\n` + generateGroupCss('checkbox') + `\n\n/* Input */\n` + generateGroupCss('input') + `\n\n/* Table */\n` + generateGroupCss('table') + `\n\n/* Other */\n` + generateGroupCss('other') + '}' console.log(sortedCss) // 将排序后的CSS变量写入文件 fs.writeFileSync('sorted-css-variables.css', sortedCss)