@ry-krystal/kicad-converter
Version:
专业的KiCad符号文件与JSON互转工具
109 lines (108 loc) • 3.78 kB
JavaScript
/**
* 批量转换命令实现
* 处理目录批量转换逻辑
*/
import { statSync, existsSync, mkdirSync } from 'fs';
import { join, extname, basename, dirname } from 'path';
// 导入工具
import { createLogger, findFiles } from '../utils/index.js';
import { convertCommand } from './convert.js';
/**
* 执行批量转换命令
*/
export async function batchCommand(options) {
const logger = createLogger(options.verbose, options.quiet);
try {
// 验证输入目录
if (!existsSync(options.input)) {
logger.error(`输入目录不存在: ${options.input}`);
return false;
}
const inputStat = statSync(options.input);
if (!inputStat.isDirectory()) {
logger.error(`输入路径不是目录: ${options.input}`);
return false;
}
// 查找需要转换的文件
const supportedExtensions = ['.kicad_sym', '.json'];
const filesToProcess = findFiles(options.input, supportedExtensions, options.recursive);
if (filesToProcess.length === 0) {
logger.warn(`在目录 ${options.input} 中未找到支持的文件`);
logger.info(`支持的文件扩展名: ${supportedExtensions.join(', ')}`);
return true;
}
logger.info(`发现 ${filesToProcess.length} 个文件需要处理`);
// 处理每个文件
let successCount = 0;
let errorCount = 0;
for (let i = 0; i < filesToProcess.length; i++) {
const file = filesToProcess[i];
const outputPath = generateOutputPath(file, options);
// 确保输出目录存在
const outputDir = dirname(outputPath);
if (!existsSync(outputDir)) {
mkdirSync(outputDir, { recursive: true });
}
// 执行转换
const success = await convertCommand({
input: file,
output: outputPath,
mode: options.mode,
engine: options.engine,
validate: options.validate,
optimize: options.optimize,
stats: false,
verbose: false,
quiet: true
});
if (success) {
successCount++;
if (options.verbose) {
logger.info(`✓ ${basename(file)}`);
}
}
else {
errorCount++;
logger.error(`✗ ${basename(file)}`);
}
}
// 显示结果摘要
logger.info(`批量处理完成`);
logger.info(`总文件数: ${filesToProcess.length}`);
logger.info(`成功: ${successCount}`);
if (errorCount > 0) {
logger.info(`失败: ${errorCount}`);
}
return errorCount === 0;
}
catch (error) {
logger.error(`批量转换过程中发生错误: ${error instanceof Error ? error.message : String(error)}`);
return false;
}
}
/**
* 生成输出路径
*/
function generateOutputPath(inputFile, options) {
const inputExt = extname(inputFile);
const inputName = basename(inputFile, inputExt);
const inputDir = dirname(inputFile);
// 确定输出扩展名
let outputExt;
if (options.mode === 'to-json' || (options.mode === 'auto' && inputExt === '.kicad_sym')) {
outputExt = '.json';
}
else {
outputExt = '.kicad_sym';
}
// 确定输出目录
let outputDir;
if (options.output) {
const relativePath = inputDir.replace(options.input, '');
outputDir = join(options.output, relativePath);
}
else {
outputDir = inputDir;
}
return join(outputDir, `${inputName}${outputExt}`);
}