Files
esercizi-web/zip-esercizi.js
2026-02-17 22:19:40 +01:00

88 lines
2.2 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const { execFileSync } = require("child_process");
const baseDir = process.argv[2]
? path.resolve(process.argv[2])
: path.join(__dirname, "javascript");
const outputDir = path.join(__dirname, ".zip");
function ensureDir(dirPath) {
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath, { recursive: true });
}
}
function psQuote(value) {
return `'${String(value).replace(/'/g, "''")}'`;
}
function sanitizeFilename(name) {
return name.replace(/[<>:"/\\|?*]/g, "-").trim();
}
function splitName(dirName) {
let number = "";
let desc = dirName;
const underscoreIndex = dirName.indexOf("_");
if (underscoreIndex !== -1) {
number = dirName.slice(0, underscoreIndex).trim();
desc = dirName.slice(underscoreIndex + 1);
} else {
const match = dirName.match(/^(\d+)\s+(.+)$/);
if (match) {
number = match[1];
desc = match[2];
}
}
desc = desc.replace(/_/g, " ").replace(/\s+/g, " ").trim();
if (!number) {
number = "00";
}
return { number, desc };
}
function createZipForDir(dirPath) {
const dirName = path.basename(dirPath);
const { number, desc } = splitName(dirName);
const zipName = sanitizeFilename(`JS_Esercizi ${number} - ${desc}.zip`);
const zipPath = path.join(outputDir, zipName);
const sourceGlob = path.join(dirPath, "*");
const psCommand = [
"$ErrorActionPreference = 'Stop'",
`if (Test-Path -LiteralPath ${psQuote(zipPath)}) { Remove-Item -LiteralPath ${psQuote(zipPath)} -Force }`,
`Compress-Archive -Path ${psQuote(sourceGlob)} -DestinationPath ${psQuote(zipPath)} -Force`
].join("; ");
execFileSync("powershell", ["-NoProfile", "-Command", psCommand], {
stdio: "inherit"
});
console.log(`Creato: ${zipName}`);
}
function main() {
if (!fs.existsSync(baseDir)) {
throw new Error(`Cartella non trovata: ${baseDir}`);
}
ensureDir(outputDir);
const entries = fs.readdirSync(baseDir, { withFileTypes: true })
.filter((entry) => entry.isDirectory())
.map((entry) => path.join(baseDir, entry.name));
for (const dirPath of entries) {
if (path.basename(dirPath).toLowerCase() === ".zip") {
continue;
}
createZipForDir(dirPath);
}
}
main();