sd-webui-kitchen-theme-legacy/utils/formatCSS.js

133 lines
3.8 KiB
JavaScript

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)