mirror of
https://github.com/shadoll/sLogos.git
synced 2025-12-20 08:30:59 +00:00
- Updated `svg-cleanup.js` to improve SVG file processing and validation. - Refactored `update-data.js` to streamline the data update process and integrate new scripts for generating image variants and syncing data files. - Introduced `generate-variants.js` to handle the conversion of SVG files to PNG and JPG formats. - Created `sync-data.js` to synchronize logo data with the filesystem, ensuring accurate representation of available images. - Enhanced error handling and logging throughout the scripts for better debugging and user feedback. - Added support for processing all collections or a specific collection based on command-line arguments or environment variables.
132 lines
3.6 KiB
JavaScript
132 lines
3.6 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const { Resvg } = require('@resvg/resvg-js');
|
|
|
|
// Use collections from src/collections.js
|
|
const { collections } = require('../src/collections.js');
|
|
|
|
// Accept collection as a CLI arg or env var
|
|
const collectionArg = process.argv.find(arg => arg.startsWith('--collection='));
|
|
const collectionName = collectionArg ? collectionArg.split('=')[1] : (process.env.COLLECTION || 'logos');
|
|
|
|
// Get file name without extension
|
|
function getBaseName(filename) {
|
|
return path.basename(filename, path.extname(filename));
|
|
}
|
|
|
|
// Clean directory (remove all contents)
|
|
function cleanDir(dir) {
|
|
if (fs.existsSync(dir)) {
|
|
for (const file of fs.readdirSync(dir)) {
|
|
if (file !== '.gitignore') {
|
|
const filePath = path.join(dir, file);
|
|
if (fs.lstatSync(filePath).isDirectory()) {
|
|
fs.rmSync(filePath, { recursive: true, force: true });
|
|
} else {
|
|
fs.unlinkSync(filePath);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
fs.mkdirSync(dir, { recursive: true });
|
|
}
|
|
}
|
|
|
|
// Convert SVG to PNG with transparency
|
|
function svgToPng(svgBuffer, width, height) {
|
|
// No background specified to maintain transparency
|
|
const resvg = new Resvg(svgBuffer, {
|
|
fitTo: { mode: 'width', value: width || 256 }
|
|
});
|
|
const pngData = resvg.render().asPng();
|
|
return pngData;
|
|
}
|
|
|
|
// Convert SVG to JPG
|
|
function svgToJpg(svgBuffer, width, height) {
|
|
// For JPGs we need a white background since JPG doesn't support transparency
|
|
const resvg = new Resvg(svgBuffer, {
|
|
background: 'white',
|
|
fitTo: { mode: 'width', value: width || 256 }
|
|
});
|
|
const pngData = resvg.render().asPng();
|
|
return pngData;
|
|
}
|
|
|
|
// Generate PNG and JPG variants for SVG files
|
|
function generateVariants(collectionName) {
|
|
const collection = collections.find(c => c.name === collectionName);
|
|
if (!collection) {
|
|
console.error(`Collection "${collectionName}" not found`);
|
|
return;
|
|
}
|
|
|
|
const imagesDir = path.join(__dirname, '..', 'public', collection.baseDir);
|
|
const varDir = path.join(__dirname, '..', 'public', collection.varDir);
|
|
|
|
if (!fs.existsSync(imagesDir)) {
|
|
console.error(`Directory does not exist: ${imagesDir}`);
|
|
return;
|
|
}
|
|
|
|
console.log(`Generating variants for collection: ${collection.label}`);
|
|
console.log(`Source: ${imagesDir}`);
|
|
console.log(`Target: ${varDir}`);
|
|
|
|
// Clean variants directory
|
|
cleanDir(varDir);
|
|
|
|
const files = fs.readdirSync(imagesDir);
|
|
const svgFiles = files.filter(file => /\.svg$/i.test(file));
|
|
|
|
console.log(`Found ${svgFiles.length} SVG files to process`);
|
|
|
|
let processed = 0;
|
|
let errors = 0;
|
|
|
|
for (const file of svgFiles) {
|
|
const base = getBaseName(file);
|
|
const svgPath = path.join(imagesDir, file);
|
|
const pngPath = path.join(varDir, base + '.png');
|
|
const jpgPath = path.join(varDir, base + '.jpg');
|
|
|
|
try {
|
|
const svgBuffer = fs.readFileSync(svgPath);
|
|
|
|
// Generate PNG
|
|
const pngBuffer = svgToPng(svgBuffer, 256, 256);
|
|
fs.writeFileSync(pngPath, pngBuffer);
|
|
|
|
// Generate JPG
|
|
const jpgBuffer = svgToJpg(svgBuffer);
|
|
fs.writeFileSync(jpgPath, jpgBuffer);
|
|
|
|
processed++;
|
|
console.log(`✓ Generated variants for ${file}`);
|
|
} catch (e) {
|
|
errors++;
|
|
console.error(`✗ Error generating variants for ${file}:`, e.message);
|
|
}
|
|
}
|
|
|
|
console.log(`\nCompleted: ${processed} processed, ${errors} errors`);
|
|
}
|
|
|
|
// Main function
|
|
function main() {
|
|
if (collectionName === 'all') {
|
|
// Process all collections
|
|
for (const col of collections) {
|
|
generateVariants(col.name);
|
|
}
|
|
} else {
|
|
// Process single collection
|
|
generateVariants(collectionName);
|
|
}
|
|
}
|
|
|
|
// Run the script
|
|
main();
|