使用nodejs输出著作权申请所需的word版源码
背景
软件著作权申请需要提供一份80页的word版源代码,如果手工复制源码到word文档中,工作量将无聊到让任何一个DAO人员血压爆表,因此我们不得不编写一个简单的文本处理代码,通过自动方式将项目源码输出到word文档中。
实现逻辑
指定一个代码目录,通过递归扫描该目录及其所有子级目录下的文件(可指定文件类型),然后按行读取文件中的代码,输出到word文档中。
实现代码
本次我们使用nodejs来实现以上逻辑,将当前目录下的codes目录中的所有代码输出到word文件merged_files.docx中。
javascript
const fs = require('fs-extra');
const path = require('path');
const readline = require('readline');
const docx = require("docx");
const graphs = [];
async function readFileContent(filePath) {
return fs.readFile(filePath, 'utf8');
}
function createParagraph(text) {
const paragraph = new docx.Paragraph({ children: [new docx.TextRun(text)] });
graphs.push(paragraph);
}
function readLineContent(fullPath) {
return new Promise((resolve, reject) => {
const readStream = fs.createReadStream(fullPath);
const rl = readline.createInterface({
input: readStream,
crlfDelay: Infinity
});
rl.on('line', (line) => {
// console.log('Line from file:', line);
createParagraph(line);
});
rl.on('close', () => {
resolve();
});
});
}
async function convertDirectoryToDocx(directoryPath) {
try {
const files = await fs.readdir(directoryPath, { withFileTypes: true });
for (const file of files) {
const fullPath = path.join(directoryPath, file.name);
if (file.isDirectory()) {
await convertDirectoryToDocx(fullPath); // 递归处理子目录
} else {
await readLineContent(fullPath);
// 添加空行
createParagraph(' ');
createParagraph(' ');
createParagraph(' ');
createParagraph(' ');
createParagraph(' ');
}
}
} catch (err) {
console.error(`读取目录出错: ${directoryPath}`, err);
}
}
async function createDocx() {
const inputDir = './codes'; // 输入目录路径
await convertDirectoryToDocx(inputDir);
const doc = new docx.Document({
sections: [
{
properties: {},
children: graphs,
},
],
});
const outputDocx = './merged_files.docx'; // 输出的.docx文件路径
docx.Packer.toBuffer(doc).then((buffer) => {
fs.writeFileSync(outputDocx, buffer);
console.log(`文件已合并至: ${outputDocx}`);
});
}
createDocx();