| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- // 票 15 盘点(只读):组件内散落的主题色字面量清点,用于设计 token 替换面
- // 输出:按「色值族」聚合的 (文件, 出现次数, 出现的 alpha/形态)
- import { readFileSync } from 'node:fs'
- import { readdirSync, statSync } from 'node:fs'
- import { join, relative } from 'node:path'
- const root = 'src/modules/cockpit'
- const files = []
- ;(function walk(dir) {
- for (const e of readdirSync(dir)) {
- const p = join(dir, e)
- if (statSync(p).isDirectory()) walk(p)
- else if (/\.(vue|js|css)$/.test(e)) files.push(p)
- }
- })(root)
- const THEME = {
- cyan: /#4fd8ff|rgba?\(\s*79\s*,\s*216\s*,\s*255/gi,
- cyanD: /#1b93cf|rgba?\(\s*27\s*,\s*147\s*,\s*207/gi,
- line: /rgba?\(\s*58\s*,\s*170\s*,\s*226/gi,
- lineHi: /rgba?\(\s*96\s*,\s*220\s*,\s*255/gi,
- insetHi: /rgba?\(\s*130\s*,\s*225\s*,\s*255/gi,
- lv1: /#ff4d5e|rgba?\(\s*255\s*,\s*77\s*,\s*94/gi,
- lv2: /#ffa63d|rgba?\(\s*255\s*,\s*166\s*,\s*61/gi,
- lv4: /#35e39a|rgba?\(\s*53\s*,\s*227\s*,\s*154/gi,
- neutral: /#6d92ae|rgba?\(\s*109\s*,\s*146\s*,\s*174/gi,
- text: /#e6f5ff/gi,
- text2: /#a8cbe2/gi,
- title: /#eaf9ff/gi,
- panelTopBase: /rgba?\(\s*12\s*,\s*48\s*,\s*86/gi,
- panelBotBase: /rgba?\(\s*3\s*,\s*14\s*,\s*28/gi,
- panelMid: /rgba?\(\s*6\s*,\s*24\s*,\s*44/gi,
- headGradA: /rgba?\(\s*24\s*,\s*96\s*,\s*152/gi,
- headGradB: /rgba?\(\s*12\s*,\s*52\s*,\s*90/gi,
- headGradC: /rgba?\(\s*90\s*,\s*200\s*,\s*255/gi,
- headHoverA: /rgba?\(\s*34\s*,\s*116\s*,\s*176/gi,
- headHoverB: /rgba?\(\s*16\s*,\s*66\s*,\s*110/gi,
- blueText: /#9dc2d9/gi,
- mapBg: /#04121f/gi,
- }
- const rows = []
- for (const f of files) {
- const src = readFileSync(f, 'utf8')
- for (const [name, re] of Object.entries(THEME)) {
- const hits = src.match(re)
- if (hits) {
- const variants = [...new Set(hits.map((h) => h.replace(/\s+/g, '')))]
- rows.push({ family: name, file: relative('.', f), count: hits.length, variants: variants.slice(0, 12).join(' ') })
- }
- }
- }
- const byFamily = new Map()
- for (const r of rows) {
- const cur = byFamily.get(r.family) || { total: 0, files: new Map() }
- cur.total += r.count
- cur.files.set(r.file, r)
- byFamily.set(r.family, cur)
- }
- for (const [family, v] of [...byFamily.entries()].sort((a, b) => b[1].total - a[1].total)) {
- console.log(`\n### ${family} 合计 ${v.total}`)
- for (const [file, r] of [...v.files.entries()].sort((a, b) => b[1].count - a[1].count)) {
- console.log(` ${String(r.count).padStart(3)} ${file}`)
- console.log(` 变体: ${r.variants}`)
- }
- }
|