fix(images): Clean up image paths, compress large images, and fix openinary URLs
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const IMAGES_DIR = path.resolve(__dirname, '../public/images');
|
||||
const DATA_FILE = path.resolve(__dirname, '../lib/data.ts');
|
||||
const GALLERY_FILE = path.resolve(__dirname, '../lib/gallery_data.ts');
|
||||
|
||||
function slugify(text) {
|
||||
return text.toString().toLowerCase()
|
||||
.replace(/ç/g, 'c')
|
||||
.replace(/ğ/g, 'g')
|
||||
.replace(/ı/g, 'i')
|
||||
.replace(/ö/g, 'o')
|
||||
.replace(/ş/g, 's')
|
||||
.replace(/ü/g, 'u')
|
||||
.replace(/[^a-z0-9.]/g, '-')
|
||||
.replace(/\-\-+/g, '-')
|
||||
.replace(/^-+/, '')
|
||||
.replace(/-+$/, '');
|
||||
}
|
||||
|
||||
function processDirectory(dir, mapping = []) {
|
||||
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
||||
|
||||
for (const entry of entries) {
|
||||
const oldPath = path.join(dir, entry.name);
|
||||
let newName = slugify(path.parse(entry.name).name);
|
||||
if (entry.isFile()) {
|
||||
newName += path.extname(entry.name).toLowerCase();
|
||||
}
|
||||
|
||||
const newPath = path.join(dir, newName);
|
||||
|
||||
if (entry.isDirectory()) {
|
||||
// Recurse first before renaming directory
|
||||
processDirectory(oldPath, mapping);
|
||||
}
|
||||
|
||||
if (oldPath !== newPath) {
|
||||
console.log(`Renaming: ${oldPath} -> ${newPath}`);
|
||||
fs.renameSync(oldPath, newPath);
|
||||
|
||||
const oldRelative = path.relative(IMAGES_DIR, oldPath).replace(/\\/g, '/');
|
||||
const newRelative = path.relative(IMAGES_DIR, newPath).replace(/\\/g, '/');
|
||||
mapping.push({ old: oldRelative, new: newRelative });
|
||||
}
|
||||
}
|
||||
return mapping;
|
||||
}
|
||||
|
||||
console.log("Starting rename process...");
|
||||
// First rename files inside directories, then rename directories
|
||||
// To do this safely, we should gather all files, then directories, and rename bottom-up.
|
||||
function getAllPaths(dir) {
|
||||
let results = [];
|
||||
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
||||
for (const entry of entries) {
|
||||
const fullPath = path.join(dir, entry.name);
|
||||
if (entry.isDirectory()) {
|
||||
results = results.concat(getAllPaths(fullPath));
|
||||
}
|
||||
results.push({ path: fullPath, isDir: entry.isDirectory(), name: entry.name });
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
const allPaths = getAllPaths(IMAGES_DIR).sort((a, b) => b.path.length - a.path.length); // Bottom up
|
||||
const mapping = [];
|
||||
|
||||
for (const item of allPaths) {
|
||||
const oldPath = item.path;
|
||||
const dir = path.dirname(oldPath);
|
||||
let newName = slugify(path.parse(item.name).name);
|
||||
if (!item.isDir) {
|
||||
newName += path.extname(item.name).toLowerCase();
|
||||
}
|
||||
const newPath = path.join(dir, newName);
|
||||
|
||||
if (oldPath !== newPath) {
|
||||
fs.renameSync(oldPath, newPath);
|
||||
console.log(`Renamed: ${item.name} -> ${newName}`);
|
||||
|
||||
// We will just do a global replace in files using slugify on the strings later
|
||||
// It's easier than keeping track of complex path mapping.
|
||||
}
|
||||
}
|
||||
console.log("Renaming done.");
|
||||
Reference in New Issue
Block a user