| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /**
- * 从 vant/lib/index.css 生成 WXSS 兼容样式:去掉含 * / *= 的选择器规则。
- * 升级 vant 后执行:node scripts/gen-vant-mp-safe-css.js
- */
- const fs = require('fs')
- const path = require('path')
- const root = path.join(__dirname, '..')
- const src = path.join(root, 'node_modules', 'vant', 'lib', 'index.css')
- const dest = path.join(root, 'styles', 'vant-mp-safe.css')
- if (!fs.existsSync(src)) {
- console.error('[gen-vant-mp-safe-css] missing', src)
- process.exit(1)
- }
- const text = fs.readFileSync(src, 'utf8')
- const out = []
- let i = 0
- const n = text.length
- let removed = 0
- let kept = 0
- function isBadSelector(sel) {
- // universal selector `*` (not `*=` attr or content "*")
- if (/(^|[,)\s>+~])\*(?!=)/.test(sel)) return true
- if (sel.includes('*=')) return true
- return false
- }
- while (i < n) {
- if (text.startsWith('/*', i)) {
- const j = text.indexOf('*/', i + 2)
- if (j < 0) break
- out.push(text.slice(i, j + 2))
- i = j + 2
- continue
- }
- if (/\s/.test(text[i])) {
- out.push(text[i])
- i += 1
- continue
- }
- if (text[i] === '@') {
- const brace = text.indexOf('{', i)
- const semi = text.indexOf(';', i)
- if (semi !== -1 && (brace === -1 || semi < brace)) {
- out.push(text.slice(i, semi + 1))
- i = semi + 1
- continue
- }
- if (brace < 0) {
- out.push(text.slice(i))
- break
- }
- let depth = 0
- let j = brace
- while (j < n) {
- if (text[j] === '{') depth += 1
- else if (text[j] === '}') {
- depth -= 1
- if (depth === 0) {
- j += 1
- break
- }
- }
- j += 1
- }
- const block = text.slice(i, j)
- if (isBadSelector(block)) removed += 1
- else {
- out.push(block)
- kept += 1
- }
- i = j
- continue
- }
- const brace = text.indexOf('{', i)
- if (brace < 0) {
- out.push(text.slice(i))
- break
- }
- let depth = 0
- let j = brace
- while (j < n) {
- if (text[j] === '{') depth += 1
- else if (text[j] === '}') {
- depth -= 1
- if (depth === 0) {
- j += 1
- break
- }
- }
- j += 1
- }
- const sel = text.slice(i, brace)
- const rule = text.slice(i, j)
- if (isBadSelector(sel)) removed += 1
- else {
- out.push(rule)
- kept += 1
- }
- i = j
- }
- const header =
- '/* auto-generated from vant/lib/index.css — WXSS-safe (no * / *= selectors). Do not edit. */\n'
- fs.writeFileSync(dest, header + out.join(''))
- console.log('[gen-vant-mp-safe-css] kept=%s removed=%s -> %s', kept, removed, dest)
|