792daa6feb
- 规划文档 01-07:愿景 / 架构 / 路线图 / 数据与AI / 风险 / 参考 / FFU Demo - 演示图:系统架构、数据流水线、里程碑路线图(SVG + PNG) - FFU Demo:D2Q9 LBM 高保真(360x270, 76s)+ 粗网格快速代理(120x90, 7.3s, 16-27x 加速) - 趋势验证:速度 r=0.95 / 粒子 r=0.83 / 温度 r=0.68 - 工具链:仿真脚本、快速代理、图表生成器、SVG->PNG 转换
40 lines
1.1 KiB
JavaScript
40 lines
1.1 KiB
JavaScript
/**
|
|
* SVG -> PNG 批量转换 (resvg, 支持中文系统字体)
|
|
*
|
|
* npm install # 首次安装依赖
|
|
* node tools/svg2png.js # 转换 docs/assets 下全部 svg
|
|
* node tools/svg2png.js foo.svg # 只转换指定文件
|
|
*/
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
let Resvg;
|
|
try {
|
|
({ Resvg } = require("@resvg/resvg-js"));
|
|
} catch (e) {
|
|
console.error("缺少依赖 @resvg/resvg-js,请先执行: npm install");
|
|
process.exit(1);
|
|
}
|
|
|
|
const dir = path.join(__dirname, "..", "docs", "assets");
|
|
const args = process.argv.slice(2);
|
|
const files = args.length
|
|
? args
|
|
: fs.readdirSync(dir).filter((f) => f.toLowerCase().endsWith(".svg"));
|
|
|
|
let ok = 0;
|
|
for (const f of files) {
|
|
const src = path.join(dir, f);
|
|
const dst = src.replace(/\.svg$/i, ".png");
|
|
const svg = fs.readFileSync(src, "utf8");
|
|
const r = new Resvg(svg, {
|
|
fitTo: { mode: "zoom", value: 2 },
|
|
font: { loadSystemFonts: true },
|
|
background: "#0d1117",
|
|
});
|
|
fs.writeFileSync(dst, r.render().asPng());
|
|
console.log(` ${f} -> ${path.basename(dst)}`);
|
|
ok++;
|
|
}
|
|
console.log(`converted ${ok} file(s)`);
|