// 将 img/ 目录下的 SVG 底图转换为 TS 模块 // 使用方式:pnpm generate-maps const fs = require('fs') const path = require('path') const imgDir = path.resolve(__dirname, '../apps/property-survey/img') const outputFile = path.resolve( __dirname, '../apps/property-survey/src/features/map/floorMaps.generated.ts', ) // 按楼层查找候选文件名(优先带 -1 后缀的新版本) const FLOOR_CANDIDATES = { 1: ['1101-1.svg', '1101.svg'], 2: ['1102-1.svg', '1102.svg'], 3: ['1103-1.svg', '1103.svg'], } function findFile(candidates) { for (const name of candidates) { const full = path.join(imgDir, name) if (fs.existsSync(full)) return full } return null } const contents = {} for (const [floor, candidates] of Object.entries(FLOOR_CANDIDATES)) { const filePath = findFile(candidates) if (!filePath) { console.error(`❌ 找不到 ${floor}F 的 SVG 文件(查找:${candidates.join(', ')})`) process.exit(1) } console.log(`读取 ${floor}F → ${path.basename(filePath)}`) let svg = fs.readFileSync(filePath, 'utf8') // 提取原始 width / height,用于补全 viewBox const wMatch = svg.match(/]*\swidth="([^"]+)"/) const hMatch = svg.match(/]*\sheight="([^"]+)"/) const svgW = wMatch ? wMatch[1] : null const svgH = hMatch ? hMatch[1] : null // 若 viewBox 缺失,用原始尺寸补充;已有则保留 const hasViewBox = /viewBox=/.test(svg) if (!hasViewBox && svgW && svgH) { svg = svg.replace(/ 的 width/height 改为 100%,让 SvgXml 的 props 完全控制渲染尺寸 svg = svg.replace(/(]*)\swidth="[^"]*"/, '$1 width="100%"') svg = svg.replace(/(]*)\sheight="[^"]*"/, '$1 height="100%"') // 将 xlink:href 替换为 href,兼容 react-native-svg 的 渲染 svg = svg.replace(/xlink:href/g, 'href') // 清除 base64 数据中的 XML 换行实体( )和空白,react-native-svg 不支持 svg = svg.replace(/href="(data:[^"]+)"/g, (_, dataUrl) => { const cleaned = dataUrl.replace(/ | |\s/g, '') return `href="${cleaned}"` }) contents[floor] = svg } const output = `// 自动生成,请勿手动编辑 // 更新底图后运行:pnpm generate-maps import type { FloorNumber } from '@repo/types' const f1 = ${JSON.stringify(contents[1])} const f2 = ${JSON.stringify(contents[2])} const f3 = ${JSON.stringify(contents[3])} export const FLOOR_SVG: Record = { 1: f1, 2: f2, 3: f3 } ` fs.writeFileSync(outputFile, output, 'utf8') console.log(`✅ 已生成 ${outputFile}`)